summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2004-06-16 09:23:54 +0000
committerEric Anholt <anholt@freebsd.org>2004-06-16 09:23:54 +0000
commit5880d0f36b7f79b650ff56914db769327fb38cc9 (patch)
treea52986caa89fe44a981013932be0fd99cfd24058
parent2a8d0bc1b050224139cf787946d2e433481b2e17 (diff)
DRI XFree86-4_3_99_12-merge importDRI-XFree86-4_3_99_12-merge
-rw-r--r--man/sis.man273
-rw-r--r--src/300vtbl.h1044
-rw-r--r--src/310vtbl.h2773
-rw-r--r--src/init.c6318
-rw-r--r--src/init.h1787
-rw-r--r--src/init301.c16133
-rw-r--r--src/init301.h570
-rw-r--r--src/initdef.h484
-rw-r--r--src/oem300.h114
-rw-r--r--src/oem310.h441
-rw-r--r--src/osdef.h147
-rw-r--r--src/sis.h419
-rw-r--r--src/sis300_accel.c108
-rw-r--r--src/sis300_accel.h50
-rw-r--r--src/sis310_accel.c241
-rw-r--r--src/sis310_accel.h45
-rw-r--r--src/sis6326_video.c71
-rw-r--r--src/sis_accel.c83
-rw-r--r--src/sis_accel.h81
-rw-r--r--src/sis_common.h16
-rw-r--r--src/sis_cursor.c826
-rw-r--r--src/sis_cursor.h380
-rw-r--r--src/sis_dac.c955
-rw-r--r--src/sis_dac.h80
-rw-r--r--src/sis_dga.c62
-rw-r--r--src/sis_dri.c173
-rw-r--r--src/sis_dri.h35
-rw-r--r--src/sis_driver.c5305
-rw-r--r--src/sis_driver.h501
-rw-r--r--src/sis_opt.c775
-rw-r--r--src/sis_regs.h62
-rw-r--r--src/sis_setup.c189
-rw-r--r--src/sis_shadow.c26
-rw-r--r--src/sis_vb.c346
-rw-r--r--src/sis_vga.c636
-rw-r--r--src/sis_video.c1380
-rw-r--r--src/vgatypes.h311
-rw-r--r--src/vstruct.h329
38 files changed, 21531 insertions, 22038 deletions
diff --git a/man/sis.man b/man/sis.man
index e842acb..0f87f75 100644
--- a/man/sis.man
+++ b/man/sis.man
@@ -1,4 +1,4 @@
-.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis.man,v 1.5 2001/12/17 20:52:34 dawes Exp $
+.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis.man,v 1.11 2003/08/30 16:13:52 twini Exp $
.\" shorthand for double quote that works everywhere.
.ds q \N'34'
.TH SIS __drivermansuffix__ __vendorversion__
@@ -14,9 +14,9 @@ sis \- SiS video driver
.fi
.SH DESCRIPTION
.B sis
-is an __xservername__ driver for SiS (Silicon Integrated Systems) video chips. The
-driver is accelerated, and provides support for colordepths of 8, 16 and 24 bpp.
-XVideo, Render and other extensions are supported as well.
+is an XFree86 driver for SiS video chips. The driver is accelerated, and
+provides support for 8, 16 and 24 colordepths. XVideo, Render and other
+extensions are supported as well.
.SH SUPPORTED HARDWARE
The
.B sis
@@ -29,10 +29,9 @@ driver supports PCI and AGP video cards based on the following chipsets:
.B SiS540
.B SiS630/730
.B SiS315/H/PRO
-.B SiS550/551/552
-.B SiS650/651/M650/661FX/M661FX/M661MX/740/741
+.B SiS550
+.B SiS650/651/M650/661FX/M661FX/740/741
.B SiS330 (Xabre)
-.B SiS760
.PP
In the following text, the following terms are used:
.PP
@@ -43,11 +42,9 @@ for SiS5597/5598, 530/620 and 6326/AGP/DVD
for SiS300/305, 540 and 630/730
.PP
.B 315/330 series
-for SiS315/H/PRO, 55x and (M)65x/(M)661xX/74x, 330, 760
-.PP
-Note: Support for 661FX, M661FX, M661MX, 741 and 760 is untested.
+for SiS315/H/PRO, 550 and 650/651/M650/661FX/M661FX/740/741, 330
.SH CONFIGURATION DETAILS
-Please refer to __xconfigfile__(__filemansuffix__) for general configuration
+Please refer to XF86Config(__filemansuffix__) for general configuration
details. This section only covers configuration details specific to this
driver.
.PP
@@ -73,43 +70,37 @@ The opposite of HWCursor. Default: SWCursor is off.
.TP
.BI "Option \*qRotate\*q \*qCW\*q"
Rotate the display clockwise. This mode is unaccelerated, and uses
-the Shadow Frame Buffer layer. Using this option disables
-the Resize and Rotate extension (RandR).
+the Shadow Frame Buffer layer.
Default: no rotation.
.TP
.BI "Option \*qRotate\*q \*qCCW\*q"
Rotate the display counterclockwise. This mode is unaccelerated, and
-uses the Shadow Frame Buffer layer. Using this option disables
-the Resize and Rotate extension (RandR).
+uses the Shadow Frame Buffer layer.
Default: no rotation.
.TP
.BI "Option \*qShadowFB\*q \*q" boolean \*q
Enable or disable use of the shadow framebuffer layer.
Default: Shadow framebuffer is off.
-.TP
-.BI "Option \*qCRT1Gamma\*q \*q" boolean \*q
-Enable or disable gamma correction.
-Default: Gamma correction is on.
.PP
.I "2. Old series specific information"
.PP
The driver will auto-detect the amount of video memory present for all
-these chips, but in the case of the 6326, it will limit the memory size
-to 4MB. This is because the 6326's 2D engine can only address 4MB. The
-remaining memory seems to be intended for 3D texture data, since only
-the 3D engine can address RAM above 4MB. However, you can override this
+these chips, but in the 6326 case, it will limit the memory size to 4MB.
+This is because the 6326's 2D engine can only address 4MB. The remaining
+memory seems to be intended for 3D texture data, since only the 3D
+engine can address RAM above 4MB. However, you can override this forced
limitation using the
.B \*qVideoRAM\*q
-option in the Device section if your board has more than 4MB and you
-need to use it. However, 2D acceleration, Xvideo and the HWCursor will
-be disabled in this case.
+option in the device section if your board has more than
+4MB and you need to use it. However, 2D acceleration, Xvideo and the
+HWCursor will be disabled in this case.
.PP
The driver will also auto-detect the maximum dotclock and DAC speed.
If you have problems getting high resolutions because of dot clock
limitations, try using the
.B \*qDacSpeed\*q
-option, also in the Device section. However, this is not recommended
-for the 6326. For this chip, the driver has two built-in modes for
+option, also in the device section. However, this is not recommended
+for the 6326. For this chipset, the driver has two built-in modes for
high resolutions which you should use instead. These are named
.B \*qSIS1280x1024-75\*q
and
@@ -119,13 +110,13 @@ just place them in your Screen section. Example:
.PP
.BI "Modes \*qSIS1600x1200-60\*q \*qSIS1280x1024x75\*q \*q1024x768\*q ...
.PP
-Of these modes, 1280x1024 is only available at 8, 15 and 16bpp. 1600x1200
-is available at 8bpp only.
+1280x1024 is only available at 8, 15 and 16bpp. 1600x1200 is available
+at 8bpp only.
.PP
TV support for the 6326
.PP
-TV output is supported for the 6326. The driver will auto detect a
-TV connected and in this case add the following modes to the list
+TV output is supported on the 6326. The driver will auto detect a
+TV connected, and in this case add the following modes to the list
of default modes: "PAL800x600", "PAL800x600U", "PAL720x540",
"PAL640x480", "NTSC640x480", "NTSC640x480U" and "NTSC640x400".
Use these modes like the hi-res modes described above.
@@ -139,10 +130,11 @@ Enable or disable TurboQueue mode. Default: off for SIS530/620, on for
the others
.TP
.BI "Option \*qFastVram\*q \*q" boolean \*q
-Enable or disable FastVram mode. Enabling this sets the video RAM timing
-to one cycle per read operation instead of two cycles. Disabling this will
-set two cycles for read and write operations. Leaving this option out uses
-the default, which varies depending on the chipset.
+Enable or disable FastVram mode. Enabling this sets the video RAM timing
+to only one cycle per read operation instead of two cycles. Disabling
+this will set 2 cycles for read and write operations. Leaving this
+option out uses the default.
+Default: off for read, on for write.
.TP
.BI "Option \*qNoHostBus\*q \*q" boolean \*q
(SiS5597/5598 only). Disable CPU-to-VGA host bus support. This
@@ -151,46 +143,39 @@ speeds up CPU to video RAM transfers. Default: Host bus is enabled.
.BI "Option \*qNoXVideo\*q \*q" boolean \*q
Disable XV (XVideo) extension support. Default: XVideo is on.
.TP
-.BI "Option \*qNoYV12\*q \*q" boolean \*q
-Disable YV12 Xv support. This might me required due to hardware bugs in some
-chipsets. Disabling YV12 support forces Xv-aware applications to use YUV2 or
-XShm for video output.
-Default: YV12 support is on.
-.TP
.BI "Option \*qTVStandard\*q \*q" string \*q
-(6326 only) Valid parameters are
+(6326 only) Possible parameters are
.B PAL
or
.B NTSC.
The default is set by a jumper on the card.
.TP
.BI "Option \*qTVXPosOffset\*q \*q" integer \*q
-(6326 only) This option allows tuning the horizontal position of the image
-for TV output. The range is from -16 to 16. Default: 0
+(6326 only) This option allows horizontal relocation the TV output.
+The range is from -16 to 16.
.TP
.BI "Option \*qTVYPosOffset\*q \*q" integer \*q
-(6326 only) This option allows tuning the vertical position of the image
-for TV output. The range is from -16 to 16. Default: 0
+(6326 only) This option allows vertical relocation the TV output.
+The range is from -16 to 16.
.TP
.BI "Option \*qSIS6326TVEnableYFilter\*q \*q" boolean \*q
-(6326 only) This option allows enabling/disabling the Y (chroma) filter for
+(6326 only) This option allows enabling/disabling the Y filter for
TV output.
.TP
.BI "Option \*qSIS6326TVAntiFlicker\*q \*q" string \*q
-(6326 only) This option allow enabling/disabling the anti flicker facility
-for TV output. Possible parameters are
+(6326 only) This option allow enabling/disabling the anti flicker
+facility for TV output. Possible parameters are
.B OFF, LOW, MED, HIGH
or
.B ADAPTIVE.
By experience,
.B ADAPTIVE
-yields the best results, hence it is the default.
+yields the best results.
.PP
.I "2. 300 and 315/330 series specific information"
.PP
-The 300 and 315/330 series feature two CRT controllers and very often come
-with a video bridge for controlling LCD and TV output. Hereinafter, the
-term
+The 300 and 315/330 series very often come with a video bridge for
+controlling LCD and TV output. Hereinafter, the term
.B CRT1
refers to the VGA output of the chip, and
.B CRT2
@@ -204,7 +189,7 @@ The driver supports the following video bridges:
.B SiS301
.B SiS301B(-DH)
.B SiS301C
-.B SiS301LV(X)
+.B SiS301LV
.B SiS302LV
.PP
Instead of a video bridge, some machines have a
@@ -219,15 +204,13 @@ About TV output
.PP
On the SiS301 and the Chrontel 7005, only resolutions up to 800x600
are supported. On all others, resolutions up to 1024x768 are supported.
-However, due to a hardware bug, Xvideo might be distorted on SiS video
-bridges if running NTSC or PAL-M at 1024x768.
.PP
About XVideo support
.PP
XVideo is supported on all chipsets of both families. However, there
are some differences in hardware features which cause limitations.
-The 300 series as well as the SiS55x, M650, 651, 661FX, M661FX, and
-741 support two video overlays. The SiS315/H/PRO, 650/740 and 330 support
+The 300 series as well as the SiS550, M650, 651, 661FX, M661FX,
+and 741 support two video overlays. The SiS315/H/PRO and 650/740 support
only one such overlay. On chips with two overlays, one overlay is used
for CRT1, the other for CRT2. On the other chipsets, the option
.B \*qXvOnCRT2\*q
@@ -243,7 +226,7 @@ About dual-head support
.PP
Dual head mode has some limitations as regards color depth and
resolution. Due to memory bandwidth limits, CRT1 might have a
-reduced maximum refresh rate if running on higher resolutions than
+reduced refresh rate if running on higher resolutions than
1280x1024.
.PP
Colordepth 8 is not supported when running in dual head mode.
@@ -265,19 +248,24 @@ and if this option is either unset or set to
option is set to
.B true
). If either only CRT1 or CRT2 is detected, the driver decides
-automatically. In Merged Framebuffer mode, this option is ignored.
+automatically.
Default: overlay is used on CRT1
.TP
.BI "Option \*qForceCRT1\*q \*q" boolean \*q
-Force CRT1 to be on of off. If a monitor is connected, it will be
-detected during server start. However, some old monitors are not
-detected correctly. In such cases, you may set this option to
-.B on
-in order to make the driver initialize CRT1 anyway.
+The BIOS detects VGA monitors connected to CRT1 at boot time
+and the X driver by default relies on the information passed
+by the BIOS. However, some old monitors are not detected
+correctly. If this is the case, or if you connected the VGA
+monitor after you booted the machine, you may set this
+option to
+.B true
+in order to make the X driver ignore the
+information from the BIOS and initialize CRT1 anyway.
If this option is set to
-.B off
-, the driver will switch off CRT1.
-Default: auto-detect
+.B false
+, the driver will switch
+off CRT1 and thus save memory bandwidth.
+Default: auto detect CRT1
.TP
.BI "Option \*qForceCRT2Type\*q \*q" string \*q
Force display type to one of:
@@ -289,8 +277,6 @@ Force display type to one of:
,
.B COMPOSITE
,
-.B SVIDEO+COMPOSITE
-,
.B SCART
,
.B LCD
@@ -298,54 +284,56 @@ Force display type to one of:
.B VGA
;
.B NONE
-will disable CRT2. The SVIDEO, COMPOSITE, SVIDEO+COMPOSITE and SCART
-parameters are for SiS video bridges only and can be used to force the
+will disable CRT2. The SVIDEO, COMPOSITE and SCART parameters
+are for SiS video bridges only and can be used to force the
driver to use a specific TV output connector (if present).
Default: auto detect.
.TP
-.BI "Option \*qCRT2Gamma\*q \*q" boolean \*q
-Enable or disable gamma correction for CRT2. Only supported
-for SiS video bridges. Default: Gamma correction for CRT2 is on.
+.BI "Option \*qPanelDelayCompensation\*q \*q" integer \*q
+This option is only for machines with a 300 series chipset
+and either a SiS301B-DH video bridge or a LVDS transmitter,
+and a 315 series chipset with a SiS30xLV bridge.
+Different LCD panels require different delay compensation
+values. In most cases, the driver can autodetect this value.
+However, due to bad BIOS design this might fail in rare
+cases. If your LCD shows small horizontal waves, set the
+parameter of this option on the 300 series first to
+.B 4
+,
+.B 32
+or
+.B 24
+and if the problem persists, try using other values between
+4 and 60 in steps of 4. On the 315 series, any value can
+be set.
.TP
.BI "Option \*qTVStandard\*q \*q" string \*q
Force the TV standard to either
.B PAL
or
.B NTSC.
-On some machines with 630, 730 and the 315/330 series,
+On some machines with 630, 730 or the 315 series,
.B PALM
-,
-.B PALN
and
-.B NTSCJ
+.B PALN
are supported as well. Default: BIOS setting.
.TP
.BI "Option \*qTVXPosOffset\*q \*q" integer \*q
-This option allows tuning the horizontal position of the image for
-TV output. The range is from -32 to 32. Not supported on the Chrontel
-7019. Default: 0
+This option allows horizontal relocation the TV output.
+The range is from -32 to 32. Not supported on the Chrontel
+7019.
.TP
.BI "Option \*qTVYPosOffset\*q \*q" integer \*q
-This option allows tuning the vertical position of the image for TV
-output. The range is from -32 to 32. Not supported on the Chrontel
-7019. Default: 0
-.TP
-.BI "Option \*qSISTVXScale\*q \*q" integer \*q
-This option selects the horizontal zooming level for TV output. The range
-is from -16 to 16. Only supported on SiS video bridges. Default: 0
-.TP
-.BI "Option \*qSISTVYScale\*q \*q" integer \*q
-This option selects the vertical zooming level for TV output in the
-following modes: 640x480, 800x600. On the 315/330 series, also 720x480,
-720x576 and 768x576. The range is from -4 to 3. Only supported on
-SiS video bridges. Default: 0
+This option allows vertical relocation the TV output.
+The range is from -32 to 32. Not supported on the Chrontel
+7019.
.TP
.BI "Option \*qCHTVOverscan\*q \*q" boolean \*q
-On machines with a Chrontel TV encoder, this can be used to force the
-TV mode to overscan or underscan.
-.B on
+On machines with a Chrontel TV encoder, this can be used to
+force the TV mode to overscan or underscan.
+.B True
means overscan,
-.B off
+.B false
means underscan.
Default: BIOS setting.
.TP
@@ -355,40 +343,57 @@ enables a super-overscan mode. This is only supported if
the TV standard is PAL. Super overscan will produce an
image on the TV which is larger than the viewable area.
.PP
-The driver supports many more options. Please see
-http://www.winischhofer.net/linuxsisvga.shtml for
+The driver supports many more TV related options. Please
+see http://www.winischhofer.net/linuxsisvga.shtml for
more information.
.PP
.I "3. 300 series specific information"
.PP
-DRI is supported on the 300 series only. On Linux, DRI requires the
-kernel's SiS framebuffer driver (
+DRI is supported on the 300 series only. DRI requires
+the kernel's SiS framebuffer driver (
.B sisfb
-) and some other modules which come with either the kernel or __xservername__.
-.PP
-Sisfb takes care of memory management for texture data. In order to
-prevent the X Server and sisfb from overwriting each other's data,
-sisfb reserves an amount of video memory for the X driver. This amount
-can either be selected using sisfb's mem parameter, or auto-selected
-depending on the amount of total video RAM available.
-.PP
-Sisfb can be used for memory management only, or as a complete framebuffer
-driver. If you start sisfb with a valid mode (ie you gain a graphical console),
-the X driver can communicate with sisfb and doesn't require any
-manual configuration for finding out about the video memory it is allowed
-to use.
-However, if you are running a 2.4 series Linux kernel and use sisfb for
-video memory management only, ie you started sisfb with mode=none and still
-have a text mode console, there is no communication between sisfb and the
-X driver. For this purpose,
-the
+) and some other modules
+which come with either the kernel or XFree86.
+.PP
+Sisfb takes care of memory management for texture
+data. In order to prevent the X driver and sisfb from
+overwriting each others video memory, sisfb reserves
+an amount of video memory for the X driver. This amount
+can either be selected using sisfb's mem parameter, or
+auto-selected depending on the amount of total video RAM
+available. However, the X driver needs to know about the
+amount of RAM sisfb reserved. For this purpose, the
.TP
.BI "Option \*qMaxXFBMem\*q \*q" integer \*q
.PP
-exists. This option must be set to the same value as given to sisfb through
-its "mem" parameter, ie the amount of memory to use for X in kilobytes.
-.PP
-If you started sisfb without the mem argument, sisfb will reserve
+exists.
+.PP
+XFree 4.3.0 disabled SiS DRI support. Old information follows:
+.PP
+At the moment (2003), the SiS DRI driver is not
+maintained, lacks support for memory swapping and
+has a few bugs. If you intend to use DRI, I recommend
+setting the total video memory in the BIOS to 64MB
+in order to at least overcome the lack of memory
+swap functions.
+.PP
+Sisfb can be used for memory management only, or as
+a complete framebuffer driver. If you start sisfb
+with a valid mode (ie you gain a graphical console),
+the X driver can communicate with sisfb and doesn't
+require setting the
+.B \*qMaxXFBMem\*q
+option at all. The X driver will receive enough information
+from sisfb in this case.
+.PP
+However, if you use sisfb for memory management only, ie
+you started sisfb with mode=none and still have a text
+mode console, there is no communication between sisfb
+and the X driver. In this case, you need to set
+.B \*qMaxXFBMem\*q
+to the same value as you gave sisfb with its mem
+parameter. If you didn't specify any mem parameter,
+sisfb will reserve
.TP
12288KB if more than 16MB of total video RAM is available,
.TP
@@ -396,20 +401,14 @@ If you started sisfb without the mem argument, sisfb will reserve
.TP
4096KB in all other cases.
.PP
-If you intend to use DRI, I recommend setting the total video memory in
-the BIOS to 64MB in order to at least overcome the lack of memory swap
-functions.
-.TP
-.BI "Option \*qDRI\*q \*q" boolean \*q
-This option allows enabling or disabling DRI. By default, DRI is on.
-.TP
-.BI "Option \*qAGPSize\*q \*q" integer \*q
-This option allows selecting the amount of AGP memory to be used for DRI.
-The amount is to be specified in megabyte, the default is 8.
+Then you need to specify any of these amounts as the
+parameter for the
+.B \*qMaxXFBMem\*q
+option. The value is to be given without 'KB'.
.SH "KNOWN BUGS"
none.
.SH "SEE ALSO"
-__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
+XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__)
.PP
.B "http://www.winischhofer.net/linuxsisvga.shtml"
for more information and updates
diff --git a/src/300vtbl.h b/src/300vtbl.h
index 5c418bd..c058895 100644
--- a/src/300vtbl.h
+++ b/src/300vtbl.h
@@ -1,240 +1,272 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/300vtbl.h,v 1.14 2003/07/28 12:39:45 twini Exp $ */
/*
* Register settings for SiS 300 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
-static const SiS_StStruct SiS300_SModeIDTable[] =
-{
- {0x01,0x9208,0x01,0x00,0x00,0x00,0x00,0x00, 0},
- {0x01,0x1210,0x14,0x01,0x01,0x00,0x00,0x00, 0},
- {0x01,0x1010,0x17,0x02,0x02,0x00,0x00,0x00, 0},
- {0x03,0x8208,0x03,0x00,0x00,0x00,0x00,0x00, 0},
- {0x03,0x0210,0x16,0x01,0x01,0x00,0x00,0x00, 0},
- {0x03,0x0010,0x18,0x02,0x02,0x00,0x00,0x00, 0},
- {0x05,0x9209,0x05,0x00,0x00,0x00,0x00,0x00, 0},
- {0x06,0x8209,0x06,0x00,0x00,0x00,0x00,0x00, 0},
- {0x07,0x0000,0x07,0x03,0x03,0x00,0x00,0x00, 0},
- {0x07,0x0000,0x19,0x02,0x02,0x00,0x00,0x00, 0},
- {0x0d,0x920a,0x0d,0x00,0x00,0x00,0x00,0x00, 0},
- {0x0e,0x820a,0x0e,0x00,0x00,0x00,0x00,0x00, 0},
- {0x0f,0x0202,0x11,0x01,0x01,0x00,0x00,0x00, 0},
- {0x10,0x0212,0x12,0x01,0x01,0x00,0x00,0x00, 0},
- {0x11,0x0212,0x1a,0x04,0x04,0x00,0x00,0x00, 0},
- {0x12,0x0212,0x1b,0x04,0x04,0x00,0x00,0x00, 0},
- {0x13,0x021b,0x1c,0x00,0x00,0x00,0x00,0x00, 0},
- {0x12,0x0010,0x18,0x02,0x02,0x00,0x00,0x00, 0},
- {0x12,0x0210,0x18,0x01,0x01,0x00,0x00,0x00, 0},
- {0xff, 0, 0, 0, 0, 0, 0, 0, 0}
-};
-
-static const SiS_ExtStruct SiS300_EModeIDTable[] =
-{
- {0x6a,0x2212,0x0102,SIS_RI_800x600, 0x00,0x00,0x00,0x00,0x00}, /* 800x600x? */
- {0x2e,0x0a1b,0x0101,SIS_RI_640x480, 0x00,0x00,0x00,0x00,0x08},
- {0x2f,0x021b,0x0100,SIS_RI_640x400, 0x00,0x00,0x00,0x00,0x10}, /* 640x400x8 */
- {0x30,0x2a1b,0x0103,SIS_RI_800x600, 0x00,0x00,0x00,0x00,0x00},
- {0x31,0x0a1b,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x00,0x11}, /* 720x480x8 */
- {0x32,0x2a1b,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x00,0x12}, /* 720x576x8 */
- {0x33,0x0a1d,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x00,0x11}, /* 720x480x16 */
- {0x34,0x2a1d,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x00,0x12}, /* 720x576x16 */
- {0x35,0x0a1f,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x00,0x11}, /* 720x480x32 */
- {0x36,0x2a1f,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x00,0x12}, /* 720x576x32 */
- {0x37,0x0212,0x0104,SIS_RI_1024x768, 0x00,0x00,0x00,0x00,0x13}, /* 1024x768x? */
- {0x38,0x0a1b,0x0105,SIS_RI_1024x768, 0x00,0x00,0x00,0x00,0x13}, /* 1024x768x8 */
- {0x3a,0x0e3b,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
- {0x3c,0x063b,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e},
- {0x3d,0x067d,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e},
- {0x40,0x921c,0x010d,SIS_RI_320x200, 0x00,0x00,0x00,0x00,0x23}, /* 320x200x15 */
- {0x41,0x921d,0x010e,SIS_RI_320x200, 0x00,0x00,0x00,0x00,0x23}, /* 320x200x16 */
- {0x43,0x0a1c,0x0110,SIS_RI_640x480, 0x00,0x00,0x00,0x00,0x08},
- {0x44,0x0a1d,0x0111,SIS_RI_640x480, 0x00,0x00,0x00,0x00,0x08},
- {0x46,0x2a1c,0x0113,SIS_RI_800x600, 0x00,0x00,0x00,0x00,0x00}, /* 800x600x15 */
- {0x47,0x2a1d,0x0114,SIS_RI_800x600, 0x00,0x00,0x00,0x00,0x00}, /* 800x600x16 */
- {0x49,0x0a3c,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x00,0x13},
- {0x4a,0x0a3d,0x0117,SIS_RI_1024x768, 0x00,0x00,0x00,0x00,0x13},
- {0x4c,0x0e7c,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a},
- {0x4d,0x0e7d,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a},
- {0x50,0x921b,0x0132,SIS_RI_320x240, 0x00,0x00,0x00,0x00,0x24}, /* 320x240x8 */
- {0x51,0xb21b,0x0133,SIS_RI_400x300, 0x00,0x00,0x00,0x00,0x25}, /* 400x300x8 */
- {0x52,0x921b,0x0134,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x26}, /* 512x384x8 */
- {0x56,0x921d,0x0135,SIS_RI_320x240, 0x00,0x00,0x00,0x00,0x24}, /* 320x240x16 */
- {0x57,0xb21d,0x0136,SIS_RI_400x300, 0x00,0x00,0x00,0x00,0x25}, /* 400x300x16 */
- {0x58,0x921d,0x0137,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x26}, /* 512x384x16 */
- {0x59,0x921b,0x0138,SIS_RI_320x200, 0x00,0x00,0x00,0x00,0x23}, /* 320x200x8 */
- {0x5c,0x921f,0x0000,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x26}, /* 512x384x32 */
- {0x5d,0x021d,0x0139,SIS_RI_640x400, 0x00,0x00,0x00,0x00,0x10}, /* 640x400x16 */
- {0x5e,0x021f,0x0000,SIS_RI_640x400, 0x00,0x00,0x00,0x00,0x10}, /* 640x400x32 */
- {0x62,0x0a3f,0x013a,SIS_RI_640x480, 0x00,0x00,0x00,0x00,0x08},
- {0x63,0x2a3f,0x013b,SIS_RI_800x600, 0x00,0x00,0x00,0x00,0x00}, /* 800x600x32 */
- {0x64,0x0a7f,0x013c,SIS_RI_1024x768, 0x00,0x00,0x00,0x00,0x13},
- {0x65,0x0eff,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a},
- {0x66,0x06ff,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e},
- {0x68,0x067b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x27},
- {0x69,0x06fd,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x27},
- {0x6b,0x07ff,0x0000,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x27},
- {0x6c,0x067b,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x00,0x28}, /* 2048x1536x8 - not in BIOS! */
- {0x6d,0x06fd,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x00,0x28}, /* 2048x1536x16 - not in BIOS! */
- {0x70,0x2a1b,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x00,0x2d}, /* 800x480x8 */
- {0x71,0x0a1b,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x30}, /* 1024x576x8 */
- {0x74,0x0a1d,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x30}, /* 1024x576x16 */
- {0x75,0x0e3d,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x33}, /* 1280x720x16 */
- {0x76,0x2a1f,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x00,0x2d}, /* 800x480x32 */
- {0x77,0x0a3f,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x30}, /* 1024x576x32 */
- {0x78,0x0eff,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x33}, /* 1280x720x32 */
- {0x79,0x0e3b,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x33}, /* 1280x720x8 */
- {0x7a,0x2a1d,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x00,0x2d}, /* 800x480x16 */
- {0x7c,0x0a3b,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x29}, /* 1280x960x8 */
- {0x7d,0x0a7d,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x29}, /* 1280x960x16 */
- {0x7e,0x0aff,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x29}, /* 1280x960x32 */
- {0x20,0x0a1b,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x00,0x2b}, /* 1024x600 */
- {0x21,0x0a3d,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x00,0x2b},
- {0x22,0x0a7f,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x00,0x2b},
- {0x23,0x0a1b,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x00,0x2c}, /* 1152x768 */
- {0x24,0x0a3d,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x00,0x2c},
- {0x25,0x0a7f,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x00,0x2c},
- {0x29,0x0e1b,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x36}, /* 1152x864 */
- {0x2a,0x0e3d,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x36},
- {0x2b,0x0e7f,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x36},
- {0x39,0x2a1b,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x38}, /* 848x480 */
- {0x3b,0x2a3d,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x38},
- {0x3e,0x2a7f,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x38},
- {0x3f,0x2a1b,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x3a}, /* 856x480 */
- {0x42,0x2a3d,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x3a},
- {0x45,0x2a7f,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x3a},
- {0x48,0x223b,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x3c}, /* 1360x768 */
- {0x4b,0x227d,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x3c},
- {0x4e,0x22ff,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x3c},
- {0x4f,0x921f,0x0000,SIS_RI_320x200, 0x00,0x00,0x00,0x00,0x23}, /* 320x200x32 */
- {0x53,0x921f,0x0000,SIS_RI_320x240, 0x00,0x00,0x00,0x00,0x24}, /* 320x240x32 */
- {0x54,0xb21f,0x0000,SIS_RI_400x300, 0x00,0x00,0x00,0x00,0x25}, /* 400x300x32 */
- {0x55,0x2e3b,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x3d}, /* 1280x768 */
- {0x5a,0x2e7d,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x3d},
- {0x5b,0x2eff,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x3d},
- {0x5f,0x2a1b,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x00,0x3e}, /* 768x576x8 */
- {0x60,0x2a1d,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x00,0x3e}, /* 768x576x16 */
- {0x61,0x2a1f,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x00,0x3e}, /* 768x576x32 */
- {0x67,0x2e3b,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x00,0x3f}, /* 1360x1024x8 (BARCO) */
- {0x6f,0x2e7d,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x00,0x3f}, /* 1360x1024x16 (BARCO) */
- {0x72,0x2eff,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x00,0x3f}, /* 1360x1024x32 (BARCO) */
- {0xff,0x0000,0xffff,0, 0x00,0x00,0x00,0x00,0x00}
-};
-
-static const SiS_Ext2Struct SiS300_RefIndex[] =
-{
- {0x085f,0x0d,0x03,0x05,0x05,0x6a, 800, 600, 0}, /* 00 */
- {0x0467,0x0e,0x44,0x05,0x05,0x6a, 800, 600, 0}, /* 01 */
- {0x0067,0x0f,0x07,0x48,0x00,0x6a, 800, 600, 0}, /* 02 - CRT1CRTC was 0x4f */
- {0x0067,0x10,0x06,0x8b,0x00,0x6a, 800, 600, 0}, /* 03 */
- {0x0147,0x11,0x08,0x00,0x00,0x6a, 800, 600, 0}, /* 04 */
- {0x0147,0x12,0x0c,0x00,0x00,0x6a, 800, 600, 0}, /* 05 */
- {0x0047,0x11,0x4e,0x00,0x00,0x6a, 800, 600, 0}, /* 06 - CRT1CRTC was 0x51 */
- {0x0047,0x11,0x13,0x00,0x00,0x6a, 800, 600, 0}, /* 07 */
- {0xc85f,0x05,0x00,0x04,0x04,0x2e, 640, 480, 0}, /* 08 */
- {0xc067,0x06,0x02,0x04,0x04,0x2e, 640, 480, 0}, /* 09 */
- {0xc067,0x07,0x02,0x47,0x04,0x2e, 640, 480, 0}, /* 0a */
- {0xc067,0x08,0x03,0x8a,0x04,0x2e, 640, 480, 0}, /* 0b */
- {0xc047,0x09,0x05,0x00,0x00,0x2e, 640, 480, 0}, /* 0c */
- {0xc047,0x0a,0x08,0x00,0x00,0x2e, 640, 480, 0}, /* 0d */
- {0xc047,0x0b,0x0a,0x00,0x00,0x2e, 640, 480, 0}, /* 0e */
- {0xc047,0x0c,0x10,0x00,0x00,0x2e, 640, 480, 0}, /* 0f */
- {0x487f,0x04,0x00,0x00,0x00,0x2f, 640, 400, 0}, /* 10 */
- {0xc04f,0x31,0x01,0x06,0x00,0x31, 720, 480, 0}, /* 11 */
- {0x004f,0x32,0x03,0x06,0x00,0x32, 720, 576, 0}, /* 12 */
- {0x0187,0x15,0x05,0x00,0x00,0x37,1024, 768, 0}, /* 13 */
- {0xc877,0x16,0x09,0x06,0x06,0x37,1024, 768, 0}, /* 14 */
- {0xc067,0x17,0x0b,0x49,0x06,0x37,1024, 768, 0}, /* 15 - CRT1CRTC was 0x97 */
- {0x0267,0x18,0x0d,0x00,0x06,0x37,1024, 768, 0}, /* 16 */
- {0x0047,0x19,0x11,0x8c,0x00,0x37,1024, 768, 0}, /* 17 - CRT1CRTC was 0x59 */
- {0x0047,0x1a,0x52,0x00,0x00,0x37,1024, 768, 0}, /* 18 */
- {0x0007,0x1b,0x16,0x00,0x00,0x37,1024, 768, 0}, /* 19 - CRT1CRTC was 0x5b */
- {0x0387,0x1c,0x4d,0x00,0x00,0x3a,1280,1024, 0}, /* 1a - CRT1CRTC was 0x5c */
- {0x0077,0x1d,0x14,0x07,0x00,0x3a,1280,1024, 0}, /* 1b */
- {0x0047,0x1e,0x17,0x00,0x00,0x3a,1280,1024, 0}, /* 1c */
- {0x0007,0x1f,0x98,0x00,0x00,0x3a,1280,1024, 0}, /* 1d */
- {0x0007,0x20,0x59,0x00,0x00,0x3c,1600,1200, 0}, /* 1e - CRT1CRTC was 0x60 */
- {0x0007,0x21,0x5a,0x00,0x00,0x3c,1600,1200, 0}, /* 1f */
- {0x0007,0x22,0x1b,0x00,0x00,0x3c,1600,1200, 0}, /* 20 */
- {0x0007,0x23,0x1d,0x00,0x00,0x3c,1600,1200, 0}, /* 21 - CRT1CRTC was 0x63 */
- {0x0007,0x24,0x1e,0x00,0x00,0x3c,1600,1200, 0}, /* 22 */
- {0x407f,0x00,0x00,0x00,0x00,0x40, 320, 200, 0}, /* 23 */
- {0xc07f,0x01,0x00,0x04,0x04,0x50, 320, 240, 0}, /* 24 */
- {0x0077,0x02,0x04,0x05,0x05,0x51, 400, 300, 0}, /* 25 */
- {0xc877,0x03,0x09,0x06,0x06,0x52, 512, 384, 0}, /* 26 */ /* was c077 */
- {0x8207,0x25,0x1f,0x00,0x00,0x68,1920,1440, 0}, /* 27 */
- {0x0007,0x26,0x20,0x00,0x00,0x6c,2048,1536, 0}, /* 28 */
- {0x0067,0x27,0x14,0x08,0x0a,0x6e,1280, 960, 0}, /* 29 - 1280x960-60 */
- {0x0027,0x45,0x3c,0x08,0x0a,0x6e,1280, 960, 0}, /* 2a - 1280x960-85 */
- {0xc077,0x33,0x09,0x06,0x00,0x20,1024, 600, 0}, /* 2b */
- {0xc077,0x34,0x0b,0x06,0x00,0x23,1152, 768, 0}, /* 2c */ /* VCLK 0x09 */
- {0x0057,0x35,0x27,0x08,0x00,0x70, 800, 480, 0}, /* 2d */
- {0x0047,0x36,0x37,0x08,0x00,0x70, 800, 480, 0}, /* 2e */
- {0x0047,0x37,0x08,0x08,0x00,0x70, 800, 480, 0}, /* 2f */
- {0x0057,0x38,0x09,0x09,0x00,0x71,1024, 576, 0}, /* 30 */
- {0x0047,0x39,0x38,0x09,0x00,0x71,1024, 576, 0}, /* 31 */
- {0x0047,0x3a,0x11,0x09,0x00,0x71,1024, 576, 0}, /* 32 */
- {0x0057,0x3b,0x39,0x0a,0x00,0x75,1280, 720, 0}, /* 33 */
- {0x0047,0x3c,0x3a,0x0a,0x00,0x75,1280, 720, 0}, /* 34 */
- {0x0007,0x3d,0x3b,0x0a,0x00,0x75,1280, 720, 0}, /* 35 */
- {0x0047,0x3e,0x34,0x06,0x00,0x29,1152, 864, 0}, /* 36 1152x864-75Hz */
- {0x0047,0x44,0x3a,0x06,0x00,0x29,1152, 864, 0}, /* 37 1152x864-85Hz */
- {0x00c7,0x3f,0x28,0x00,0x00,0x39, 848, 480, 0}, /* 38 848x480-38Hzi */
- {0xc067,0x40,0x3d,0x0b,0x0b,0x39, 848, 480, 0}, /* 39 848x480-60Hz */
- {0x00c7,0x41,0x28,0x00,0x00,0x3f, 856, 480, 0}, /* 3a 856x480-38Hzi */
- {0xc047,0x42,0x28,0x00,0x00,0x3f, 856, 480, 0}, /* 3b 856x480-60Hz */
- {0x0067,0x43,0x3e,0x0c,0x0b,0x48,1360, 768, 0}, /* 3c 1360x768-60Hz */
- {0x0077,0x46,0x3f,0x08,0x00,0x55,1280, 768, 0}, /* 3d 1280x768-60Hz */
- {0x004f,0x47,0x03,0x06,0x00,0x5f, 768, 576, 0}, /* 3e 768x576 */
- {0x0027,0x48,0x13,0x08,0x08,0x67,1360,1024, 0}, /* 3f 1360x1024-59Hz (BARCO1366 only) */
- {0xffff, 0, 0, 0, 0, 0, 0, 0, 0}
-};
-
-static const SiS_VBModeStruct SiS300_VBModeIDTable[] =
+typedef struct _SiS300_StStruct
+{
+ UCHAR St_ModeID;
+ USHORT St_ModeFlag;
+ UCHAR St_StTableIndex;
+ UCHAR St_CRT2CRTC;
+ UCHAR St_ResInfo;
+ UCHAR VB_StTVFlickerIndex;
+ UCHAR VB_StTVEdgeIndex;
+ UCHAR VB_StTVYFilterIndex;
+} SiS300_StStruct;
+
+static const SiS300_StStruct SiS300_SModeIDTable[] =
+{
+ {0x01,0x9208,0x01,0x00,0x00,0x00,0x00,0x00},
+ {0x01,0x1210,0x14,0x01,0x01,0x00,0x00,0x00},
+ {0x01,0x1010,0x17,0x02,0x02,0x00,0x00,0x00},
+ {0x03,0x8208,0x03,0x00,0x00,0x00,0x00,0x00},
+ {0x03,0x0210,0x16,0x01,0x01,0x00,0x00,0x00},
+ {0x03,0x0010,0x18,0x02,0x02,0x00,0x00,0x00},
+ {0x05,0x9209,0x05,0x00,0x00,0x00,0x00,0x00},
+ {0x06,0x8209,0x06,0x00,0x00,0x00,0x00,0x00},
+ {0x07,0x0000,0x07,0x03,0x03,0x00,0x00,0x00},
+ {0x07,0x0000,0x19,0x02,0x02,0x00,0x00,0x00},
+ {0x0d,0x920a,0x0d,0x00,0x00,0x00,0x00,0x00},
+ {0x0e,0x820a,0x0e,0x00,0x00,0x00,0x00,0x00},
+ {0x0f,0x0202,0x11,0x01,0x01,0x00,0x00,0x00},
+ {0x10,0x0212,0x12,0x01,0x01,0x00,0x00,0x00},
+ {0x11,0x0212,0x1a,0x04,0x04,0x00,0x00,0x00},
+ {0x12,0x0212,0x1b,0x04,0x04,0x00,0x00,0x00},
+ {0x13,0x021b,0x1c,0x00,0x00,0x00,0x00,0x00},
+ {0x12,0x0010,0x18,0x02,0x02,0x00,0x00,0x00},
+ {0x12,0x0210,0x18,0x01,0x01,0x00,0x00,0x00},
+ {0xff, 0, 0, 0, 0, 0, 0, 0}
+};
+
+typedef struct _SiS300_ExtStruct
+{
+ UCHAR Ext_ModeID;
+ USHORT Ext_ModeFlag;
+ USHORT Ext_ModeInfo;
+ USHORT Ext_VESAID;
+ UCHAR Ext_RESINFO;
+ UCHAR VB_ExtTVFlickerIndex;
+ UCHAR VB_ExtTVEdgeIndex;
+ UCHAR VB_ExtTVYFilterIndex;
+ UCHAR REFindex;
+} SiS300_ExtStruct;
+
+static const SiS300_ExtStruct SiS300_EModeIDTable[] =
+{
+ {0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600, 0x00,0x00,0x00,0x00}, /* 800x600x? */
+ {0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480, 0x00,0x00,0x00,0x08},
+ {0x2f,0x021b,0x0305,0x0100,SIS_RI_640x400, 0x00,0x00,0x00,0x10}, /* 640x400x8 */
+ {0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600, 0x00,0x00,0x00,0x00},
+ {0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x11}, /* 720x480x8 */
+ {0x32,0x2a1b,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x12}, /* 720x576x8 */
+ {0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x11}, /* 720x480x16 */
+ {0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x12}, /* 720x576x16 */
+ {0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x00,0x11}, /* 720x480x32 */
+ {0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x00,0x12}, /* 720x576x32 */
+ {0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x00,0x13}, /* 1024x768x? */
+ {0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x00,0x13}, /* 1024x768x8 */
+ {0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
+ {0x3c,0x063b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
+ {0x3d,0x067d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
+ {0x40,0x921c,0x0000,0x010d,SIS_RI_320x200, 0x00,0x00,0x00,0x23}, /* 320x200x15 */
+ {0x41,0x921d,0x0000,0x010e,SIS_RI_320x200, 0x00,0x00,0x00,0x23}, /* 320x200x16 */
+ {0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480, 0x00,0x00,0x00,0x08},
+ {0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480, 0x00,0x00,0x00,0x08},
+ {0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600, 0x00,0x00,0x00,0x00}, /* 800x600x15 */
+ {0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600, 0x00,0x00,0x00,0x00}, /* 800x600x16 */
+ {0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
+ {0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
+ {0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
+ {0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
+ {0x50,0x921b,0x0001,0x0132,SIS_RI_320x240, 0x00,0x00,0x00,0x24}, /* 320x240x8 */
+ {0x51,0xb21b,0x0103,0x0133,SIS_RI_400x300, 0x00,0x00,0x00,0x25}, /* 400x300x8 */
+ {0x52,0x921b,0x0204,0x0134,SIS_RI_512x384, 0x00,0x00,0x00,0x26}, /* 512x384x8 */
+ {0x56,0x921d,0x0001,0x0135,SIS_RI_320x240, 0x00,0x00,0x00,0x24}, /* 320x240x16 */
+ {0x57,0xb21d,0x0103,0x0136,SIS_RI_400x300, 0x00,0x00,0x00,0x25}, /* 400x300x16 */
+ {0x58,0x921d,0x0204,0x0137,SIS_RI_512x384, 0x00,0x00,0x00,0x26}, /* 512x384x16 */
+ {0x59,0x921b,0x0000,0x0138,SIS_RI_320x200, 0x00,0x00,0x00,0x23}, /* 320x200x8 */
+ {0x5c,0x921f,0x0204,0x0000,SIS_RI_512x384, 0x00,0x00,0x00,0x26}, /* 512x384x32 */
+ {0x5d,0x021d,0x0305,0x0139,SIS_RI_640x400, 0x00,0x00,0x00,0x10}, /* 640x400x16 */
+ {0x5e,0x021f,0x0305,0x0000,SIS_RI_640x400, 0x00,0x00,0x00,0x10}, /* 640x400x32 */
+ {0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480, 0x00,0x00,0x00,0x08},
+ {0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600, 0x00,0x00,0x00,0x00}, /* 800x600x32 */
+ {0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
+ {0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
+ {0x66,0x06ff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e},
+ {0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
+ {0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
+ {0x6b,0x07ff,0x080b,0x0000,SIS_RI_1920x1440,0x00,0x00,0x00,0x27},
+ {0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28}, /* 2048x1536x8 - not in BIOS! */
+ {0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x28}, /* 2048x1536x16 - not in BIOS! */
+ {0x70,0x2a1b,0x0400,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x2d}, /* 800x480x8 */
+ {0x71,0x0a1b,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30}, /* 1024x576x8 */
+ {0x74,0x0a1d,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30}, /* 1024x576x16 */
+ {0x75,0x0e3d,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33}, /* 1280x720x16 */
+ {0x76,0x2a1f,0x0400,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x2d}, /* 800x480x32 */
+ {0x77,0x0a3f,0x0501,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x30}, /* 1024x576x32 */
+ {0x78,0x0eff,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33}, /* 1280x720x32 */
+ {0x79,0x0e3b,0x0602,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x33}, /* 1280x720x8 */
+ {0x7a,0x2a1d,0x0400,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x2d}, /* 800x480x16 */
+ {0x7c,0x0a3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29}, /* 1280x960x8 */
+ {0x7d,0x0a7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29}, /* 1280x960x16 */
+ {0x7e,0x0aff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x29}, /* 1280x960x32 */
+ {0x20,0x0a1b,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b}, /* 1024x600 */
+ {0x21,0x0a3d,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
+ {0x22,0x0a7f,0x0504,0x0000,SIS_RI_1024x600, 0x00,0x00,0x00,0x2b},
+ {0x23,0x0a1b,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c}, /* 1152x768 */
+ {0x24,0x0a3d,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
+ {0x25,0x0a7f,0x0c05,0x0000,SIS_RI_1152x768, 0x00,0x00,0x00,0x2c},
+ {0x29,0x0e1b,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36}, /* 1152x864 */
+ {0x2a,0x0e3d,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
+ {0x2b,0x0e7f,0x0c05,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x36},
+ {0x39,0x2a1b,0x0d06,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x38}, /* 848x480 */
+ {0x3b,0x2a3d,0x0d06,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x38},
+ {0x3e,0x2a7f,0x0d06,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x38},
+ {0x3f,0x2a1b,0x0d07,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x3a}, /* 856x480 */
+ {0x42,0x2a3d,0x0d07,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x3a},
+ {0x45,0x2a7f,0x0d07,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x3a},
+ {0x48,0x223b,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c}, /* 1360x768 */
+ {0x4b,0x227d,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
+ {0x4e,0x22ff,0x0e08,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x3c},
+ {0x4f,0x921f,0x0000,0x0000,SIS_RI_320x200, 0x00,0x00,0x00,0x23}, /* 320x200x32 */
+ {0x53,0x921f,0x0001,0x0000,SIS_RI_320x240, 0x00,0x00,0x00,0x24}, /* 320x240x32 */
+ {0x54,0xb21f,0x0103,0x0000,SIS_RI_400x300, 0x00,0x00,0x00,0x25}, /* 400x300x32 */
+ {0x55,0x2e3b,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d}, /* 1280x768 */
+ {0x5a,0x2e7d,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
+ {0x5b,0x2eff,0x0609,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x3d},
+ {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x3e}, /* 768x576x8 */
+ {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x3e}, /* 768x576x16 */
+ {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x3e}, /* 768x576x32 */
+ {0x67,0x2e3b,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f}, /* 1360x1024x8 (BARCO) */
+ {0x6f,0x2e7d,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f}, /* 1360x1024x16 (BARCO) */
+ {0x72,0x2eff,0x0e08,0x0000,SIS_RI_1360x1024,0x00,0x00,0x00,0x3f}, /* 1360x1024x32 (BARCO) */
+ {0xff,0x0000,0x0000,0xffff,0x00, 0x00,0x00,0x00,0x00}
+};
+
+typedef struct _SiS300_Ext2Struct
+{
+ USHORT Ext_InfoFlag;
+ UCHAR Ext_CRT1CRTC; /* TW: Index in SiS300_CRT1Table */
+ UCHAR Ext_CRTVCLK; /* TW: Index in VCLK array */
+ UCHAR Ext_CRT2CRTC; /* TW: Index in LCD Paneltype arrays (&3f) */
+ UCHAR ModeID;
+ USHORT XRes;
+ USHORT YRes;
+} SiS300_Ext2Struct;
+
+static const SiS300_Ext2Struct SiS300_RefIndex[] =
+{ /* TW: Don't ever insert anything here, table is indexed */
+ {0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 00 */
+ {0x0467,0x0e,0x44,0x05,0x6a, 800, 600}, /* 01 */
+ {0x0067,0x0f,0x07,0x48,0x6a, 800, 600}, /* 02 - CRT1CRTC was 0x4f */
+ {0x0067,0x10,0x06,0x8b,0x6a, 800, 600}, /* 03 */
+ {0x0147,0x11,0x08,0x00,0x6a, 800, 600}, /* 04 */
+ {0x0147,0x12,0x0c,0x00,0x6a, 800, 600}, /* 05 */
+ {0x0047,0x11,0x4e,0x00,0x6a, 800, 600}, /* 06 - CRT1CRTC was 0x51 */
+ {0x0047,0x11,0x13,0x00,0x6a, 800, 600}, /* 07 */
+ {0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 08 */
+ {0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 09 */
+ {0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0a */
+ {0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0b */
+ {0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0c */
+ {0xc047,0x0a,0x08,0x00,0x2e, 640, 480}, /* 0d */
+ {0xc047,0x0b,0x0a,0x00,0x2e, 640, 480}, /* 0e */
+ {0xc047,0x0c,0x10,0x00,0x2e, 640, 480}, /* 0f */
+ {0x487f,0x04,0x00,0x00,0x2f, 640, 400}, /* 10 */
+ {0xc00f,0x31,0x01,0x06,0x31, 720, 480}, /* 11 */
+ {0x000f,0x32,0x03,0x06,0x32, 720, 576}, /* 12 */
+ {0x0187,0x15,0x05,0x00,0x37,1024, 768}, /* 13 */
+ {0xc877,0x16,0x09,0x06,0x37,1024, 768}, /* 14 */
+ {0xc067,0x17,0x0b,0x49,0x37,1024, 768}, /* 15 - CRT1CRTC was 0x97 */
+ {0x0267,0x18,0x0d,0x00,0x37,1024, 768}, /* 16 */
+ {0x0047,0x19,0x11,0x8c,0x37,1024, 768}, /* 17 - CRT1CRTC was 0x59 */
+ {0x0047,0x1a,0x52,0x00,0x37,1024, 768}, /* 18 */
+ {0x0007,0x1b,0x16,0x00,0x37,1024, 768}, /* 19 - CRT1CRTC was 0x5b */
+ {0x0387,0x1c,0x4d,0x00,0x3a,1280,1024}, /* 1a - CRT1CRTC was 0x5c */
+ {0x0077,0x1d,0x14,0x07,0x3a,1280,1024}, /* 1b */
+ {0x0047,0x1e,0x17,0x00,0x3a,1280,1024}, /* 1c */
+ {0x0007,0x1f,0x98,0x00,0x3a,1280,1024}, /* 1d */
+ {0x0007,0x20,0x59,0x00,0x3c,1600,1200}, /* 1e - CRT1CRTC was 0x60 */
+ {0x0007,0x21,0x5a,0x00,0x3c,1600,1200}, /* 1f */
+ {0x0007,0x22,0x1b,0x00,0x3c,1600,1200}, /* 20 */
+ {0x0007,0x23,0x1d,0x00,0x3c,1600,1200}, /* 21 - CRT1CRTC was 0x63 */
+ {0x0007,0x24,0x1e,0x00,0x3c,1600,1200}, /* 22 */
+ {0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 23 */
+ {0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 24 */
+ {0x0077,0x02,0x04,0x05,0x51, 400, 300}, /* 25 */
+ {0xc877,0x03,0x09,0x06,0x52, 512, 384}, /* 26 */ /* was c077 */
+ {0x8207,0x25,0x1f,0x00,0x68,1920,1440}, /* 27 */
+ {0x0007,0x26,0x20,0x00,0x6c,2048,1536}, /* 28 */
+ {0x0067,0x27,0x14,0x08,0x6e,1280, 960}, /* 29 - TW: 1280x960-60 */
+ {0x0027,0x45,0x3c,0x08,0x6e,1280, 960}, /* 2a - TW: 1280x960-85 */
+ {0xc077,0x33,0x09,0x06,0x20,1024, 600}, /* 2b */
+ {0xc077,0x34,0x0b,0x06,0x23,1152, 768}, /* 2c */ /* VCLK 0x09 */
+ {0x0057,0x35,0x27,0x08,0x70, 800, 480}, /* 2d */
+ {0x0047,0x36,0x37,0x08,0x70, 800, 480}, /* 2e */
+ {0x0047,0x37,0x08,0x08,0x70, 800, 480}, /* 2f */
+ {0x0057,0x38,0x09,0x09,0x71,1024, 576}, /* 30 */
+ {0x0047,0x39,0x38,0x09,0x71,1024, 576}, /* 31 */
+ {0x0047,0x3a,0x11,0x09,0x71,1024, 576}, /* 32 */
+ {0x0057,0x3b,0x39,0x0a,0x75,1280, 720}, /* 33 */
+ {0x0047,0x3c,0x3a,0x0a,0x75,1280, 720}, /* 34 */
+ {0x0007,0x3d,0x3b,0x0a,0x75,1280, 720}, /* 35 */
+ {0x0047,0x3e,0x34,0x06,0x29,1152, 864}, /* 36 1152x864-75Hz */
+ {0x0047,0x44,0x3a,0x06,0x29,1152, 864}, /* 37 1152x864-85Hz */
+ {0x00c7,0x3f,0x28,0x00,0x39, 848, 480}, /* 38 848x480-38Hzi */
+ {0xc067,0x40,0x3d,0x0b,0x39, 848, 480}, /* 39 848x480-60Hz */
+ {0x00c7,0x41,0x28,0x00,0x3f, 856, 480}, /* 3a 856x480-38Hzi */
+ {0xc047,0x42,0x28,0x00,0x3f, 856, 480}, /* 3b 856x480-60Hz */
+ {0x0067,0x43,0x3e,0x0c,0x48,1360, 768}, /* 3c 1360x768-60Hz */
+ {0x0077,0x46,0x3f,0x08,0x55,1280, 768}, /* 3d 1280x768-60Hz */
+ {0x000f,0x47,0x03,0x06,0x5f, 768, 576}, /* 3e 768x576 */
+ {0x0027,0x48,0x13,0x08,0x67,1360,1024}, /* 3f 1360x1024-59Hz (BARCO1366 only) */
+ {0xffff, 0, 0, 0, 0, 0, 0}
+};
+
+typedef struct _SiS_VBModeIDTableStruct
+{
+ UCHAR ModeID;
+ UCHAR VB_TVDelayIndex;
+ UCHAR VB_TVFlickerIndex;
+ UCHAR VB_TVPhaseIndex;
+ UCHAR VB_TVYFilterIndex;
+ UCHAR VB_LCDDelayIndex;
+ UCHAR _VB_LCDHIndex;
+ UCHAR _VB_LCDVIndex;
+}SiS_VBModeIDTableStruct;
+
+static const SiS_VBModeIDTableStruct SiS300_VBModeIDTable[] =
{
{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01},
@@ -259,10 +291,6 @@ static const SiS_VBModeStruct SiS300_VBModeIDTable[] =
{0x30,0x00,0x00,0x01,0x07,0x00,0x08,0x0a},
{0x31,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
{0x32,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x33,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x34,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x35,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x36,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
{0x37,0x00,0x00,0x01,0x00,0x00,0x0a,0x0c},
{0x38,0x00,0x00,0x01,0x00,0x00,0x0a,0x0c},
{0x3a,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
@@ -276,32 +304,30 @@ static const SiS_VBModeStruct SiS300_VBModeIDTable[] =
{0x4a,0x00,0x00,0x01,0x00,0x00,0x0a,0x0c},
{0x4c,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
{0x4d,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
- {0x4f,0x00,0x00,0x01,0x04,0x00,0x05,0x05},
{0x50,0x00,0x00,0x01,0x04,0x00,0x05,0x07},
{0x51,0x00,0x00,0x01,0x07,0x00,0x07,0x09},
{0x52,0x00,0x00,0x01,0x00,0x00,0x09,0x0b},
- {0x53,0x00,0x00,0x01,0x04,0x00,0x05,0x07},
- {0x54,0x00,0x00,0x01,0x07,0x00,0x07,0x09},
{0x56,0x00,0x00,0x01,0x04,0x00,0x05,0x07},
{0x57,0x00,0x00,0x01,0x07,0x00,0x07,0x09},
{0x58,0x00,0x00,0x01,0x00,0x00,0x09,0x0b},
{0x59,0x00,0x00,0x01,0x04,0x00,0x05,0x05},
- {0x5c,0x00,0x00,0x01,0x00,0x00,0x09,0x0b},
- {0x5d,0x00,0x00,0x01,0x05,0x00,0x06,0x06},
- {0x5e,0x00,0x00,0x01,0x05,0x00,0x06,0x06},
- {0x5f,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x60,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
- {0x61,0x00,0x00,0x01,0x06,0x00,0x00,0x00},
+ {0x5d,0x00,0x00,0x01,0x07,0x00,0x06,0x06},
{0x62,0x00,0x00,0x01,0x05,0x00,0x06,0x08},
{0x63,0x00,0x00,0x01,0x07,0x00,0x08,0x0a},
{0x64,0x00,0x00,0x01,0x00,0x00,0x0a,0x0c},
{0x65,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
- {0x6c,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
- {0x6d,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+ {0x6e,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+ {0x6f,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
+ {0x7b,0x00,0x00,0x01,0x00,0x00,0x0b,0x0d},
{0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};
-static const SiS_CRT1TableStruct SiS300_CRT1Table[] =
+typedef struct _SiS300_CRT1TableStruct
+{
+ UCHAR CR[17];
+} SiS300_CRT1TableStruct;
+
+static const SiS300_CRT1TableStruct SiS300_CRT1Table[] =
{
#if 1
{{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f, /* 0x00 - 320x200 */
@@ -566,7 +592,13 @@ static const SiS_CRT1TableStruct SiS300_CRT1Table[] =
0x00}} /* 0x48 */
};
-static const SiS_MCLKDataStruct SiS300_MCLKData_630[] =
+typedef struct _SiS300_MCLKDataStruct
+{
+ UCHAR SR28,SR29,SR2A;
+ USHORT CLOCK;
+} SiS300_MCLKDataStruct;
+
+static const SiS300_MCLKDataStruct SiS300_MCLKData_630[] =
{
{ 0x5a,0x64,0x80, 66},
{ 0xb3,0x45,0x80, 83},
@@ -578,7 +610,7 @@ static const SiS_MCLKDataStruct SiS300_MCLKData_630[] =
{ 0x37,0x61,0x80,100}
};
-static const SiS_MCLKDataStruct SiS300_MCLKData_300[] =
+static const SiS300_MCLKDataStruct SiS300_MCLKData_300[] =
{
{ 0x68,0x43,0x80,125},
{ 0x68,0x43,0x80,125},
@@ -590,7 +622,33 @@ static const SiS_MCLKDataStruct SiS300_MCLKData_300[] =
{ 0x37,0x61,0x80,100}
};
-static SiS_VCLKDataStruct SiS300_VCLKData[] =
+#ifdef LINUXBIOS
+typedef struct _SiS300_ECLKDataStruct
+{
+ UCHAR SR2E,SR2F,SR30;
+ USHORT CLOCK;
+} SiS300_ECLKDataStruct;
+
+static const SiS300_ECLKDataStruct SiS300_ECLKData[] =
+{
+ { 0x54,0x43,0x80,100},
+ { 0x53,0x43,0x80,100},
+ { 0x55,0x43,0x80,100},
+ { 0x52,0x43,0x80,100},
+ { 0x3f,0x42,0x80,100},
+ { 0x54,0x43,0x80,100},
+ { 0x54,0x43,0x80,100},
+ { 0x54,0x43,0x80,100}
+};
+#endif
+
+typedef struct _SiS300_VCLKDataStruct
+{
+ UCHAR SR2B,SR2C;
+ USHORT CLOCK;
+} SiS300_VCLKDataStruct;
+
+static const SiS300_VCLKDataStruct SiS300_VCLKData[] =
{
{ 0x1b,0xe1, 25}, /* 0x00 */
{ 0x4e,0xe4, 28}, /* 0x01 */
@@ -664,15 +722,75 @@ static SiS_VCLKDataStruct SiS300_VCLKData[] =
{ 0xa1,0x42,108}, /* 0x42 */ /* 1280x960 LCD */
{ 0x37,0x61,100}, /* 0x43 */ /* 1280x960 LCD */
{ 0xe3,0x9a,106}, /* 0x44 */ /* 1360x1024 - special for Barco iQ R300 */
- { 0xe2,0x46,135}, /* 0x45 */ /* 1280x1024-75, better clock for VGA2 */
- { 0, 0, 0} /* 0x46 custom (will be filled out) */
+ { 0xff,0x00, 0}
+};
+
+#if 0 /* TW: This table is in all BIOSes, but not used */
+static const SiS300_VCLKDataStruct SiS300_VBVCLKData[] =
+{
+ { 0x1b,0xe1, 25},
+ { 0x4e,0xe4, 28},
+ { 0x57,0xe4, 31},
+ { 0xc3,0xc8, 36},
+ { 0x42,0x47, 40},
+ { 0x5d,0xc4, 44},
+ { 0x52,0x47, 49},
+ { 0x53,0x47, 50},
+ { 0x6d,0x66, 56},
+ { 0x5a,0x64, 65},
+ { 0x46,0x44, 67},
+ { 0x29,0x61, 75},
+ { 0x6d,0x46, 75},
+ { 0x41,0x43, 78},
+ { 0x31,0x42, 79},
+ { 0x46,0x25, 84},
+ { 0x78,0x29, 86}, /* 0x10 */
+ { 0x62,0x44, 94},
+ { 0x2b,0x22,104},
+ { 0x49,0x24,105},
+ { 0x43,0x42,108},
+ { 0x3c,0x23,109},
+ { 0xe0,0x46,132},
+ { 0x70,0x25,135},
+ { 0x41,0x22,157},
+ { 0x43,0x22,162},
+ { 0x30,0x21,175},
+ { 0xc1,0x24,189},
+ { 0xde,0x26,194},
+ { 0x70,0x07,202},
+ { 0x3f,0x03,229},
+ { 0x30,0x02,234}, /* 0x1f */
+ { 0x24,0x01,265}, /* 0x20 */
+ { 0x52,0x2a, 54},
+ { 0x52,0x6a, 27},
+ { 0x62,0x24, 70},
+ { 0x62,0x64, 70},
+ { 0xa8,0x4c, 30},
+ { 0x20,0x26, 33},
+ { 0x31,0xc2, 39},
+ { 0x2e,0x48, 25}, /* 0x28 */
+ { 0x24,0x46, 25}, /* 0x29 */
+ { 0x26,0x64, 28},
+ { 0x37,0x64, 40},
+ { 0xa1,0x42,108},
+ { 0x37,0x61,100},
+ { 0x78,0x27,108},
+ { 0xff,0x00, 0}
+};
+#endif
+
+static const UCHAR SiS300_ScreenOffset[] =
+{
+ 0x14,0x19,0x20,0x28,0x32,0x40,0x50,
+ 0x64,0x78,0x80,0x2d,0x35,0x48,0x35,
+ 0x55,0x30,0xff
};
#ifndef LINUX_XF86
static UCHAR SiS300_SR07 = 0x10;
#endif
-static const DRAM4Type SiS300_SR15[8] =
+static const UCHAR SiS300_SR15[8][4] =
{
{0x01,0x09,0xa3,0x00},
{0x43,0x43,0x43,0x00},
@@ -706,12 +824,17 @@ static const USHORT SiS300_RGBSenseData2 = 0x0190;
static const USHORT SiS300_VideoSenseData2 = 0x0174;
static const USHORT SiS300_YCSenseData2 = 0x016b;
-static const DRAM4Type SiS300_CR40[5];
+static const UCHAR SiS300_CR40[5][4];
static UCHAR SiS300_CR49[2];
#endif
-static const SiS_PanelDelayTblStruct SiS300_PanelDelayTbl[] =
+typedef struct _SiS300_PanelDelayTblStruct
+{
+ UCHAR timer[2];
+} SiS300_PanelDelayTblStruct;
+
+static const SiS300_PanelDelayTblStruct SiS300_PanelDelayTbl[] =
{
{{0x05,0xaa}},
{{0x05,0x14}},
@@ -731,8 +854,7 @@ static const SiS_PanelDelayTblStruct SiS300_PanelDelayTbl[] =
{{0x05,0x60}}
};
-#if 0
-static const SiS_PanelDelayTblStruct SiS300_PanelDelayTblLVDS[] =
+static const SiS300_PanelDelayTblStruct SiS300_PanelDelayTblLVDS[] =
{
{{0x05,0xaa}},
{{0x05,0x14}},
@@ -751,24 +873,29 @@ static const SiS_PanelDelayTblStruct SiS300_PanelDelayTblLVDS[] =
{{0x05,0x14}}, /* Some BIOSes: 05, 40 */
{{0x05,0x60}}
};
-#endif
-/**************************************************************/
-/* SIS VIDEO BRIDGE ----------------------------------------- */
-/**************************************************************/
+typedef struct _SiS300_LCDDataStruct
+{
+ USHORT RVBHCMAX;
+ USHORT RVBHCFACT;
+ USHORT VGAHT;
+ USHORT VGAVT;
+ USHORT LCDHT;
+ USHORT LCDVT;
+} SiS300_LCDDataStruct;
-static const SiS_LCDDataStruct SiS300_St2LCD1024x768Data[] =
+static const SiS300_LCDDataStruct SiS300_StLCD1024x768Data[] =
{
- { 62, 25, 800, 546,1344, 806},
- { 32, 15, 930, 546,1344, 806},
- { 32, 15, 930, 546,1344, 806},
- { 104, 45, 945, 496,1344, 806},
- { 62, 25, 800, 546,1344, 806},
- { 31, 18,1008, 624,1344, 806},
+ { 66, 31, 992, 510,1320, 816},
+ { 66, 31, 992, 510,1320, 816},
+ { 176, 75, 900, 510,1320, 816},
+ { 176, 75, 900, 510,1320, 816},
+ { 66, 31, 992, 510,1320, 816},
+ { 27, 16,1024, 650,1350, 832},
{ 1, 1,1344, 806,1344, 806}
};
-static const SiS_LCDDataStruct SiS300_ExtLCD1024x768Data[] =
+static const SiS300_LCDDataStruct SiS300_ExtLCD1024x768Data[] =
{
{ 12, 5, 896, 512,1344, 806},
{ 12, 5, 896, 510,1344, 806},
@@ -785,19 +912,30 @@ static const SiS_LCDDataStruct SiS300_ExtLCD1024x768Data[] =
{ 1, 1,1344, 806,1344, 806}
};
-static const SiS_LCDDataStruct SiS300_St2LCD1280x1024Data[] =
+static const SiS300_LCDDataStruct SiS300_St2LCD1024x768Data[] =
{
- { 22, 5, 800, 510,1650,1088},
- { 22, 5, 800, 510,1650,1088},
+ { 62, 25, 800, 546,1344, 806},
+ { 32, 15, 930, 546,1344, 806},
+ { 32, 15, 930, 546,1344, 806},
+ { 104, 45, 945, 496,1344, 806},
+ { 62, 25, 800, 546,1344, 806},
+ { 31, 18,1008, 624,1344, 806},
+ { 1, 1,1344, 806,1344, 806}
+};
+
+static const SiS300_LCDDataStruct SiS300_StLCD1280x1024Data[] =
+{
+ { 4, 1, 880, 510,1650,1088},
+ { 4, 1, 880, 510,1650,1088},
{ 176, 45, 900, 510,1650,1088},
{ 176, 45, 900, 510,1650,1088},
- { 22, 5, 800, 510,1650,1088},
+ { 4, 1, 880, 510,1650,1088},
{ 13, 5,1024, 675,1560,1152},
{ 16, 9,1266, 804,1688,1072},
{ 1, 1,1688,1066,1688,1066}
};
-static const SiS_LCDDataStruct SiS300_ExtLCD1280x1024Data[] =
+static const SiS300_LCDDataStruct SiS300_ExtLCD1280x1024Data[] =
{
{ 211, 60,1024, 501,1688,1066},
{ 211, 60,1024, 508,1688,1066},
@@ -809,53 +947,51 @@ static const SiS_LCDDataStruct SiS300_ExtLCD1280x1024Data[] =
{ 1, 1,1688,1066,1688,1066}
};
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1024x768_1[] =
-{ /* VESA Timing */
- {{0x21,0x12,0xbf,0xe4,0xc0,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
- {{0x2c,0x12,0x9a,0xae,0x88,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
- {{0x21,0x12,0xbf,0xe4,0xc0,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
- {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}},
- {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}},
- {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}}
-};
-
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1024x768_2[] =
-{ /* Non-VESA */
- {{0x28,0x12,0xa3,0xd0,0xaa,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x2c,0x12,0x9a,0xae,0x88,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x28,0x12,0xa3,0xd0,0xaa,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x2c,0x12,0x9a,0xae,0x88,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x28,0x13,0xe7,0x0b,0xe8,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x38,0x18,0x16,0x00,0x00,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x36,0x13,0x13,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}}
-};
-
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1024x768_3[] =
-{
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
-};
-
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_1[] =
+static const SiS300_LCDDataStruct SiS300_St2LCD1280x1024Data[] =
{
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+ { 22, 5, 800, 510,1650,1088},
+ { 22, 5, 800, 510,1650,1088},
+ { 176, 45, 900, 510,1650,1088},
+ { 176, 45, 900, 510,1650,1088},
+ { 22, 5, 800, 510,1650,1088},
+ { 13, 5,1024, 675,1560,1152},
+ { 16, 9,1266, 804,1688,1072},
+ { 1, 1,1688,1066,1688,1066}
};
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_2[] =
+static const SiS300_LCDDataStruct SiS300_NoScaleData1024x768[] =
{
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+ { 1, 1, 800, 449, 800, 449},
+ { 1, 1, 800, 449, 800, 449},
+ { 1, 1, 900, 449, 900, 449},
+ { 1, 1, 900, 449, 900, 449},
+ { 1, 1, 800, 525, 800, 525},
+ { 1, 1,1056, 628,1056, 628},
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1688,1066,1688,1066}
};
-static const SiS_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_3[] =
+static const SiS300_LCDDataStruct SiS300_NoScaleData1280x1024[] = /* TW: Fake */
{
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+ { 1, 1, 800, 449, 800, 449},
+ { 1, 1, 800, 449, 800, 449},
+ { 1, 1, 900, 449, 900, 449},
+ { 1, 1, 900, 449, 900, 449},
+ { 1, 1, 800, 525, 800, 525},
+ { 1, 1,1056, 628,1056, 628},
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1688,1066,1688,1066}
};
-/**************************************************************/
-/* LVDS/Chrontel -------------------------------------------- */
-/**************************************************************/
+typedef struct _SiS300_LVDSDataStruct
+{
+ USHORT VGAHT;
+ USHORT VGAVT;
+ USHORT LCDHT;
+ USHORT LCDVT;
+} SiS300_LVDSDataStruct;
-static const SiS_LVDSDataStruct SiS300_CHTVUPALData[] =
+static const SiS300_LVDSDataStruct SiS300_CHTVUPALData[] =
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -865,7 +1001,7 @@ static const SiS_LVDSDataStruct SiS300_CHTVUPALData[] =
{ 936, 836, 936, 836}
};
-static const SiS_LVDSDataStruct SiS300_CHTVOPALData[] =
+static const SiS300_LVDSDataStruct SiS300_CHTVOPALData[] =
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -875,7 +1011,7 @@ static const SiS_LVDSDataStruct SiS300_CHTVOPALData[] =
{ 960, 750, 960, 750}
};
-static const SiS_LVDSDataStruct SiS300_CHTVSOPALData[] =
+static const SiS300_LVDSDataStruct SiS300_CHTVSOPALData[] =
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -885,8 +1021,13 @@ static const SiS_LVDSDataStruct SiS300_CHTVSOPALData[] =
{ 944, 625, 944, 625}
};
+typedef struct _SiS300_LVDSDesStruct
+{
+ USHORT LCDHDES;
+ USHORT LCDVDES;
+} SiS300_LVDSDesStruct;
-static const SiS_LVDSDesStruct SiS300_PanelType00_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType00_1[] =
{
{ 1059, 626 }, /* 2.08 */
{ 1059, 624 },
@@ -910,7 +1051,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType00_1[] =
#endif
};
-static const SiS_LVDSDesStruct SiS300_PanelType01_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType01_1[] =
{
{ 0, 0 }, /* 2.08 */
{ 0, 0 },
@@ -934,7 +1075,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType01_1[] =
#endif
};
-static const SiS_LVDSDesStruct SiS300_PanelType02_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType02_1[] =
{
{ 1059, 626 }, /* 2.08 */
{ 1059, 624 },
@@ -958,7 +1099,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType02_1[] =
#endif
};
-static const SiS_LVDSDesStruct SiS300_PanelType03_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType03_1[] =
{
{ 8, 436},
{ 8, 440},
@@ -971,7 +1112,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType03_1[] =
{1343, 794}
};
-static const SiS_LVDSDesStruct SiS300_PanelType04_1[] = /* 1280x1024 */
+static const SiS300_LVDSDesStruct SiS300_PanelType04_1[] = /* 1280x1024 */
{
{1343, 798},
{1343, 794},
@@ -984,7 +1125,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_1[] = /* 1280x1024 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType05_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType05_1[] =
{
{1343, 798},
{1343, 794},
@@ -997,7 +1138,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType05_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType06_1[] = /* Clevo Trumpion 1024x768 */
+static const SiS300_LVDSDesStruct SiS300_PanelType06_1[] =
{
{1343, 798},
{1343, 794},
@@ -1010,7 +1151,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType06_1[] = /* Clevo Trumpion 1024x
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType07_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType07_1[] =
{
{1343, 798},
{1343, 794},
@@ -1023,7 +1164,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType07_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType08_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType08_1[] =
{
{1059, 626},
{1059, 624},
@@ -1036,7 +1177,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType08_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType09_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType09_1[] =
{
{1343, 798},
{1343, 794},
@@ -1049,7 +1190,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType09_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0a_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0a_1[] =
{
{1059, 626},
{1059, 624},
@@ -1062,7 +1203,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0a_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0b_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0b_1[] =
{
{1343, 0},
{1343, 0},
@@ -1075,7 +1216,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0b_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0c_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0c_1[] =
{
{1343, 798},
{1343, 794},
@@ -1088,7 +1229,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0c_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0d_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0d_1[] =
{
{1343, 798},
{1343, 794},
@@ -1101,7 +1242,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0d_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0e_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0e_1[] =
{
{1343, 798},
{1343, 794},
@@ -1114,7 +1255,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0e_1[] =
{ 0, 0} /* 1280x960 - not applicable */
};
-static const SiS_LVDSDesStruct SiS300_PanelType0f_1[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0f_1[] =
{
{1343, 798},
{1343, 794},
@@ -1127,7 +1268,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0f_1[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType00_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType00_2[] =
{
{976, 527},
{976, 502},
@@ -1140,7 +1281,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType00_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType01_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType01_2[] =
{
{1152, 622},
{1152, 597},
@@ -1153,7 +1294,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType01_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType02_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType02_2[] =
{
{976, 527},
{976, 502},
@@ -1166,7 +1307,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType02_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType03_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType03_2[] =
{
{1152, 622},
{1152, 597},
@@ -1179,7 +1320,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType03_2[] =
{1152, 597}
};
-static const SiS_LVDSDesStruct SiS300_PanelType04_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType04_2[] =
{
{1152, 622},
{1152, 597},
@@ -1192,7 +1333,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType05_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType05_2[] =
{
{1152, 622},
{1152, 597},
@@ -1205,7 +1346,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType05_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType06_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType06_2[] =
{
{1152, 622},
{1152, 597},
@@ -1218,7 +1359,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType06_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType07_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType07_2[] =
{
{1152, 622},
{1152, 597},
@@ -1231,7 +1372,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType07_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType08_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType08_2[] =
{
{976, 527},
{976, 502},
@@ -1244,7 +1385,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType08_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType09_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType09_2[] =
{
{1152, 622},
{1152, 597},
@@ -1257,7 +1398,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType09_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0a_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0a_2[] =
{
{976, 527},
{976, 502},
@@ -1270,7 +1411,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0a_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0b_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0b_2[] =
{
{ 1152, 700},
{ 1152, 675},
@@ -1283,7 +1424,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0b_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0c_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0c_2[] =
{
{1152, 622},
{1152, 597},
@@ -1296,7 +1437,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0c_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0d_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0d_2[] =
{
{1152, 622},
{1152, 597},
@@ -1309,7 +1450,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0d_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0e_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0e_2[] =
{
{1152, 622},
{1152, 597},
@@ -1322,7 +1463,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType0e_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelType0f_2[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType0f_2[] =
{
{1152, 622},
{1152, 597},
@@ -1335,36 +1476,8 @@ static const SiS_LVDSDesStruct SiS300_PanelType0f_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS300_PanelTypeNS_1[]=
-{
- { 0, 0},
- { 0, 0},
- { 0, 0},
- { 0, 0},
- { 0, 0},
- { 0, 0},
- { 0, 805},
- { 0, 0},
- { 0, 0},
- { 0, 0}
-};
-
-static const SiS_LVDSDesStruct SiS300_PanelTypeNS_2[] =
-{
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0}
-};
-
/* Custom data for Barco iQ R200/300/400 (BIOS 2.00.07) */
-static const SiS_LVDSDesStruct SiS300_PanelType04_1a[] = /* 1280x1024 (1366x1024) */
+static const SiS300_LVDSDesStruct SiS300_PanelType04_1a[] = /* 1280x1024 (1366x1024) */
{
{1330, 798}, /* 320x200 */
{1330, 794},
@@ -1377,7 +1490,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_1a[] = /* 1280x1024 (1366x102
{ 0, 0} /* 1360x1024 */
};
-static const SiS_LVDSDesStruct SiS300_PanelType04_2a[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType04_2a[] =
{
{1152, 622},
{1152, 597},
@@ -1391,7 +1504,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_2a[] =
};
/* Custom data for Barco iQ G200/300/400 (BIOS 2.00.07) */
-static const SiS_LVDSDesStruct SiS300_PanelType04_1b[] = /* 1024x768 */
+static const SiS300_LVDSDesStruct SiS300_PanelType04_1b[] = /* 1024x768 */
{
{1330, 798}, /* 320x200 */
{1330, 794},
@@ -1402,7 +1515,7 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_1b[] = /* 1024x768 */
{ 0, 805} /* 1024x768 / 512x384 */
};
-static const SiS_LVDSDesStruct SiS300_PanelType04_2b[] =
+static const SiS300_LVDSDesStruct SiS300_PanelType04_2b[] =
{
{1152, 622},
{1152, 597},
@@ -1413,9 +1526,90 @@ static const SiS_LVDSDesStruct SiS300_PanelType04_2b[] =
{ 0, 805}
};
-/* CRT1 CRTC for slave modes */
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1[] =
+typedef struct _SiS300_Part2PortTblStruct
+{
+ UCHAR CR[12];
+} SiS300_Part2PortTblStruct;
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1024x768_1[] =
+{ /* VESA Timing */
+ {{0x21,0x12,0xbf,0xe4,0xc0,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
+ {{0x2c,0x12,0x9a,0xae,0x88,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
+ {{0x21,0x12,0xbf,0xe4,0xc0,0x21,0x45,0x09,0x00,0xa9,0x09,0x04}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}},
+ {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}},
+ {{0x22,0x13,0xfe,0x25,0xff,0x21,0x45,0x0a,0x00,0xa9,0x0d,0x04}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_1[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1400x1050_1[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1600x1200_1[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1024x768_2[] =
+{ /* Non-VESA */
+ {{0x28,0x12,0xa3,0xd0,0xaa,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x2c,0x12,0x9a,0xae,0x88,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x28,0x12,0xa3,0xd0,0xaa,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x2c,0x12,0x9a,0xae,0x88,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x28,0x13,0xe7,0x0b,0xe8,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x38,0x18,0x16,0x00,0x00,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x36,0x13,0x13,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_2[] =
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1400x1050_2[] =
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1600x1200_2[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1024x768_3[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1280x1024_3[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1400x1050_3[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+static const SiS300_Part2PortTblStruct SiS300_CRT2Part2_1600x1200_3[] =
+{ /* TW: Temporary data, invalid */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
+};
+
+typedef struct _SiS300_LVDSCRT1DataStruct
+{
+UCHAR CR[15];
+} SiS300_LVDSCRT1DataStruct;
+
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1[] =
{
{{0x65,0x4f,0x89,0x56,0x83,0xaf,0x1f,
0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
@@ -1437,7 +1631,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1_H[] =
{
{{0x30,0x27,0x94,0x2c,0x92,0xaf,0x1f,
0x90,0x85,0x8f,0xab,0x30,0x00,0x04,
@@ -1459,7 +1653,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_1_H[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1[] =
{
{{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
@@ -1484,7 +1678,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1_H[] =
{
{{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
@@ -1533,7 +1727,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_1_H[] =
#endif
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1[] =
{
{{0x63,0x4f,0x87,0x54,0x9f,0xb4,0x1f,
0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
@@ -1558,7 +1752,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1_H[] =
{
{{0x2f,0x27,0x93,0x2b,0x90,0xb4,0x1f,
0x92,0x89,0x8f,0xb5,0x30,0x00,0x04,
@@ -1583,7 +1777,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_1_H[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2[] =
{
{{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
0xf4,0x88,0x8f,0x73,0x20,0x00,0x06,
@@ -1605,7 +1799,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2_H[] =
{
{{0x3d,0x27,0x81,0x32,0x1a,0x72,0x3e,
0xf4,0x88,0x8f,0x73,0x20,0x00,0x05,
@@ -1627,7 +1821,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1800x600_2_H[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2[] =
{
{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
@@ -1652,7 +1846,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2_H[] =
{
{{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
@@ -1677,7 +1871,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11024x768_2_H[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2[] =
{
{{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
@@ -1702,7 +1896,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2_H[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2_H[] =
{
{{0x4f,0x27,0x93,0x39,0x81,0x24,0xbb,
0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
@@ -1727,64 +1921,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT11280x1024_2_H[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1XXXxXXX_1[] =
-{
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
- 0x01}},
- {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
- 0x00,0x84,0xff,0x29,0x09,0x00,0x07,
- 0x01}},
- {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x07,
- 0x01}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS300_LVDSCRT1XXXxXXX_1_H[] =
-{
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}},
- {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
- 0x01}},
- {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
-};
-
-
-static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1UNTSC[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_CHTVCRT1UNTSC[] =
{
{{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,
@@ -1806,7 +1943,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1UNTSC[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1ONTSC[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_CHTVCRT1ONTSC[] =
{
{{0x64,0x4f,0x88,0x5a,0x9f,0x0b,0x3e,
0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,
@@ -1828,7 +1965,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1ONTSC[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1UPAL[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_CHTVCRT1UPAL[] =
{
{{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,
@@ -1850,7 +1987,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1UPAL[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1OPAL[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_CHTVCRT1OPAL[] =
{
{{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
@@ -1872,7 +2009,7 @@ static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1OPAL[] =
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1SOPAL[] =
+static const SiS300_LVDSCRT1DataStruct SiS300_CHTVCRT1SOPAL[] =
{
{{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
@@ -1894,7 +2031,12 @@ static const SiS_LVDSCRT1DataStruct SiS300_CHTVCRT1SOPAL[] =
0x01 }}
};
-static const SiS_CHTVRegDataStruct SiS300_CHTVReg_UNTSC[] =
+typedef struct _SiS300_CHTVRegDataStruct
+{
+ UCHAR Reg[16];
+} SiS300_CHTVRegDataStruct;
+
+static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_UNTSC[] =
{
{{0x4a,0x94,0x00,0x48,0xfe,0,0,0,0,0,0,0,0,0,0,0}},
{{0x4a,0x94,0x00,0x48,0xfe,0,0,0,0,0,0,0,0,0,0,0}},
@@ -1904,7 +2046,7 @@ static const SiS_CHTVRegDataStruct SiS300_CHTVReg_UNTSC[] =
{{0x8d,0xc4,0x00,0x3b,0xfb,0,0,0,0,0,0,0,0,0,0,0}} /* Mode 24: 800x600 NTSC 7/10 */
};
-static const SiS_CHTVRegDataStruct SiS300_CHTVReg_ONTSC[] =
+static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_ONTSC[] =
{
{{0x49,0x94,0x00,0x34,0xfe,0,0,0,0,0,0,0,0,0,0,0}},
{{0x49,0x94,0x00,0x34,0xfe,0,0,0,0,0,0,0,0,0,0,0}},
@@ -1914,7 +2056,7 @@ static const SiS_CHTVRegDataStruct SiS300_CHTVReg_ONTSC[] =
{{0x8c,0xb4,0x00,0x32,0xf9,0,0,0,0,0,0,0,0,0,0,0}} /* Mode 23: 800x600 NTSC 3/4 */
};
-static const SiS_CHTVRegDataStruct SiS300_CHTVReg_UPAL[] =
+static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_UPAL[] =
{
{{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}},
{{0x41,0x12,0x00,0x50,0x00,0,0,0,0,0,0,0,0,0,0,0}},
@@ -1925,7 +2067,7 @@ static const SiS_CHTVRegDataStruct SiS300_CHTVReg_UPAL[] =
};
-static const SiS_CHTVRegDataStruct SiS300_CHTVReg_OPAL[] =
+static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_OPAL[] =
{
{{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}}, /* Mode 9: 640x400 PAL 1/1 */
{{0x41,0x12,0x00,0x50,0x00,0,0,0,0,0,0,0,0,0,0,0}},
@@ -1936,7 +2078,7 @@ static const SiS_CHTVRegDataStruct SiS300_CHTVReg_OPAL[] =
};
-static const SiS_CHTVRegDataStruct SiS300_CHTVReg_SOPAL[] =
+static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_SOPAL[] =
{
{{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}}, /* Mode 9: 640x400 PAL 1/1 */
{{0x41,0x12,0x00,0x50,0x00,0,0,0,0,0,0,0,0,0,0,0}},
diff --git a/src/310vtbl.h b/src/310vtbl.h
index 764a5f6..42c597a 100644
--- a/src/310vtbl.h
+++ b/src/310vtbl.h
@@ -1,256 +1,273 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/310vtbl.h,v 1.12 2003/08/07 12:52:22 twini Exp $ */
/*
* Register settings for SiS 315/330 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
-static const SiS_StStruct SiS310_SModeIDTable[]=
-{
- {0x01,0x9208,0x01,0x00,0x00,0x00,0x01,0x00, 0x40},
- {0x01,0x1210,0x14,0x01,0x01,0x00,0x01,0x00, 0x40},
- {0x01,0x1010,0x17,0x02,0x02,0x00,0x01,0x01, 0x40},
- {0x03,0x8208,0x03,0x00,0x00,0x00,0x01,0x02, 0x40},
- {0x03,0x0210,0x16,0x01,0x01,0x00,0x01,0x02, 0x40},
- {0x03,0x0010,0x18,0x02,0x02,0x00,0x01,0x03, 0x40},
- {0x05,0x9209,0x05,0x00,0x00,0x00,0x00,0x04, 0x40},
- {0x06,0x8209,0x06,0x00,0x00,0x00,0x00,0x05, 0x40},
- {0x07,0x0000,0x07,0x03,0x03,0x00,0x01,0x03, 0x40},
- {0x07,0x0000,0x19,0x02,0x02,0x00,0x01,0x03, 0x40},
- {0x0d,0x920a,0x0d,0x00,0x00,0x00,0x00,0x04, 0x40},
- {0x0e,0x820a,0x0e,0x00,0x00,0x00,0x00,0x05, 0x40},
- {0x0f,0x0202,0x11,0x01,0x01,0x00,0x00,0x05, 0x40},
- {0x10,0x0212,0x12,0x01,0x01,0x00,0x00,0x05, 0x40},
- {0x11,0x0212,0x1a,0x04,0x04,0x00,0x00,0x05, 0x40},
- {0x12,0x0212,0x1b,0x04,0x04,0x00,0x00,0x05, 0x40},
- {0x13,0x021b,0x1c,0x00,0x00,0x00,0x00,0x04, 0x40},
- {0x12,0x0010,0x18,0x02,0x02,0x00,0x00,0x05, 0x40},
- {0x12,0x0210,0x18,0x01,0x01,0x00,0x00,0x05, 0x40},
- {0xff,0x0000,0x00,0x00,0x00,0x00,0x00,0x00, 0x40}
-};
-
-static const SiS_ExtStruct SiS310_EModeIDTable[]=
-{
- {0x6a,0x2212,0x0102,SIS_RI_800x600, 0x00,0x00,0x07,0x06,0x00}, /* 800x600x? */
- {0x2e,0x0a1b,0x0101,SIS_RI_640x480, 0x00,0x00,0x05,0x05,0x08}, /* 640x480x8 */
- {0x2f,0x0a1b,0x0100,SIS_RI_640x400, 0x00,0x00,0x05,0x05,0x10}, /* 640x400x8 */
- {0x30,0x2a1b,0x0103,SIS_RI_800x600, 0x00,0x00,0x07,0x06,0x00}, /* 800x600x8 */
- {0x31,0x0a1b,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x06,0x11}, /* 720x480x8 */
- {0x32,0x0a1b,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x06,0x12}, /* 720x576x8 */
- {0x33,0x0a1d,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x06,0x11}, /* 720x480x16 */
- {0x34,0x2a1d,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x06,0x12}, /* 720x576x16 */
- {0x35,0x0a1f,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x06,0x11}, /* 720x480x32 */
- {0x36,0x2a1f,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x06,0x12}, /* 720x576x32 */
- {0x37,0x0212,0x0104,SIS_RI_1024x768, 0x00,0x00,0x08,0x07,0x13}, /* 1024x768x? */
- {0x38,0x0a1b,0x0105,SIS_RI_1024x768, 0x00,0x00,0x08,0x07,0x13}, /* 1024x768x8 */
- {0x3a,0x0e3b,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
- {0x3c,0x0e3b,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e}, /* 1600x1200x8 */
- {0x3d,0x0e7d,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e}, /* 1600x1200x16 */
- {0x40,0x9a1c,0x010d,SIS_RI_320x200, 0x00,0x00,0x04,0x04,0x25}, /* 320x200x15 */
- {0x41,0x9a1d,0x010e,SIS_RI_320x200, 0x00,0x00,0x04,0x04,0x25}, /* 320x200x16 */
- {0x43,0x0a1c,0x0110,SIS_RI_640x480, 0x00,0x00,0x05,0x05,0x08},
- {0x44,0x0a1d,0x0111,SIS_RI_640x480, 0x00,0x00,0x05,0x05,0x08}, /* 640x480x16 */
- {0x46,0x2a1c,0x0113,SIS_RI_800x600, 0x00,0x00,0x07,0x06,0x00},
- {0x47,0x2a1d,0x0114,SIS_RI_800x600, 0x00,0x00,0x07,0x06,0x00}, /* 800x600x16 */
- {0x49,0x0a3c,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x07,0x13},
- {0x4a,0x0a3d,0x0117,SIS_RI_1024x768, 0x00,0x00,0x08,0x07,0x13}, /* 1024x768x16 */
- {0x4c,0x0e7c,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a},
- {0x4d,0x0e7d,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a}, /* 1280x1024x16 */
- {0x50,0x9a1b,0x0132,SIS_RI_320x240, 0x00,0x00,0x04,0x04,0x26}, /* 320x240x8 */
- {0x51,0xba1b,0x0133,SIS_RI_400x300, 0x00,0x00,0x07,0x07,0x27}, /* 400x300x8 */
- {0x52,0xba1b,0x0134,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x28}, /* 512x384x8 */
- {0x56,0x9a1d,0x0135,SIS_RI_320x240, 0x00,0x00,0x04,0x04,0x26}, /* 320x240x16 */
- {0x57,0xba1d,0x0136,SIS_RI_400x300, 0x00,0x00,0x07,0x07,0x27}, /* 400x300x16 */
- {0x58,0xba1d,0x0137,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x28}, /* 512x384x16 */
- {0x59,0x9a1b,0x0138,SIS_RI_320x200, 0x00,0x00,0x04,0x04,0x25}, /* 320x200x8 */
- {0x5a,0x021b,0x0138,SIS_RI_320x240, 0x00,0x00,0x00,0x00,0x3f}, /* 320x240x8 fstn */
- {0x5b,0x0a1d,0x0135,SIS_RI_320x240, 0x00,0x00,0x00,0x00,0x3f}, /* 320x240x16 fstn */
- {0x5c,0xba1f,0x0000,SIS_RI_512x384, 0x00,0x00,0x00,0x00,0x28}, /* 512x384x32 */
- {0x5d,0x0a1d,0x0139,SIS_RI_640x400, 0x00,0x00,0x05,0x07,0x10},
- {0x5e,0x0a1f,0x0000,SIS_RI_640x400, 0x00,0x00,0x05,0x07,0x10}, /* 640x400x32 */
- {0x62,0x0a3f,0x013a,SIS_RI_640x480, 0x00,0x00,0x05,0x05,0x08}, /* 640x480x32 */
- {0x63,0x2a3f,0x013b,SIS_RI_800x600, 0x00,0x00,0x07,0x06,0x00}, /* 800x600x32 */
- {0x64,0x0a7f,0x013c,SIS_RI_1024x768, 0x00,0x00,0x08,0x07,0x13}, /* 1024x768x32 */
- {0x65,0x0eff,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x00,0x1a}, /* 1280x1024x32 */
- {0x66,0x0eff,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x00,0x1e}, /* 1600x1200x32 */
- {0x68,0x067b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x29}, /* 1920x1440x8 */
- {0x69,0x06fd,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x29}, /* 1920x1440x16 */
- {0x6b,0x07ff,0x0141,SIS_RI_1920x1440,0x00,0x00,0x00,0x00,0x29}, /* 1920x1440x32 */
- {0x6c,0x067b,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x00,0x2f}, /* 2048x1536x8 */
- {0x6d,0x06fd,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x00,0x2f}, /* 2048x1536x16 */
- {0x6e,0x07ff,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x00,0x2f}, /* 2048x1536x32 */
- {0x70,0x2a1b,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x07,0x34}, /* 800x480x8 */
- {0x71,0x0a1b,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x37}, /* 1024x576x8 */
- {0x74,0x0a1d,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x37}, /* 1024x576x16 */
- {0x75,0x0a3d,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x3a}, /* 1280x720x16 */
- {0x76,0x2a1f,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x07,0x34}, /* 800x480x32 */
- {0x77,0x0a1f,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x00,0x37}, /* 1024x576x32 */
- {0x78,0x0a3f,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x3a}, /* 1280x720x32 */
- {0x79,0x0a3b,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x00,0x3a}, /* 1280x720x8 */
- {0x7a,0x2a1d,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x07,0x34}, /* 800x480x16 */
- {0x7c,0x0e3b,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x3d}, /* 1280x960x8 */
- {0x7d,0x0e7d,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x3d}, /* 1280x960x16 */
- {0x7e,0x0eff,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x00,0x3d}, /* 1280x960x32 */
- {0x23,0x0e3b,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x40}, /* 1280x768x8 */
- {0x24,0x0e7d,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x40}, /* 1280x768x16 */
- {0x25,0x0eff,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x00,0x40}, /* 1280x768x32 */
- {0x26,0x0e3b,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x00,0x41}, /* 1400x1050x8 */
- {0x27,0x0e7d,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x00,0x41}, /* 1400x1050x16 */
- {0x28,0x0eff,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x00,0x41}, /* 1400x1050x32*/
- {0x29,0x0e1b,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x43}, /* 1152x864 */
- {0x2a,0x0e3d,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x43},
- {0x2b,0x0e7f,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x00,0x43},
- {0x39,0x2a1b,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x45}, /* 848x480 */
- {0x3b,0x2a3d,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x45},
- {0x3e,0x2a7f,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x00,0x45},
- {0x3f,0x2a1b,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47}, /* 856x480 */
- {0x42,0x2a3d,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47},
- {0x45,0x2a7f,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x00,0x47},
- {0x48,0x2a1b,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49}, /* 1360x768 */
- {0x4b,0x2a3d,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49},
- {0x4e,0x2a7f,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x00,0x49},
- {0x4f,0x9a1f,0x0000,SIS_RI_320x200, 0x00,0x00,0x04,0x04,0x25}, /* 320x200x32 */
- {0x53,0x9a1f,0x0000,SIS_RI_320x240, 0x00,0x00,0x04,0x04,0x26}, /* 320x240x32 */
- {0x54,0xba1f,0x0000,SIS_RI_400x300, 0x00,0x00,0x07,0x07,0x27}, /* 400x300x32 */
- {0x5f,0x2a1b,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a}, /* 768x576 */
- {0x60,0x2a1d,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a},
- {0x61,0x2a1f,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x06,0x4a},
- {0x14,0x0e1b,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b}, /* 1280x800 */
- {0x15,0x0e3d,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b},
- {0x16,0x0e7f,0x0000,SIS_RI_1280x800, 0x00,0x00,0x00,0x00,0x4b},
- {0x17,0x0e1b,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c}, /* 1680x1050 */
- {0x18,0x0e3d,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c},
- {0x19,0x0e7f,0x0000,SIS_RI_1680x1050,0x00,0x00,0x00,0x00,0x4c},
- {0xff,0x0000,0x0000,0, 0x00,0x00,0x00,0x00,0x00}
-};
-
-static const SiS_Ext2Struct SiS310_RefIndex[]=
-{
- {0x085f,0x0d,0x03,0x05,0x05,0x6a, 800, 600, 0x40}, /* 0x0 */
- {0x0067,0x0e,0x04,0x05,0x05,0x6a, 800, 600, 0x40}, /* 0x1 */
- {0x0067,0x0f,0x08,0x48,0x05,0x6a, 800, 600, 0x40}, /* 0x2 */
- {0x0067,0x10,0x07,0x8b,0x05,0x6a, 800, 600, 0x40}, /* 0x3 */
- {0x0047,0x11,0x0a,0x00,0x05,0x6a, 800, 600, 0x40}, /* 0x4 */
- {0x0047,0x12,0x0d,0x00,0x05,0x6a, 800, 600, 0x40}, /* 0x5 */
- {0x0047,0x13,0x13,0x00,0x05,0x6a, 800, 600, 0x20}, /* 0x6 */
- {0x0107,0x14,0x1c,0x00,0x05,0x6a, 800, 600, 0x20}, /* 0x7 */
- {0xc85f,0x05,0x00,0x04,0x04,0x2e, 640, 480, 0x40}, /* 0x8 */
- {0xc067,0x06,0x02,0x04,0x04,0x2e, 640, 480, 0x40}, /* 0x9 */
- {0xc067,0x07,0x02,0x47,0x04,0x2e, 640, 480, 0x40}, /* 0xa */
- {0xc067,0x08,0x03,0x8a,0x04,0x2e, 640, 480, 0x40}, /* 0xb */
- {0xc047,0x09,0x05,0x00,0x04,0x2e, 640, 480, 0x40}, /* 0xc */
- {0xc047,0x0a,0x09,0x00,0x04,0x2e, 640, 480, 0x40}, /* 0xd */
- {0xc047,0x0b,0x0e,0x00,0x04,0x2e, 640, 480, 0x40}, /* 0xe */
- {0xc047,0x0c,0x15,0x00,0x04,0x2e, 640, 480, 0x40}, /* 0xf */
- {0x487f,0x04,0x00,0x00,0x00,0x2f, 640, 400, 0x30}, /* 0x10 */
- {0xc04f,0x3c,0x01,0x06,0x00,0x31, 720, 480, 0x30}, /* 0x11 */
- {0x004f,0x3d,0x03,0x06,0x00,0x32, 720, 576, 0x30}, /* 0x12 */
- {0x0087,0x15,0x06,0x00,0x06,0x37,1024, 768, 0x30}, /* 0x13 */
- {0xc877,0x16,0x0b,0x06,0x06,0x37,1024, 768, 0x20}, /* 0x14 */
- {0xc067,0x17,0x0f,0x49,0x06,0x37,1024, 768, 0x20}, /* 0x15 */
- {0x0067,0x18,0x11,0x00,0x06,0x37,1024, 768, 0x20}, /* 0x16 */
- {0x0047,0x19,0x16,0x8c,0x06,0x37,1024, 768, 0x20}, /* 0x17 */
- {0x0107,0x1a,0x1b,0x00,0x06,0x37,1024, 768, 0x10}, /* 0x18 */
- {0x0107,0x1b,0x1f,0x00,0x06,0x37,1024, 768, 0x10}, /* 0x19 */
- {0x0087,0x1c,0x11,0x00,0x07,0x3a,1280,1024, 0x30}, /* 0x1a */
- {0x0137,0x1d,0x19,0x07,0x07,0x3a,1280,1024, 0x00}, /* 0x1b */
- {0x0107,0x1e,0x1e,0x00,0x07,0x3a,1280,1024, 0x00}, /* 0x1c */
- {0x0207,0x1f,0x20,0x00,0x07,0x3a,1280,1024, 0x00}, /* 0x1d */
- {0x0227,0x20,0x21,0x09,0x09,0x3c,1600,1200, 0x00}, /* 0x1e */
- {0x0407,0x21,0x22,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x1f */
- {0x0407,0x22,0x23,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x20 */
- {0x0407,0x23,0x25,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x21 */
- {0x0007,0x24,0x26,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x22 */
- {0x0007,0x25,0x2c,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x23 */
- {0x0007,0x26,0x34,0x00,0x09,0x3c,1600,1200, 0x00}, /* 0x24 */
- {0x407f,0x00,0x00,0x00,0x00,0x40, 320, 200, 0x30}, /* 0x25 */
- {0xc07f,0x01,0x00,0x04,0x04,0x50, 320, 240, 0x30}, /* 0x26 */
- {0x007f,0x02,0x04,0x05,0x05,0x51, 400, 300, 0x30}, /* 0x27 */
- {0xc077,0x03,0x0b,0x06,0x06,0x52, 512, 384, 0x30}, /* 0x28 */
- {0x8007,0x27,0x27,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x29 */
- {0x4007,0x28,0x29,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x2a */
- {0x4007,0x29,0x2e,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x2b */
- {0x4007,0x2a,0x30,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x2c */
- {0x4007,0x2b,0x35,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x2d */
- {0x4005,0x2c,0x39,0x00,0x00,0x68,1920,1440, 0x00}, /* 0x2e */
- {0x4007,0x2d,0x2b,0x00,0x00,0x6c,2048,1536, 0x00}, /* 0x2f */
- {0x4007,0x2e,0x31,0x00,0x00,0x6c,2048,1536, 0x00}, /* 0x30 */
- {0x4007,0x2f,0x33,0x00,0x00,0x6c,2048,1536, 0x00}, /* 0x31 */
- {0x4007,0x30,0x37,0x00,0x00,0x6c,2048,1536, 0x00}, /* 0x32 */
- {0x4005,0x31,0x38,0x00,0x00,0x6c,2048,1536, 0x00}, /* 0x33 */
- {0x0057,0x32,0x40,0x08,0x00,0x70, 800, 480, 0x30}, /* 0x34 */
- {0x0047,0x33,0x07,0x08,0x00,0x70, 800, 480, 0x30}, /* 0x35 */
- {0x0047,0x34,0x0a,0x08,0x00,0x70, 800, 480, 0x30}, /* 0x36 */
- {0x0057,0x35,0x0b,0x09,0x00,0x71,1024, 576, 0x30}, /* 0x37 */
- {0x0047,0x36,0x11,0x09,0x00,0x71,1024, 576, 0x30}, /* 0x38 */
- {0x0047,0x37,0x16,0x09,0x00,0x71,1024, 576, 0x30}, /* 0x39 */
- {0x1137,0x38,0x19,0x0a,0x0c,0x75,1280, 720, 0x30}, /* 0x3a */
- {0x1107,0x39,0x1e,0x0a,0x0c,0x75,1280, 720, 0x30}, /* 0x3b */
- {0x1307,0x3a,0x20,0x0a,0x0c,0x75,1280, 720, 0x30}, /* 0x3c */
- {0x0127,0x3b,0x19,0x08,0x0a,0x7c,1280, 960, 0x30}, /* 0x3d */
- {0x0227,0x4c,0x59,0x08,0x0a,0x7c,1280, 960, 0x20}, /* 0x3e */
- {0xc07f,0x4e,0x00,0x06,0x04,0x5a, 320, 240, 0x30}, /* 0x3f */ /* FSTN 320x240 */
- {0x0077,0x42,0x5b,0x08,0x11,0x23,1280, 768, 0x30}, /* 0x40 */ /* 0x5b was 0x12 */
- {0x0127,0x43,0x4d,0x08,0x0b,0x26,1400,1050, 0x30}, /* 0x41 */
- {0x0207,0x4b,0x5a,0x08,0x0b,0x26,1400,1050, 0x30}, /* 0x42 1400x1050-75Hz */
- {0x0107,0x44,0x19,0x00,0x00,0x29,1152, 864, 0x30}, /* 0x43 1152x864-75Hz */
- {0x0107,0x4a,0x1e,0x00,0x00,0x29,1152, 864, 0x30}, /* 0x44 1152x864-85Hz */
- {0x0087,0x45,0x57,0x00,0x00,0x39, 848, 480, 0x30}, /* 0x45 848x480-38Hzi */
- {0xc067,0x46,0x55,0x0b,0x00,0x39, 848, 480, 0x30}, /* 0x46 848x480-60Hz */
- {0x0087,0x47,0x57,0x00,0x00,0x3f, 856, 480, 0x30}, /* 0x47 856x480-38Hzi */
- {0xc047,0x48,0x57,0x00,0x00,0x3f, 856, 480, 0x30}, /* 0x48 856x480-60Hz */
- {0x0067,0x49,0x58,0x0c,0x00,0x48,1360, 768, 0x30}, /* 0x49 1360x768-60Hz */
- {0x004f,0x4d,0x03,0x06,0x00,0x5f, 768, 576, 0x30}, /* 0x4a 768x576-56Hz */
- {0x0067,0x4f,0x5c,0x08,0x0d,0x14,1280, 800, 0x30}, /* 0x4b 1280x800-60Hz */
- {0x0067,0x50,0x5d,0x0c,0x0e,0x17,1680,1050, 0x30}, /* 0x4c 1680x1050-60Hz */
- {0xffff,0x00,0x00,0x00,0x00,0x00, 0, 0, 0}
-};
-
-static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
+typedef struct _SiS310_StStruct
+{
+ UCHAR St_ModeID;
+ USHORT St_ModeFlag;
+ UCHAR St_StTableIndex;
+ UCHAR St_CRT2CRTC;
+ UCHAR St_ResInfo;
+ UCHAR VB_StTVFlickerIndex;
+ UCHAR VB_StTVEdgeIndex;
+ UCHAR VB_StTVYFilterIndex;
+} SiS310_StStruct;
+
+static const SiS310_StStruct SiS310_SModeIDTable[]=
+{
+ {0x01,0x9208,0x01,0x00,0x00,0x00,0x01,0x00},
+ {0x01,0x1210,0x14,0x01,0x01,0x00,0x01,0x00},
+ {0x01,0x1010,0x17,0x02,0x02,0x00,0x01,0x01},
+ {0x03,0x8208,0x03,0x00,0x00,0x00,0x01,0x02},
+ {0x03,0x0210,0x16,0x01,0x01,0x00,0x01,0x02},
+ {0x03,0x0010,0x18,0x02,0x02,0x00,0x01,0x03},
+ {0x05,0x9209,0x05,0x00,0x00,0x00,0x00,0x04},
+ {0x06,0x8209,0x06,0x00,0x00,0x00,0x00,0x05},
+ {0x07,0x0000,0x07,0x03,0x03,0x00,0x01,0x03},
+ {0x07,0x0000,0x19,0x02,0x02,0x00,0x01,0x03},
+ {0x0d,0x920a,0x0d,0x00,0x00,0x00,0x00,0x04},
+ {0x0e,0x820a,0x0e,0x00,0x00,0x00,0x00,0x05},
+ {0x0f,0x0202,0x11,0x01,0x01,0x00,0x00,0x05},
+ {0x10,0x0212,0x12,0x01,0x01,0x00,0x00,0x05},
+ {0x11,0x0212,0x1a,0x04,0x04,0x00,0x00,0x05},
+ {0x12,0x0212,0x1b,0x04,0x04,0x00,0x00,0x05},
+ {0x13,0x021b,0x1c,0x00,0x00,0x00,0x00,0x04},
+ {0x12,0x0010,0x18,0x02,0x02,0x00,0x00,0x05},
+ {0x12,0x0210,0x18,0x01,0x01,0x00,0x00,0x05},
+ {0xff,0x0000,0x00,0x00,0x00,0x00,0x00,0x00}
+};
+
+typedef struct _SiS310_ExtStruct
+{
+ UCHAR Ext_ModeID;
+ USHORT Ext_ModeFlag;
+ USHORT Ext_ModeInfo;
+ USHORT Ext_VESAID;
+ UCHAR Ext_RESINFO;
+ UCHAR VB_ExtTVFlickerIndex;
+ UCHAR VB_ExtTVEdgeIndex;
+ UCHAR VB_ExtTVYFilterIndex;
+ UCHAR REFindex;
+} SiS310_ExtStruct;
+
+static const SiS310_ExtStruct SiS310_EModeIDTable[]=
+{
+ {0x6a,0x2212,0x0407,0x0102,SIS_RI_800x600, 0x00,0x00,0x07,0x00}, /* 800x600x? */
+ {0x2e,0x0a1b,0x0306,0x0101,SIS_RI_640x480, 0x00,0x00,0x05,0x08}, /* 640x480x8 */
+ {0x2f,0x0a1b,0x0305,0x0100,SIS_RI_640x400, 0x00,0x00,0x05,0x10}, /* 640x400x8 */
+ {0x30,0x2a1b,0x0407,0x0103,SIS_RI_800x600, 0x00,0x00,0x07,0x00}, /* 800x600x8 */
+ {0x31,0x0a1b,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x11}, /* 720x480x8 */
+ {0x32,0x0a1b,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x12}, /* 720x576x8 */
+ {0x33,0x0a1d,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x11}, /* 720x480x16 */
+ {0x34,0x2a1d,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x12}, /* 720x576x16 */
+ {0x35,0x0a1f,0x0a0d,0x0000,SIS_RI_720x480, 0x00,0x00,0x06,0x11}, /* 720x480x32 */
+ {0x36,0x2a1f,0x0a0e,0x0000,SIS_RI_720x576, 0x00,0x00,0x06,0x12}, /* 720x576x32 */
+ {0x37,0x0212,0x0508,0x0104,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x? */
+ {0x38,0x0a1b,0x0508,0x0105,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x8 */
+ {0x3a,0x0e3b,0x0609,0x0107,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x8 */
+ {0x3c,0x0e3b,0x070a,0x0130,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x8 */
+ {0x3d,0x0e7d,0x070a,0x0131,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x16 */
+ {0x40,0x9a1c,0x0000,0x010d,SIS_RI_320x200, 0x00,0x00,0x04,0x25}, /* 320x200x15 */
+ {0x41,0x9a1d,0x0000,0x010e,SIS_RI_320x200, 0x00,0x00,0x04,0x25}, /* 320x200x16 */
+ {0x43,0x0a1c,0x0306,0x0110,SIS_RI_640x480, 0x00,0x00,0x05,0x08},
+ {0x44,0x0a1d,0x0306,0x0111,SIS_RI_640x480, 0x00,0x00,0x05,0x08}, /* 640x480x16 */
+ {0x46,0x2a1c,0x0407,0x0113,SIS_RI_800x600, 0x00,0x00,0x07,0x00},
+ {0x47,0x2a1d,0x0407,0x0114,SIS_RI_800x600, 0x00,0x00,0x07,0x00}, /* 800x600x16 */
+ {0x49,0x0a3c,0x0508,0x0116,SIS_RI_1024x768, 0x00,0x00,0x00,0x13},
+ {0x4a,0x0a3d,0x0508,0x0117,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x16 */
+ {0x4c,0x0e7c,0x0609,0x0119,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a},
+ {0x4d,0x0e7d,0x0609,0x011a,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x16 */
+ {0x50,0x9a1b,0x0001,0x0132,SIS_RI_320x240, 0x00,0x00,0x04,0x26}, /* 320x240x8 */
+ {0x51,0xba1b,0x0103,0x0133,SIS_RI_400x300, 0x00,0x00,0x07,0x27}, /* 400x300x8 */
+ {0x52,0xba1b,0x0204,0x0134,SIS_RI_512x384, 0x00,0x00,0x00,0x28}, /* 512x384x8 */
+ {0x56,0x9a1d,0x0001,0x0135,SIS_RI_320x240, 0x00,0x00,0x04,0x26}, /* 320x240x16 */
+ {0x57,0xba1d,0x0103,0x0136,SIS_RI_400x300, 0x00,0x00,0x07,0x27}, /* 400x300x16 */
+ {0x58,0xba1d,0x0204,0x0137,SIS_RI_512x384, 0x00,0x00,0x00,0x28}, /* 512x384x16 */
+ {0x59,0x9a1b,0x0000,0x0138,SIS_RI_320x200, 0x00,0x00,0x04,0x25}, /* 320x200x8 */
+ {0x5a,0x021b,0x0014,0x0138,SIS_RI_320x240, 0x00,0x00,0x04,0x3f}, /* 320x240x8 fstn */
+ {0x5b,0x0a1d,0x0014,0x0135,SIS_RI_320x240, 0x00,0x00,0x04,0x3f}, /* 320x240x16 fstn */
+ {0x5c,0xba1f,0x0204,0x0000,SIS_RI_512x384, 0x00,0x00,0x00,0x28}, /* 512x384x32 */
+ {0x5d,0x0a1d,0x0305,0x0139,SIS_RI_640x400, 0x00,0x00,0x05,0x10},
+ {0x5e,0x0a1f,0x0305,0x0000,SIS_RI_640x400, 0x00,0x00,0x05,0x10}, /* 640x400x32 */
+ {0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480, 0x00,0x00,0x05,0x08}, /* 640x480x32 */
+ {0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600, 0x00,0x00,0x07,0x00}, /* 800x600x32 */
+ {0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x32 */
+ {0x65,0x0eff,0x0609,0x013d,SIS_RI_1280x1024,0x00,0x00,0x00,0x1a}, /* 1280x1024x32 */
+ {0x66,0x0eff,0x070a,0x013e,SIS_RI_1600x1200,0x00,0x00,0x00,0x1e}, /* 1600x1200x32 */
+ {0x68,0x067b,0x080b,0x013f,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x8 */
+ {0x69,0x06fd,0x080b,0x0140,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x16 */
+ {0x6b,0x07ff,0x080b,0x0141,SIS_RI_1920x1440,0x00,0x00,0x00,0x29}, /* 1920x1440x32 */
+ {0x6c,0x067b,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x8 */
+ {0x6d,0x06fd,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x16 */
+ {0x6e,0x07ff,0x090c,0x0000,SIS_RI_2048x1536,0x00,0x00,0x00,0x2f}, /* 2048x1536x32 */
+ {0x70,0x2a1b,0x0410,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x34}, /* 800x480x8 */
+ {0x71,0x0a1b,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x8 */
+ {0x74,0x0a1d,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x16 */
+ {0x75,0x0a3d,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x16 */
+ {0x76,0x2a1f,0x0410,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x34}, /* 800x480x32 */
+ {0x77,0x0a1f,0x0511,0x0000,SIS_RI_1024x576, 0x00,0x00,0x00,0x37}, /* 1024x576x32 */
+ {0x78,0x0a3f,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x32 */
+ {0x79,0x0a3b,0x0612,0x0000,SIS_RI_1280x720, 0x00,0x00,0x00,0x3a}, /* 1280x720x8 */
+ {0x7a,0x2a1d,0x0410,0x0000,SIS_RI_800x480, 0x00,0x00,0x07,0x34}, /* 800x480x16 */
+ {0x7c,0x0e3b,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x8 */
+ {0x7d,0x0e7d,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x16 */
+ {0x7e,0x0eff,0x060f,0x0000,SIS_RI_1280x960, 0x00,0x00,0x00,0x3d}, /* 1280x960x32 */
+ {0x23,0x0e3b,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x8 */
+ {0x24,0x0e7d,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x16 */
+ {0x25,0x0eff,0x0614,0x0000,SIS_RI_1280x768, 0x00,0x00,0x00,0x40}, /* 1280x768x32 */
+ {0x26,0x0e3b,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x8 */
+ {0x27,0x0e7d,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x16 */
+ {0x28,0x0eff,0x0c15,0x0000,SIS_RI_1400x1050,0x00,0x00,0x00,0x41}, /* 1400x1050x32*/
+ {0x29,0x0e1b,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43}, /* 1152x864 */
+ {0x2a,0x0e3d,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
+ {0x2b,0x0e7f,0x0d16,0x0000,SIS_RI_1152x864, 0x00,0x00,0x00,0x43},
+ {0x39,0x2a1b,0x0b17,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x45}, /* 848x480 */
+ {0x3b,0x2a3d,0x0b17,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x45},
+ {0x3e,0x2a7f,0x0b17,0x0000,SIS_RI_848x480, 0x00,0x00,0x00,0x45},
+ {0x3f,0x2a1b,0x0b13,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x47}, /* 856x480 */
+ {0x42,0x2a3d,0x0b13,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x47},
+ {0x45,0x2a7f,0x0b13,0x0000,SIS_RI_856x480, 0x00,0x00,0x00,0x47},
+ {0x48,0x2a1b,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49}, /* 1360x768 */
+ {0x4b,0x2a3d,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
+ {0x4e,0x2a7f,0x0e18,0x0000,SIS_RI_1360x768, 0x00,0x00,0x00,0x49},
+ {0x4f,0x9a1f,0x0000,0x0000,SIS_RI_320x200, 0x00,0x00,0x04,0x25}, /* 320x200x32 */
+ {0x53,0x9a1f,0x0001,0x0000,SIS_RI_320x240, 0x00,0x00,0x04,0x26}, /* 320x240x32 */
+ {0x54,0xba1f,0x0103,0x0000,SIS_RI_400x300, 0x00,0x00,0x07,0x27}, /* 400x300x32 */
+ {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x8 */
+ {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x16 */
+ {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x32 */
+ {0xff,0x0000,0x0000,0x0000,0x00, 0x00,0x00,0x00,0x00}
+};
+
+typedef struct _SiS310_Ext2Struct
+{
+ USHORT Ext_InfoFlag;
+ UCHAR Ext_CRT1CRTC;
+ UCHAR Ext_CRTVCLK;
+ UCHAR Ext_CRT2CRTC;
+ UCHAR ModeID;
+ USHORT XRes;
+ USHORT YRes;
+} SiS310_Ext2Struct;
+
+static const SiS310_Ext2Struct SiS310_RefIndex[]=
+{
+ {0x085f,0x0d,0x03,0x05,0x6a, 800, 600}, /* 0x0 */
+ {0x0467,0x0e,0x04,0x05,0x6a, 800, 600}, /* 0x1 */
+ {0x0067,0x0f,0x08,0x48,0x6a, 800, 600}, /* 0x2 */
+ {0x0067,0x10,0x07,0x8b,0x6a, 800, 600}, /* 0x3 */
+ {0x0147,0x11,0x0a,0x00,0x6a, 800, 600}, /* 0x4 */
+ {0x0147,0x12,0x0d,0x00,0x6a, 800, 600}, /* 0x5 - TW: Test sync change */
+ {0x0047,0x13,0x13,0x00,0x6a, 800, 600}, /* 0x6 */
+ {0x0047,0x14,0x1c,0x00,0x6a, 800, 600}, /* 0x7 */
+ {0xc85f,0x05,0x00,0x04,0x2e, 640, 480}, /* 0x8 */
+ {0xc067,0x06,0x02,0x04,0x2e, 640, 480}, /* 0x9 */
+ {0xc067,0x07,0x02,0x47,0x2e, 640, 480}, /* 0xa */
+ {0xc067,0x08,0x03,0x8a,0x2e, 640, 480}, /* 0xb */
+ {0xc047,0x09,0x05,0x00,0x2e, 640, 480}, /* 0xc */
+ {0xc047,0x0a,0x09,0x00,0x2e, 640, 480}, /* 0xd */
+ {0xc047,0x0b,0x0e,0x00,0x2e, 640, 480}, /* 0xe */
+ {0xc047,0x0c,0x15,0x00,0x2e, 640, 480}, /* 0xf */
+ {0x407f,0x04,0x00,0x00,0x2f, 640, 400}, /* 0x10 */
+ {0xc00f,0x3c,0x01,0x06,0x31, 720, 480}, /* 0x11 */
+ {0x000f,0x3d,0x03,0x06,0x32, 720, 576}, /* 0x12 */
+ {0x0187,0x15,0x06,0x00,0x37,1024, 768}, /* 0x13 */
+ {0xc877,0x16,0x0b,0x06,0x37,1024, 768}, /* 0x14 */
+ {0xc067,0x17,0x0f,0x49,0x37,1024, 768}, /* 0x15 */
+ {0x0267,0x18,0x11,0x00,0x37,1024, 768}, /* 0x16 */
+ {0x0047,0x19,0x16,0x8c,0x37,1024, 768}, /* 0x17 */
+ {0x0047,0x1a,0x1b,0x00,0x37,1024, 768}, /* 0x18 */
+ {0x0007,0x1b,0x1f,0x00,0x37,1024, 768}, /* 0x19 */
+ {0x0387,0x1c,0x11,0x00,0x3a,1280,1024}, /* 0x1a */
+ {0x0077,0x1d,0x19,0x07,0x3a,1280,1024}, /* 0x1b */
+ {0x0047,0x1e,0x1e,0x00,0x3a,1280,1024}, /* 0x1c */
+ {0x0007,0x1f,0x20,0x00,0x3a,1280,1024}, /* 0x1d */
+ {0x0867,0x20,0x21,0x09,0x3c,1600,1200}, /* 0x1e */
+ {0x0007,0x21,0x22,0x00,0x3c,1600,1200}, /* 0x1f */
+ {0x0007,0x22,0x23,0x00,0x3c,1600,1200}, /* 0x20 */
+ {0x0007,0x23,0x25,0x00,0x3c,1600,1200}, /* 0x21 */
+ {0x0007,0x24,0x26,0x00,0x3c,1600,1200}, /* 0x22 */
+ {0x0007,0x25,0x2c,0x00,0x3c,1600,1200}, /* 0x23 */
+ {0x0007,0x26,0x34,0x00,0x3c,1600,1200}, /* 0x24 */
+ {0x407f,0x00,0x00,0x00,0x40, 320, 200}, /* 0x25 */
+ {0xc07f,0x01,0x00,0x04,0x50, 320, 240}, /* 0x26 */
+ {0x007f,0x02,0x04,0x05,0x51, 400, 300}, /* 0x27 */
+ {0xc077,0x03,0x0b,0x06,0x52, 512, 384}, /* 0x28 */
+ {0x8007,0x27,0x27,0x00,0x68,1920,1440}, /* 0x29 */
+ {0x4007,0x28,0x29,0x00,0x68,1920,1440}, /* 0x2a */
+ {0x4007,0x29,0x2e,0x00,0x68,1920,1440}, /* 0x2b */
+ {0x4007,0x2a,0x30,0x00,0x68,1920,1440}, /* 0x2c */
+ {0x4007,0x2b,0x35,0x00,0x68,1920,1440}, /* 0x2d */
+ {0x4005,0x2c,0x39,0x00,0x68,1920,1440}, /* 0x2e */
+ {0x4007,0x2d,0x2b,0x00,0x6c,2048,1536}, /* 0x2f */
+ {0x4007,0x2e,0x31,0x00,0x6c,2048,1536}, /* 0x30 */
+ {0x4007,0x2f,0x33,0x00,0x6c,2048,1536}, /* 0x31 */
+ {0x4007,0x30,0x37,0x00,0x6c,2048,1536}, /* 0x32 */
+ {0x4005,0x31,0x38,0x00,0x6c,2048,1536}, /* 0x33 */
+ {0x0057,0x32,0x40,0x08,0x70, 800, 480}, /* 0x34 */
+ {0x0047,0x33,0x07,0x08,0x70, 800, 480}, /* 0x35 */
+ {0x0047,0x34,0x0a,0x08,0x70, 800, 480}, /* 0x36 */
+ {0x0057,0x35,0x0b,0x09,0x71,1024, 576}, /* 0x37 */
+ {0x0047,0x36,0x11,0x09,0x71,1024, 576}, /* 0x38 */
+ {0x0047,0x37,0x16,0x09,0x71,1024, 576}, /* 0x39 */
+ {0x0057,0x38,0x19,0x0a,0x75,1280, 720}, /* 0x3a */
+ {0x0047,0x39,0x1e,0x0a,0x75,1280, 720}, /* 0x3b */
+ {0x0007,0x3a,0x20,0x0a,0x75,1280, 720}, /* 0x3c */
+ {0x0067,0x3b,0x19,0x08,0x7c,1280, 960}, /* 0x3d */
+ {0x0027,0x4c,0x59,0x08,0x7c,1280, 960}, /* 0x3e */
+ {0xc07f,0x4e,0x00,0x06,0x5a, 320, 240}, /* 0x3f */ /* FSTN 320x240 */
+ {0x0077,0x42,0x5b,0x08,0x23,1280, 768}, /* 0x40 */ /* TW: 0x5b was 0x12 */
+ {0x0067,0x43,0x4d,0x08,0x26,1400,1050}, /* 0x41 */
+ {0x0007,0x4b,0x5a,0x08,0x26,1400,1050}, /* 0x42 TW: not in any BIOS */
+ {0x0047,0x44,0x19,0x00,0x29,1152, 864}, /* 0x43 TW: Non-BIOS, new */
+ {0x0047,0x4a,0x1e,0x00,0x29,1152, 864}, /* 0x44 TW: Non-BIOS, new */
+ {0x00c7,0x45,0x57,0x00,0x39, 848, 480}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */
+ {0xc067,0x46,0x55,0x0b,0x39, 848, 480}, /* 0x46 TW: 848x480-60Hz - Non-BIOS, new */
+ {0x00c7,0x47,0x57,0x00,0x3f, 856, 480}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */
+ {0xc047,0x48,0x57,0x00,0x3f, 856, 480}, /* 0x48 TW: 856x480-60Hz - Non-BIOS, new */
+ {0x0067,0x49,0x58,0x0c,0x48,1360, 768}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */
+ {0x000f,0x4d,0x03,0x06,0x5f, 768, 576}, /* 0x4a TW: 768x576 */
+ {0xffff,0x00,0x00,0x00,0x00, 0, 0}
+};
+
+typedef struct _SiS310_CRT1TableStruct
+{
+ UCHAR CR[17];
+} SiS310_CRT1TableStruct;
+
+static const SiS310_CRT1TableStruct SiS310_CRT1Table[]=
{
{{0x2d,0x27,0x28,0x90,0x2c,0x80,0xbf,0x1f,
0x9c,0x8e,0x8f,0x96,0xb9,0x30,0x00,0x00,
@@ -271,7 +288,7 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
{{0x5f,0x4f,0x50,0x82,0x55,0x81,0x0b,0x3e,
0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x05,
0x00}}, /* 0x5 */
-#endif
+#endif
{{0x5f,0x4f,0x4f,0x83,0x55,0x81,0x0b,0x3e, /* 0x05 - corrected 640x480-60 */
0xe9,0x8b,0xdf,0xe8,0x0c,0x00,0x00,0x05,
0x00}},
@@ -290,16 +307,16 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
0xe0,0x83,0xdf,0xdf,0xfc,0x10,0x00,0x05,
0x00}}, /* 0x8 */
{{0x65,0x4f,0x4f,0x89,0x58,0x80,0xfb,0x1f,
- 0xe0,0x83,0xdf,0xdf,0xfc,0x10,0x00,0x05, /* Corrected VBE */
+ 0xe0,0x83,0xdf,0xdf,0xfc,0x10,0x00,0x05, /* TW: Corrected VBE */
0x61}}, /* 0x9 */
{{0x65,0x4f,0x4f,0x89,0x58,0x80,0x01,0x3e,
0xe0,0x83,0xdf,0xdf,0x02,0x00,0x00,0x05,
0x61}}, /* 0xa */
{{0x67,0x4f,0x4f,0x8b,0x58,0x81,0x0d,0x3e,
- 0xe0,0x83,0xdf,0xdf,0x0e,0x00,0x00,0x05, /* Corrected VBE */
+ 0xe0,0x83,0xdf,0xdf,0x0e,0x00,0x00,0x05, /* TW: Corrected VBE */
0x61}}, /* 0xb */
{{0x65,0x4f,0x4f,0x89,0x57,0x9f,0xfb,0x1f,
- 0xe6,0x8a,0xdf,0xdf,0xfc,0x10,0x00,0x01, /* Corrected VDE, VBE */
+ 0xe6,0x8a,0xdf,0xdf,0xfc,0x10,0x00,0x01, /* TW: Corrected VDE, VBE */
0x00}}, /* 0xc */
{{0x7b,0x63,0x63,0x9f,0x6a,0x93,0x6f,0xf0,
0x58,0x8a,0x57,0x57,0x70,0x20,0x00,0x05,
@@ -427,7 +444,7 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
{{0x9f,0x7f,0x7f,0x83,0x85,0x91,0x1e,0xf1,
0xad,0x81,0x3f,0x3f,0x1f,0x30,0x00,0x02,
0x01}}, /* 0x36 */
- {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1, /* 95 was 15 - illegal HBE! */
+ {{0xa7,0x7f,0x7f,0x88,0x89,0x95,0x26,0xf1, /* TW: 95 was 15 - illegal HBE! */
0xb1,0x85,0x3f,0x3f,0x27,0x30,0x00,0x02,
0x01}}, /* 0x37 */
{{0xce,0x9f,0x9f,0x92,0xa9,0x17,0x28,0xc4,
@@ -459,7 +476,7 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
{{0x81,0x6a,0x6a,0x85,0x70,0x00,0x0f,0x3e,
0xeb,0x8e,0xdf,0xdf,0x10,0x00,0x00,0x02,
0x00}}, /* 0x3f */
- {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+ {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x1e,0xf1, /* TW: The following from 650/LVDS BIOS */
0xae,0x85,0x57,0x57,0x1f,0x30,0x00,0x02,
0x01}}, /* 0x40 */
{{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,
@@ -471,31 +488,31 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
{{0xe6,0xae,0xae,0x8a,0xbd,0x90,0x3d,0x10,
0x1a,0x8d,0x19,0x19,0x3e,0x2f,0x00,0x03,
0x00}}, /* 0x43 */
- {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef, /* 1152x864-75 */
+ {{0xc3,0x8f,0x8f,0x87,0x9b,0x0b,0x82,0xef, /* TW: New, 1152x864-75, not in any BIOS */
0x60,0x83,0x5f,0x5f,0x83,0x10,0x00,0x07,
0x01}}, /* 0x44 */
- {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15, /* 848x480-38i */
+ {{0x86,0x69,0x69,0x8A,0x74,0x06,0x8C,0x15, /* TW: New, 848x480-38i, not in BIOS */
0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
0x00}}, /* 0x45 */
- {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E, /* 848x480-60 */
+ {{0x83,0x69,0x69,0x87,0x6f,0x1d,0x03,0x3E, /* TW: New, 848x480-60, not in BIOS */
0xE5,0x8d,0xDF,0xe4,0x04,0x00,0x00,0x06,
0x00}}, /* 0x46 */
- {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15, /* 856x480-38i */
+ {{0x86,0x6A,0x6A,0x8A,0x74,0x06,0x8C,0x15, /* TW: New, 856x480-38i, not in BIOS */
0x4F,0x83,0xEF,0xEF,0x8D,0x30,0x00,0x02,
0x00}}, /* 0x47 */
- {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E, /* 856x480-60 */
+ {{0x81,0x6A,0x6A,0x85,0x70,0x00,0x0F,0x3E, /* TW: New, 856x480-60, not in BIOS */
0xEB,0x8E,0xDF,0xDF,0x10,0x00,0x00,0x02,
0x00}}, /* 0x48 */
- {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd, /* 1360x768-60 */
+ {{0xdd,0xa9,0xa9,0x81,0xb4,0x97,0x26,0xfd, /* TW: New, 1360x768-60, not in BIOS */
0x01,0x8d,0xff,0x00,0x27,0x10,0x00,0x03,
0x01}}, /* 0x49 */
- {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff, /* 1152x864-84 */
+ {{0xd9,0x8f,0x8f,0x9d,0xba,0x0a,0x8a,0xff, /* TW: New, 1152x864-84, not in any BIOS */
0x60,0x8b,0x5f,0x5f,0x8b,0x10,0x00,0x03,
0x01}}, /* 0x4a */
- {{0xea,0xae,0xae,0x8e,0xba,0x82,0x40,0x10, /* 1400x1050-75 */
+ {{0xea,0xae,0xae,0x8e,0xba,0x82,0x40,0x10, /* TW: New, 1400x1050-75, not in any BIOS */
0x1b,0x87,0x19,0x1a,0x41,0x0f,0x00,0x03,
- 0x00}}, /* 0x4b */
- {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff, /* 1280x960-85 */
+ 0x00}}, /* 0x4b */
+ {{0xd3,0x9f,0x9f,0x97,0xab,0x1f,0xf1,0xff, /* TW: New, 1280x960-85, not in any BIOS */
0xc0,0x83,0xbf,0xbf,0xf2,0x10,0x00,0x07,
0x01}}, /* 0x4c */
{{0x7b,0x5f,0x63,0x9f,0x6a,0x93,0x6f,0xf0, /* 768x576 */
@@ -503,16 +520,17 @@ static const SiS_CRT1TableStruct SiS310_CRT1Table[]=
0x01}}, /* 0x4d */
{{0x2d,0x27,0x28,0x90,0x2c,0x80,0x0b,0x3e, /* FSTN 320x480, TEMP - possibly invalid */
0xe9,0x8b,0xdf,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}, /* 0x4e */
- {{0xcd,0x9f,0x9f,0x91,0xab,0x1c,0x3a,0xff, /* 1280x800-60 */
- 0x20,0x83,0x1f,0x1f,0x3b,0x10,0x00,0x07,
- 0x21}}, /* 0x4f */
- {{0x15,0xd1,0xd1,0x99,0xe2,0x19,0x3d,0x10, /* 1680x1050-60 */
- 0x1a,0x8d,0x19,0x19,0x3e,0x2f,0x01,0x0c,
- 0x20}} /* 0x50 */
+ 0x00}} /* 0x4e */
};
-static const SiS_MCLKDataStruct SiS310_MCLKData_0_315[] =
+typedef struct _SiS310_MCLKDataStruct
+{
+ UCHAR SR28,SR29,SR2A;
+ USHORT CLOCK;
+} SiS310_MCLKDataStruct;
+
+#ifdef LINUXBIOS
+static const SiS310_MCLKDataStruct SiS310_MCLKData_0_315[] =
{
{ 0x3b,0x22,0x01,143},
{ 0x5c,0x23,0x01,166},
@@ -524,7 +542,7 @@ static const SiS_MCLKDataStruct SiS310_MCLKData_0_315[] =
{ 0x5c,0x23,0x01,166}
};
-static const SiS_MCLKDataStruct SiS310_MCLKData_0_650[] =
+static const SiS310_MCLKDataStruct SiS310_MCLKData_0_650[] =
{
{ 0x5a,0x64,0x82, 66},
{ 0xb3,0x45,0x82, 83},
@@ -535,8 +553,9 @@ static const SiS_MCLKDataStruct SiS310_MCLKData_0_650[] =
{ 0x37,0x22,0x82,133},
{ 0x37,0x22,0x82,133}
};
+#endif
-static const SiS_MCLKDataStruct SiS310_MCLKData_0_330[] =
+static const SiS310_MCLKDataStruct SiS310_MCLKData_0_330[] =
{
{ 0x5c,0x23,0x01,166},
{ 0x5c,0x23,0x01,166},
@@ -548,31 +567,21 @@ static const SiS_MCLKDataStruct SiS310_MCLKData_0_330[] =
{ 0x79,0x06,0x01,250}
};
-static const SiS_MCLKDataStruct SiS310_MCLKData_0_660[] =
-{
- { 0x5c,0x23,0x82,166},
- { 0x5c,0x23,0x82,166},
- { 0x37,0x21,0x82,200},
- { 0x37,0x22,0x82,133},
- { 0x29,0x21,0x82,150},
- { 0x5c,0x23,0x82,166},
- { 0x65,0x23,0x82,183},
- { 0x37,0x21,0x82,200}
-};
-
-static const SiS_MCLKDataStruct SiS310_MCLKData_0_760[] =
+#ifdef LINUXBIOS
+static const SiS310_MCLKDataStruct SiS310_MCLKData_0_660[] = /* TODO */
{
- { 0x37,0x22,0x82,133},
- { 0x5c,0x23,0x82,166},
- { 0x65,0x23,0x82,183},
- { 0x7c,0x08,0x82,200},
- { 0x29,0x21,0x82,150},
- { 0x5c,0x23,0x82,166},
- { 0x65,0x23,0x82,183},
- { 0x37,0x21,0x82,200}
+ { 0x5c,0x23,0x01,166},
+ { 0x5c,0x23,0x01,166},
+ { 0x7c,0x08,0x01,200},
+ { 0x79,0x06,0x01,250},
+ { 0x7c,0x08,0x01,200},
+ { 0x7c,0x08,0x01,200},
+ { 0x7c,0x08,0x01,200},
+ { 0x79,0x06,0x01,250}
};
+#endif
-static const SiS_MCLKDataStruct SiS310_MCLKData_1[] = /* ECLK */
+static const SiS310_MCLKDataStruct SiS310_MCLKData_1[] =
{
{ 0x29,0x21,0x82,150},
{ 0x5c,0x23,0x82,166},
@@ -584,7 +593,29 @@ static const SiS_MCLKDataStruct SiS310_MCLKData_1[] = /* ECLK */
{ 0x37,0x22,0x82,133}
};
-static SiS_VCLKDataStruct SiS310_VCLKData[]=
+#ifdef LINUXBIOS
+typedef struct _SiS310_ECLKDataStruct
+{
+ UCHAR SR2E,SR2F,SR30;
+ USHORT CLOCK;
+} SiS310_ECLKDataStruct;
+
+static const SiS310_ECLKDataStruct SiS310_ECLKData[]=
+{
+ { 0x5c,0x23,0x01,166},
+ { 0x5c,0x23,0x01,166},
+ { 0x5c,0x23,0x01,166},
+ { 0x5c,0x23,0x01,166}
+};
+#endif
+
+typedef struct _SiS310_VCLKDataStruct
+{
+ UCHAR SR2B,SR2C;
+ USHORT CLOCK;
+} SiS310_VCLKDataStruct;
+
+static const SiS310_VCLKDataStruct SiS310_VCLKData[]=
{
{ 0x1b,0xe1, 25}, /* 0x00 */
{ 0x4e,0xe4, 28}, /* 0x01 */
@@ -597,7 +628,7 @@ static SiS_VCLKDataStruct SiS310_VCLKData[]=
{ 0x53,0xe2, 50}, /* 0x08 */
{ 0x74,0x67, 52}, /* 0x09 */
{ 0x6d,0x66, 56}, /* 0x0a */
- { 0x5a,0x64, 65}, /* 0x0b */ /* was 6c c3 - WRONG */
+ { 0x5a,0x64, 65}, /* 0x0b */ /* TW: was 6c c3 - WRONG */
{ 0x46,0x44, 67}, /* 0x0c */
{ 0xb1,0x46, 68}, /* 0x0d */
{ 0xd3,0x4a, 72}, /* 0x0e */
@@ -611,7 +642,7 @@ static SiS_VCLKDataStruct SiS310_VCLKData[]=
{ 0x62,0x44, 94}, /* 0x16 */
{ 0x2b,0x41,104}, /* 0x17 */
{ 0x3a,0x23,105}, /* 0x18 */
- { 0x70,0x44,108}, /* 0x19 */
+ { 0x70,0x44,108}, /* 0x19 */ /* 1400x1050 LCD */
{ 0x3c,0x23,109}, /* 0x1a */
{ 0x5e,0x43,113}, /* 0x1b */
{ 0xbc,0x44,116}, /* 0x1c */
@@ -644,51 +675,49 @@ static SiS_VCLKDataStruct SiS310_VCLKData[]=
{ 0xea,0x08,340}, /* 0x37 */
{ 0xe8,0x07,376}, /* 0x38 */
{ 0xde,0x06,389}, /* 0x39 */
- { 0x52,0x2a, 54}, /* 0x3a 301 TV */
- { 0x52,0x6a, 27}, /* 0x3b 301 TV */
- { 0x62,0x24, 70}, /* 0x3c 301 TV */
- { 0x62,0x64, 70}, /* 0x3d 301 TV */
- { 0xa8,0x4c, 30}, /* 0x3e 301 TV */
- { 0x20,0x26, 33}, /* 0x3f 301 TV */
+ { 0x52,0x2a, 54}, /* 0x3a */ /* 301 TV */
+ { 0x52,0x6a, 27}, /* 0x3b */ /* 301 TV */
+ { 0x62,0x24, 70}, /* 0x3c */ /* 301 TV */
+ { 0x62,0x64, 70}, /* 0x3d */ /* 301 TV */
+ { 0xa8,0x4c, 30}, /* 0x3e */ /* 301 TV */
+ { 0x20,0x26, 33}, /* 0x3f */ /* 301 TV */
{ 0x31,0xc2, 39}, /* 0x40 */
- { 0x60,0x36, 30}, /* 0x41 Chrontel */
- { 0x40,0x4a, 28}, /* 0x42 Chrontel */
- { 0x9f,0x46, 44}, /* 0x43 Chrontel */
+ { 0x60,0x36, 30}, /* 0x41 */ /* Chrontel */
+ { 0x40,0x4a, 28}, /* 0x42 */ /* Chrontel */
+ { 0x9f,0x46, 44}, /* 0x43 */ /* Chrontel */
{ 0x97,0x2c, 26}, /* 0x44 */
- { 0x44,0xe4, 25}, /* 0x45 Chrontel */
- { 0x7e,0x32, 47}, /* 0x46 Chrontel */
- { 0x8a,0x24, 31}, /* 0x47 Chrontel */
- { 0x97,0x2c, 26}, /* 0x48 Chrontel */
+ { 0x44,0xe4, 25}, /* 0x45 */ /* Chrontel */
+ { 0x7e,0x32, 47}, /* 0x46 */ /* Chrontel */
+ { 0x8a,0x24, 31}, /* 0x47 */ /* Chrontel */
+ { 0x97,0x2c, 26}, /* 0x48 */ /* Chrontel */
{ 0xce,0x3c, 39}, /* 0x49 */
- { 0x52,0x4a, 36}, /* 0x4a Chrontel */
+ { 0x52,0x4a, 36}, /* 0x4a */ /* Chrontel */
{ 0x34,0x61, 95}, /* 0x4b */
{ 0x78,0x27,108}, /* 0x4c - was 102 */
- { 0x66,0x43,123}, /* 0x4d Modes 0x26-0x28 (1400x1050) */
+ { 0x66,0x43,123}, /* 0x4d */ /* Modes 0x26-0x28 (1400x1050) */
{ 0x41,0x4e, 21}, /* 0x4e */
- { 0xa1,0x4a, 29}, /* 0x4f Chrontel */
+ { 0xa1,0x4a, 29}, /* 0x4f */ /* Chrontel */
{ 0x19,0x42, 42}, /* 0x50 */
- { 0x54,0x46, 58}, /* 0x51 Chrontel */
+ { 0x54,0x46, 58}, /* 0x51 */ /* Chrontel */
{ 0x25,0x42, 61}, /* 0x52 */
- { 0x44,0x44, 66}, /* 0x53 Chrontel */
- { 0x3a,0x62, 70}, /* 0x54 Chrontel */
- { 0x62,0xc6, 34}, /* 0x55 848x480-60 */
- { 0x6a,0xc6, 37}, /* 0x56 848x480-75 - TEMP */
- { 0xbf,0xc8, 35}, /* 0x57 856x480-38i,60 */
- { 0x30,0x23, 88}, /* 0x58 1360x768-62 (is 60Hz!) */
- { 0x52,0x07,149}, /* 0x59 1280x960-85 */
- { 0x56,0x07,156}, /* 0x5a 1400x1050-75 */
- { 0x70,0x29, 81}, /* 0x5b 1280x768 LCD */
- { 0x45,0x25, 83}, /* 0x5c 1280x800 */
- { 0x70,0x0a,147}, /* 0x5d 1680x1050 */
- { 0x70,0x24,162}, /* 0x5e 1600x1200 */
- { 0x5a,0x64, 65}, /* 0x5f 1280x720 - temp */
- { 0x63,0x46, 68}, /* 0x60 1280x768_2 */
- { 0x31,0x42, 79}, /* 0x61 1280x768_3 - temp */
- { 0, 0, 0}, /* 0x62 - custom (will be filled out at run-time) */
- { 0x5a,0x64, 65} /* 0x63 1280x720 (LCD LVDS) */
-};
-
-static SiS_VBVCLKDataStruct SiS310_VBVCLKData[]=
+ { 0x44,0x44, 66}, /* 0x53 */ /* Chrontel */
+ { 0x3a,0x62, 70}, /* 0x54 */ /* Chrontel */
+ { 0x62,0xc6, 34}, /* 0x55 - added for 848x480-60 (not in any BIOS) */
+ { 0x6a,0xc6, 37}, /* 0x56 - added for 848x480-75 (not in any BIOS) - TEMP */
+ { 0xbf,0xc8, 35}, /* 0x57 - added for 856x480-38i,60 (not in any BIOS) */
+ { 0x30,0x23, 88}, /* 0x58 - added for 1360x768-62 (is 60Hz!) (not in any BIOS) */
+ { 0x52,0x07,149}, /* 0x59 - added for 1280x960-85 (Not in any BIOS) */
+ { 0x56,0x07,156}, /* 0x5a - added for 1400x1050-75 */
+ { 0x70,0x29, 81} /* 0x5b */ /* 1280x768 LCD */
+};
+
+typedef struct _SiS310_VBVCLKDataStruct
+{
+ UCHAR Part4_A,Part4_B;
+ USHORT CLOCK;
+} SiS310_VBVCLKDataStruct;
+
+static const SiS310_VBVCLKDataStruct SiS310_VBVCLKData[]=
{
{ 0x1b,0xe1, 25}, /* 0x00 */
{ 0x4e,0xe4, 28}, /* 0x01 */
@@ -701,7 +730,7 @@ static SiS_VBVCLKDataStruct SiS310_VBVCLKData[]=
{ 0x53,0x47, 50}, /* 0x08 */
{ 0x74,0x67, 52}, /* 0x09 */
{ 0x6d,0x66, 56}, /* 0x0a */
- { 0x35,0x62, 65}, /* 0x0b */ /* Was 0x5a,0x64 - 650/LVDS+301: 35,62 */
+ { 0x35,0x62, 65}, /* 0x0b */ /* Was 0x5a,0x64 - 650/LVDS+301 bios: 35,62 */
{ 0x46,0x44, 67}, /* 0x0c */
{ 0xb1,0x46, 68}, /* 0x0d */
{ 0xd3,0x4a, 72}, /* 0x0e */
@@ -720,16 +749,10 @@ static SiS_VBVCLKDataStruct SiS310_VBVCLKData[]=
{ 0x5e,0x43,113}, /* 0x1b */
{ 0xbc,0x44,116}, /* 0x1c */
{ 0xe0,0x46,132}, /* 0x1d */
-#if 0
{ 0xd4,0x28,135}, /* 0x1e */
{ 0xea,0x2a,139}, /* 0x1f */
{ 0x41,0x22,157}, /* 0x20 */
{ 0x70,0x24,162}, /* 0x21 */
-#endif
- { 0xe2,0x46,135}, /* 0x1e */ /* 1280x1024-75, better clock for VGA2 */
- { 0xe5,0x46,139}, /* 0x1f */ /* 1024x768-120, better clock for VGA2 */
- { 0x15,0x01,157}, /* 0x20 */ /* 1280x1024-85, better clock for VGA2 */
- { 0x70,0x09,162}, /* 0x21 */ /* 1600x1200-60, better clock for VGA2 */
{ 0x30,0x21,175}, /* 0x22 */
{ 0x4e,0x22,189}, /* 0x23 */
{ 0xde,0x26,194}, /* 0x24 */
@@ -754,51 +777,50 @@ static SiS_VBVCLKDataStruct SiS310_VBVCLKData[]=
{ 0xea,0x08,340}, /* 0x37 */
{ 0xe8,0x07,376}, /* 0x38 */
{ 0xde,0x06,389}, /* 0x39 */
- { 0x52,0x2a, 54}, /* 0x3a 301 TV - start */
- { 0x52,0x6a, 27}, /* 0x3b 301 TV */
- { 0x62,0x24, 70}, /* 0x3c 301 TV */
- { 0x62,0x64, 70}, /* 0x3d 301 TV */
- { 0xa8,0x4c, 30}, /* 0x3e 301 TV */
- { 0x20,0x26, 33}, /* 0x3f 301 TV */
+ { 0x52,0x2a, 54}, /* 0x3a */ /* 301 TV */
+ { 0x52,0x6a, 27}, /* 0x3b */ /* 301 TV */
+ { 0x62,0x24, 70}, /* 0x3c */ /* 301 TV */
+ { 0x62,0x64, 70}, /* 0x3d */ /* 301 TV */
+ { 0xa8,0x4c, 30}, /* 0x3e */ /* 301 TV */
+ { 0x20,0x26, 33}, /* 0x3f */ /* 301 TV */
{ 0x31,0xc2, 39}, /* 0x40 */
- { 0x2e,0x48, 25}, /* 0x41 Replacement for LCD on 315 for index 0 */
- { 0x24,0x46, 25}, /* 0x42 Replacement for LCD on 315 for modes 0x01, 0x03, 0x0f, 0x10, 0x12 */
- { 0x26,0x64, 28}, /* 0x43 Replacement for LCD on 315 for index 1 */
- { 0x37,0x64, 40}, /* 0x44 Replacement for LCD on 315 for index 4 */
- { 0xa1,0x42,108}, /* 0x45 1280x960 LCD */
- { 0x37,0x61,100}, /* 0x46 1280x960 LCD */
+ { 0x2e,0x48, 25}, /* 0x41 */ /* Replacement for LCD on 315 for index 0 */
+ { 0x24,0x46, 25}, /* 0x42 */ /* Replacement for LCD on 315 for modes 0x01, 0x03, 0x0f, 0x10, 0x12 */
+ { 0x26,0x64, 28}, /* 0x43 */ /* Replacement for LCD on 315 for index 1 */
+ { 0x37,0x64, 40}, /* 0x44 */ /* Replacement for LCD on 315 for index 4 */
+ { 0xa1,0x42,108}, /* 0x45 */ /* 1280x960 LCD */
+ { 0x37,0x61,100}, /* 0x46 */ /* 1280x960 LCD */
{ 0x78,0x27,108}, /* 0x47 */
- { 0x97,0x2c, 26}, /* 0x48 UNUSED */
- { 0xce,0x3c, 39}, /* 0x49 UNUSED */
- { 0x52,0x4a, 36}, /* 0x4a UNUSED */
- { 0x34,0x61, 95}, /* 0x4b UNUSED */
- { 0x78,0x27,108}, /* 0x4c UNUSED */
- { 0x66,0x43,123}, /* 0x4d 1400x1050-60 */
- { 0x41,0x4e, 21}, /* 0x4e UNUSED */
- { 0xa1,0x4a, 29}, /* 0x4f UNUSED */
- { 0x19,0x42, 42}, /* 0x50 UNUSED */
- { 0x54,0x46, 58}, /* 0x51 UNUSED */
- { 0x25,0x42, 61}, /* 0x52 UNUSED */
- { 0x44,0x44, 66}, /* 0x53 UNUSED */
- { 0x3a,0x62, 70}, /* 0x54 UNUSED */
- { 0x62,0xc6, 34}, /* 0x55 848x480-60 */
- { 0x6a,0xc6, 37}, /* 0x56 848x480-75 - TEMP, UNUSED */
- { 0xbf,0xc8, 35}, /* 0x57 856x480-38i,60 */
- { 0x30,0x23, 88}, /* 0x58 1360x768-62 (is 60Hz!) TEMP, UNUSED */
- { 0x52,0x07,149}, /* 0x59 1280x960-85 */
- { 0x56,0x07,156}, /* 0x5a 1400x1050-75 */
- { 0x70,0x29, 81}, /* 0x5b 1280x768 LCD */
- { 0x9c,0x62, 69}, /* 0x5c 1280x800 LCD - wrong? */
- { 0xbe,0x44,121}, /* 0x5d 1680x1050 LCD */
- { 0x70,0x24,162}, /* 0x5e 1600x1200 LCD */
- { 0x52,0x27, 75}, /* 0x5f 1280x720 LCD TMDS + HDTV (correct) */
- { 0x63,0x46, 68}, /* 0x60 1280x768_2 */
- { 0x31,0x42, 79}, /* 0x61 1280x768_3 - temp */
- { 0, 0, 0}, /* 0x62 - custom (will be filled out at run-time) */
- { 0x5a,0x64, 65} /* 0x63 1280x720 (LCD LVDS) */
-};
-
-static const DRAM4Type SiS310_SR15[8] = {
+ { 0x97,0x2c, 26}, /* 0x48 */ /* UNUSED - Entries from here new, not in any BIOS */
+ { 0xce,0x3c, 39}, /* 0x49 */ /* UNUSED */
+ { 0x52,0x4a, 36}, /* 0x4a */ /* UNUSED */
+ { 0x34,0x61, 95}, /* 0x4b */ /* UNUSED */
+ { 0x78,0x27,108}, /* 0x4c */ /* UNUSED */
+ { 0x66,0x43,123}, /* 0x4d */ /* 1400x1050-60 */
+ { 0x41,0x4e, 21}, /* 0x4e */ /* UNUSED */
+ { 0xa1,0x4a, 29}, /* 0x4f */ /* UNUSED */
+ { 0x19,0x42, 42}, /* 0x50 */ /* UNUSED */
+ { 0x54,0x46, 58}, /* 0x51 */ /* UNUSED */
+ { 0x25,0x42, 61}, /* 0x52 */ /* UNUSED */
+ { 0x44,0x44, 66}, /* 0x53 */ /* UNUSED */
+ { 0x3a,0x62, 70}, /* 0x54 */ /* UNUSED */
+ { 0x62,0xc6, 34}, /* 0x55 */ /* 848x480-60 */
+ { 0x6a,0xc6, 37}, /* 0x56 */ /* 848x480-75 - TEMP, UNUSED */
+ { 0xbf,0xc8, 35}, /* 0x57 */ /* 856x480-38i,60 */
+ { 0x30,0x23, 88}, /* 0x58 */ /* 1360x768-62 (is 60Hz!) TEMP, UNUSED */
+ { 0x52,0x07,149}, /* 0x59 */ /* 1280x960-85 - UNUSED */
+ { 0x56,0x07,156}, /* 0x5a */ /* 1400x1050-75 - UNUSED */
+ { 0x70,0x29, 81} /* 0x5b */ /* 1280x768 LCD */
+};
+
+static const UCHAR SiS310_ScreenOffset[] =
+{
+ 0x14,0x19,0x20,0x28,0x32,0x40,0x50,0x64,
+ 0x78,0x80,0x2d,0x35,0x57,0x48,0x55,0x30,
+ 0xff
+};
+
+static const UCHAR SiS310_SR15[8][4]={
{0x00,0x04,0x60,0x60},
{0x0f,0x0f,0x0f,0x0f},
{0xba,0xba,0xba,0xba},
@@ -813,7 +835,7 @@ static const DRAM4Type SiS310_SR15[8] = {
static UCHAR SiS310_SR07 = 0x18;
-static const DRAM4Type SiS310_CR40[5] = {
+static const UCHAR SiS310_CR40[5][4]={
{0x77,0x77,0x33,0x33},
{0x77,0x77,0x33,0x33},
{0x00,0x00,0x00,0x00},
@@ -843,62 +865,28 @@ static const USHORT SiS310_VideoSenseData2 = 0x0174;
static const USHORT SiS310_YCSenseData2 = 0x016b;
#endif
-static const SiS_PanelDelayTblStruct SiS310_PanelDelayTbl[]=
-{
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}},
- {{0x10,0x40}}
-};
-
-static const SiS_PanelDelayTblStruct SiS310_PanelDelayTblLVDS[]=
+typedef struct _SiS310_LCDDataStruct
{
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}},
- {{0x28,0xc8}}
-};
-
-/**************************************************************/
-/* SIS VIDEO BRIDGE ----------------------------------------- */
-/**************************************************************/
+ USHORT RVBHCMAX;
+ USHORT RVBHCFACT;
+ USHORT VGAHT;
+ USHORT VGAVT;
+ USHORT LCDHT;
+ USHORT LCDVT;
+} SiS310_LCDDataStruct;
-static const SiS_LCDDataStruct SiS310_St2LCD1024x768Data[] =
+static const SiS310_LCDDataStruct SiS310_StLCD1024x768Data[]=
{
{ 62, 25, 800, 546,1344, 806},
{ 32, 15, 930, 546,1344, 806},
- { 62, 25, 800, 546,1344, 806},
+ { 32, 15, 930, 546,1344, 806},
{ 104, 45, 945, 496,1344, 806},
{ 62, 25, 800, 546,1344, 806},
{ 31, 18,1008, 624,1344, 806},
{ 1, 1,1344, 806,1344, 806}
};
-static const SiS_LCDDataStruct SiS310_ExtLCD1024x768Data[] =
+static const SiS310_LCDDataStruct SiS310_ExtLCD1024x768Data[] =
{
{ 42, 25,1536, 419,1344, 806},
{ 48, 25,1536, 369,1344, 806},
@@ -906,10 +894,28 @@ static const SiS_LCDDataStruct SiS310_ExtLCD1024x768Data[] =
{ 48, 25,1536, 369,1344, 806},
{ 12, 5, 896, 500,1344, 806},
{ 42, 25,1024, 625,1344, 806},
+ { 1, 1,1344, 806,1344, 806},
+ { 12, 5, 896, 500,1344, 806},
+ { 42, 25,1024, 625,1344, 806},
+ { 1, 1,1344, 806,1344, 806},
+ { 12, 5, 896, 500,1344, 806},
+ { 42, 25,1024, 625,1344, 806},
+ { 1, 1,1344, 806,1344, 806}
+
+};
+
+static const SiS310_LCDDataStruct SiS310_St2LCD1024x768Data[] =
+{
+ { 62, 25, 800, 546,1344, 806},
+ { 32, 15, 930, 546,1344, 806},
+ { 62, 25, 800, 546,1344, 806},
+ { 104, 45, 945, 496,1344, 806},
+ { 62, 25, 800, 546,1344, 806},
+ { 31, 18,1008, 624,1344, 806},
{ 1, 1,1344, 806,1344, 806}
};
-static const SiS_LCDDataStruct SiS310_St2LCD1280x1024Data[] =
+static const SiS310_LCDDataStruct SiS310_StLCD1280x1024Data[] =
{
{ 22, 5, 800, 510,1650,1088},
{ 22, 5, 800, 510,1650,1088},
@@ -921,7 +927,7 @@ static const SiS_LCDDataStruct SiS310_St2LCD1280x1024Data[] =
{ 1, 1,1688,1066,1688,1066}
};
-static const SiS_LCDDataStruct SiS310_ExtLCD1280x1024Data[] =
+static const SiS310_LCDDataStruct SiS310_ExtLCD1280x1024Data[] =
{
{ 211, 60,1024, 501,1688,1066},
{ 211, 60,1024, 508,1688,1066},
@@ -930,48 +936,102 @@ static const SiS_LCDDataStruct SiS310_ExtLCD1280x1024Data[] =
{ 211, 60,1024, 500,1688,1066},
{ 211, 75,1024, 625,1688,1066},
{ 211, 120,1280, 798,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1800,1000,1688,1066} /* 1280x960 - does not work, use panel scaler instead */
+};
+
+static const SiS310_LCDDataStruct SiS310_St2LCD1280x1024Data[] =
+{
+ { 22, 5, 800, 510,1650,1088},
+ { 22, 5, 800, 510,1650,1088},
+ { 176, 45, 900, 510,1650,1088},
+ { 176, 45, 900, 510,1650,1088},
+ { 22, 5, 800, 510,1650,1088},
+ { 13, 5,1024, 675,1560,1152},
+ { 16, 9,1266, 804,1688,1072},
{ 1, 1,1688,1066,1688,1066}
};
-static const SiS_Part2PortTblStruct SiS310_CRT2Part2_1024x768_1[] =
+static const SiS310_LCDDataStruct SiS310_NoScaleData1024x768[] =
{
- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x2c,0x12,0x9a,0xae,0x88,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
- {{0x38,0x13,0x16,0x0c,0xe6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1344, 806,1344, 806}, /* 640x400 - does not work */
+ { 1, 1,1344, 806,1344, 806}, /* 640x480 - does not work */
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1344, 806,1344, 806},
+ { 1, 1,1344, 806,1344, 806}
+};
+
+static const SiS310_LCDDataStruct SiS310_NoScaleData1280x1024[] =
+{
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066},
+ { 1, 1,1688,1066,1688,1066}
};
-/* *** LCDA *** */
-#if 0
-static const SiS_LVDSDataStruct SiS_LCDA1600x1200Data_1[]=
-{ /* Clevo, 651+301C */
- {1200, 450, 2048,1250},
- {1200, 400, 2048,1250},
- {1280, 450, 2048,1250},
- {1280, 400, 2048,1250},
- {1200, 530, 2048,1250},
- {1360, 650, 2048,1250},
- {1584, 818, 2048,1250},
- {1688,1066, 2048,1250},
- {1688,1066, 2048,1250},
-#if 0
- {2048,1250, 2048,1250} /* this should be correct */
-#endif
-#if 1
- {2160,1250, 2048,1250} /* ? */
-#endif
+typedef struct _SiS310_PanelDelayTblStruct
+{
+ UCHAR timer[2];
+} SiS310_PanelDelayTblStruct;
+
+static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTbl[]=
+{
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}},
+ {{0x10,0x40}}
+};
+
+static const SiS310_PanelDelayTblStruct SiS310_PanelDelayTblLVDS[]=
+{
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}},
+ {{0x28,0xc8}}
};
-#endif
-/**************************************************************/
-/* LVDS, CHRONTEL ------------------------------------------- */
-/**************************************************************/
+typedef struct _SiS310_LVDSDataStruct
+{
+ USHORT VGAHT;
+ USHORT VGAVT;
+ USHORT LCDHT;
+ USHORT LCDVT;
+} SiS310_LVDSDataStruct;
-static const SiS_LVDSDataStruct SiS310_CHTVUPALData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVUPALData[]=
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -982,7 +1042,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVUPALData[]=
{1400,1000,1400,1000}
};
-static const SiS_LVDSDataStruct SiS310_CHTVOPALData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVOPALData[]=
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -993,7 +1053,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVOPALData[]=
{1400, 875,1400, 875}
};
-static const SiS_LVDSDataStruct SiS310_CHTVUPALMData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVUPALMData[]=
{
{ 840, 600, 840, 600},
{ 840, 600, 840, 600},
@@ -1004,7 +1064,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVUPALMData[]=
{1160, 945,1160, 945}
};
-static const SiS_LVDSDataStruct SiS310_CHTVOPALMData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVOPALMData[]=
{
{ 840, 525, 840, 525},
{ 840, 525, 840, 525},
@@ -1015,7 +1075,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVOPALMData[]=
{1160, 840,1160, 840}
};
-static const SiS_LVDSDataStruct SiS310_CHTVUPALNData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVUPALNData[]=
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -1026,7 +1086,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVUPALNData[]=
{1400,1000,1400,1000}
};
-static const SiS_LVDSDataStruct SiS310_CHTVOPALNData[]=
+static const SiS310_LVDSDataStruct SiS310_CHTVOPALNData[]=
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -1037,7 +1097,7 @@ static const SiS_LVDSDataStruct SiS310_CHTVOPALNData[]=
{1400, 875,1400, 875}
};
-static const SiS_LVDSDataStruct SiS310_CHTVSOPALData[]= /* (super overscan - no effect on 7019) */
+static const SiS310_LVDSDataStruct SiS310_CHTVSOPALData[]= /* TW: (super overscan - no effect on 7019) */
{
{1008, 625,1008, 625},
{1008, 625,1008, 625},
@@ -1048,8 +1108,13 @@ static const SiS_LVDSDataStruct SiS310_CHTVSOPALData[]= /* (super overscan -
{1400, 875,1400, 875}
};
+typedef struct _SiS310_LVDSDesStruct
+{
+ USHORT LCDHDES;
+ USHORT LCDVDES;
+} SiS310_LVDSDesStruct;
-static const SiS_LVDSDesStruct SiS310_PanelType00_1[]= /* 800x600 */
+static const SiS310_LVDSDesStruct SiS310_PanelType00_1[]= /* 800x600 */
{
{ 0, 0},
{ 0, 0},
@@ -1062,7 +1127,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType00_1[]= /* 800x600 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType01_1[]= /* 1024x768 */
+static const SiS310_LVDSDesStruct SiS310_PanelType01_1[]= /* 1024x768 */
{
{ 0, 0},
{ 0, 0},
@@ -1075,7 +1140,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType01_1[]= /* 1024x768 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType02_1[]= /* 1280x1024 */
+static const SiS310_LVDSDesStruct SiS310_PanelType02_1[]= /* 1280x1024 */
{
{ 0, 0},
{ 0, 0},
@@ -1090,7 +1155,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType02_1[]= /* 1280x1024 */
};
-static const SiS_LVDSDesStruct SiS310_PanelType03_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType03_1[]=
{
{ 0, 0},
{ 0, 0},
@@ -1103,7 +1168,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType03_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType04_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType04_1[]=
{
{1343, 798},
{1343, 794},
@@ -1116,7 +1181,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType04_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType05_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType05_1[]=
{
{1343, 798},
{1343, 794},
@@ -1129,7 +1194,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType05_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType06_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType06_1[]=
{
{1343, 798},
{1343, 794},
@@ -1142,7 +1207,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType06_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType07_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType07_1[]=
{
{1343, 798},
{1343, 794},
@@ -1155,7 +1220,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType07_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType08_1[]= /* 1400x1050 */
+static const SiS310_LVDSDesStruct SiS310_PanelType08_1[]= /* 1400x1050 */
{
{ 0, 0},
{ 0, 0},
@@ -1170,7 +1235,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType08_1[]= /* 1400x1050 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType09_1[]= /* 1280x768 */
+static const SiS310_LVDSDesStruct SiS310_PanelType09_1[]= /* 1280x768 */
{
{ 0, 0},
{ 0, 0},
@@ -1185,7 +1250,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType09_1[]= /* 1280x768 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0a_1[]= /* 1600x1200 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0a_1[]= /* 1600x1200 */
{
{ 0, 0},
{ 0, 0},
@@ -1200,7 +1265,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0a_1[]= /* 1600x1200 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0b_1[]= /* 640x480_2 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0b_1[]= /* 640x480_2 */
{
{ 0, 524},
{ 0, 524},
@@ -1212,7 +1277,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0b_1[]= /* 640x480_2 */
{ 0, 524}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0c_1[]= /* 640x480_3 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0c_1[]= /* 640x480_3 */
{
{ 0, 524},
{ 0, 524},
@@ -1224,7 +1289,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0c_1[]= /* 640x480_3 */
{ 0, 524}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0d_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType0d_1[]=
{
{1343, 798},
{1343, 794},
@@ -1237,7 +1302,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0d_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0e_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType0e_1[]=
{
{1343, 798},
{1343, 794},
@@ -1250,7 +1315,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0e_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0f_1[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType0f_1[]=
{
{1343, 798},
{1343, 794},
@@ -1263,7 +1328,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0f_1[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType00_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType00_2[]=
{
{980, 528},
{980, 503},
@@ -1276,7 +1341,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType00_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType01_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType01_2[]=
{
{1152, 622},
{1152, 597},
@@ -1289,7 +1354,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType01_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType02_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType02_2[]=
{
{1368, 754},
{1368, 729},
@@ -1304,7 +1369,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType02_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType03_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType03_2[]=
{
{ 0, 0},
{ 0, 0},
@@ -1315,7 +1380,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType03_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType04_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType04_2[]=
{
{ 0, 0},
{ 0, 0},
@@ -1328,7 +1393,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType04_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType05_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType05_2[]=
{
{1152, 622},
{1152, 597},
@@ -1341,7 +1406,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType05_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType06_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType06_2[]=
{
{1152, 622},
{1152, 597},
@@ -1354,7 +1419,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType06_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType07_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType07_2[]=
{
{1152, 622},
{1152, 597},
@@ -1367,7 +1432,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType07_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType08_2[]= /* 1400x1050 */
+static const SiS310_LVDSDesStruct SiS310_PanelType08_2[]= /* 1400x1050 */
{
{1308, 741},
{1308, 716},
@@ -1380,9 +1445,20 @@ static const SiS_LVDSDesStruct SiS310_PanelType08_2[]= /* 1400x1050 */
{ 0,1065},
{ 0, 0},
{ 0, 0}
+#if 0
+ {976, 527},
+ {976, 502},
+ {976, 527},
+ {976, 502},
+ {976, 567},
+ { 0, 627},
+ { 0, 627},
+ { 0, 0},
+ { 0, 0}
+#endif
};
-static const SiS_LVDSDesStruct SiS310_PanelType09_2[]= /* 1280x768 */
+static const SiS310_LVDSDesStruct SiS310_PanelType09_2[]= /* 1280x768 */
{
{1083, 622},
{1083, 597},
@@ -1395,19 +1471,8 @@ static const SiS_LVDSDesStruct SiS310_PanelType09_2[]= /* 1280x768 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0a_2[]= /* 1600x1200 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0a_2[]= /* 1600x1200 */
{
- {1568, 920},
- {1568, 895},
- {1568, 920},
- {1568, 895},
- {1568, 960},
- {1648,1020},
- {1760,1104},
- {1888,1232},
- {1948,1245},
- { 0, 0}
-#if 0
{1568, 850},
{1568, 825},
{1568, 850},
@@ -1418,10 +1483,9 @@ static const SiS_LVDSDesStruct SiS310_PanelType0a_2[]= /* 1600x1200 */
{1888,1162},
{1948,1175},
{ 0, 0}
-#endif
};
-static const SiS_LVDSDesStruct SiS310_PanelType0b_2[]= /* 640x480_2 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0b_2[]= /* 640x480_2 */
{
{1152, 622},
{1152, 597},
@@ -1434,7 +1498,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0b_2[]= /* 640x480_2 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0c_2[]= /* 640x480_3 */
+static const SiS310_LVDSDesStruct SiS310_PanelType0c_2[]= /* 640x480_3 */
{
{1152, 622},
{1152, 597},
@@ -1447,7 +1511,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0c_2[]= /* 640x480_3 */
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0d_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType0d_2[]=
{
{1152, 622},
{1152, 597},
@@ -1460,7 +1524,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0d_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0e_2[]=
+static const SiS310_LVDSDesStruct SiS310_PanelType0e_2[]=
{
{1152, 622},
{1152, 597},
@@ -1473,7 +1537,7 @@ static const SiS_LVDSDesStruct SiS310_PanelType0e_2[]=
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelType0f_2[] =
+static const SiS310_LVDSDesStruct SiS310_PanelType0f_2[] =
{
{1152, 622},
{1152, 597},
@@ -1486,125 +1550,792 @@ static const SiS_LVDSDesStruct SiS310_PanelType0f_2[] =
{ 0, 0}
};
-static const SiS_LVDSDesStruct SiS310_PanelTypeNS_1[]=
+typedef struct _SiS310_Part2PortTblStruct
{
- { 8, 0},
- { 8, 0},
- { 8, 0},
- { 8, 0},
- { 8, 0},
- { 0, 0},
- { 0, 0},
- { 0, 0},
- { 0, 806},
- { 0, 0}
+ UCHAR CR[12];
+} SiS310_Part2PortTblStruct;
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_1[] =
+{
+ {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x2c,0x12,0x9a,0xae,0x88,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x38,0x13,0x16,0x0c,0xe6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x25,0x12,0xc9,0xdc,0xb6,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_1[] =
+{ /* TW: BIOS data invalid, last row taken from _3 */
+ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0xC1,0x35,0xB1,0x47,0xE9,0x71,0x33}},
+ {{0x2D,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x29,0x12,0xB5,0xD2,0xAC,0xE9,0x35,0xD9,0x47,0x11,0x99,0x33}},
+ {{0x36,0x13,0x02,0x25,0xFF,0x03,0x45,0x09,0x07,0xF9,0x00,0x24}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_1[] =
+{ /* TW: Temporary data, invalid */
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_1[] =
+{
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_2[] =
+{
+ {{0x25,0x12,0x51,0x6e,0x48,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+ {{0x2c,0x12,0x38,0x55,0x2f,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+ {{0x25,0x12,0x51,0x6e,0x48,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+ {{0x2c,0x12,0x38,0x55,0x2f,0xc1,0x35,0xb1,0x47,0xe9,0x71,0x33}},
+ {{0x2d,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}},
+ {{0x29,0x12,0xb5,0xd2,0xac,0xe9,0x35,0xd9,0x47,0x11,0x99,0x33}},
+ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, /* others */
+/* 0x36,0x13,0x02,0x25,0xff,0x03,0x45,0x09,0x07,0xf9,0x00,0x24 my */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
};
-static const SiS_LVDSDesStruct SiS310_PanelTypeNS_2[] =
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_2[] =
{
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0},
- { 0 , 0}
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
};
-/* CRT1 CRTC for SlaveModes and LCDA */
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_2[] =
+{
+ {{0x2b,0x12,0xd9,0xe5,0xd5,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}},
+ {{0x22,0x12,0xc0,0xcc,0xbc,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}},
+ {{0x2b,0x12,0xd9,0xe5,0xd5,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}},
+ {{0x22,0x12,0xc0,0xcc,0xbc,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}},
+ {{0x33,0x13,0x01,0x0d,0xfd,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}},
+ {{0x3f,0x1b,0x3d,0x49,0x39,0x54,0x23,0xc0,0x27,0x66,0x30,0x42}},
+ {{0x33,0x1b,0x91,0x9d,0x8d,0x8c,0x23,0xf8,0x27,0x9e,0x68,0x42}},
+ {{0x43,0x24,0x11,0x1d,0x0d,0xcc,0x23,0x38,0x37,0xde,0xa8,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}
+};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_1[] =
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_2[] =
{
- {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
- 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
- 0x00 }},
- {{0x6b,0x4f,0x8f,0x55,0x85,0x78,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00 }},
- {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
- 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
- 0x00 }},
- {{0x6b,0x4f,0x8f,0x55,0x85,0x78,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00 }},
- {{0x6b,0x4f,0x8f,0x55,0x85,0xfa,0x1f,
- 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
- 0x00 }},
- {{0x7f,0x63,0x83,0x69,0x19,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01 }}
+ {{0x32,0x1B,0x2C,0x52,0x20,0x80,0x20,0x52,0x30,0xA3,0x3A,0x02}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x32,0x1B,0x2C,0x52,0x20,0x80,0x20,0x52,0x30,0xA3,0x3A,0x02}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x3A,0x1B,0x54,0x7A,0x48,0x80,0x24,0x52,0x30,0xA3,0x3A,0x02}},
+ {{0x36,0x1B,0x90,0xB6,0x84,0xA8,0x24,0x7A,0x30,0xCB,0x62,0x02}},
+ {{0x3A,0x1C,0xE4,0x0A,0xD8,0xE0,0x24,0xB2,0x30,0x03,0x9A,0x02}},
+ {{0x4A,0x24,0x64,0x8A,0x58,0x20,0x34,0xF2,0x30,0x43,0xDA,0x52}},
+ {{0x47,0x24,0x71,0x97,0x65,0x3E,0x34,0x10,0x40,0x61,0xF8,0x02}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_1_H[] =
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_3[] =
{
- {{0x43,0x27,0x87,0x2d,0x1d,0xaa,0x1f,
- 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+#if 1 /* Data from 650/301LVx 1.10.6s and others */
+ {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x25,0x13,0xc9,0x24,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x38,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x25,0x13,0xc9,0x25,0xff,0xf9,0x45,0x09,0x07,0xf9,0x09,0x24}}
+#endif
+#if 0 /* Data from my 301LV */
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, /* TEST */
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}},
+ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}
+#endif
+};
+
+/* 1 2 4 5 6 1c 1d 1f 20 21 23 25 */
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1280x1024_3[] =
+{
+ {{0x31,0x1B,0xC4,0xDA,0xB0,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x34,0x1B,0x9F,0xC0,0x80,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x3E,0x1B,0xCF,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1400x1050_3[] =
+{
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}},
+ {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}
+};
+
+static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_3[] =
+{
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}},
+ {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}
+};
+
+typedef struct _SiS310_LCDACRT1DataStruct
+{
+ UCHAR CR[17];
+}SiS310_LCDACRT1DataStruct;
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT1800x600_1[] =
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11024x768_1[]=
+{
+ {{0x73,0x4f,0x4f,0x97,0x55,0x86,0xc4,0x1f,
+ 0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x05,
+ 0x00}},
+ {{0x73,0x4f,0x4f,0x97,0x55,0x86,0x97,0x1f,
+ 0x60,0x87,0x5d,0x5d,0x83,0x10,0x00,0x05,
+ 0x00}},
+ {{0x73,0x4f,0x4f,0x97,0x55,0x86,0xc4,0x1f,
+ 0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x05,
+ 0x00}},
+ {{0x73,0x4f,0x4f,0x97,0x55,0x86,0x97,0x1f,
+ 0x60,0x87,0x5d,0x5d,0x83,0x10,0x00,0x05,
+ 0x00}},
+ {{0x73,0x4f,0x4f,0x97,0x55,0x86,0x04,0x3e,
+ 0xE2,0x89,0xDf,0xDf,0x05,0x00,0x00,0x05,
+ 0x00}},
+ {{0x87,0x63,0x63,0x8B,0x69,0x1A,0x7c,0xf0,
+ 0x5A,0x8F,0x57,0x57,0x7D,0x20,0x00,0x26,
+ 0x01}},
+ {{0xA3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xFf,0xFf,0x25,0x10,0x00,0x02,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11280x1024_1[]=
+{
+ {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0xb8,0x1f,
+ 0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x06,
+ 0x00}},
+ {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0x86,0x1f,
+ 0x5e,0x82,0x5d,0x5d,0x87,0x10,0x00,0x06,
+ 0x00}},
+ {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0xb8,0x1f,
+ 0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x06,
+ 0x00}},
+ {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0x86,0x1f,
+ 0x5e,0x82,0x5d,0x5d,0x87,0x10,0x00,0x06,
+ 0x00}},
+ {{0x7e,0x4f,0x4f,0x82,0x58,0x06,0x08,0x3e,
+ 0xe0,0x84,0xdf,0xdf,0x09,0x00,0x00,0x06,
+ 0x00}},
+ {{0x92,0x63,0x63,0x96,0x6c,0x1a,0x80,0xf0,
+ 0x58,0x8c,0x57,0x57,0x81,0x20,0x00,0x06,
+ 0x01}},
+ {{0xae,0x7f,0x7f,0x92,0x88,0x96,0x28,0xf5,
+ 0x00,0x84,0xff,0xff,0x29,0x10,0x00,0x02,
+ 0x01}},
+ {{0xce,0x9f,0x9f,0x92,0xa8,0x16,0x28,0x5a,
+ 0x00,0x84,0xff,0xff,0x29,0x01,0x00,0x07,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11400x1050_1[]=
+{
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+ 0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+ 0x00}},
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x6c,0x1f,
+ 0x60,0x84,0x5d,0x5d,0x6d,0x10,0x00,0x05,
+ 0x00}},
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
+ 0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+ 0x00}},
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x6c,0x1f,
+ 0x60,0x84,0x5d,0x5d,0x6d,0x10,0x00,0x05,
+ 0x00}},
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0xee,0x1f,
+ 0xe2,0x86,0xdf,0xdf,0xef,0x10,0x00,0x05,
+ 0x00}},
+ {{0x83,0x63,0x63,0x87,0x68,0x16,0x66,0xf0,
+ 0x5a,0x8e,0x57,0x57,0x67,0x20,0x00,0x06,
+ 0x01}},
+ {{0x9f,0x7f,0x7f,0x83,0x84,0x92,0x0e,0xf5,
+ 0x02,0x86,0xff,0xff,0x0f,0x10,0x00,0x02,
+ 0x01}},
+ {{0xbf,0x9f,0x9f,0x83,0xa4,0x12,0x0e,0x5a,
+ 0x02,0x86,0xff,0xff,0x0f,0x09,0x00,0x07,
+ 0x01}},
+ {{0xce,0xae,0xae,0x92,0xb3,0x01,0x28,0x10,
+ 0x1a,0x80,0x19,0x19,0x29,0x0f,0x00,0x03,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11600x1200_1[]=
+{ /* MISSING */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT1800x600_1_H[]=
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11024x768_1_H[]=
+{
+ {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0xc4,0x1f,
+ 0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0x97,0x1f,
+ 0x60,0x87,0x5D,0x5D,0x83,0x01,0x00,0x44,
+ 0x00}},
+ {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0xc4,0x1f,
+ 0x92,0x89,0x8f,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x4b,0x27,0x27,0x8f,0x2b,0x03,0x97,0x1f,
+ 0x60,0x87,0x5D,0x5D,0x83,0x01,0x00,0x44,
+ 0x00}},
+ {{0x4b,0x27,0x27,0x8f,0x32,0x1b,0x04,0x3e,
+ 0xE2,0x89,0xDf,0xDf,0x05,0x00,0x00,0x45,
+ 0x00}},
+ {{0x55,0x31,0x31,0x99,0x46,0x1d,0x7c,0xf0,
+ 0x5A,0x8F,0x57,0x57,0x7D,0x20,0x00,0x55,
+ 0x01}},
+ {{0x63,0x3F,0x3F,0x87,0x4a,0x93,0x24,0xf5,
+ 0x02,0x88,0xFf,0xFf,0x25,0x10,0x00,0x01,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11280x1024_1_H[]=
+{
+ {{0x56,0x27,0x27,0x9a,0x30,0x1e,0xb8,0x1f,
+ 0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x3c,0x4f,0x4f,0x82,0x58,0x06,0x86,0xd1, /* <-- Invalid data - one byte missing in BIOS */
+ 0xbc,0x80,0xbb,0xbb,0xe5,0x00,0x00,0x06,
+ 0x01}},
+ {{0x56,0x27,0x27,0x9a,0x30,0x1e,0xb8,0x1f,
+ 0x90,0x84,0x8f,0x8f,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x3c,0x4f,0x4f,0x82,0x58,0x06,0x86,0xd1,
+ 0xbc,0x80,0xbb,0xbb,0xe5,0x00,0x00,0x06,
+ 0x01}},
+ {{0x56,0x27,0x27,0x9a,0x30,0x1e,0x08,0x3e,
+ 0xe0,0x84,0xdf,0xdf,0x09,0x00,0x00,0x05,
+ 0x00}},
+ {{0x60,0x31,0x31,0x84,0x3a,0x88,0x80,0xf0,
+ 0x58,0x8c,0x57,0x57,0x81,0x20,0x00,0x01,
+ 0x01}},
+ {{0x6e,0x3f,0x3f,0x92,0x48,0x96,0x28,0xf5,
+ 0x00,0x84,0xff,0xff,0x29,0x10,0x00,0x01,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11400x1050_1_H[]=
+{
+ {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
+ 0x93,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+ 0x00}},
+ {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+ 0x60,0x84,0x5d,0x5d,0x6d,0x10,0x00,0x05,
+ 0x00}},
+ {{0x47,0x27,0x27,0x8b,0x30,0x1e,0x9e,0x1f,
+ 0x92,0x86,0x8f,0x8f,0x9f,0x30,0x00,0x05,
+ 0x00}},
+ {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0x6c,0x1f,
+ 0x60,0x84,0x5d,0x5d,0x6d,0x10,0x00,0x05,
+ 0x00}},
+ {{0x47,0x27,0x27,0x8b,0x2c,0x1a,0xee,0x1f,
+ 0xe2,0x86,0xdf,0xdf,0xef,0x10,0x00,0x05,
+ 0x00}},
+ {{0x51,0x31,0x31,0x95,0x36,0x04,0x66,0xf0,
+ 0x5a,0x8e,0x57,0x57,0x67,0x20,0x00,0x01,
+ 0x01}},
+ {{0x5f,0x3f,0x3f,0x83,0x44,0x92,0x0e,0xf5,
+ 0x02,0x86,0xff,0xff,0x0f,0x10,0x00,0x01,
+ 0x01}},
+ {{0x6f,0x4f,0x4f,0x93,0x54,0x82,0x0e,0x5a,
+ 0x02,0x86,0xff,0xff,0x0f,0x09,0x00,0x05,
+ 0x01}},
+ {{0x76,0x56,0x56,0x9a,0x5b,0x89,0x28,0x10,
+ 0x1c,0x80,0x19,0x19,0x29,0x0b,0x00,0x05,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11600x1200_1_H[]=
+{ /* MISSING */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT1800x600_2[]=
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11024x768_2[]=
+{
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x72,0x88,0xdf,0xdf,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x63,0x63,0x87,0x78,0x89,0x24,0xf1,
+ 0xae,0x84,0x57,0x57,0x25,0x30,0x00,0x02,
+ 0x01}},
+ {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11280x1024_2[]=
+{
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x72,0x88,0xdf,0xdf,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x63,0x63,0x87,0x78,0x89,0x24,0xf1,
+ 0xae,0x84,0x57,0x57,0x25,0x30,0x00,0x02,
+ 0x01}},
+ {{0xa3,0x7f,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x02,
+ 0x01}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11400x1050_2[]=
+{
+ {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+ 0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x03,
+ 0x00}},
+ {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+ 0xc2,0x86,0x5d,0x5d,0x29,0x01,0x00,0x03,
+ 0x01}},
+ {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+ 0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x03,
+ 0x00}},
+ {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9a,
+ 0xc2,0x86,0x5d,0x5d,0x29,0x01,0x00,0x03,
+ 0x00}},
+ {{0xce,0x4f,0x4f,0x92,0x8c,0x1a,0x28,0x9e,
+ 0x03,0x87,0xdf,0xdf,0x29,0x01,0x00,0x03,
+ 0x00}},
+ {{0xce,0x63,0x63,0x92,0x96,0x04,0x28,0xd4,
+ 0x3f,0x83,0x57,0x57,0x29,0x01,0x00,0x07,
+ 0x01}},
+ {{0xce,0x7f,0x7f,0x92,0xa4,0x12,0x28,0xd4,
+ 0x93,0x87,0xff,0xff,0x29,0x21,0x00,0x07,
+ 0x01}},
+ {{0xce,0x9f,0x9f,0x92,0xb4,0x02,0x28,0x5a,
+ 0x13,0x87,0xff,0xff,0x29,0x29,0x00,0x03,
+ 0x01}},
+ {{0xce,0xae,0xae,0x92,0xbc,0x0a,0x28,0x10,
+ 0x20,0x84,0x19,0x19,0x29,0x0f,0x00,0x03,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11600x1200_2[]=
+{ /* MISSING */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT1800x600_2_H[]=
+{
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11024x768_2_H[]=
+{
+ {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x43,0x27,0x87,0x2d,0x1d,0x78,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x8d,0x5d,0x25,0x30,0x00,0x01, /* <-- invalid data */
0x00 }},
- {{0x43,0x27,0x87,0x2d,0x1d,0xfa,0x1f,
- 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x43,0x27,0x87,0x2d,0x1d,0x78,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x43,0x27,0x87,0x2d,0x1d,0xfa,0x1f,
- 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ {{0x4f,0x27,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x72,0x88,0xdf,0xdf,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x4d,0x31,0x91,0x37,0x07,0x72,0xf0,
- 0x58,0x8d,0x57,0x73,0x20,0x00,0x01,
+ {{0x4f,0x31,0x31,0x93,0x3e,0x06,0x24,0xf1,
+ 0xae,0x84,0x57,0x57,0x25,0x30,0x00,0x01, /* <-- invalid data */
+ 0x01 }},
+ {{0x4f,0x3f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x01,
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_2[]=
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11280x1024_2_H[]=
{
- {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
- 0xff,0x84,0x8f,0x73,0x00,0x00,0x06,
+ {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
- 0xe6,0x8b,0x5d,0x73,0x00,0x00,0x06,
+ {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
- 0xff,0x84,0x8f,0x73,0x00,0x00,0x06,
+ {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x8f,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
- 0xe6,0x8b,0x5d,0x73,0x00,0x00,0x06,
+ {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+ 0x31,0x87,0x5d,0x5d,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x7f,0x4f,0x83,0x62,0x12,0x72,0xba,
- 0x27,0x8c,0xdf,0x73,0x00,0x00,0x06,
+ {{0x4f,0x27,0x27,0x93,0x39,0x81,0x24,0xbb,
+ 0x72,0x88,0xdf,0xdf,0x25,0x30,0x00,0x01,
0x00 }},
- {{0x7f,0x63,0x83,0x69,0x19,0x72,0xf0,
- 0x58,0x8d,0x57,0x73,0x20,0x00,0x06,
+ {{0x4f,0x31,0x31,0x93,0x3e,0x86,0x24,0xf1,
+ 0xae,0x84,0x57,0x57,0x25,0x30,0x00,0x01,
+ 0x01 }},
+ {{0x4f,0x3f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0xff,0x25,0x10,0x00,0x01,
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_2_H[] =
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11400x1050_2_H[]=
{
- {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
- 0xff,0x84,0x8f,0x73,0x00,0x00,0x01,
+ {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+ 0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x06,
+ 0x00}},
+ {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+ 0xc2,0x86,0x5d,0x5d,0x29,0x01,0x00,0x06,
+ 0x00}},
+ {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+ 0xdb,0x8f,0x8f,0x8f,0x29,0x21,0x00,0x06,
+ 0x00}},
+ {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9a,
+ 0xc2,0x86,0x5d,0x5d,0x29,0x01,0x00,0x06,
+ 0x00}},
+ {{0xa6,0x27,0x27,0x8a,0x64,0x92,0x28,0x9e,
+ 0x03,0x87,0xdf,0xdf,0x29,0x01,0x00,0x06,
+ 0x00}},
+ {{0x9c,0x31,0x31,0x80,0x64,0x92,0x28,0xd4,
+ 0x3f,0x83,0x57,0x57,0x29,0x01,0x00,0x06,
+ 0x01}},
+ {{0x8e,0x3f,0x3f,0x92,0x64,0x12,0x28,0xd4,
+ 0x93,0x87,0xff,0xff,0x29,0x21,0x00,0x06,
+ 0x01}},
+ {{0x7e,0x4f,0x4f,0x82,0x64,0x12,0x28,0x5a,
+ 0x13,0x87,0xff,0xff,0x29,0x29,0x00,0x06,
+ 0x01}},
+ {{0x76,0x56,0x56,0x9a,0x64,0x92,0x28,0x10,
+ 0x20,0x84,0x19,0x19,0x29,0x0f,0x00,0x05,
+ 0x00}}
+};
+
+static const SiS310_LCDACRT1DataStruct SiS310_LCDACRT11600x1200_2_H[]=
+{ /* MISSING */
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00}}
+};
+
+typedef struct _SiS310_LVDSCRT1DataStruct
+{
+ UCHAR CR[15];
+} SiS310_LVDSCRT1DataStruct;
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_1[] =
+{
+ {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
+ 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
0x00 }},
- {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
- 0xd6,0x8b,0x5d,0x73,0x00,0x00,0x01,
+ {{0x6b,0x4f,0x8f,0x55,0x85,0x78,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
0x00 }},
- {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
- 0xff,0x84,0x8f,0x73,0x00,0x00,0x01,
+ {{0x6b,0x4f,0x8f,0x55,0x85,0xaa,0x1f,
+ 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
0x00 }},
- {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
- 0xd6,0x8b,0x5d,0x73,0x00,0x00,0x01,
+ {{0x6b,0x4f,0x8f,0x55,0x85,0x78,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
0x00 }},
- {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0xba,
- 0x27,0x8c,0xdf,0x73,0x00,0x00,0x01,
+ {{0x6b,0x4f,0x8f,0x55,0x85,0xfa,0x1f,
+ 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
0x00 }},
- {{0x4d,0x31,0x91,0x3a,0x0a,0x72,0xf0,
- 0x63,0x88,0x57,0x73,0x00,0x00,0x01,
+ {{0x7f,0x63,0x83,0x69,0x19,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
0x01 }}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_1[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_1[] =
{
{{0x73,0x4f,0x97,0x53,0x84,0xb4,0x1f,
0x92,0x89,0x8f,0xb5,0x30,0x00,0x05,
@@ -1629,82 +2360,7 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_1[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_1_H[] =
-{
- {{0x4b,0x27,0x8f,0x2b,0x1c,0xb4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x05,
- 0x00 }},
- {{0x4b,0x27,0x8f,0x2b,0x1c,0x82,0x1f,
- 0x60,0x87,0x5D,0x83,0x01,0x00,0x05,
- 0x00}},
- {{0x4b,0x27,0x8f,0x2b,0x1c,0xb4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x05,
- 0x00}},
- {{0x4b,0x27,0x8f,0x2b,0x1c,0x82,0x1f,
- 0x60,0x87,0x5D,0x83,0x01,0x00,0x05,
- 0x00}},
- {{0x4b,0x27,0x8f,0x2b,0x1c,0x04,0x3e,
- 0xE2,0x89,0xDf,0x05,0x00,0x00,0x05,
- 0x00}},
- {{0x55,0x31,0x99,0x35,0x06,0x7c,0xf0,
- 0x5A,0x81,0x57,0x7D,0x00,0x00,0x01,
- 0x01}},
- {{0x63,0x3F,0x87,0x43,0x94,0x24,0xf5,
- 0x02,0x89,0xFf,0x25,0x10,0x00,0x01,
- 0x01 }}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_2[] =
-{
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x57,0x8e,0x8f,0x25,0x30,0x00,0x06,
- 0x00 }},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x3e,0x85,0x5d,0x25,0x10,0x00,0x06,
- 0x00 }},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x57,0x8e,0x8f,0x25,0x30,0x00,0x06,
- 0x00 }},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x3e,0x85,0x5d,0x25,0x10,0x00,0x06,
- 0x01 }},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x7f,0x86,0xdf,0x25,0x10,0x00,0x06,
- 0x00 }},
- {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
- 0xbb,0x82,0x57,0x25,0x10,0x00,0x02,
- 0x01 }},
- {{0xa3,0x7f,0x87,0x83,0x94,0x24,0xf5,
- 0x02,0x89,0xff,0x25,0x10,0x00,0x02,
- 0x01 }}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_2_H[] =
-{
- {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
- 0x57,0x8e,0x8f,0x25,0x30,0x00,0x01,
- 0x00 }},
- {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
- 0x3e,0x85,0x5d,0x25,0x10,0x00,0x01,
- 0x00 }},
- {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
- 0x57,0x8e,0x8f,0x25,0x30,0x00,0x01,
- 0x00 }},
- {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
- 0x3e,0x85,0x5d,0x25,0x10,0x00,0x01,
- 0x00 }},
- {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
- 0x7f,0x86,0xdf,0x25,0x10,0x00,0x01,
- 0x00 }},
- {{0x71,0x31,0x95,0x46,0x97,0x24,0xf1,
- 0xbb,0x82,0x57,0x25,0x10,0x00,0x01,
- 0x01 }},
- {{0x63,0x3f,0x87,0x46,0x97,0x24,0xf5,
- 0x0f,0x86,0xff,0x25,0x30,0x00,0x01,
- 0x01 }}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1[] =
{
{{0x7e,0x4f,0x82,0x58,0x04,0xb8,0x1f,
0x90,0x84,0x8f,0xb9,0x30,0x00,0x06,
@@ -1732,7 +2388,54 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1_H[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_1_H[] =
+{
+ {{0x43,0x27,0x87,0x2d,0x1d,0xaa,0x1f,
+ 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+ 0x00 }},
+ {{0x43,0x27,0x87,0x2d,0x1d,0x78,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00 }},
+ {{0x43,0x27,0x87,0x2d,0x1d,0xfa,0x1f,
+ 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ 0x00 }},
+ {{0x43,0x27,0x87,0x2d,0x1d,0x78,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00 }},
+ {{0x43,0x27,0x87,0x2d,0x1d,0xfa,0x1f,
+ 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ 0x00 }},
+ {{0x4d,0x31,0x91,0x37,0x07,0x72,0xf0,
+ 0x58,0x8d,0x57,0x73,0x20,0x00,0x01,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_1_H[] =
+{
+ {{0x4b,0x27,0x8f,0x2b,0x1c,0xb4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x05,
+ 0x00 }},
+ {{0x4b,0x27,0x8f,0x2b,0x1c,0x82,0x1f,
+ 0x60,0x87,0x5D,0x83,0x01,0x00,0x05,
+ 0x00}},
+ {{0x4b,0x27,0x8f,0x2b,0x1c,0xb4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x05,
+ 0x00}},
+ {{0x4b,0x27,0x8f,0x2b,0x1c,0x82,0x1f,
+ 0x60,0x87,0x5D,0x83,0x01,0x00,0x05,
+ 0x00}},
+ {{0x4b,0x27,0x8f,0x2b,0x1c,0x04,0x3e,
+ 0xE2,0x89,0xDf,0x05,0x00,0x00,0x05,
+ 0x00}},
+ {{0x55,0x31,0x99,0x35,0x06,0x7c,0xf0,
+ 0x5A,0x81,0x57,0x7D,0x00,0x00,0x01,
+ 0x01}},
+ {{0x63,0x3F,0x87,0x43,0x94,0x24,0xf5,
+ 0x02,0x89,0xFf,0x25,0x10,0x00,0x01,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1_H[] =
{
{{0x56,0x27,0x9a,0x31,0x1c,0xb8,0x1f,
0x90,0x84,0x8f,0xb9,0x30,0x00,0x05,
@@ -1757,7 +2460,54 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_1_H[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_2[]=
+{
+ {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
+ 0xff,0x84,0x8f,0x73,0x00,0x00,0x06,
+ 0x00 }},
+ {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
+ 0xe6,0x8b,0x5d,0x73,0x00,0x00,0x06,
+ 0x00 }},
+ {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
+ 0xff,0x84,0x8f,0x73,0x00,0x00,0x06,
+ 0x00 }},
+ {{0x7f,0x4f,0x83,0x62,0x12,0x72,0x3e,
+ 0xe6,0x8b,0x5d,0x73,0x00,0x00,0x06,
+ 0x00 }},
+ {{0x7f,0x4f,0x83,0x62,0x12,0x72,0xba,
+ 0x27,0x8c,0xdf,0x73,0x00,0x00,0x06,
+ 0x00 }},
+ {{0x7f,0x63,0x83,0x69,0x19,0x72,0xf0,
+ 0x58,0x8d,0x57,0x73,0x20,0x00,0x06,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_2[] =
+{
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x57,0x8e,0x8f,0x25,0x30,0x00,0x06,
+ 0x00 }},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x3e,0x85,0x5d,0x25,0x10,0x00,0x06,
+ 0x00 }},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x57,0x8e,0x8f,0x25,0x30,0x00,0x06,
+ 0x00 }},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x3e,0x85,0x5d,0x25,0x10,0x00,0x06,
+ 0x01 }},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x7f,0x86,0xdf,0x25,0x10,0x00,0x06,
+ 0x00 }},
+ {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+ 0xbb,0x82,0x57,0x25,0x10,0x00,0x02,
+ 0x01 }},
+ {{0xa3,0x7f,0x87,0x83,0x94,0x24,0xf5,
+ 0x02,0x89,0xff,0x25,0x10,0x00,0x02,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2[] =
{
{{0xce,0x72,0x91,0x81,0x8f,0x28,0x92,
0xc8,0x8c,0x5d,0x5c,0x01,0x00,0x02,
@@ -1785,7 +2535,54 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2_H[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT1800x600_2_H[] =
+{
+ {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
+ 0xff,0x84,0x8f,0x73,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
+ 0xd6,0x8b,0x5d,0x73,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
+ 0xff,0x84,0x8f,0x73,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0x3e,
+ 0xd6,0x8b,0x5d,0x73,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x57,0x27,0x9b,0x3a,0x0a,0x72,0xba,
+ 0x27,0x8c,0xdf,0x73,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x4d,0x31,0x91,0x3a,0x0a,0x72,0xf0,
+ 0x63,0x88,0x57,0x73,0x00,0x00,0x01,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11024x768_2_H[] =
+{
+ {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
+ 0x57,0x8e,0x8f,0x25,0x30,0x00,0x01,
+ 0x00 }},
+ {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
+ 0x3e,0x85,0x5d,0x25,0x10,0x00,0x01,
+ 0x00 }},
+ {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
+ 0x57,0x8e,0x8f,0x25,0x30,0x00,0x01,
+ 0x00 }},
+ {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
+ 0x3e,0x85,0x5d,0x25,0x10,0x00,0x01,
+ 0x00 }},
+ {{0x7b,0x27,0x9f,0x46,0x97,0x24,0xbb,
+ 0x7f,0x86,0xdf,0x25,0x10,0x00,0x01,
+ 0x00 }},
+ {{0x71,0x31,0x95,0x46,0x97,0x24,0xf1,
+ 0xbb,0x82,0x57,0x25,0x10,0x00,0x01,
+ 0x01 }},
+ {{0x63,0x3f,0x87,0x46,0x97,0x24,0xf5,
+ 0x0f,0x86,0xff,0x25,0x30,0x00,0x01,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2_H[] =
{
{{0xa6,0x4a,0x89,0x59,0x07,0x28,0x92,
0xc8,0x8c,0x5d,0x5c,0x01,0x00,0x06,
@@ -1810,7 +2607,7 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11280x1024_2_H[] =
0x01}}
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1[] =
{
{{0x6f,0x4f,0x93,0x54,0x82,0x9e,0x1f,
0x8f,0x81,0x8f,0x9f,0x30,0x00,0x05,
@@ -1870,7 +2667,7 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1[] =
#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1_H[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1_H[] =
{
{{0x47,0x27,0x8b,0x2c,0x1a,0x9e,0x1f,
0x8f,0x81,0x8f,0x9f,0x30,0x00,0x05,
@@ -1930,7 +2727,7 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_1_H[] =
#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2[] =
{
{{0xce,0x72,0x91,0x84,0x92,0x28,0x92,
0xd7,0x8b,0x5d,0x5c,0x21,0x00,0x02,
@@ -1990,7 +2787,7 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2[] =
#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2_H[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2_H[] =
{
{{0xa6,0x4a,0x89,0x5c,0x0a,0x28,0x92,
0xd7,0x8b,0x5d,0x5c,0x21,0x00,0x06,
@@ -2050,39 +2847,8 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11400x1050_2_H[] =
#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1[] =
{
- {{0x83,0x4F,0x87,0x5B,0x13,0x06,0x3E,
- 0xB3,0x86,0x8F,0x07,0x20,0x00,0x06,
- 0x00}},
- {{0x83,0x4F,0x87,0x5B,0x13,0xD4,0x1F,
- 0x81,0x84,0x5D,0xD5,0x10,0x00,0x06,
- 0x00}},
- {{0x83,0x4F,0x87,0x5B,0x13,0x06,0x3E,
- 0xB3,0x86,0x8F,0x07,0x20,0x00,0x06,
- 0x00}},
- {{0x83,0x4F,0x87,0x5B,0x13,0xD4,0x1F,
- 0x81,0x84,0x5D,0xD5,0x10,0x00,0x06,
- 0x00}},
- {{0x83,0x4F,0x87,0x5B,0x13,0x56,0xBA,
- 0x03,0x86,0xDF,0x57,0x00,0x00,0x06,
- 0x00}},
- {{0x97,0x63,0x9B,0x6F,0x07,0xCE,0xF0,
- 0x7B,0x8E,0x57,0xCF,0x20,0x00,0x02,
- 0x01}},
- {{0xB3,0x7F,0x97,0x8B,0x83,0x76,0xF5,
- 0x23,0x86,0xFF,0x77,0x10,0x00,0x06,
- 0x01}},
- {{0xD3,0x9F,0x97,0xAB,0x03,0x76,0x5A,
- 0x23,0x86,0xFF,0x77,0x09,0x00,0x03,
- 0x01}},
- {{0xE2,0xAE,0x86,0xBA,0x92,0x90,0x10,
- 0x3D,0x80,0x19,0x91,0x0F,0x00,0x03,
- 0x00}},
- {{0xFB,0xC7,0x9F,0xD3,0x8B,0x26,0x11,
- 0xD3,0x86,0xAF,0x27,0x3F,0x00,0x07,
- 0x00}}
-#if 0
{{0x83,0x4f,0x87,0x51,0x09,0xc0,0x1f,
0x90,0x84,0x8f,0xc1,0x30,0x00,0x06,
0x00}},
@@ -2113,42 +2879,10 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1[] =
{{0xfb,0xc7,0x9f,0xc9,0x81,0xe0,0x10,
0xb0,0x84,0xaf,0xe1,0x2f,0x00,0x07,
0x00}}
-#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1_H[] =
-{
- {{0x5B,0x27,0x9F,0x33,0x0B,0x06,0x2E,
- 0xB3,0x86,0x8F,0x07,0x20,0x00,0x01,
- 0x00}},
- {{0x5B,0x27,0x9F,0x29,0x01,0x8E,0x1F,
- 0x81,0x84,0x5D,0xD5,0x10,0x00,0x06,
- 0x00}},
- {{0x5B,0x27,0x9F,0x33,0x0B,0x06,0x2E,
- 0xB3,0x86,0x8F,0x07,0x20,0x00,0x01,
- 0x00}},
- {{0x83,0x4F,0x87,0x5B,0x13,0xD4,0x1F,
- 0x81,0x84,0x5D,0xD5,0x10,0x00,0x06,
- 0x00}},
- {{0x5B,0x27,0x9F,0x33,0x0B,0x56,0xBA,
- 0x03,0x86,0xDF,0x57,0x00,0x00,0x01,
- 0x00}},
- {{0x65,0x31,0x89,0x3D,0x95,0xCE,0xF0,
- 0x7B,0x8E,0x57,0xCF,0x20,0x00,0x01,
- 0x01}},
- {{0x73,0x3F,0x97,0x4B,0x83,0x76,0xF5,
- 0x23,0x86,0xFF,0x77,0x10,0x00,0x05,
- 0x01}},
- {{0xD3,0x9F,0x97,0xAB,0x03,0x76,0x5A,
- 0x23,0x86,0xFF,0x77,0x09,0x00,0x03,
- 0x01}},
- {{0xE2,0xAE,0x86,0xBA,0x92,0x90,0x10,
- 0x3D,0x80,0x19,0x91,0x0F,0x00,0x03,
- 0x00}},
- {{0x97,0x63,0x9B,0x6F,0x07,0xE0,0x10,
- 0xB0,0x84,0xAF,0xE1,0x2F,0x00,0x06,
- 0x00}}
-#if 0
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1_H[] =
+{
{{0x5b,0x27,0x9f,0x29,0x01,0xc0,0x1f,
0x90,0x84,0x8f,0xc1,0x30,0x00,0x01,
0x00}},
@@ -2179,42 +2913,10 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_1_H[] =
{{0x97,0x63,0x9b,0x65,0x1d,0xe0,0x10,
0xb0,0x84,0xaf,0xe1,0x2f,0x00,0x06,
0x00}}
-#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2[] =
-{
- {{0xFB,0x87,0x86,0x97,0x0F,0x26,0x97,
- 0x43,0x86,0xDB,0xDA,0x11,0x00,0x07,
- 0x01}},
- {{0xFB,0x87,0x86,0x97,0x0F,0x26,0x97,
- 0x2A,0x8D,0xC2,0xC1,0x11,0x00,0x07,
- 0x01}},
- {{0xFB,0x87,0x86,0x97,0x0F,0x26,0x97,
- 0x43,0x86,0xDB,0xDA,0x11,0x00,0x07,
- 0x01}},
- {{0xFB,0x87,0x86,0x97,0x0F,0x26,0x97,
- 0x2A,0x8D,0xC2,0xC1,0x11,0x00,0x07,
- 0x01}},
- {{0xFB,0x87,0x86,0x97,0x0F,0x26,0x9F,
- 0x6B,0x8E,0x03,0x02,0x01,0x00,0x07,
- 0x01}},
- {{0xFB,0x63,0x9F,0xA1,0x99,0x26,0xD5,
- 0xA7,0x8A,0xBF,0xBE,0x01,0x00,0x07,
- 0x01}},
- {{0xFB,0x7F,0x9F,0xAF,0x87,0x26,0xDD,
- 0xFB,0x8E,0x13,0x12,0x31,0x00,0x03,
- 0x01}},
- {{0xFB,0x9F,0x9F,0xBF,0x97,0x26,0x5B,
- 0x7B,0x8E,0xFF,0x27,0x39,0x00,0x03,
- 0x01}},
- {{0xFB,0xAE,0x9F,0xC6,0x9E,0x26,0x11,
- 0x88,0x8B,0x19,0x27,0x1F,0x00,0x03,
- 0x00}},
- {{0xFB,0xC7,0x9F,0xD3,0x8B,0x26,0x11,
- 0xD3,0x86,0xAF,0x27,0x3F,0x00,0x07,
- 0x00}}
-#if 0
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2[] =
+{
{{0xfb,0x88,0x87,0x90,0x08,0xe0,0x96,
0x20,0x84,0xb9,0xb8,0x01,0x00,0x07,
0x01}},
@@ -2245,42 +2947,10 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2[] =
{{0xfb,0xc7,0x9f,0xc9,0x84,0xe0,0x10,
0xc7,0x8b,0xaf,0xe1,0x0f,0x00,0x07,
0x00}}
-#endif
};
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2_H[] =
-{
- {{0xD3,0x5F,0x9E,0x6F,0x07,0x26,0x97,
- 0x43,0x86,0xDB,0xDA,0x11,0x00,0x02,
- 0x01}},
- {{0xD3,0x27,0x97,0x6F,0x07,0x26,0x97,
- 0x6B,0x8E,0x83,0x82,0x01,0x00,0x03,
- 0x01}},
- {{0xD3,0x5F,0x9E,0x6F,0x07,0x26,0x97,
- 0x43,0x86,0xDB,0xDA,0x11,0x00,0x02,
- 0x01}},
- {{0xD3,0x27,0x97,0x6F,0x07,0x26,0x97,
- 0x07,0x8B,0xA0,0x9F,0x01,0x00,0x02,
- 0x01}},
- {{0xD3,0x27,0x97,0x6F,0x07,0x26,0x97,
- 0x6B,0x8E,0x83,0x82,0x01,0x00,0x03,
- 0x01}},
- {{0xC9,0x31,0x8D,0x6F,0x07,0x26,0xD5,
- 0xA7,0x8A,0xBF,0xBE,0x01,0x00,0x03,
- 0x01}},
- {{0xBB,0x3F,0x9F,0x6F,0x87,0x26,0xDD,
- 0xFB,0x8E,0x13,0x12,0x31,0x00,0x02,
- 0x01}},
- {{0xAB,0x4F,0x8F,0x68,0x80,0xE0,0x5A,
- 0x6F,0x83,0xFF,0xE1,0x29,0x00,0x02,
- 0x01}},
- {{0xA3,0x56,0x87,0x67,0x9F,0xE0,0x10,
- 0x7C,0x80,0x19,0xE1,0x0F,0x00,0x06,
- 0x00}},
- {{0x97,0x63,0x9B,0x68,0x00,0xE0,0x10,
- 0xC7,0x8B,0xAF,0xE1,0x0F,0x00,0x02,
- 0x00}}
-#if 0
+static const SiS310_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2_H[] =
+{
{{0xd3,0x60,0x9f,0x68,0x00,0xe0,0x96,
0x20,0x84,0xb9,0xb8,0x01,0x00,0x02,
0x01}},
@@ -2311,296 +2981,253 @@ static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT11600x1200_2_H[] =
{{0x97,0x63,0x9b,0x68,0x00,0xe0,0x10,
0xc7,0x8b,0xaf,0xe1,0x0f,0x00,0x02,
0x00}}
-#endif
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1XXXxXXX_1[] =
-{
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
- 0x01}},
- {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
- 0x00,0x84,0xff,0x29,0x09,0x00,0x07,
- 0x01}},
- {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x07,
- 0x01}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_LVDSCRT1XXXxXXX_1_H[] =
-{
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
- 0x00}},
- {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}},
- {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
- 0x01}},
- {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
};
-/* CRT1 CRTC for Chrontel TV slave modes */
-
-static const SiS_LVDSCRT1DataStruct SiS310_CHTVCRT1UNTSC[] =
+static const SiS310_LVDSCRT1DataStruct SiS310_CHTVCRT1UNTSC[] =
{
- {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
- 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,
- 0x00 }},
- {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
- 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,
- 0x00 }},
- {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
- 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,
- 0x00 }},
- {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
- 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,
- 0x00 }},
- {{0x5d,0x4f,0x81,0x56,0x99,0x56,0xba,
- 0x0a,0x84,0xdf,0x57,0x00,0x00,0x01,
- 0x00 }},
- {{0x80,0x63,0x84,0x6d,0x0f,0xec,0xf0,
- 0x7a,0x8f,0x57,0xed,0x20,0x00,0x06,
- 0x01 }},
- {{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,
- 0x36,0x88,0xff,0xb0,0x10,0x00,0x02,
- 0x01}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_CHTVCRT1ONTSC[] =
-{
- {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
- 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,
- 0x00 }},
- {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
- 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,
- 0x00 }},
- {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
- 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,
- 0x00 }},
- {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
- 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,
- 0x00 }},
- {{0x5d,0x4f,0x81,0x58,0x9d,0x0b,0x3e,
- 0xe8,0x84,0xdf,0x0c,0x00,0x00,0x01,
- 0x00 }},
- {{0x7d,0x63,0x81,0x68,0x0e,0xba,0xf0,
- 0x78,0x8a,0x57,0xbb,0x20,0x00,0x06,
- 0x01 }},
- {{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,
- 0x15,0x88,0xff,0x47,0x70,0x00,0x02,
- 0x01 }}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_CHTVCRT1UPAL[] =
+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+ 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+ 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+ 0xe8,0x84,0x8f,0x57,0x20,0x00,0x01,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x56,0x9f,0x56,0x3e,
+ 0xd0,0x82,0x5d,0x57,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x5d,0x4f,0x81,0x56,0x99,0x56,0xba,
+ 0x0a,0x84,0xdf,0x57,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x80,0x63,0x84,0x6d,0x0f,0xec,0xf0,
+ 0x7a,0x8f,0x57,0xed,0x20,0x00,0x06,
+ 0x01 }},
+ {{0x8c,0x7f,0x90,0x86,0x09,0xaf,0xf5,
+ 0x36,0x88,0xff,0xb0,0x10,0x00,0x02,
+ 0x01}}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_CHTVCRT1ONTSC[] =
{
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
- 0x00 }},
- {{0x64,0x4f,0x88,0x5a,0x9f,0x6f,0xba,
- 0x15,0x83,0xdf,0x70,0x00,0x00,0x01,
- 0x00 }},
- {{0x73,0x63,0x97,0x69,0x8b,0xec,0xf0,
- 0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
- 0x01 }},
- {{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,
- 0x50,0x88,0xff,0xe7,0x10,0x00,0x02,
- 0x01}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS310_CHTVCRT1OPAL[] =
-{
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
- 0x00 }},
- {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
- 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
- 0x00 }},
- {{0x64,0x4f,0x88,0x58,0x9d,0x6f,0xba,
- 0x15,0x83,0xdf,0x70,0x00,0x00,0x01,
- 0x00 }},
- {{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
- 0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
- 0x01 }},
- {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
- 0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
- 0x01 }}
-};
-
-
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_UNTSC[] =
-{
- {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x6a,0x77,0xbb,0x6e,0x84,0x2e,0x02,0x5a,0x04,0x00,0x80,0x20,0x7e,0x80,0x98,0x00}},
- {{0xcf,0x77,0xb7,0xc8,0x84,0x3b,0x02,0x5a,0x04,0x00,0x80,0x19,0x88,0x30,0x7f,0x00}},
- {{0xee,0x77,0xbb,0x66,0x87,0x32,0x01,0x5a,0x04,0x00,0x80,0x1b,0xd3,0xf2,0x36,0x00}}
-}; /* WRONG: 0x02: should be 0xfx, because if CIVEnable is clear, this should be set;
- 0x07: Blacklevel: NTSC/PAL-M: Should be 131 (0x83), and not 0x50/0x5a
- PAL/PAL-N: 110 (0x6e)
- NTSC-J: 102 (0x66)
- 0x0c-0x0f: CIV is not default as in datasheet
- MISSING: 0x21: Should set D1 to ZERO (for NTSC, PAL-M) or ONE (PAL, NTSC-J)
- Most of this is wrong in all NTSC and PAL register arrays. But I won't correct
- it as long as it works. For NTSC-J, the blacklevel is corrected in init301.c;
- for PAL-M and PAL-N all above is corrected.
- */
-
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_ONTSC[] =
-{
- {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x69,0x77,0xbb,0x6e,0x84,0x1e,0x00,0x5a,0x04,0x00,0x80,0x25,0x1a,0x43,0x04,0x00}},
- {{0xce,0x77,0xb7,0xb6,0x83,0x2c,0x02,0x5a,0x04,0x00,0x80,0x1c,0x00,0x82,0x97,0x00}},
- {{0xed,0x77,0xbb,0x66,0x8c,0x21,0x02,0x5a,0x04,0x00,0x80,0x1f,0x9f,0xc1,0x0c,0x00}}
-};
-
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_UPAL[] =
-{
- {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x80,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x12,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x26,0x2a,0x55,0x5d,0x00}},
- {{0xc3,0x7f,0xb7,0x7a,0x84,0x40,0x02,0x5a,0x05,0x00,0x80,0x1f,0x84,0x3d,0x28,0x00}},
- {{0xe5,0x7f,0xb7,0x1d,0xa7,0x3e,0x04,0x5a,0x05,0x00,0x80,0x20,0x3e,0xe4,0x22,0x00}}
-};
-
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_OPAL[] =
-{
- {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x26,0x2a,0x55,0x5d,0x00}},
- {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x5a,0x05,0x00,0x80,0x26,0x78,0x19,0x34,0x00}},
- {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x5a,0x05,0x00,0x80,0x25,0x8c,0xb2,0x2a,0x00}}
-};
-
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_UPALM[] =
-{
- {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x72,0x77,0xfb,0x6e,0x84,0x2e,0x02,0x83,0x04,0x00,0x80,0x20,0x76,0xdb,0x6e,0x00}},
- {{0xd7,0x77,0xf7,0xc8,0x84,0x3b,0x02,0x83,0x04,0x00,0x80,0x19,0x84,0x0a,0xc7,0x00}},
- {{0xf6,0x77,0xfb,0x66,0x87,0x32,0x01,0x83,0x04,0x00,0x80,0x1b,0xdc,0xb0,0x8d,0x00}}
-#if 0 /* Correct blacklevel and CFRB */
- {{0x72,0x77,0xbb,0x6e,0x84,0x2e,0x02,0x5a,0x04,0x00,0x80,0x20,0x76,0xdb,0x6e,0x00}},
- {{0xd7,0x77,0xb7,0xc8,0x84,0x3b,0x02,0x5a,0x04,0x00,0x80,0x19,0x84,0x0a,0xc7,0x00}},
- {{0xf6,0x77,0xbb,0x66,0x87,0x32,0x01,0x5a,0x04,0x00,0x80,0x1b,0xdc,0xb0,0x8d,0x00}}
-#endif
+ {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
+ 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,
+ 0x00 }},
+ {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
+ 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
+ 0xc0,0x84,0x8f,0x0c,0x20,0x00,0x01,
+ 0x00 }},
+ {{0x63,0x4f,0x87,0x5a,0x9f,0x0b,0x3e,
+ 0xb0,0x8d,0x5d,0x0c,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x5d,0x4f,0x81,0x58,0x9d,0x0b,0x3e,
+ 0xe8,0x84,0xdf,0x0c,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x7d,0x63,0x81,0x68,0x0e,0xba,0xf0,
+ 0x78,0x8a,0x57,0xbb,0x20,0x00,0x06,
+ 0x01 }},
+ {{0x8c,0x7f,0x90,0x82,0x06,0x46,0xf5,
+ 0x15,0x88,0xff,0x47,0x70,0x00,0x02,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_CHTVCRT1UPAL[] =
+{
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf8,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x5a,0x9f,0x6f,0xba,
+ 0x15,0x83,0xdf,0x70,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x73,0x63,0x97,0x69,0x8b,0xec,0xf0,
+ 0x90,0x8c,0x57,0xed,0x20,0x00,0x05,
+ 0x01 }},
+ {{0xaa,0x7f,0x8e,0x8e,0x96,0xe6,0xf5,
+ 0x50,0x88,0xff,0xe7,0x10,0x00,0x02,
+ 0x01}}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_CHTVCRT1OPAL[] =
+{
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x58,0x9d,0x6f,0xba,
+ 0x15,0x83,0xdf,0x70,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+ 0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+ 0x01 }},
+ {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+ 0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+ 0x01 }}
+};
+
+static const SiS310_LVDSCRT1DataStruct SiS310_CHTVCRT1SOPAL[] =
+{
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xf0,0x83,0x8f,0x70,0x20,0x00,0x05,
+ 0x00 }},
+ {{0x79,0x4f,0x9d,0x5a,0x90,0x6f,0x3e,
+ 0xde,0x81,0x5d,0x70,0x00,0x00,0x05,
+ 0x00 }},
+ {{0x64,0x4f,0x88,0x58,0x9d,0x6f,0xba,
+ 0x15,0x83,0xdf,0x70,0x00,0x00,0x01,
+ 0x00 }},
+ {{0x71,0x63,0x95,0x69,0x8c,0x6f,0xf0,
+ 0x5a,0x8b,0x57,0x70,0x20,0x00,0x05,
+ 0x01 }},
+ {{0xaa,0x7f,0x8e,0x8f,0x96,0x69,0xf5,
+ 0x28,0x88,0xff,0x6a,0x10,0x00,0x02,
+ 0x01 }}
+};
+
+typedef struct _SiS310_CHTVRegDataStruct
+{
+ UCHAR Reg[16];
+} SiS310_CHTVRegDataStruct;
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_UNTSC[] =
+{
+ {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x4a,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x6a,0x77,0xbb,0x6e,0x84,0x2e,0x02,0x5a,0x04,0x00,0x80,0x20,0x7e,0x80,0x98,0x00}},
+ {{0xcf,0x77,0xb7,0xc8,0x84,0x3b,0x02,0x5a,0x04,0x00,0x80,0x19,0x88,0x30,0x7f,0x00}},
+ {{0xee,0x77,0xbb,0x66,0x87,0x32,0x01,0x5a,0x04,0x00,0x80,0x1b,0xd3,0xf2,0x36,0x00}}
+};
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_ONTSC[] =
+{
+ {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x49,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x69,0x77,0xbb,0x6e,0x84,0x1e,0x00,0x5a,0x04,0x00,0x80,0x25,0x1a,0x43,0x04,0x00}},
+ {{0xce,0x77,0xb7,0xb6,0x83,0x2c,0x02,0x5a,0x04,0x00,0x80,0x1c,0x00,0x82,0x97,0x00}},
+ {{0xed,0x77,0xbb,0x66,0x8c,0x21,0x02,0x5a,0x04,0x00,0x80,0x1f,0x9f,0xc1,0x0c,0x00}}
+};
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_UPAL[] =
+{
+ {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x80,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x12,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x26,0x2a,0x55,0x5d,0x00}},
+ {{0xc3,0x7f,0xb7,0x7a,0x84,0x40,0x02,0x5a,0x05,0x00,0x80,0x1f,0x84,0x3d,0x28,0x00}},
+ {{0xe5,0x7f,0xb7,0x1d,0xa7,0x3e,0x04,0x5a,0x05,0x00,0x80,0x20,0x3e,0xe4,0x22,0x00}}
+};
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_OPAL[] =
+{
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x26,0x2a,0x55,0x5d,0x00}},
+ {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x5a,0x05,0x00,0x80,0x26,0x78,0x19,0x34,0x00}},
+ {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x5a,0x05,0x00,0x80,0x25,0x8c,0xb2,0x2a,0x00}}
+};
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_SOPAL[] =
+{
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x26,0x2a,0x55,0x5d,0x00}},
+ {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x5a,0x05,0x00,0x80,0x26,0x78,0x19,0x34,0x00}},
+ {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x5a,0x05,0x00,0x80,0x25,0x8c,0xb2,0x2a,0x00}}
+};
+
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_UPALM[] =
+{
+ {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x52,0x77,0xbb,0x94,0x84,0x48,0xfe,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x72,0x77,0xbb,0x6e,0x84,0x2e,0x02,0x5a,0x04,0x00,0x80,0x20,0x76,0xdb,0x6e,0x00}},
+ {{0xd7,0x77,0xb7,0xc8,0x84,0x3b,0x02,0x5a,0x04,0x00,0x80,0x19,0x84,0x0a,0xc7,0x00}},
+ {{0xf6,0x77,0xbb,0x66,0x87,0x32,0x01,0x5a,0x04,0x00,0x80,0x1b,0xdc,0xb0,0x8d,0x00}}
};
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_OPALM[] =
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_OPALM[] =
{
- {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x83,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
- {{0x71,0x77,0xfb,0x6e,0x84,0x1e,0x00,0x83,0x04,0x00,0x80,0x25,0x1a,0x1f,0x59,0x00}},
- {{0xd6,0x77,0xf7,0xb6,0x83,0x2c,0x02,0x83,0x04,0x00,0x80,0x1b,0xf8,0x1f,0x82,0x00}},
- {{0xf5,0x77,0xfb,0x66,0x8c,0x21,0x02,0x83,0x04,0x00,0x80,0x1f,0x58,0x46,0x9f,0x00}}
-#if 0 /* Correct blacklevel and CFRB */
- {{0x71,0x77,0xbb,0x6e,0x84,0x1e,0x00,0x5a,0x04,0x00,0x80,0x25,0x1a,0x1f,0x59,0x00}},
- {{0xd6,0x77,0xb7,0xb6,0x83,0x2c,0x02,0x5a,0x04,0x00,0x80,0x1b,0xf8,0x1f,0x82,0x00}},
- {{0xf5,0x77,0xbb,0x66,0x8c,0x21,0x02,0x5a,0x04,0x00,0x80,0x1f,0x58,0x46,0x9f,0x00}}
-#endif
+ {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x51,0x77,0xbb,0x7b,0x84,0x34,0x00,0x50,0x04,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x71,0x77,0xbb,0x6e,0x84,0x1e,0x00,0x5a,0x04,0x00,0x80,0x25,0x1a,0x1f,0x59,0x00}},
+ {{0xd6,0x77,0xb7,0xb6,0x83,0x2c,0x02,0x5a,0x04,0x00,0x80,0x1b,0xf8,0x1f,0x82,0x00}},
+ {{0xf5,0x77,0xbb,0x66,0x8c,0x21,0x02,0x5a,0x04,0x00,0x80,0x1f,0x58,0x46,0x9f,0x00}}
};
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_UPALN[] =
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_UPALN[] =
{
- {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x80,0x85,0x50,0x00,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x12,0x85,0x50,0x00,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0xc3,0x7f,0xb7,0x7a,0x84,0x40,0x02,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0xe5,0x7f,0xb7,0x1d,0xa7,0x3e,0x04,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}}
-#if 0 /* Correct blacklevel, CIV and CFRB */
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x1f,0x0d,0x54,0x5e,0x00}},
- {{0xc3,0x7f,0xb7,0x7a,0x84,0x40,0x02,0x5a,0x05,0x00,0x80,0x19,0x78,0xef,0x35,0x00}},
- {{0xe5,0x7f,0xb7,0x1d,0xa7,0x3e,0x04,0x5a,0x05,0x00,0x80,0x1a,0x33,0x3f,0x2f,0x00}}
-#endif
+ {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x80,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x34,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x12,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x1f,0x0d,0x54,0x5e,0x00}},
+ {{0xc3,0x7f,0xb7,0x7a,0x84,0x40,0x02,0x5a,0x05,0x00,0x80,0x19,0x78,0xef,0x35,0x00}},
+ {{0xe5,0x7f,0xb7,0x1d,0xa7,0x3e,0x04,0x5a,0x05,0x00,0x80,0x1a,0x33,0x3f,0x2f,0x00}}
};
-static const SiS_CHTVRegDataStruct SiS310_CHTVReg_OPALN[] =
+static const SiS310_CHTVRegDataStruct SiS310_CHTVReg_OPALN[] =
{
- {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}},
- {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x6e,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x03}}
-#if 0 /* Correct blacklevel, CIV and CFRB */
- {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x1f,0x0d,0x54,0x5e,0x00}},
- {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x5a,0x05,0x00,0x80,0x1f,0x15,0xc0,0x1e,0x00}},
- {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x5a,0x05,0x00,0x80,0x1d,0xf1,0x6c,0xcb,0x00}}
-#endif
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x36,0xad,0x50,0x34,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x41,0x7f,0xb7,0x86,0x85,0x50,0x00,0x83,0x05,0x00,0x80,0x00,0x00,0x00,0x00,0x01}},
+ {{0x61,0x7f,0xb7,0x99,0x84,0x35,0x04,0x5a,0x05,0x00,0x80,0x1f,0x0d,0x54,0x5e,0x00}},
+ {{0xc1,0x7f,0xb7,0x4d,0x8c,0x1e,0x31,0x5a,0x05,0x00,0x80,0x1f,0x15,0xc0,0x1e,0x00}},
+ {{0xe4,0x7f,0xb7,0x1e,0xaf,0x29,0x37,0x5a,0x05,0x00,0x80,0x1d,0xf1,0x6c,0xcb,0x00}}
};
static const UCHAR SiS310_CHTVVCLKUNTSC[] = {0x41,0x41,0x41,0x41,0x42,0x46,0x53};
+
static const UCHAR SiS310_CHTVVCLKONTSC[] = {0x48,0x48,0x48,0x48,0x45,0x43,0x51};
static const UCHAR SiS310_CHTVVCLKUPAL[] = {0x47,0x47,0x47,0x47,0x48,0x4a,0x54};
+
static const UCHAR SiS310_CHTVVCLKOPAL[] = {0x47,0x47,0x47,0x47,0x48,0x4f,0x52};
+static const UCHAR SiS310_CHTVVCLKSOPAL[] = {0x47,0x47,0x47,0x47,0x48,0x4f,0x52};
+
static const UCHAR SiS310_CHTVVCLKUPALM[] = {0x41,0x41,0x41,0x41,0x42,0x46,0x53};
+
static const UCHAR SiS310_CHTVVCLKOPALM[] = {0x48,0x48,0x48,0x48,0x45,0x43,0x51};
static const UCHAR SiS310_CHTVVCLKUPALN[] = {0x47,0x47,0x47,0x47,0x48,0x4a,0x54};
-static const UCHAR SiS310_CHTVVCLKOPALN[] = {0x47,0x47,0x47,0x47,0x48,0x4f,0x52};
+static const UCHAR SiS310_CHTVVCLKOPALN[] = {0x47,0x47,0x47,0x47,0x48,0x4f,0x52};
diff --git a/src/init.c b/src/init.c
index f94f89e..3e23e3b 100644
--- a/src/init.c
+++ b/src/init.c
@@ -1,57 +1,35 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.20 2003/09/05 09:38:32 twini Exp $ */
/*
- * Mode initializing code (CRT1 section) for
- * for SiS 300/305/540/630/730 and
- * SiS 315/550/650/M650/651/661FX/M661FX/740/741/M741/330/660/M660/760/M760
+ * Mode switching code (CRT1 section) for
+ * SiS 300/540/630/730/315/550/650/M650/651/M652/740/330/660/M660/760
* (Universal module for Linux kernel framebuffer and XFree86 4.x)
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Assembler-To-C translation
+ * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
+ * Formerly based on non-functional code-fragements by SiS, Inc.
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- *
- * Formerly based on non-functional code-fragements for 300 series by SiS, Inc.
- * Used by permission.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* TW says: This code looks awful, I know. But please don't do anything about
* this otherwise debugging will be hell.
@@ -73,74 +51,141 @@
#include "310vtbl.h"
#endif
+#ifdef LINUX_XF86
+BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi);
+int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber);
+#ifdef SISDUALHEAD
+BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+#endif /* dual head */
+#endif /* linux_xf86 */
+
+#ifdef LINUX_XF86
+BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch);
+#else
+BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo);
+#endif
+
+#ifndef LINUX_XF86
+static ULONG GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#endif
+
#if defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE,SiSSetMode)
+#pragma alloc_text(PAGE,SiSInit)
#endif
-/*********************************************/
-/* POINTER INITIALIZATION */
-/*********************************************/
-
static void
-InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
SiS_Pr->SiS_StResInfo = SiS_StResInfo;
SiS_Pr->SiS_ModeResInfo = SiS_ModeResInfo;
SiS_Pr->SiS_StandTable = SiS_StandTable;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ SiS_StandTable[0x04].CRTC[4] = 0x2b;
+ SiS_StandTable[0x05].CRTC[4] = 0x2b;
+ SiS_StandTable[0x06].CRTC[4] = 0x54;
+ SiS_StandTable[0x06].CRTC[5] = 0x80;
+ SiS_StandTable[0x0d].CRTC[4] = 0x2b;
+ SiS_StandTable[0x0e].CRTC[4] = 0x54;
+ SiS_StandTable[0x0e].CRTC[5] = 0x80;
+ SiS_StandTable[0x11].CRTC[4] = 0x54;
+ SiS_StandTable[0x11].CRTC[5] = 0x80;
+ SiS_StandTable[0x11].CRTC[16] = 0x83;
+ SiS_StandTable[0x11].CRTC[17] = 0x85;
+ SiS_StandTable[0x12].CRTC[4] = 0x54;
+ SiS_StandTable[0x12].CRTC[5] = 0x80;
+ SiS_StandTable[0x12].CRTC[16] = 0x83;
+ SiS_StandTable[0x12].CRTC[17] = 0x85;
+ SiS_StandTable[0x13].CRTC[5] = 0xa0;
+ SiS_StandTable[0x17].CRTC[5] = 0xa0;
+ SiS_StandTable[0x1a].CRTC[4] = 0x54;
+ SiS_StandTable[0x1a].CRTC[5] = 0x80;
+ SiS_StandTable[0x1a].CRTC[16] = 0xea;
+ SiS_StandTable[0x1a].CRTC[17] = 0x8c;
+ SiS_StandTable[0x1b].CRTC[4] = 0x54;
+ SiS_StandTable[0x1b].CRTC[5] = 0x80;
+ SiS_StandTable[0x1b].CRTC[16] = 0xea;
+ SiS_StandTable[0x1b].CRTC[17] = 0x8c;
+ SiS_StandTable[0x1c].CRTC[4] = 0x54;
+ SiS_StandTable[0x1c].CRTC[5] = 0x80;
+ } else {
+ SiS_StandTable[0x04].CRTC[4] = 0x2c;
+ SiS_StandTable[0x05].CRTC[4] = 0x2c;
+ SiS_StandTable[0x06].CRTC[4] = 0x55;
+ SiS_StandTable[0x06].CRTC[5] = 0x81;
+ SiS_StandTable[0x0d].CRTC[4] = 0x2c;
+ SiS_StandTable[0x0e].CRTC[4] = 0x55;
+ SiS_StandTable[0x0e].CRTC[5] = 0x81;
+ SiS_StandTable[0x11].CRTC[4] = 0x55;
+ SiS_StandTable[0x11].CRTC[5] = 0x81;
+ SiS_StandTable[0x11].CRTC[16] = 0x82;
+ SiS_StandTable[0x11].CRTC[17] = 0x84;
+ SiS_StandTable[0x12].CRTC[4] = 0x55;
+ SiS_StandTable[0x12].CRTC[5] = 0x81;
+ SiS_StandTable[0x12].CRTC[16] = 0x82;
+ SiS_StandTable[0x12].CRTC[17] = 0x84;
+ SiS_StandTable[0x13].CRTC[5] = 0xb1;
+ SiS_StandTable[0x17].CRTC[5] = 0xb1;
+ SiS_StandTable[0x1a].CRTC[4] = 0x55;
+ SiS_StandTable[0x1a].CRTC[5] = 0x81;
+ SiS_StandTable[0x1a].CRTC[16] = 0xe9;
+ SiS_StandTable[0x1a].CRTC[17] = 0x8b;
+ SiS_StandTable[0x1b].CRTC[4] = 0x55;
+ SiS_StandTable[0x1b].CRTC[5] = 0x81;
+ SiS_StandTable[0x1b].CRTC[16] = 0xe9;
+ SiS_StandTable[0x1b].CRTC[17] = 0x8b;
+ SiS_StandTable[0x1c].CRTC[4] = 0x55;
+ SiS_StandTable[0x1c].CRTC[5] = 0x81;
+ }
- SiS_Pr->SiS_NTSCPhase = SiS_NTSCPhase;
- SiS_Pr->SiS_PALPhase = SiS_PALPhase;
- SiS_Pr->SiS_NTSCPhase2 = SiS_NTSCPhase2;
- SiS_Pr->SiS_PALPhase2 = SiS_PALPhase2;
- SiS_Pr->SiS_PALMPhase = SiS_PALMPhase;
- SiS_Pr->SiS_PALNPhase = SiS_PALNPhase;
- SiS_Pr->SiS_PALMPhase2 = SiS_PALMPhase2;
- SiS_Pr->SiS_PALNPhase2 = SiS_PALNPhase2;
- SiS_Pr->SiS_SpecialPhase = SiS_SpecialPhase;
- SiS_Pr->SiS_SpecialPhaseM = SiS_SpecialPhaseM;
- SiS_Pr->SiS_SpecialPhaseJ = SiS_SpecialPhaseJ;
+ SiS_Pr->SiS_NTSCPhase = SiS_NTSCPhase;
+ SiS_Pr->SiS_PALPhase = SiS_PALPhase;
+ SiS_Pr->SiS_NTSCPhase2 = SiS_NTSCPhase2;
+ SiS_Pr->SiS_PALPhase2 = SiS_PALPhase2;
+ SiS_Pr->SiS_PALMPhase = SiS_PALMPhase;
+ SiS_Pr->SiS_PALNPhase = SiS_PALNPhase;
+ SiS_Pr->SiS_PALMPhase2 = SiS_PALMPhase2;
+ SiS_Pr->SiS_PALNPhase2 = SiS_PALNPhase2;
+ SiS_Pr->SiS_SpecialPhase = SiS_SpecialPhase;
SiS_Pr->SiS_NTSCTiming = SiS_NTSCTiming;
SiS_Pr->SiS_PALTiming = SiS_PALTiming;
SiS_Pr->SiS_HiTVSt1Timing = SiS_HiTVSt1Timing;
SiS_Pr->SiS_HiTVSt2Timing = SiS_HiTVSt2Timing;
-
+ SiS_Pr->SiS_HiTVTextTiming = SiS_HiTVTextTiming;
SiS_Pr->SiS_HiTVExtTiming = SiS_HiTVExtTiming;
SiS_Pr->SiS_HiTVGroup3Data = SiS_HiTVGroup3Data;
SiS_Pr->SiS_HiTVGroup3Simu = SiS_HiTVGroup3Simu;
-#if 0
- SiS_Pr->SiS_HiTVTextTiming = SiS_HiTVTextTiming;
SiS_Pr->SiS_HiTVGroup3Text = SiS_HiTVGroup3Text;
-#endif
SiS_Pr->SiS_StPALData = SiS_StPALData;
SiS_Pr->SiS_ExtPALData = SiS_ExtPALData;
SiS_Pr->SiS_StNTSCData = SiS_StNTSCData;
SiS_Pr->SiS_ExtNTSCData = SiS_ExtNTSCData;
- SiS_Pr->SiS_St1HiTVData = SiS_StHiTVData;
+/* SiS_Pr->SiS_St1HiTVData = SiS_St1HiTVData; */
SiS_Pr->SiS_St2HiTVData = SiS_St2HiTVData;
SiS_Pr->SiS_ExtHiTVData = SiS_ExtHiTVData;
- SiS_Pr->SiS_St525iData = SiS_StNTSCData;
- SiS_Pr->SiS_St525pData = SiS_St525pData;
- SiS_Pr->SiS_St750pData = SiS_St750pData;
- SiS_Pr->SiS_Ext525iData = SiS_ExtNTSCData;
- SiS_Pr->SiS_Ext525pData = SiS_ExtNTSCData;
- SiS_Pr->SiS_Ext750pData = SiS_Ext750pData;
SiS_Pr->pSiS_OutputSelect = &SiS_OutputSelect;
SiS_Pr->pSiS_SoftSetting = &SiS_SoftSetting;
- SiS_Pr->SiS_LCD1280x720Data = SiS_LCD1280x720Data;
- SiS_Pr->SiS_StLCD1280x768_2Data = SiS_StLCD1280x768_2Data;
- SiS_Pr->SiS_ExtLCD1280x768_2Data = SiS_ExtLCD1280x768_2Data;
- SiS_Pr->SiS_LCD1280x768_3Data = SiS_LCD1280x768_3Data;
- SiS_Pr->SiS_LCD1280x800Data = SiS_LCD1280x800Data;
SiS_Pr->SiS_LCD1280x960Data = SiS_LCD1280x960Data;
- SiS_Pr->SiS_StLCD1400x1050Data = SiS_StLCD1400x1050Data;
SiS_Pr->SiS_ExtLCD1400x1050Data = SiS_ExtLCD1400x1050Data;
- SiS_Pr->SiS_LCD1680x1050Data = SiS_LCD1680x1050Data;
- SiS_Pr->SiS_StLCD1600x1200Data = SiS_StLCD1600x1200Data;
SiS_Pr->SiS_ExtLCD1600x1200Data = SiS_ExtLCD1600x1200Data;
+ SiS_Pr->SiS_StLCD1400x1050Data = SiS_StLCD1400x1050Data;
+ SiS_Pr->SiS_StLCD1600x1200Data = SiS_StLCD1600x1200Data;
+ SiS_Pr->SiS_NoScaleData1400x1050 = SiS_NoScaleData1400x1050;
+ SiS_Pr->SiS_NoScaleData1600x1200 = SiS_NoScaleData1600x1200;
+ SiS_Pr->SiS_ExtLCD1280x768Data = SiS_ExtLCD1280x768Data;
+ SiS_Pr->SiS_StLCD1280x768Data = SiS_StLCD1280x768Data;
+ SiS_Pr->SiS_NoScaleData1280x768 = SiS_NoScaleData1280x768;
SiS_Pr->SiS_NoScaleData = SiS_NoScaleData;
SiS_Pr->SiS_LVDS320x480Data_1 = SiS_LVDS320x480Data_1;
@@ -169,12 +214,36 @@ InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->SiS_LVDS640x480Data_1 = SiS_LVDS640x480Data_1;
SiS_Pr->SiS_LVDS640x480Data_2 = SiS_LVDS640x480Data_2;
- SiS_Pr->SiS_LVDS848x480Data_1 = SiS_LVDS848x480Data_1;
- SiS_Pr->SiS_LVDS848x480Data_2 = SiS_LVDS848x480Data_2;
- SiS_Pr->SiS_LVDSBARCO1024Data_1 = SiS_LVDSBARCO1024Data_1;
- SiS_Pr->SiS_LVDSBARCO1024Data_2 = SiS_LVDSBARCO1024Data_2;
SiS_Pr->SiS_LVDSBARCO1366Data_1 = SiS_LVDSBARCO1366Data_1;
SiS_Pr->SiS_LVDSBARCO1366Data_2 = SiS_LVDSBARCO1366Data_2;
+ SiS_Pr->SiS_LVDSBARCO1024Data_1 = SiS_LVDSBARCO1024Data_1;
+ SiS_Pr->SiS_LVDSBARCO1024Data_2 = SiS_LVDSBARCO1024Data_2;
+ SiS_Pr->SiS_LVDS848x480Data_1 = SiS_LVDS848x480Data_1;
+ SiS_Pr->SiS_LVDS848x480Data_2 = SiS_LVDS848x480Data_2;
+
+ SiS_Pr->SiS_LCDA1400x1050Data_1 = SiS_LCDA1400x1050Data_1;
+ SiS_Pr->SiS_LCDA1400x1050Data_2 = SiS_LCDA1400x1050Data_2;
+ SiS_Pr->SiS_LCDA1600x1200Data_1 = SiS_LCDA1600x1200Data_1;
+ SiS_Pr->SiS_LCDA1600x1200Data_2 = SiS_LCDA1600x1200Data_2;
+ SiS_Pr->SiS_CHTVUNTSCData = SiS_CHTVUNTSCData;
+ SiS_Pr->SiS_CHTVONTSCData = SiS_CHTVONTSCData;
+
+ SiS_Pr->LVDS1024x768Des_1 = SiS_PanelType1076_1;
+ SiS_Pr->LVDS1280x1024Des_1 = SiS_PanelType1210_1;
+ SiS_Pr->LVDS1400x1050Des_1 = SiS_PanelType1296_1;
+ SiS_Pr->LVDS1600x1200Des_1 = SiS_PanelType1600_1;
+ SiS_Pr->LVDS1024x768Des_2 = SiS_PanelType1076_2;
+ SiS_Pr->LVDS1280x1024Des_2 = SiS_PanelType1210_2;
+ SiS_Pr->LVDS1400x1050Des_2 = SiS_PanelType1296_2;
+ SiS_Pr->LVDS1600x1200Des_2 = SiS_PanelType1600_2;
+
+ SiS_Pr->SiS_PanelTypeNS_1 = SiS_PanelTypeNS_1;
+ SiS_Pr->SiS_PanelTypeNS_2 = SiS_PanelTypeNS_2;
+
+ SiS_Pr->SiS_CHTVUNTSCDesData = SiS_CHTVUNTSCDesData;
+ SiS_Pr->SiS_CHTVONTSCDesData = SiS_CHTVONTSCDesData;
+ SiS_Pr->SiS_CHTVUPALDesData = SiS_CHTVUPALDesData;
+ SiS_Pr->SiS_CHTVOPALDesData = SiS_CHTVOPALDesData;
SiS_Pr->SiS_LVDSCRT11280x768_1 = SiS_LVDSCRT11280x768_1;
SiS_Pr->SiS_LVDSCRT11024x600_1 = SiS_LVDSCRT11024x600_1;
@@ -189,71 +258,38 @@ InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->SiS_LVDSCRT11024x600_2_H = SiS_LVDSCRT11024x600_2_H;
SiS_Pr->SiS_LVDSCRT11152x768_2_H = SiS_LVDSCRT11152x768_2_H;
SiS_Pr->SiS_LVDSCRT1320x480_1 = SiS_LVDSCRT1320x480_1;
+ SiS_Pr->SiS_LVDSCRT1XXXxXXX_1 = SiS_LVDSCRT1XXXxXXX_1;
+ SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H = SiS_LVDSCRT1XXXxXXX_1_H;
SiS_Pr->SiS_LVDSCRT1640x480_1 = SiS_LVDSCRT1640x480_1;
SiS_Pr->SiS_LVDSCRT1640x480_1_H = SiS_LVDSCRT1640x480_1_H;
SiS_Pr->SiS_LVDSCRT1640x480_2 = SiS_LVDSCRT1640x480_2;
SiS_Pr->SiS_LVDSCRT1640x480_2_H = SiS_LVDSCRT1640x480_2_H;
SiS_Pr->SiS_LVDSCRT1640x480_3 = SiS_LVDSCRT1640x480_3;
SiS_Pr->SiS_LVDSCRT1640x480_3_H = SiS_LVDSCRT1640x480_3_H;
-
- SiS_Pr->SiS_CHTVUNTSCData = SiS_CHTVUNTSCData;
- SiS_Pr->SiS_CHTVONTSCData = SiS_CHTVONTSCData;
-
- SiS_Pr->SiS_CHTVUNTSCDesData = SiS_CHTVUNTSCDesData;
- SiS_Pr->SiS_CHTVONTSCDesData = SiS_CHTVONTSCDesData;
- SiS_Pr->SiS_CHTVUPALDesData = SiS_CHTVUPALDesData;
- SiS_Pr->SiS_CHTVOPALDesData = SiS_CHTVOPALDesData;
-
- SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* lowest value LVDS/LCDA */
- SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* lowest value 301 */
}
#ifdef SIS300
static void
-InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- InitCommonPointer(SiS_Pr, HwInfo);
-
- SiS_StandTable[0x04].CRTC[4] = 0x2b;
- SiS_StandTable[0x05].CRTC[4] = 0x2b;
- SiS_StandTable[0x06].CRTC[4] = 0x54;
- SiS_StandTable[0x06].CRTC[5] = 0x80;
- SiS_StandTable[0x0d].CRTC[4] = 0x2b;
- SiS_StandTable[0x0e].CRTC[4] = 0x54;
- SiS_StandTable[0x0e].CRTC[5] = 0x80;
- SiS_StandTable[0x11].CRTC[4] = 0x54;
- SiS_StandTable[0x11].CRTC[5] = 0x80;
- SiS_StandTable[0x11].CRTC[16] = 0x83;
- SiS_StandTable[0x11].CRTC[17] = 0x85;
- SiS_StandTable[0x12].CRTC[4] = 0x54;
- SiS_StandTable[0x12].CRTC[5] = 0x80;
- SiS_StandTable[0x12].CRTC[16] = 0x83;
- SiS_StandTable[0x12].CRTC[17] = 0x85;
- SiS_StandTable[0x13].CRTC[5] = 0xa0;
- SiS_StandTable[0x17].CRTC[5] = 0xa0;
- SiS_StandTable[0x1a].CRTC[4] = 0x54;
- SiS_StandTable[0x1a].CRTC[5] = 0x80;
- SiS_StandTable[0x1a].CRTC[16] = 0xea;
- SiS_StandTable[0x1a].CRTC[17] = 0x8c;
- SiS_StandTable[0x1b].CRTC[4] = 0x54;
- SiS_StandTable[0x1b].CRTC[5] = 0x80;
- SiS_StandTable[0x1b].CRTC[16] = 0xea;
- SiS_StandTable[0x1b].CRTC[17] = 0x8c;
- SiS_StandTable[0x1c].CRTC[4] = 0x54;
- SiS_StandTable[0x1c].CRTC[5] = 0x80;
-
- SiS_Pr->SiS_SModeIDTable = SiS300_SModeIDTable;
- SiS_Pr->SiS_VBModeIDTable = SiS300_VBModeIDTable;
- SiS_Pr->SiS_EModeIDTable = SiS300_EModeIDTable;
- SiS_Pr->SiS_RefIndex = SiS300_RefIndex;
- SiS_Pr->SiS_CRT1Table = SiS300_CRT1Table;
- if(HwInfo->jChipType == SIS_300) {
- SiS_Pr->SiS_MCLKData_0 = SiS300_MCLKData_300; /* 300 */
+ InitCommonPointer(SiS_Pr, HwDeviceExtension);
+
+ SiS_Pr->SiS_SModeIDTable = (SiS_StStruct *)SiS300_SModeIDTable;
+ SiS_Pr->SiS_VBModeIDTable = (SiS_VBModeStruct *)SiS300_VBModeIDTable;
+ SiS_Pr->SiS_EModeIDTable = (SiS_ExtStruct *)SiS300_EModeIDTable;
+ SiS_Pr->SiS_RefIndex = (SiS_Ext2Struct *)SiS300_RefIndex;
+ SiS_Pr->SiS_CRT1Table = (SiS_CRT1TableStruct *)SiS300_CRT1Table;
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS300_MCLKData_300; /* 300 */
} else {
- SiS_Pr->SiS_MCLKData_0 = SiS300_MCLKData_630; /* 630, 730 */
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS300_MCLKData_630; /* 630, 730 */
}
- SiS_Pr->SiS_VCLKData = SiS300_VCLKData;
+#ifdef LINUXBIOS
+ SiS_Pr->SiS_ECLKData = (SiS_ECLKDataStruct *)SiS300_ECLKData;
+#endif
+ SiS_Pr->SiS_VCLKData = (SiS_VCLKDataStruct *)SiS300_VCLKData;
SiS_Pr->SiS_VBVCLKData = (SiS_VBVCLKDataStruct *)SiS300_VCLKData;
+ SiS_Pr->SiS_ScreenOffset = SiS300_ScreenOffset;
SiS_Pr->SiS_SR15 = SiS300_SR15;
@@ -282,102 +318,94 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->pSiS_YCSenseData2 = &SiS300_YCSenseData2;
#endif
- SiS_Pr->SiS_PanelDelayTbl = SiS300_PanelDelayTbl;
- SiS_Pr->SiS_PanelDelayTblLVDS = SiS300_PanelDelayTbl;
-
- SiS_Pr->SiS_ExtLCD1024x768Data = SiS300_ExtLCD1024x768Data;
- SiS_Pr->SiS_St2LCD1024x768Data = SiS300_St2LCD1024x768Data;
- SiS_Pr->SiS_ExtLCD1280x1024Data = SiS300_ExtLCD1280x1024Data;
- SiS_Pr->SiS_St2LCD1280x1024Data = SiS300_St2LCD1280x1024Data;
-
- SiS_Pr->SiS_CRT2Part2_1024x768_1 = SiS300_CRT2Part2_1024x768_1;
- SiS_Pr->SiS_CRT2Part2_1280x1024_1 = SiS300_CRT2Part2_1280x1024_1;
- SiS_Pr->SiS_CRT2Part2_1024x768_2 = SiS300_CRT2Part2_1024x768_2;
- SiS_Pr->SiS_CRT2Part2_1280x1024_2 = SiS300_CRT2Part2_1280x1024_2;
- SiS_Pr->SiS_CRT2Part2_1024x768_3 = SiS300_CRT2Part2_1024x768_3;
- SiS_Pr->SiS_CRT2Part2_1280x1024_3 = SiS300_CRT2Part2_1280x1024_3;
-
- SiS_Pr->SiS_CHTVUPALData = SiS300_CHTVUPALData;
- SiS_Pr->SiS_CHTVOPALData = SiS300_CHTVOPALData;
- SiS_Pr->SiS_CHTVUPALMData = SiS_CHTVUNTSCData; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVOPALMData = SiS_CHTVONTSCData; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVUPALNData = SiS300_CHTVUPALData; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVOPALNData = SiS300_CHTVOPALData; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVSOPALData = SiS300_CHTVSOPALData;
-
- SiS_Pr->SiS_PanelType00_1 = SiS300_PanelType00_1;
- SiS_Pr->SiS_PanelType01_1 = SiS300_PanelType01_1;
- SiS_Pr->SiS_PanelType02_1 = SiS300_PanelType02_1;
- SiS_Pr->SiS_PanelType03_1 = SiS300_PanelType03_1;
- SiS_Pr->SiS_PanelType04_1 = SiS300_PanelType04_1;
- SiS_Pr->SiS_PanelType05_1 = SiS300_PanelType05_1;
- SiS_Pr->SiS_PanelType06_1 = SiS300_PanelType06_1;
- SiS_Pr->SiS_PanelType07_1 = SiS300_PanelType07_1;
- SiS_Pr->SiS_PanelType08_1 = SiS300_PanelType08_1;
- SiS_Pr->SiS_PanelType09_1 = SiS300_PanelType09_1;
- SiS_Pr->SiS_PanelType0a_1 = SiS300_PanelType0a_1;
- SiS_Pr->SiS_PanelType0b_1 = SiS300_PanelType0b_1;
- SiS_Pr->SiS_PanelType0c_1 = SiS300_PanelType0c_1;
- SiS_Pr->SiS_PanelType0d_1 = SiS300_PanelType0d_1;
- SiS_Pr->SiS_PanelType0e_1 = SiS300_PanelType0e_1;
- SiS_Pr->SiS_PanelType0f_1 = SiS300_PanelType0f_1;
- SiS_Pr->SiS_PanelType00_2 = SiS300_PanelType00_2;
- SiS_Pr->SiS_PanelType01_2 = SiS300_PanelType01_2;
- SiS_Pr->SiS_PanelType02_2 = SiS300_PanelType02_2;
- SiS_Pr->SiS_PanelType03_2 = SiS300_PanelType03_2;
- SiS_Pr->SiS_PanelType04_2 = SiS300_PanelType04_2;
- SiS_Pr->SiS_PanelType05_2 = SiS300_PanelType05_2;
- SiS_Pr->SiS_PanelType06_2 = SiS300_PanelType06_2;
- SiS_Pr->SiS_PanelType07_2 = SiS300_PanelType07_2;
- SiS_Pr->SiS_PanelType08_2 = SiS300_PanelType08_2;
- SiS_Pr->SiS_PanelType09_2 = SiS300_PanelType09_2;
- SiS_Pr->SiS_PanelType0a_2 = SiS300_PanelType0a_2;
- SiS_Pr->SiS_PanelType0b_2 = SiS300_PanelType0b_2;
- SiS_Pr->SiS_PanelType0c_2 = SiS300_PanelType0c_2;
- SiS_Pr->SiS_PanelType0d_2 = SiS300_PanelType0d_2;
- SiS_Pr->SiS_PanelType0e_2 = SiS300_PanelType0e_2;
- SiS_Pr->SiS_PanelType0f_2 = SiS300_PanelType0f_2;
- SiS_Pr->SiS_PanelTypeNS_1 = SiS300_PanelTypeNS_1;
- SiS_Pr->SiS_PanelTypeNS_2 = SiS300_PanelTypeNS_2;
+ SiS_Pr->SiS_StLCD1024x768Data = (SiS_LCDDataStruct *)SiS300_StLCD1024x768Data;
+ SiS_Pr->SiS_ExtLCD1024x768Data = (SiS_LCDDataStruct *)SiS300_ExtLCD1024x768Data;
+ SiS_Pr->SiS_St2LCD1024x768Data = (SiS_LCDDataStruct *)SiS300_St2LCD1024x768Data;
+ SiS_Pr->SiS_StLCD1280x1024Data = (SiS_LCDDataStruct *)SiS300_StLCD1280x1024Data;
+ SiS_Pr->SiS_ExtLCD1280x1024Data = (SiS_LCDDataStruct *)SiS300_ExtLCD1280x1024Data;
+ SiS_Pr->SiS_St2LCD1280x1024Data = (SiS_LCDDataStruct *)SiS300_St2LCD1280x1024Data;
+ SiS_Pr->SiS_NoScaleData1024x768 = (SiS_LCDDataStruct *)SiS300_NoScaleData1024x768;
+ SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS300_NoScaleData1280x1024;
+
+ SiS_Pr->SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTbl;
+ SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS300_PanelDelayTblLVDS;
+
+ SiS_Pr->SiS_CHTVUPALData = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData;
+ SiS_Pr->SiS_CHTVOPALData = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData;
+ SiS_Pr->SiS_CHTVUPALMData = SiS_CHTVUNTSCData; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVOPALMData = SiS_CHTVONTSCData; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVUPALData; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS300_CHTVOPALData; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS300_CHTVSOPALData;
+
+ SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS300_PanelType00_1;
+ SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS300_PanelType01_1;
+ SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS300_PanelType02_1;
+ SiS_Pr->SiS_PanelType03_1 = (SiS_LVDSDesStruct *)SiS300_PanelType03_1;
+ SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1;
+ SiS_Pr->SiS_PanelType05_1 = (SiS_LVDSDesStruct *)SiS300_PanelType05_1;
+ SiS_Pr->SiS_PanelType06_1 = (SiS_LVDSDesStruct *)SiS300_PanelType06_1;
+ SiS_Pr->SiS_PanelType07_1 = (SiS_LVDSDesStruct *)SiS300_PanelType07_1;
+ SiS_Pr->SiS_PanelType08_1 = (SiS_LVDSDesStruct *)SiS300_PanelType08_1;
+ SiS_Pr->SiS_PanelType09_1 = (SiS_LVDSDesStruct *)SiS300_PanelType09_1;
+ SiS_Pr->SiS_PanelType0a_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0a_1;
+ SiS_Pr->SiS_PanelType0b_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0b_1;
+ SiS_Pr->SiS_PanelType0c_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0c_1;
+ SiS_Pr->SiS_PanelType0d_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0d_1;
+ SiS_Pr->SiS_PanelType0e_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0e_1;
+ SiS_Pr->SiS_PanelType0f_1 = (SiS_LVDSDesStruct *)SiS300_PanelType0f_1;
+ SiS_Pr->SiS_PanelType00_2 = (SiS_LVDSDesStruct *)SiS300_PanelType00_2;
+ SiS_Pr->SiS_PanelType01_2 = (SiS_LVDSDesStruct *)SiS300_PanelType01_2;
+ SiS_Pr->SiS_PanelType02_2 = (SiS_LVDSDesStruct *)SiS300_PanelType02_2;
+ SiS_Pr->SiS_PanelType03_2 = (SiS_LVDSDesStruct *)SiS300_PanelType03_2;
+ SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2;
+ SiS_Pr->SiS_PanelType05_2 = (SiS_LVDSDesStruct *)SiS300_PanelType05_2;
+ SiS_Pr->SiS_PanelType06_2 = (SiS_LVDSDesStruct *)SiS300_PanelType06_2;
+ SiS_Pr->SiS_PanelType07_2 = (SiS_LVDSDesStruct *)SiS300_PanelType07_2;
+ SiS_Pr->SiS_PanelType08_2 = (SiS_LVDSDesStruct *)SiS300_PanelType08_2;
+ SiS_Pr->SiS_PanelType09_2 = (SiS_LVDSDesStruct *)SiS300_PanelType09_2;
+ SiS_Pr->SiS_PanelType0a_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0a_2;
+ SiS_Pr->SiS_PanelType0b_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0b_2;
+ SiS_Pr->SiS_PanelType0c_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0c_2;
+ SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0d_2;
+ SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0e_2;
+ SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS300_PanelType0f_2;
if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
- SiS_Pr->SiS_PanelType04_1 = SiS300_PanelType04_1a;
- SiS_Pr->SiS_PanelType04_2 = SiS300_PanelType04_2a;
+ SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1a;
+ SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2a;
}
if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
- SiS_Pr->SiS_PanelType04_1 = SiS300_PanelType04_1b;
- SiS_Pr->SiS_PanelType04_2 = SiS300_PanelType04_2b;
+ SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS300_PanelType04_1b;
+ SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS300_PanelType04_2b;
}
- SiS_Pr->SiS_LVDSCRT1800x600_1 = SiS300_LVDSCRT1800x600_1;
- SiS_Pr->SiS_LVDSCRT1800x600_1_H = SiS300_LVDSCRT1800x600_1_H;
- SiS_Pr->SiS_LVDSCRT1800x600_2 = SiS300_LVDSCRT1800x600_2;
- SiS_Pr->SiS_LVDSCRT1800x600_2_H = SiS300_LVDSCRT1800x600_2_H;
- SiS_Pr->SiS_LVDSCRT11024x768_1 = SiS300_LVDSCRT11024x768_1;
- SiS_Pr->SiS_LVDSCRT11024x768_1_H = SiS300_LVDSCRT11024x768_1_H;
- SiS_Pr->SiS_LVDSCRT11024x768_2 = SiS300_LVDSCRT11024x768_2;
- SiS_Pr->SiS_LVDSCRT11024x768_2_H = SiS300_LVDSCRT11024x768_2_H;
- SiS_Pr->SiS_LVDSCRT11280x1024_1 = SiS300_LVDSCRT11280x1024_1;
- SiS_Pr->SiS_LVDSCRT11280x1024_1_H = SiS300_LVDSCRT11280x1024_1_H;
- SiS_Pr->SiS_LVDSCRT11280x1024_2 = SiS300_LVDSCRT11280x1024_2;
- SiS_Pr->SiS_LVDSCRT11280x1024_2_H = SiS300_LVDSCRT11280x1024_2_H;
- SiS_Pr->SiS_LVDSCRT1XXXxXXX_1 = SiS300_LVDSCRT1XXXxXXX_1;
- SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H = SiS300_LVDSCRT1XXXxXXX_1_H;
-
- SiS_Pr->SiS_CHTVCRT1UNTSC = SiS300_CHTVCRT1UNTSC;
- SiS_Pr->SiS_CHTVCRT1ONTSC = SiS300_CHTVCRT1ONTSC;
- SiS_Pr->SiS_CHTVCRT1UPAL = SiS300_CHTVCRT1UPAL;
- SiS_Pr->SiS_CHTVCRT1OPAL = SiS300_CHTVCRT1OPAL;
- SiS_Pr->SiS_CHTVCRT1SOPAL = SiS300_CHTVCRT1SOPAL;
- SiS_Pr->SiS_CHTVReg_UNTSC = SiS300_CHTVReg_UNTSC;
- SiS_Pr->SiS_CHTVReg_ONTSC = SiS300_CHTVReg_ONTSC;
- SiS_Pr->SiS_CHTVReg_UPAL = SiS300_CHTVReg_UPAL;
- SiS_Pr->SiS_CHTVReg_OPAL = SiS300_CHTVReg_OPAL;
- SiS_Pr->SiS_CHTVReg_UPALM = SiS300_CHTVReg_UNTSC; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVReg_OPALM = SiS300_CHTVReg_ONTSC; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVReg_UPALN = SiS300_CHTVReg_UPAL; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVReg_OPALN = SiS300_CHTVReg_OPAL; /* not supported on 300 series */
- SiS_Pr->SiS_CHTVReg_SOPAL = SiS300_CHTVReg_SOPAL;
+ SiS_Pr->SiS_LVDSCRT1800x600_1 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1;
+ SiS_Pr->SiS_LVDSCRT11024x768_1 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1;
+ SiS_Pr->SiS_LVDSCRT11280x1024_1 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1;
+ SiS_Pr->SiS_LVDSCRT1800x600_1_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_1_H;
+ SiS_Pr->SiS_LVDSCRT11024x768_1_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_1_H;
+ SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_1_H;
+ SiS_Pr->SiS_LVDSCRT1800x600_2 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2;
+ SiS_Pr->SiS_LVDSCRT11024x768_2 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2;
+ SiS_Pr->SiS_LVDSCRT11280x1024_2 = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2;
+ SiS_Pr->SiS_LVDSCRT1800x600_2_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT1800x600_2_H;
+ SiS_Pr->SiS_LVDSCRT11024x768_2_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11024x768_2_H;
+ SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS300_LVDSCRT11280x1024_2_H;
+ SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UNTSC;
+ SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1ONTSC;
+ SiS_Pr->SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1UPAL;
+ SiS_Pr->SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1OPAL;
+ SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS300_CHTVCRT1SOPAL;
+ SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_UNTSC;
+ SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_ONTSC;
+ SiS_Pr->SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_UPAL;
+ SiS_Pr->SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_OPAL;
+ SiS_Pr->SiS_CHTVReg_UPALM = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_UNTSC; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVReg_OPALM = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_ONTSC; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_UPAL; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_OPAL; /* not supported on 300 series */
+ SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS300_CHTVReg_SOPAL;
SiS_Pr->SiS_CHTVVCLKUNTSC = SiS300_CHTVVCLKUNTSC;
SiS_Pr->SiS_CHTVVCLKONTSC = SiS300_CHTVVCLKONTSC;
SiS_Pr->SiS_CHTVVCLKUPAL = SiS300_CHTVVCLKUPAL;
@@ -387,61 +415,74 @@ InitTo300Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->SiS_CHTVVCLKUPALN = SiS300_CHTVVCLKUPAL; /* not supported on 300 series */
SiS_Pr->SiS_CHTVVCLKOPALN = SiS300_CHTVVCLKOPAL; /* not supported on 300 series */
SiS_Pr->SiS_CHTVVCLKSOPAL = SiS300_CHTVVCLKSOPAL;
+
+ SiS_Pr->SiS_CRT2Part2_1024x768_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1024x768_1;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1280x1024_1;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_1;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_1 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1600x1200_1;
+ SiS_Pr->SiS_CRT2Part2_1024x768_2 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1024x768_2;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_2 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1280x1024_2;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_2 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_2;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_2 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1600x1200_2;
+ SiS_Pr->SiS_CRT2Part2_1024x768_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1024x768_3;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1280x1024_3;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1400x1050_3;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS300_CRT2Part2_1600x1200_3;
+
+ /* TW: LCDResInfo will on 300 series be translated to 315 series definitions */
+ SiS_Pr->SiS_Panel320x480 = Panel_320x480;
+ SiS_Pr->SiS_Panel640x480 = Panel_640x480;
+ SiS_Pr->SiS_Panel800x600 = Panel_800x600;
+ SiS_Pr->SiS_Panel1024x768 = Panel_1024x768;
+ SiS_Pr->SiS_Panel1280x1024 = Panel_1280x1024;
+ SiS_Pr->SiS_Panel1280x960 = Panel_1280x960;
+ SiS_Pr->SiS_Panel1024x600 = Panel_1024x600;
+ SiS_Pr->SiS_Panel1152x768 = Panel_1152x768;
+ SiS_Pr->SiS_Panel1280x768 = Panel_1280x768;
+ SiS_Pr->SiS_Panel1600x1200 = 255; /* TW: Something illegal */
+ SiS_Pr->SiS_Panel1400x1050 = 255; /* TW: Something illegal */
+ SiS_Pr->SiS_Panel640x480_2 = 255; /* TW: Something illegal */
+ SiS_Pr->SiS_Panel640x480_3 = 255; /* TW: Something illegal */
+ SiS_Pr->SiS_Panel1152x864 = 255; /* TW: Something illegal */
+ SiS_Pr->SiS_PanelMax = Panel_320x480; /* TW: highest value */
+ SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* TW: Lowest value LVDS */
+ SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* TW: lowest value 301 */
+ SiS_Pr->SiS_PanelCustom = Panel_Custom;
+ SiS_Pr->SiS_PanelBarco1366 = Panel_Barco1366;
}
#endif
#ifdef SIS315H
static void
-InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- InitCommonPointer(SiS_Pr, HwInfo);
-
- SiS_StandTable[0x04].CRTC[4] = 0x2c;
- SiS_StandTable[0x05].CRTC[4] = 0x2c;
- SiS_StandTable[0x06].CRTC[4] = 0x55;
- SiS_StandTable[0x06].CRTC[5] = 0x81;
- SiS_StandTable[0x0d].CRTC[4] = 0x2c;
- SiS_StandTable[0x0e].CRTC[4] = 0x55;
- SiS_StandTable[0x0e].CRTC[5] = 0x81;
- SiS_StandTable[0x11].CRTC[4] = 0x55;
- SiS_StandTable[0x11].CRTC[5] = 0x81;
- SiS_StandTable[0x11].CRTC[16] = 0x82;
- SiS_StandTable[0x11].CRTC[17] = 0x84;
- SiS_StandTable[0x12].CRTC[4] = 0x55;
- SiS_StandTable[0x12].CRTC[5] = 0x81;
- SiS_StandTable[0x12].CRTC[16] = 0x82;
- SiS_StandTable[0x12].CRTC[17] = 0x84;
- SiS_StandTable[0x13].CRTC[5] = 0xb1;
- SiS_StandTable[0x17].CRTC[5] = 0xb1;
- SiS_StandTable[0x1a].CRTC[4] = 0x55;
- SiS_StandTable[0x1a].CRTC[5] = 0x81;
- SiS_StandTable[0x1a].CRTC[16] = 0xe9;
- SiS_StandTable[0x1a].CRTC[17] = 0x8b;
- SiS_StandTable[0x1b].CRTC[4] = 0x55;
- SiS_StandTable[0x1b].CRTC[5] = 0x81;
- SiS_StandTable[0x1b].CRTC[16] = 0xe9;
- SiS_StandTable[0x1b].CRTC[17] = 0x8b;
- SiS_StandTable[0x1c].CRTC[4] = 0x55;
- SiS_StandTable[0x1c].CRTC[5] = 0x81;
-
- SiS_Pr->SiS_SModeIDTable = SiS310_SModeIDTable;
- SiS_Pr->SiS_EModeIDTable = SiS310_EModeIDTable;
+ InitCommonPointer(SiS_Pr, HwDeviceExtension);
+
+ SiS_Pr->SiS_SModeIDTable = (SiS_StStruct *)SiS310_SModeIDTable;
+ SiS_Pr->SiS_EModeIDTable = (SiS_ExtStruct *)SiS310_EModeIDTable;
SiS_Pr->SiS_RefIndex = (SiS_Ext2Struct *)SiS310_RefIndex;
- SiS_Pr->SiS_CRT1Table = SiS310_CRT1Table;
- if(HwInfo->jChipType >= SIS_760) {
- SiS_Pr->SiS_MCLKData_0 = SiS310_MCLKData_0_760; /* 760 */
- } else if(HwInfo->jChipType >= SIS_661) {
- SiS_Pr->SiS_MCLKData_0 = SiS310_MCLKData_0_660; /* 661/741 */
- } else if(HwInfo->jChipType == SIS_330) {
- SiS_Pr->SiS_MCLKData_0 = SiS310_MCLKData_0_330; /* 330 */
- } else if(HwInfo->jChipType > SIS_315PRO) {
- SiS_Pr->SiS_MCLKData_0 = SiS310_MCLKData_0_650; /* 550, 650, 740 */
+ SiS_Pr->SiS_CRT1Table = (SiS_CRT1TableStruct *)SiS310_CRT1Table;
+ /* TW: MCLK is different */
+#ifdef LINUXBIOS
+ if(HwDeviceExtension->jChipType >= SIS_660) {
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_660; /* 660/760 */
+ } else if(HwDeviceExtension->jChipType == SIS_330) {
+#endif
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_330; /* 330 */
+#ifdef LINUXBIOS
+ } else if(HwDeviceExtension->jChipType > SIS_315PRO) {
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_650; /* 550, 650, 740 */
} else {
- SiS_Pr->SiS_MCLKData_0 = SiS310_MCLKData_0_315; /* 315 */
+ SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_315; /* 315 */
}
- SiS_Pr->SiS_MCLKData_1 = SiS310_MCLKData_1;
- SiS_Pr->SiS_VCLKData = SiS310_VCLKData;
- SiS_Pr->SiS_VBVCLKData = SiS310_VBVCLKData;
+#endif
+ SiS_Pr->SiS_MCLKData_1 = (SiS_MCLKDataStruct *)SiS310_MCLKData_1;
+#ifdef LINUXBIOS
+ SiS_Pr->SiS_ECLKData = (SiS_ECLKDataStruct *)SiS310_ECLKData;
+#endif
+ SiS_Pr->SiS_VCLKData = (SiS_VCLKDataStruct *)SiS310_VCLKData;
+ SiS_Pr->SiS_VBVCLKData = (SiS_VBVCLKDataStruct *)SiS310_VBVCLKData;
+ SiS_Pr->SiS_ScreenOffset = SiS310_ScreenOffset;
SiS_Pr->SiS_SR15 = SiS310_SR15;
@@ -470,96 +511,128 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->pSiS_YCSenseData2 = &SiS310_YCSenseData2;
#endif
- SiS_Pr->SiS_PanelDelayTbl = SiS310_PanelDelayTbl;
- SiS_Pr->SiS_PanelDelayTblLVDS = SiS310_PanelDelayTblLVDS;
-
- SiS_Pr->SiS_St2LCD1024x768Data = SiS310_St2LCD1024x768Data;
- SiS_Pr->SiS_ExtLCD1024x768Data = SiS310_ExtLCD1024x768Data;
- SiS_Pr->SiS_St2LCD1280x1024Data = SiS310_St2LCD1280x1024Data;
- SiS_Pr->SiS_ExtLCD1280x1024Data = SiS310_ExtLCD1280x1024Data;
-
- SiS_Pr->SiS_CRT2Part2_1024x768_1 = SiS310_CRT2Part2_1024x768_1;
-
- SiS_Pr->SiS_PanelType00_1 = SiS310_PanelType00_1;
- SiS_Pr->SiS_PanelType01_1 = SiS310_PanelType01_1;
- SiS_Pr->SiS_PanelType02_1 = SiS310_PanelType02_1;
- SiS_Pr->SiS_PanelType03_1 = SiS310_PanelType03_1;
- SiS_Pr->SiS_PanelType04_1 = SiS310_PanelType04_1;
- SiS_Pr->SiS_PanelType05_1 = SiS310_PanelType05_1;
- SiS_Pr->SiS_PanelType06_1 = SiS310_PanelType06_1;
- SiS_Pr->SiS_PanelType07_1 = SiS310_PanelType07_1;
- SiS_Pr->SiS_PanelType08_1 = SiS310_PanelType08_1;
- SiS_Pr->SiS_PanelType09_1 = SiS310_PanelType09_1;
- SiS_Pr->SiS_PanelType0a_1 = SiS310_PanelType0a_1;
- SiS_Pr->SiS_PanelType0b_1 = SiS310_PanelType0b_1;
- SiS_Pr->SiS_PanelType0c_1 = SiS310_PanelType0c_1;
- SiS_Pr->SiS_PanelType0d_1 = SiS310_PanelType0d_1;
- SiS_Pr->SiS_PanelType0e_1 = SiS310_PanelType0e_1;
- SiS_Pr->SiS_PanelType0f_1 = SiS310_PanelType0f_1;
- SiS_Pr->SiS_PanelType00_2 = SiS310_PanelType00_2;
- SiS_Pr->SiS_PanelType01_2 = SiS310_PanelType01_2;
- SiS_Pr->SiS_PanelType02_2 = SiS310_PanelType02_2;
- SiS_Pr->SiS_PanelType03_2 = SiS310_PanelType03_2;
- SiS_Pr->SiS_PanelType04_2 = SiS310_PanelType04_2;
- SiS_Pr->SiS_PanelType05_2 = SiS310_PanelType05_2;
- SiS_Pr->SiS_PanelType06_2 = SiS310_PanelType06_2;
- SiS_Pr->SiS_PanelType07_2 = SiS310_PanelType07_2;
- SiS_Pr->SiS_PanelType08_2 = SiS310_PanelType08_2;
- SiS_Pr->SiS_PanelType09_2 = SiS310_PanelType09_2;
- SiS_Pr->SiS_PanelType0a_2 = SiS310_PanelType0a_2;
- SiS_Pr->SiS_PanelType0b_2 = SiS310_PanelType0b_2;
- SiS_Pr->SiS_PanelType0c_2 = SiS310_PanelType0c_2;
- SiS_Pr->SiS_PanelType0d_2 = SiS310_PanelType0d_2;
- SiS_Pr->SiS_PanelType0e_2 = SiS310_PanelType0e_2;
- SiS_Pr->SiS_PanelType0f_2 = SiS310_PanelType0f_2;
- SiS_Pr->SiS_PanelTypeNS_1 = SiS310_PanelTypeNS_1;
- SiS_Pr->SiS_PanelTypeNS_2 = SiS310_PanelTypeNS_2;
-
- SiS_Pr->SiS_CHTVUPALData = SiS310_CHTVUPALData;
- SiS_Pr->SiS_CHTVOPALData = SiS310_CHTVOPALData;
- SiS_Pr->SiS_CHTVUPALMData = SiS310_CHTVUPALMData;
- SiS_Pr->SiS_CHTVOPALMData = SiS310_CHTVOPALMData;
- SiS_Pr->SiS_CHTVUPALNData = SiS310_CHTVUPALNData;
- SiS_Pr->SiS_CHTVOPALNData = SiS310_CHTVOPALNData;
- SiS_Pr->SiS_CHTVSOPALData = SiS310_CHTVSOPALData;
-
- SiS_Pr->SiS_LVDSCRT1800x600_1 = SiS310_LVDSCRT1800x600_1;
- SiS_Pr->SiS_LVDSCRT11024x768_1 = SiS310_LVDSCRT11024x768_1;
- SiS_Pr->SiS_LVDSCRT11280x1024_1 = SiS310_LVDSCRT11280x1024_1;
- SiS_Pr->SiS_LVDSCRT11400x1050_1 = SiS310_LVDSCRT11400x1050_1;
- SiS_Pr->SiS_LVDSCRT11600x1200_1 = SiS310_LVDSCRT11600x1200_1;
- SiS_Pr->SiS_LVDSCRT1800x600_1_H = SiS310_LVDSCRT1800x600_1_H;
- SiS_Pr->SiS_LVDSCRT11024x768_1_H = SiS310_LVDSCRT11024x768_1_H;
- SiS_Pr->SiS_LVDSCRT11280x1024_1_H = SiS310_LVDSCRT11280x1024_1_H;
- SiS_Pr->SiS_LVDSCRT11400x1050_1_H = SiS310_LVDSCRT11400x1050_1_H;
- SiS_Pr->SiS_LVDSCRT11600x1200_1_H = SiS310_LVDSCRT11600x1200_1_H;
- SiS_Pr->SiS_LVDSCRT1800x600_2 = SiS310_LVDSCRT1800x600_2;
- SiS_Pr->SiS_LVDSCRT11024x768_2 = SiS310_LVDSCRT11024x768_2;
- SiS_Pr->SiS_LVDSCRT11280x1024_2 = SiS310_LVDSCRT11280x1024_2;
- SiS_Pr->SiS_LVDSCRT11400x1050_2 = SiS310_LVDSCRT11400x1050_2;
- SiS_Pr->SiS_LVDSCRT11600x1200_2 = SiS310_LVDSCRT11600x1200_2;
- SiS_Pr->SiS_LVDSCRT1800x600_2_H = SiS310_LVDSCRT1800x600_2_H;
- SiS_Pr->SiS_LVDSCRT11024x768_2_H = SiS310_LVDSCRT11024x768_2_H;
- SiS_Pr->SiS_LVDSCRT11280x1024_2_H = SiS310_LVDSCRT11280x1024_2_H;
- SiS_Pr->SiS_LVDSCRT11400x1050_2_H = SiS310_LVDSCRT11400x1050_2_H;
- SiS_Pr->SiS_LVDSCRT11600x1200_2_H = SiS310_LVDSCRT11600x1200_2_H;
- SiS_Pr->SiS_LVDSCRT1XXXxXXX_1 = SiS310_LVDSCRT1XXXxXXX_1;
- SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H = SiS310_LVDSCRT1XXXxXXX_1_H;
- SiS_Pr->SiS_CHTVCRT1UNTSC = SiS310_CHTVCRT1UNTSC;
- SiS_Pr->SiS_CHTVCRT1ONTSC = SiS310_CHTVCRT1ONTSC;
- SiS_Pr->SiS_CHTVCRT1UPAL = SiS310_CHTVCRT1UPAL;
- SiS_Pr->SiS_CHTVCRT1OPAL = SiS310_CHTVCRT1OPAL;
- SiS_Pr->SiS_CHTVCRT1SOPAL = SiS310_CHTVCRT1OPAL;
-
- SiS_Pr->SiS_CHTVReg_UNTSC = SiS310_CHTVReg_UNTSC;
- SiS_Pr->SiS_CHTVReg_ONTSC = SiS310_CHTVReg_ONTSC;
- SiS_Pr->SiS_CHTVReg_UPAL = SiS310_CHTVReg_UPAL;
- SiS_Pr->SiS_CHTVReg_OPAL = SiS310_CHTVReg_OPAL;
- SiS_Pr->SiS_CHTVReg_UPALM = SiS310_CHTVReg_UPALM;
- SiS_Pr->SiS_CHTVReg_OPALM = SiS310_CHTVReg_OPALM;
- SiS_Pr->SiS_CHTVReg_UPALN = SiS310_CHTVReg_UPALN;
- SiS_Pr->SiS_CHTVReg_OPALN = SiS310_CHTVReg_OPALN;
- SiS_Pr->SiS_CHTVReg_SOPAL = SiS310_CHTVReg_OPAL;
+ SiS_Pr->SiS_StLCD1024x768Data = (SiS_LCDDataStruct *)SiS310_StLCD1024x768Data;
+ SiS_Pr->SiS_ExtLCD1024x768Data = (SiS_LCDDataStruct *)SiS310_ExtLCD1024x768Data;
+ SiS_Pr->SiS_St2LCD1024x768Data = (SiS_LCDDataStruct *)SiS310_St2LCD1024x768Data;
+ SiS_Pr->SiS_StLCD1280x1024Data = (SiS_LCDDataStruct *)SiS310_StLCD1280x1024Data;
+ SiS_Pr->SiS_ExtLCD1280x1024Data = (SiS_LCDDataStruct *)SiS310_ExtLCD1280x1024Data;
+ SiS_Pr->SiS_St2LCD1280x1024Data = (SiS_LCDDataStruct *)SiS310_St2LCD1280x1024Data;
+ SiS_Pr->SiS_NoScaleData1024x768 = (SiS_LCDDataStruct *)SiS310_NoScaleData1024x768;
+ SiS_Pr->SiS_NoScaleData1280x1024 = (SiS_LCDDataStruct *)SiS310_NoScaleData1280x1024;
+
+ SiS_Pr->SiS_PanelDelayTbl = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTbl;
+ SiS_Pr->SiS_PanelDelayTblLVDS = (SiS_PanelDelayTblStruct *)SiS310_PanelDelayTblLVDS;
+
+ SiS_Pr->SiS_CHTVUPALData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALData;
+ SiS_Pr->SiS_CHTVOPALData = (SiS_LVDSDataStruct *)SiS310_CHTVOPALData;
+ SiS_Pr->SiS_CHTVUPALMData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALMData;
+ SiS_Pr->SiS_CHTVOPALMData = (SiS_LVDSDataStruct *)SiS310_CHTVOPALMData;
+ SiS_Pr->SiS_CHTVUPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVUPALNData;
+ SiS_Pr->SiS_CHTVOPALNData = (SiS_LVDSDataStruct *)SiS310_CHTVOPALNData;
+ SiS_Pr->SiS_CHTVSOPALData = (SiS_LVDSDataStruct *)SiS310_CHTVSOPALData;
+
+ SiS_Pr->SiS_PanelType00_1 = (SiS_LVDSDesStruct *)SiS310_PanelType00_1;
+ SiS_Pr->SiS_PanelType01_1 = (SiS_LVDSDesStruct *)SiS310_PanelType01_1;
+ SiS_Pr->SiS_PanelType02_1 = (SiS_LVDSDesStruct *)SiS310_PanelType02_1;
+ SiS_Pr->SiS_PanelType03_1 = (SiS_LVDSDesStruct *)SiS310_PanelType03_1;
+ SiS_Pr->SiS_PanelType04_1 = (SiS_LVDSDesStruct *)SiS310_PanelType04_1;
+ SiS_Pr->SiS_PanelType05_1 = (SiS_LVDSDesStruct *)SiS310_PanelType05_1;
+ SiS_Pr->SiS_PanelType06_1 = (SiS_LVDSDesStruct *)SiS310_PanelType06_1;
+ SiS_Pr->SiS_PanelType07_1 = (SiS_LVDSDesStruct *)SiS310_PanelType07_1;
+ SiS_Pr->SiS_PanelType08_1 = (SiS_LVDSDesStruct *)SiS310_PanelType08_1;
+ SiS_Pr->SiS_PanelType09_1 = (SiS_LVDSDesStruct *)SiS310_PanelType09_1;
+ SiS_Pr->SiS_PanelType0a_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0a_1;
+ SiS_Pr->SiS_PanelType0b_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0b_1;
+ SiS_Pr->SiS_PanelType0c_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0c_1;
+ SiS_Pr->SiS_PanelType0d_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_1;
+ SiS_Pr->SiS_PanelType0e_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_1;
+ SiS_Pr->SiS_PanelType0f_1 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_1;
+ SiS_Pr->SiS_PanelType00_2 = (SiS_LVDSDesStruct *)SiS310_PanelType00_2;
+ SiS_Pr->SiS_PanelType01_2 = (SiS_LVDSDesStruct *)SiS310_PanelType01_2;
+ SiS_Pr->SiS_PanelType02_2 = (SiS_LVDSDesStruct *)SiS310_PanelType02_2;
+ SiS_Pr->SiS_PanelType03_2 = (SiS_LVDSDesStruct *)SiS310_PanelType03_2;
+ SiS_Pr->SiS_PanelType04_2 = (SiS_LVDSDesStruct *)SiS310_PanelType04_2;
+ SiS_Pr->SiS_PanelType05_2 = (SiS_LVDSDesStruct *)SiS310_PanelType05_2;
+ SiS_Pr->SiS_PanelType06_2 = (SiS_LVDSDesStruct *)SiS310_PanelType06_2;
+ SiS_Pr->SiS_PanelType07_2 = (SiS_LVDSDesStruct *)SiS310_PanelType07_2;
+ SiS_Pr->SiS_PanelType08_2 = (SiS_LVDSDesStruct *)SiS310_PanelType08_2;
+ SiS_Pr->SiS_PanelType09_2 = (SiS_LVDSDesStruct *)SiS310_PanelType09_2;
+ SiS_Pr->SiS_PanelType0a_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0a_2;
+ SiS_Pr->SiS_PanelType0b_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0b_2;
+ SiS_Pr->SiS_PanelType0c_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0c_2;
+ SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_2;
+ SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_2;
+ SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_2;
+
+ SiS_Pr->SiS_CRT2Part2_1024x768_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_1;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_1;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_1;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_1;
+ SiS_Pr->SiS_CRT2Part2_1024x768_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_2;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_2;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_2;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_2;
+ SiS_Pr->SiS_CRT2Part2_1024x768_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_3;
+ SiS_Pr->SiS_CRT2Part2_1280x1024_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_3;
+ SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_3;
+ SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_3;
+
+ SiS_Pr->SiS_LVDSCRT1800x600_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1;
+ SiS_Pr->SiS_LVDSCRT11024x768_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1;
+ SiS_Pr->SiS_LVDSCRT11280x1024_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1;
+ SiS_Pr->SiS_LVDSCRT11400x1050_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1;
+ SiS_Pr->SiS_LVDSCRT11600x1200_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1;
+ SiS_Pr->SiS_LVDSCRT1800x600_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1_H;
+ SiS_Pr->SiS_LVDSCRT11024x768_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1_H;
+ SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1_H;
+ SiS_Pr->SiS_LVDSCRT11400x1050_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1_H;
+ SiS_Pr->SiS_LVDSCRT11600x1200_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1_H;
+ SiS_Pr->SiS_LVDSCRT1800x600_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2;
+ SiS_Pr->SiS_LVDSCRT11024x768_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2;
+ SiS_Pr->SiS_LVDSCRT11280x1024_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2;
+ SiS_Pr->SiS_LVDSCRT11400x1050_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2;
+ SiS_Pr->SiS_LVDSCRT11600x1200_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2;
+ SiS_Pr->SiS_LVDSCRT1800x600_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2_H;
+ SiS_Pr->SiS_LVDSCRT11024x768_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2_H;
+ SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2_H;
+ SiS_Pr->SiS_LVDSCRT11400x1050_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2_H;
+ SiS_Pr->SiS_LVDSCRT11600x1200_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2_H;
+ SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC;
+ SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC;
+ SiS_Pr->SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL;
+ SiS_Pr->SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL;
+ SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL;
+
+ SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UNTSC;
+ SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_ONTSC;
+ SiS_Pr->SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPAL;
+ SiS_Pr->SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPAL;
+ SiS_Pr->SiS_CHTVReg_UPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALM;
+ SiS_Pr->SiS_CHTVReg_OPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALM;
+ SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALN;
+ SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALN;
+ SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_SOPAL;
+
+ SiS_Pr->SiS_LCDACRT1800x600_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1;
+ SiS_Pr->SiS_LCDACRT11024x768_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1;
+ SiS_Pr->SiS_LCDACRT11280x1024_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1;
+ SiS_Pr->SiS_LCDACRT11400x1050_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1;
+ SiS_Pr->SiS_LCDACRT11600x1200_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1;
+ SiS_Pr->SiS_LCDACRT1800x600_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1_H;
+ SiS_Pr->SiS_LCDACRT11024x768_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1_H;
+ SiS_Pr->SiS_LCDACRT11280x1024_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1_H;
+ SiS_Pr->SiS_LCDACRT11400x1050_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1_H;
+ SiS_Pr->SiS_LCDACRT11600x1200_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1_H;
+ SiS_Pr->SiS_LCDACRT1800x600_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2;
+ SiS_Pr->SiS_LCDACRT11024x768_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2;
+ SiS_Pr->SiS_LCDACRT11280x1024_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2;
+ SiS_Pr->SiS_LCDACRT11400x1050_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2;
+ SiS_Pr->SiS_LCDACRT11600x1200_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2;
+ SiS_Pr->SiS_LCDACRT1800x600_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2_H;
+ SiS_Pr->SiS_LCDACRT11024x768_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2_H;
+ SiS_Pr->SiS_LCDACRT11280x1024_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2_H;
+ SiS_Pr->SiS_LCDACRT11400x1050_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2_H;
+ SiS_Pr->SiS_LCDACRT11600x1200_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2_H;
SiS_Pr->SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC;
SiS_Pr->SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC;
@@ -568,679 +641,67 @@ InitTo310Pointer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Pr->SiS_CHTVVCLKUPALM = SiS310_CHTVVCLKUPALM;
SiS_Pr->SiS_CHTVVCLKOPALM = SiS310_CHTVVCLKOPALM;
SiS_Pr->SiS_CHTVVCLKUPALN = SiS310_CHTVVCLKUPALN;
- SiS_Pr->SiS_CHTVVCLKOPALN = SiS310_CHTVVCLKOPALN;
- SiS_Pr->SiS_CHTVVCLKSOPAL = SiS310_CHTVVCLKOPAL;
+ SiS_Pr->SiS_CHTVVCLKOPALN = SiS310_CHTVVCLKOPALN;
+ SiS_Pr->SiS_CHTVVCLKSOPAL = SiS310_CHTVVCLKSOPAL;
+
+ SiS_Pr->SiS_Panel320x480 = Panel_320x480;
+ SiS_Pr->SiS_Panel640x480 = Panel_640x480;
+ SiS_Pr->SiS_Panel800x600 = Panel_800x600;
+ SiS_Pr->SiS_Panel1024x768 = Panel_1024x768;
+ SiS_Pr->SiS_Panel1280x1024 = Panel_1280x1024;
+ SiS_Pr->SiS_Panel1280x960 = Panel_1280x960;
+ SiS_Pr->SiS_Panel1600x1200 = Panel_1600x1200;
+ SiS_Pr->SiS_Panel1400x1050 = Panel_1400x1050;
+ SiS_Pr->SiS_Panel1152x768 = Panel_1152x768;
+ SiS_Pr->SiS_Panel1152x864 = Panel_1152x864;
+ SiS_Pr->SiS_Panel1280x768 = Panel_1280x768;
+ SiS_Pr->SiS_Panel1024x600 = Panel_1024x600;
+ SiS_Pr->SiS_Panel640x480_2 = Panel_640x480_2;
+ SiS_Pr->SiS_Panel640x480_3 = Panel_640x480_3;
+ SiS_Pr->SiS_PanelMax = Panel_320x480; /* TW: highest value */
+ SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* TW: lowest value LVDS/LCDA */
+ SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* TW: lowest value 301 */
+ SiS_Pr->SiS_PanelCustom = Panel_Custom;
+ SiS_Pr->SiS_PanelBarco1366 = 255;
}
#endif
-static void
-SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- switch(HwInfo->jChipType) {
#ifdef SIS315H
- case SIS_315H:
- case SIS_315:
- case SIS_315PRO:
- case SIS_550:
- case SIS_650:
- case SIS_740:
- case SIS_330:
- case SIS_661:
- case SIS_741:
- case SIS_660:
- case SIS_760:
- InitTo310Pointer(SiS_Pr, HwInfo);
- break;
-#endif
-#ifdef SIS300
- case SIS_300:
- case SIS_540:
- case SIS_630:
- case SIS_730:
- InitTo300Pointer(SiS_Pr, HwInfo);
- break;
-#endif
- default:
- break;
- }
-}
-
-/*********************************************/
-/* HELPER: Get ModeID */
-/*********************************************/
-
-USHORT
-SiS_GetModeID(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay,
- int Depth, BOOLEAN FSTN, int LCDwidth, int LCDheight)
-{
- USHORT ModeIndex = 0;
-
- switch(HDisplay)
- {
- case 320:
- if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth];
- else if(VDisplay == 240) {
- if(FSTN) ModeIndex = ModeIndex_320x240_FSTN[Depth];
- else ModeIndex = ModeIndex_320x240[Depth];
- }
- break;
- case 400:
- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
- break;
- case 512:
- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth];
- break;
- case 720:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 480) ModeIndex = ModeIndex_720x480[Depth];
- else if(VDisplay == 576) ModeIndex = ModeIndex_720x576[Depth];
- }
- break;
- case 768:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 576) ModeIndex = ModeIndex_768x576[Depth];
- }
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- else if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 480) ModeIndex = ModeIndex_800x480[Depth];
- }
- break;
- case 848:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 480) ModeIndex = ModeIndex_848x480[Depth];
- }
- break;
- case 856:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth];
- }
- break;
- case 1024:
- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth];
- else if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth];
- else if(VGAEngine == SIS_300_VGA) {
- if(VDisplay == 600) ModeIndex = ModeIndex_1024x600[Depth];
- }
- }
- break;
- case 1152:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 864) ModeIndex = ModeIndex_1152x864[Depth];
- else if(VGAEngine == SIS_300_VGA) {
- if(VDisplay == 768) ModeIndex = ModeIndex_1152x768[Depth];
- }
- }
- break;
- case 1280:
- if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth];
- else if(VDisplay == 800) {
- if(VGAEngine == SIS_315_VGA) {
- if((VBFlags & CRT1_LCDA) && (LCDwidth == 1280) && (LCDheight == 800)) {
- ModeIndex = ModeIndex_1280x800[Depth];
- } else if(!(VBFlags & CRT1_LCDA)) {
- ModeIndex = ModeIndex_1280x800[Depth];
- }
- }
- } else if(VDisplay == 720) {
- if((VBFlags & CRT1_LCDA) && (LCDwidth == 1280) && (LCDheight == 720)) {
- ModeIndex = ModeIndex_1280x720[Depth];
- } else if(!(VBFlags & CRT1_LCDA)) {
- ModeIndex = ModeIndex_1280x720[Depth];
- }
- } else if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 960) ModeIndex = ModeIndex_1280x960[Depth];
- else if(VDisplay == 768) {
- if(VGAEngine == SIS_300_VGA) {
- ModeIndex = ModeIndex_300_1280x768[Depth];
- } else {
- ModeIndex = ModeIndex_310_1280x768[Depth];
- }
- }
- }
- break;
- case 1360:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 768) ModeIndex = ModeIndex_1360x768[Depth];
- else if(VGAEngine == SIS_300_VGA) {
- if(VDisplay == 1024) ModeIndex = ModeIndex_300_1360x1024[Depth];
- }
- }
- break;
- case 1400:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 1050) {
- if((VBFlags & CRT1_LCDA) &&
- (((LCDwidth == 1400) && (LCDheight == 1050)) ||
- ((LCDwidth == 1600) && (LCDheight == 1200)))) {
- ModeIndex = ModeIndex_1400x1050[Depth];
- } else if(!(VBFlags & CRT1_LCDA)) {
- ModeIndex = ModeIndex_1400x1050[Depth];
- }
- }
- }
- break;
- case 1600:
- if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth];
- break;
- case 1680:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 1050) ModeIndex = ModeIndex_1680x1050[Depth];
- }
- break;
- case 1920:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 1440) ModeIndex = ModeIndex_1920x1440[Depth];
- }
- break;
- case 2048:
- if(!(VBFlags & CRT1_LCDA)) {
- if(VDisplay == 1536) {
- if(VGAEngine == SIS_300_VGA) {
- ModeIndex = ModeIndex_300_2048x1536[Depth];
- } else {
- ModeIndex = ModeIndex_310_2048x1536[Depth];
- }
- }
- }
- break;
- }
-
- return(ModeIndex);
-}
-
-USHORT
-SiS_GetModeID_LCD(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay,
- int Depth, BOOLEAN FSTN, USHORT CustomT, int LCDwidth, int LCDheight)
-{
- USHORT ModeIndex = 0;
-
- if(VBFlags & (VB_LVDS | VB_30xBDH)) {
-
- switch(HDisplay)
- {
- case 320:
- if(CustomT != CUT_PANEL848) {
- if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth];
- else if(VDisplay == 240) {
- if(!FSTN) ModeIndex = ModeIndex_320x240[Depth];
- else if(VGAEngine == SIS_315_VGA) {
- ModeIndex = ModeIndex_320x240_FSTN[Depth];
- }
- }
- }
- break;
- case 400:
- if(CustomT != CUT_PANEL848) {
- if(!((VGAEngine == SIS_300_VGA) && (VBFlags & VB_TRUMPION))) {
- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
- }
- }
- break;
- case 512:
- if(CustomT != CUT_PANEL848) {
- if(!((VGAEngine == SIS_300_VGA) && (VBFlags & VB_TRUMPION))) {
- if(LCDwidth != 1024 || LCDheight != 600) {
- if(VDisplay == 384) {
- ModeIndex = ModeIndex_512x384[Depth];
- }
- }
- }
- }
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) {
- if(CustomT != CUT_PANEL848) ModeIndex = ModeIndex_640x400[Depth];
- }
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- break;
- case 848:
- if(CustomT == CUT_PANEL848) {
- if(VDisplay == 480) ModeIndex = ModeIndex_848x480[Depth];
- }
- break;
- case 1024:
- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth];
- else if(VGAEngine == SIS_300_VGA) {
- if((VDisplay == 600) && (LCDheight == 600)) {
- ModeIndex = ModeIndex_1024x600[Depth];
- }
- }
- break;
- case 1152:
- if(VGAEngine == SIS_300_VGA) {
- if((VDisplay == 768) && (LCDheight == 768)) {
- ModeIndex = ModeIndex_1152x768[Depth];
- }
- }
- break;
- case 1280:
- if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth];
- else if(VGAEngine == SIS_315_VGA) {
- if((VDisplay == 768) && (LCDheight == 768)) {
- ModeIndex = ModeIndex_310_1280x768[Depth];
- }
- if((VDisplay == 800) && (LCDheight == 800)) {
- ModeIndex = ModeIndex_310_1280x768[Depth];
- }
- }
- break;
- case 1360:
- if(VGAEngine == SIS_300_VGA) {
- if(CustomT == CUT_BARCO1366) {
- if(VDisplay == 1024) ModeIndex = ModeIndex_300_1360x1024[Depth];
- }
- }
- if(CustomT == CUT_PANEL848) {
- if(VDisplay == 768) ModeIndex = ModeIndex_1360x768[Depth];
- }
- break;
- case 1400:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 1050) ModeIndex = ModeIndex_1400x1050[Depth];
- }
- break;
- case 1600:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth];
- }
- break;
- }
-
- } else if(VBFlags & VB_SISBRIDGE) {
-
- switch(HDisplay)
- {
- case 320:
- if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth];
- else if(VDisplay == 240) ModeIndex = ModeIndex_320x240[Depth];
- break;
- case 400:
- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
- break;
- case 512:
- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth];
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- break;
- case 1024:
- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth];
- break;
- case 1280:
- if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth];
- else if(VDisplay == 768) {
- if((LCDheight == 768) || (LCDwidth == 1680) ||
- ((LCDheight == 1024) && (VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)))) {
- if(VGAEngine == SIS_300_VGA) {
- ModeIndex = ModeIndex_300_1280x768[Depth];
- } else {
- ModeIndex = ModeIndex_310_1280x768[Depth];
- }
- }
- } else if(VDisplay == 960) {
- if((LCDheight == 960) ||
- ((LCDheight == 1024) && (VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)))) {
- ModeIndex = ModeIndex_1280x960[Depth];
- }
- } else if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 800) {
- if((LCDheight == 800) || (LCDwidth == 1680) ||
- ((LCDheight == 1024) && (VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)))) {
- ModeIndex = ModeIndex_1280x800[Depth];
- }
- } else if(VDisplay == 720) {
- if((LCDheight == 720) || (LCDwidth == 1680) ||
- ((LCDheight == 1024) && (VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)))) {
- ModeIndex = ModeIndex_1280x720[Depth];
- }
- }
- }
- break;
- case 1400:
- if(VGAEngine == SIS_315_VGA) {
- if(VBFlags & (VB_301B | VB_301C | VB_302B | VB_302LV | VB_302ELV)) {
- if((LCDwidth == 1400) || (LCDwidth == 1600) || (LCDwidth == 1680)) {
- ModeIndex = ModeIndex_1400x1050[Depth];
- }
- }
- }
- break;
- case 1600:
- if(VGAEngine == SIS_315_VGA) {
- if(VBFlags & (VB_301C | VB_302B | VB_302LV | VB_302ELV)) {
- if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth];
- }
- }
- break;
- case 1680:
- if(VGAEngine == SIS_315_VGA) {
- if(VBFlags & (VB_301C | VB_302B | VB_302LV | VB_302ELV)) {
- if(VDisplay == 1050) ModeIndex = ModeIndex_1680x1050[Depth];
- }
- }
- break;
- }
- }
-
- return ModeIndex;
-}
-
-USHORT
-SiS_GetModeID_TV(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth)
-{
- USHORT ModeIndex = 0;
-
- if(VBFlags & VB_CHRONTEL) {
-
- switch(HDisplay)
- {
- case 512:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
- }
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth];
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- break;
- case 1024:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth];
- }
- break;
- }
-
- } else if(VBFlags & VB_SISTVBRIDGE) {
-
- switch(HDisplay)
- {
- case 320:
- if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth];
- else if(VDisplay == 240) ModeIndex = ModeIndex_320x240[Depth];
- break;
- case 400:
- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
- break;
- case 512:
- if( ((VBFlags & TV_YPBPR) && (VBFlags & (TV_YPBPR750P | TV_YPBPR1080I))) ||
- (VBFlags & TV_HIVISION) ||
- ((!(VBFlags & (TV_YPBPR | TV_PALM))) && (VBFlags & TV_PAL)) ) {
- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
- }
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth];
- break;
- case 720:
- if((!(VBFlags & TV_HIVISION)) && (!((VBFlags & TV_YPBPR) && (VBFlags & TV_YPBPR1080I)))) {
- if(VDisplay == 480) {
- if((VBFlags & TV_YPBPR) || (VBFlags & (TV_NTSC | TV_PALM)))
- ModeIndex = ModeIndex_720x480[Depth];
- } else if(VDisplay == 576) {
- if((!(VBFlags & (TV_YPBPR | TV_PALM))) && (VBFlags & TV_PAL))
- ModeIndex = ModeIndex_720x576[Depth];
- }
- }
- break;
- case 768:
- if((!(VBFlags & TV_HIVISION)) && (!((VBFlags & TV_YPBPR) && (VBFlags & TV_YPBPR1080I)))) {
- if((!(VBFlags & (TV_YPBPR | TV_PALM))) && (VBFlags & TV_PAL)) {
- if(VDisplay == 576) ModeIndex = ModeIndex_768x576[Depth];
- }
- }
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- else if(VDisplay == 480) {
- if((VBFlags & TV_HIVISION) || ((VBFlags & TV_YPBPR) && (VBFlags & TV_YPBPR1080I))) {
- ModeIndex = ModeIndex_800x480[Depth];
- }
- }
- break;
- case 1024:
- if(VDisplay == 768) {
- if(VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV)) {
- ModeIndex = ModeIndex_1024x768[Depth];
- }
- } else if(VDisplay == 576) {
- if((VBFlags & TV_HIVISION) || ((VBFlags & TV_YPBPR) && (VBFlags & TV_YPBPR1080I))) {
- ModeIndex = ModeIndex_1024x576[Depth];
- }
- }
- break;
- case 1280:
- if(VDisplay == 720) {
- if((VBFlags & TV_HIVISION) ||
- ((VBFlags & TV_YPBPR) && (VBFlags & (TV_YPBPR1080I | TV_YPBPR750P)))) {
- ModeIndex = ModeIndex_1280x720[Depth];
- }
- } else if(VDisplay == 1024) {
- if((VBFlags & TV_HIVISION) ||
- ((VBFlags & TV_YPBPR) && (VBFlags & TV_YPBPR1080I))) {
- ModeIndex = ModeIndex_1280x1024[Depth];
- }
- }
- break;
- }
- }
- return ModeIndex;
-}
-
-USHORT
-SiS_GetModeID_VGA2(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth)
-{
- USHORT ModeIndex = 0;
-
- if(!(VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0;
-
- switch(HDisplay)
- {
- case 320:
- if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth];
- else if(VDisplay == 240) ModeIndex = ModeIndex_320x240[Depth];
- break;
- case 400:
- if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth];
- break;
- case 512:
- if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth];
- break;
- case 640:
- if(VDisplay == 480) ModeIndex = ModeIndex_640x480[Depth];
- else if(VDisplay == 400) ModeIndex = ModeIndex_640x400[Depth];
- break;
- case 720:
- if(VDisplay == 480) ModeIndex = ModeIndex_720x480[Depth];
- else if(VDisplay == 576) ModeIndex = ModeIndex_720x576[Depth];
- break;
- case 768:
- if(VDisplay == 576) ModeIndex = ModeIndex_768x576[Depth];
- break;
- case 800:
- if(VDisplay == 600) ModeIndex = ModeIndex_800x600[Depth];
- else if(VDisplay == 480) ModeIndex = ModeIndex_800x480[Depth];
- break;
- case 848:
- if(VDisplay == 480) ModeIndex = ModeIndex_848x480[Depth];
- break;
- case 856:
- if(VDisplay == 480) ModeIndex = ModeIndex_856x480[Depth];
- break;
- case 1024:
- if(VDisplay == 768) ModeIndex = ModeIndex_1024x768[Depth];
- else if(VDisplay == 576) ModeIndex = ModeIndex_1024x576[Depth];
- break;
- case 1152:
- if(VDisplay == 864) ModeIndex = ModeIndex_1152x864[Depth];
- else if(VGAEngine == SIS_300_VGA) {
- if(VDisplay == 768) ModeIndex = ModeIndex_1152x768[Depth];
- }
- break;
- case 1280:
- if(VDisplay == 768) {
- if(VGAEngine == SIS_300_VGA) {
- ModeIndex = ModeIndex_300_1280x768[Depth];
- } else {
- ModeIndex = ModeIndex_310_1280x768[Depth];
- }
- } else if(VDisplay == 1024) ModeIndex = ModeIndex_1280x1024[Depth];
- else if(VDisplay == 720) ModeIndex = ModeIndex_1280x720[Depth];
- else if(VDisplay == 800) ModeIndex = ModeIndex_1280x800[Depth];
- else if(VDisplay == 960) ModeIndex = ModeIndex_1280x960[Depth];
- break;
- case 1360:
- if(VDisplay == 768) ModeIndex = ModeIndex_1360x768[Depth];
- break;
- case 1400:
- if(VGAEngine == SIS_315_VGA) {
- if(VDisplay == 1050) ModeIndex = ModeIndex_1400x1050[Depth];
- }
- break;
- case 1600:
- if(VGAEngine == SIS_315_VGA) {
- if(VBFlags & (VB_301B|VB_301C|VB_302B)) {
- if(VDisplay == 1200) ModeIndex = ModeIndex_1600x1200[Depth];
- }
- }
- break;
- case 1680:
- if(VGAEngine == SIS_315_VGA) {
- if(VBFlags & (VB_301B|VB_301C|VB_302B)) {
- if(VDisplay == 1050) ModeIndex = ModeIndex_1680x1050[Depth];
- }
- }
- break;
- }
-
- return ModeIndex;
-}
-
-
-/*********************************************/
-/* HELPER: SetReg, GetReg */
-/*********************************************/
-
-void
-SiS_SetReg(SISIOADDRESS port, USHORT index, USHORT data)
-{
- OutPortByte(port,index);
- OutPortByte(port + 1,data);
-}
-
-void
-SiS_SetRegByte(SISIOADDRESS port, USHORT data)
-{
- OutPortByte(port,data);
-}
-
-void
-SiS_SetRegShort(SISIOADDRESS port, USHORT data)
-{
- OutPortWord(port,data);
-}
-
-void
-SiS_SetRegLong(SISIOADDRESS port, ULONG data)
-{
- OutPortLong(port,data);
-}
-
-UCHAR
-SiS_GetReg(SISIOADDRESS port, USHORT index)
-{
- OutPortByte(port,index);
- return(InPortByte(port + 1));
-}
-
UCHAR
-SiS_GetRegByte(SISIOADDRESS port)
-{
- return(InPortByte(port));
-}
-
-USHORT
-SiS_GetRegShort(SISIOADDRESS port)
+SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- return(InPortWord(port));
-}
-
-ULONG
-SiS_GetRegLong(SISIOADDRESS port)
-{
- return(InPortLong(port));
-}
-
-void
-SiS_SetRegANDOR(SISIOADDRESS Port,USHORT Index,USHORT DataAND,USHORT DataOR)
-{
- USHORT temp;
-
- temp = SiS_GetReg(Port,Index);
- temp = (temp & (DataAND)) | DataOR;
- SiS_SetReg(Port,Index,temp);
-}
-
-void
-SiS_SetRegAND(SISIOADDRESS Port,USHORT Index,USHORT DataAND)
-{
- USHORT temp;
-
- temp = SiS_GetReg(Port,Index);
- temp &= DataAND;
- SiS_SetReg(Port,Index,temp);
-}
-
-void
-SiS_SetRegOR(SISIOADDRESS Port,USHORT Index,USHORT DataOR)
-{
- USHORT temp;
-
- temp = SiS_GetReg(Port,Index);
- temp |= DataOR;
- SiS_SetReg(Port,Index,temp);
-}
-
-/*********************************************/
-/* HELPER: DisplayOn, DisplayOff */
-/*********************************************/
+ UCHAR data, temp;
-void
-SiS_DisplayOn(SiS_Private *SiS_Pr)
-{
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x01,0xDF);
-}
+ if(*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) {
+ data = *SiS_Pr->pSiS_SoftSetting & 0x03;
+ } else {
+ if(IS_SIS550650740660) {
+ data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07;
+ } else { /* TW: 315, 330 */
+ data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3a) & 0x03;
+ if(HwDeviceExtension->jChipType == SIS_330) {
+ if(data > 1) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0x30;
+ switch(temp) {
+ case 0x00: data = 1; break;
+ case 0x10: data = 3; break;
+ case 0x20: data = 3; break;
+ case 0x30: data = 2; break;
+ }
+ } else {
+ data = 0;
+ }
+ }
+ }
+ }
-void
-SiS_DisplayOff(SiS_Private *SiS_Pr)
-{
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x20);
+ return data;
}
+#endif
+/* ----------------------------------------- */
-/*********************************************/
-/* HELPER: Init Port Addresses */
-/*********************************************/
-
-void
-SiSRegInit(SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr)
+void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr)
{
SiS_Pr->SiS_P3c4 = BaseAddr + 0x14;
SiS_Pr->SiS_P3d4 = BaseAddr + 0x24;
@@ -1265,75 +726,10 @@ SiSRegInit(SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr)
SiS_Pr->SiS_VidPlay = BaseAddr + SIS_VIDEO_PLAYBACK;
}
-/*********************************************/
-/* HELPER: GetSysFlags */
-/*********************************************/
-
-static void
-SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- unsigned char cr5f, temp1, temp2;
-
- /* 661 and newer: NEVER write non-zero to SR11[7:4] */
- /* (SR11 is used for DDC and in enable/disablebridge) */
- SiS_Pr->SiS_SensibleSR11 = FALSE;
- SiS_Pr->SiS_MyCR63 = 0x63;
- if(HwInfo->jChipType >= SIS_661) {
- SiS_Pr->SiS_SensibleSR11 = TRUE;
- SiS_Pr->SiS_MyCR63 = 0x53;
- }
-
- /* You should use the macros, not these flags directly */
-
- SiS_Pr->SiS_SysFlags = 0;
- if(HwInfo->jChipType == SIS_650) {
- cr5f = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x5c,0x07);
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x5c,0xf8);
- temp2 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
- if((!temp1) || (temp2)) {
- switch(cr5f) {
- case 0x80:
- case 0x90:
- case 0xc0:
- SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
- case 0xa0:
- case 0xb0:
- case 0xe0:
- SiS_Pr->SiS_SysFlags |= SF_Is651; break;
- }
- } else {
- switch(cr5f) {
- case 0x90:
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
- switch(temp1) {
- case 0x00: SiS_Pr->SiS_SysFlags |= SF_IsM652; break;
- case 0x40: SiS_Pr->SiS_SysFlags |= SF_IsM653; break;
- default: SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
- }
- break;
- case 0xb0:
- SiS_Pr->SiS_SysFlags |= SF_Is652; break;
- default:
- SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
- }
- }
- }
- if(HwInfo->jChipType == SIS_760) {
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x78);
- if(temp1 & 0x30) SiS_Pr->SiS_SysFlags |= SF_760UMA;
- }
-}
-
-/*********************************************/
-/* HELPER: Init PCI & Engines */
-/*********************************************/
-
-static void
-SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- switch(HwInfo->jChipType) {
+ switch(HwDeviceExtension->jChipType) {
case SIS_300:
case SIS_540:
case SIS_630:
@@ -1342,7 +738,7 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
* - RELOCATED VGA IO (0x20)
* - MMIO ENABLE (0x1)
*/
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x20,0xa1);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1);
/* - Enable 2D (0x40)
* - Enable 3D (0x02)
* - Enable 3D Vertex command fetch (0x10) ?
@@ -1356,11 +752,9 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
case SIS_650:
case SIS_740:
case SIS_330:
- case SIS_661:
- case SIS_741:
case SIS_660:
case SIS_760:
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x20,0xa1);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1);
/* - Enable 2D (0x40)
* - Enable 3D (0x02)
* - Enable 3D vertex command fetch (0x10)
@@ -1370,7 +764,7 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0xDA);
break;
case SIS_550:
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x20,0xa1);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1);
/* No 3D engine ! */
/* - Enable 2D (0x40)
*/
@@ -1378,37 +772,41 @@ SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
-/*********************************************/
-/* HELPER: SetLVDSetc */
-/*********************************************/
-
void
-SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo)
{
ULONG temp;
SiS_Pr->SiS_IF_DEF_LVDS = 0;
SiS_Pr->SiS_IF_DEF_TRUMPION = 0;
SiS_Pr->SiS_IF_DEF_CH70xx = 0;
+ SiS_Pr->SiS_IF_DEF_HiVision = 0;
SiS_Pr->SiS_IF_DEF_DSTN = 0;
SiS_Pr->SiS_IF_DEF_FSTN = 0;
- SiS_Pr->SiS_IF_DEF_CONEX = 0;
SiS_Pr->SiS_ChrontelInit = 0;
- /* Check for SiS30x first */
- temp = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);
- if((temp == 1) || (temp == 2)) return;
+#if 0
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((ModeNo == 0x5a) || (ModeNo == 0x5b)) {
+ SiS_Pr->SiS_IF_DEF_DSTN = 1; /* for 550 dstn */
+ SiS_Pr->SiS_IF_DEF_FSTN = 1; /* for fstn */
+ }
+ }
+#endif
- switch(HwInfo->jChipType) {
+ switch(HwDeviceExtension->jChipType) {
#ifdef SIS300
case SIS_540:
case SIS_630:
case SIS_730:
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
+ /* Check for SiS30x first */
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00);
+ if((temp == 1) || (temp == 2)) return;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
temp = (temp & 0x0E) >> 1;
- if((temp >= 2) && (temp <= 5)) SiS_Pr->SiS_IF_DEF_LVDS = 1;
- if(temp == 3) SiS_Pr->SiS_IF_DEF_TRUMPION = 1;
+ if((temp >= 2) && (temp <= 5)) SiS_Pr->SiS_IF_DEF_LVDS = 1;
+ if(temp == 3) SiS_Pr->SiS_IF_DEF_TRUMPION = 1;
if((temp == 4) || (temp == 5)) {
/* Save power status (and error check) - UNUSED */
SiS_Pr->SiS_Backup70xx = SiS_GetCH700x(SiS_Pr, 0x0e);
@@ -1421,20 +819,12 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
case SIS_650:
case SIS_740:
case SIS_330:
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
- temp = (temp & 0x0E) >> 1;
- if((temp >= 2) && (temp <= 3)) SiS_Pr->SiS_IF_DEF_LVDS = 1;
- if(temp == 3) SiS_Pr->SiS_IF_DEF_CH70xx = 2;
- break;
- case SIS_661:
- case SIS_741:
case SIS_660:
case SIS_760:
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- temp = (temp & 0xe0) >> 5;
- if((temp >= 2) && (temp <= 3)) SiS_Pr->SiS_IF_DEF_LVDS = 1;
- if(temp == 3) SiS_Pr->SiS_IF_DEF_CH70xx = 2;
- if(temp == 4) SiS_Pr->SiS_IF_DEF_CONEX = 1; /* Not yet supported */
+ temp=SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+ temp = (temp & 0x0E) >> 1;
+ if((temp >= 2) && (temp <= 3)) SiS_Pr->SiS_IF_DEF_LVDS = 1;
+ if(temp == 3) SiS_Pr->SiS_IF_DEF_CH70xx = 2;
break;
#endif
default:
@@ -1442,431 +832,1000 @@ SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
-/*********************************************/
-/* HELPER: Enable DSTN/FSTN */
-/*********************************************/
-
void
-SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable)
+SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- SiS_Pr->SiS_IF_DEF_DSTN = enable ? 1 : 0;
+ switch(HwDeviceExtension->jChipType) {
+#ifdef SIS315H
+ case SIS_315H:
+ case SIS_315:
+ case SIS_315PRO:
+ case SIS_550:
+ case SIS_650:
+ case SIS_740:
+ case SIS_330:
+ case SIS_660:
+ case SIS_760:
+ InitTo310Pointer(SiS_Pr, HwDeviceExtension);
+ break;
+#endif
+#ifdef SIS300
+ case SIS_300:
+ case SIS_540:
+ case SIS_630:
+ case SIS_730:
+ InitTo300Pointer(SiS_Pr, HwDeviceExtension);
+ break;
+#endif
+ default:
+ break;
+ }
}
void
-SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable)
+SiSDetermineROMUsage(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr)
{
- SiS_Pr->SiS_IF_DEF_FSTN = enable ? 1 : 0;
+ if((ROMAddr) && (HwDeviceExtension->UseROM)) {
+ if((ROMAddr[0x00] != 0x55) || (ROMAddr[0x01] != 0xAA)) {
+ SiS_Pr->SiS_UseROM = FALSE;
+ } else if(HwDeviceExtension->jChipType == SIS_300) {
+ /* TW: 300: We check if the code starts below 0x220 by
+ * checking the jmp instruction at the beginning
+ * of the BIOS image.
+ */
+ if((ROMAddr[3] == 0xe9) &&
+ ((ROMAddr[5] << 8) | ROMAddr[4]) > 0x21a)
+ SiS_Pr->SiS_UseROM = TRUE;
+ else SiS_Pr->SiS_UseROM = FALSE;
+ } else if(HwDeviceExtension->jChipType < SIS_315H) {
+#if 0
+ /* TW: Rest of 300 series: We don't use the ROM image if
+ * the BIOS version < 2.0.0 as such old BIOSes don't
+ * have the needed data at the expected locations.
+ */
+ if(ROMAddr[0x06] < '2') SiS_Pr->SiS_UseROM = FALSE;
+ else SiS_Pr->SiS_UseROM = TRUE;
+#else
+ /* Sony's VAIO BIOS 1.09 follows the standard, so perhaps
+ * the others do as well
+ */
+ SiS_Pr->SiS_UseROM = TRUE;
+#endif
+ } else {
+ /* TW: 315/330 series stick to the standard */
+ SiS_Pr->SiS_UseROM = TRUE;
+ }
+ } else SiS_Pr->SiS_UseROM = FALSE;
+
}
-/*********************************************/
-/* HELPER: Determine ROM usage */
-/*********************************************/
+/*
+ =========================================
+ ======== SiS SetMode Functions ==========
+ =========================================
+*/
+#ifdef LINUX_XF86
+/* TW: This is used for non-Dual-Head mode from X */
+BOOLEAN
+SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+ DisplayModePtr mode, BOOLEAN IsCustom)
+{
+ SISPtr pSiS = SISPTR(pScrn);
+ UShort ModeNo=0;
+
+ SiS_Pr->UseCustomMode = FALSE;
+
+ if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n",
+ SiS_Pr->CHDisplay,
+ (mode->Flags & V_INTERLACE ? SiS_Pr->CVDisplay * 2 :
+ (mode->Flags & V_DBLSCAN ? SiS_Pr->CVDisplay / 2 :
+ SiS_Pr->CVDisplay)));
+
+ return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));
+ }
+
+ ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+ if(!ModeNo) return FALSE;
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
+
+ return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE));
+}
+
+#ifdef SISDUALHEAD
+/* TW: Set CRT1 mode (used for dual head and MergedFB) */
BOOLEAN
-SiSDetermineROMLayout661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+ DisplayModePtr mode, BOOLEAN IsCustom)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT romversoffs, romvmaj = 1, romvmin = 0;
-
- if(HwInfo->jChipType >= SIS_661) {
- romversoffs = ROMAddr[0x16] | (ROMAddr[0x17] << 8);
- if(romversoffs) {
- if((ROMAddr[romversoffs+1] == '.') || (ROMAddr[romversoffs+4] == '.')) {
- romvmaj = ROMAddr[romversoffs] - '0';
- romvmin = ((ROMAddr[romversoffs+2] -'0') * 10) + (ROMAddr[romversoffs+3] - '0');
+ ULONG temp;
+ USHORT ModeIdIndex;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+ SISPtr pSiS = SISPTR(pScrn);
+ SISEntPtr pSiSEnt = pSiS->entityPrivate;
+ unsigned char backupreg=0;
+ BOOLEAN backupcustom;
+ UShort ModeNo=0;
+
+ SiS_Pr->UseCustomMode = FALSE;
+
+ if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+
+ USHORT temptemp = SiS_Pr->CVDisplay;
+
+ if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
+ else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "Setting custom mode %dx%d on CRT1\n",
+ SiS_Pr->CHDisplay, temptemp);
+ ModeNo = 0xfe;
+
+ } else {
+
+ ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes);
+ if(!ModeNo) return FALSE;
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "Setting standard mode 0x%x on CRT1\n", ModeNo);
+ }
+
+ SiSInitPtr(SiS_Pr, HwDeviceExtension);
+
+ SiSRegInit(SiS_Pr, BaseAddr);
+
+ SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
+
+ SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+
+ SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+
+ SiSSetLVDSetc(SiS_Pr, HwDeviceExtension, ModeNo);
+
+ SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+
+ /* We don't clear the buffer under X */
+ SiS_Pr->SiS_flag_clearbuffer = 0;
+
+ /* 1.Openkey */
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+
+ SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+
+ /* 2.Get ModeID Table */
+ if(!SiS_Pr->UseCustomMode) {
+ temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+ if(temp == 0) return(0);
+ } else {
+ ModeIdIndex = 0;
+ }
+
+ /* TW: Determine VBType (301,301B,301LV,302B,302LV) */
+ SiS_GetVBType(SiS_Pr, BaseAddr,HwDeviceExtension);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ } else {
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ }
+ }
+
+ /* TW: Get VB information (connectors, connected devices) */
+ /* (We don't care if the current mode is a CRT2 mode) */
+ SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
+ SiS_SetHiVision(SiS_Pr, BaseAddr,HwDeviceExtension);
+ SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(ModeNo != 0x10) SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
+ SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ }
+ }
+
+ if(IS_SIS650) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+ if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
}
}
- if((romvmaj != 0) || (romvmin >= 92)) {
- return TRUE;
+ }
+
+ /* Set mode on CRT1 */
+ SiS_SetCRT1Group(SiS_Pr, ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+
+ /* SetPitch: Adapt to virtual size & position */
+ SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
+
+ if(pSiS->DualHeadMode) {
+ pSiSEnt->CRT1ModeNo = ModeNo;
+ pSiSEnt->CRT1DMode = mode;
+ }
+
+ if(SiS_Pr->UseCustomMode) {
+ SiS_Pr->CRT1UsesCustomMode = TRUE;
+ SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
+ SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
+ } else {
+ SiS_Pr->CRT1UsesCustomMode = FALSE;
+ }
+
+ /* We have to reset CRT2 if changing mode on CRT1 */
+ if(pSiS->DualHeadMode) {
+ if(pSiSEnt->CRT2ModeNo != -1) {
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "(Re-)Setting mode for CRT2\n");
+ backupcustom = SiS_Pr->UseCustomMode;
+ SiSBIOSSetModeCRT2(SiS_Pr, HwDeviceExtension, pSiSEnt->pScrn_1,
+ pSiSEnt->CRT2DMode, pSiSEnt->CRT2IsCustom);
+ SiS_Pr->UseCustomMode = backupcustom;
}
- } else if(IS_SIS650740) {
- if((ROMAddr[0x1a] == 'N') &&
- (ROMAddr[0x1b] == 'e') &&
- (ROMAddr[0x1c] == 'w') &&
- (ROMAddr[0x1d] == 'V')) {
- return TRUE;
+ }
+
+ /* Warning: From here, the custom mode entries in SiS_Pr are
+ * possibly overwritten
+ */
+
+ SiS_HandleCRT1(SiS_Pr);
+
+ SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
+
+ SiS_DisplayOn(SiS_Pr);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,backupreg);
+ } else if((HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,backupreg);
}
}
- return FALSE;
+
+ /* Backup/Set ModeNo in BIOS scratch area */
+ SiS_GetSetModeID(pScrn,ModeNo);
+
+ return TRUE;
}
-static void
-SiSDetermineROMUsage(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+/* TW: Set CRT2 mode (used for dual head) */
+BOOLEAN
+SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,
+ DisplayModePtr mode, BOOLEAN IsCustom)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT romptr = 0;
+ ULONG temp;
+ USHORT ModeIdIndex;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+ UShort ModeNo = 0;
+ SISPtr pSiS = SISPTR(pScrn);
+ SISEntPtr pSiSEnt = pSiS->entityPrivate;
+ unsigned char tempr1, tempr2, backupreg=0;
- SiS_Pr->SiS_UseROM = FALSE;
- SiS_Pr->SiS_ROMNew = FALSE;
+ SiS_Pr->UseCustomMode = FALSE;
- if((ROMAddr) && (HwInfo->UseROM)) {
- if(HwInfo->jChipType == SIS_300) {
- /* 300: We check if the code starts below 0x220 by
- * checking the jmp instruction at the beginning
- * of the BIOS image.
- */
- if((ROMAddr[3] == 0xe9) && ((ROMAddr[5] << 8) | ROMAddr[4]) > 0x21a)
- SiS_Pr->SiS_UseROM = TRUE;
- } else if(HwInfo->jChipType < SIS_315H) {
- /* Sony's VAIO BIOS 1.09 follows the standard, so perhaps
- * the others do as well
- */
- SiS_Pr->SiS_UseROM = TRUE;
+ /* Remember: Custom modes for CRT2 are ONLY supported
+ * -) on 315/330 series,
+ * -) on the 301 and 30xB, and
+ * -) if CRT2 is LCD or VGA
+ */
+
+ if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
+
+ ModeNo = 0xfe;
+
+ } else {
+
+ BOOLEAN havecustommodes = pSiS->HaveCustomModes;
+
+#ifdef SISMERGED
+ if(pSiS->MergedFB) havecustommodes = pSiS->HaveCustomModes2;
+#endif
+
+ ModeNo = SiS_CalcModeIndex(pScrn, mode, havecustommodes);
+ if(!ModeNo) return FALSE;
+
+ }
+
+ /* Save mode info so we can set it from within SetMode for CRT1 */
+ if(pSiS->DualHeadMode) {
+ pSiSEnt->CRT2ModeNo = ModeNo;
+ pSiSEnt->CRT2DMode = mode;
+ pSiSEnt->CRT2IsCustom = IsCustom;
+
+ /* We can't set CRT2 mode before CRT1 mode is set */
+ if(pSiSEnt->CRT1ModeNo == -1) {
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "Setting CRT2 mode delayed until after setting CRT1 mode\n");
+ return TRUE;
+ }
+ }
+
+ SiSInitPtr(SiS_Pr, HwDeviceExtension);
+
+ SiSRegInit(SiS_Pr, BaseAddr);
+
+ SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
+
+ SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+
+ SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+
+ SiSSetLVDSetc(SiS_Pr, HwDeviceExtension, ModeNo);
+
+ SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+
+ /* We don't clear the buffer under X */
+ SiS_Pr->SiS_flag_clearbuffer=0;
+
+ if(SiS_Pr->UseCustomMode) {
+
+ USHORT temptemp = SiS_Pr->CVDisplay;
+
+ if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
+ else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "Setting custom mode %dx%d on CRT2\n",
+ SiS_Pr->CHDisplay, temptemp);
+
+ } else {
+
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "Setting standard mode 0x%x on CRT2\n", ModeNo);
+
+ }
+
+ /* 1.Openkey */
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+
+ SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+
+ /* 2.Get ModeID */
+ if(!SiS_Pr->UseCustomMode) {
+ temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&ModeNo,&ModeIdIndex);
+ if(temp == 0) return(0);
+ } else {
+ ModeIdIndex = 0;
+ }
+
+ /* Determine VBType (301,301B,301LV,302B,302LV) */
+ SiS_GetVBType(SiS_Pr, BaseAddr,HwDeviceExtension);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ temp = ROMAddr[VB310Data_1_2_Offset];
+ temp |= 0x40;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x02,temp);
+ }
+ }
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x32,0x10);
+
+ SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x02,0x0c);
+
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
} else {
- /* 315/330 series stick to the standard */
- SiS_Pr->SiS_UseROM = TRUE;
- if((SiS_Pr->SiS_ROMNew = SiSDetermineROMLayout661(SiS_Pr, HwInfo))) {
- /* Find out about LCD data table entry size */
- if((romptr = SISGETROMW(0x0102))) {
- if(ROMAddr[romptr + (32 * 16)] == 0xff)
- SiS_Pr->SiS661LCD2TableSize = 32;
- else if(ROMAddr[romptr + (34 * 16)] == 0xff)
- SiS_Pr->SiS661LCD2TableSize = 34;
- else if(ROMAddr[romptr + (36 * 16)] == 0xff)
- SiS_Pr->SiS661LCD2TableSize = 36;
- }
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ }
+ }
+
+ /* Get VB information (connectors, connected devices) */
+ if(!SiS_Pr->UseCustomMode) {
+ SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
+ } else {
+ /* If this is a custom mode, we don't check the modeflag for CRT2Mode */
+ SiS_GetVBInfo(SiS_Pr, BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
+ }
+ SiS_SetHiVision(SiS_Pr, BaseAddr,HwDeviceExtension);
+ SiS_GetLCDResInfo(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(ModeNo != 0x10) SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
+ SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ }
+ }
+ }
+
+ /* Set mode on CRT2 */
+ switch (HwDeviceExtension->ujVBChipID) {
+ case VB_CHIP_301:
+ case VB_CHIP_301B:
+ case VB_CHIP_301C:
+ case VB_CHIP_301LV:
+ case VB_CHIP_302:
+ case VB_CHIP_302B:
+ case VB_CHIP_302LV:
+ SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+ break;
+ case VB_CHIP_UNKNOWN:
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1 ||
+ SiS_Pr->SiS_IF_DEF_CH70xx != 0 ||
+ SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
+ SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+ }
+ break;
+ }
+
+ SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
+
+ SiS_DisplayOn(SiS_Pr);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
}
}
}
-}
-/*********************************************/
-/* HELPER: SET SEGMENT REGISTERS */
-/*********************************************/
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0xFE);
+ }
-static void
-SiS_SetSegRegLower(SiS_Private *SiS_Pr, USHORT value)
-{
- USHORT temp;
-
- value &= 0x00ff;
- temp = SiS_GetRegByte(SiS_Pr->SiS_P3cb) & 0xf0;
- temp |= (value >> 4);
- SiS_SetRegByte(SiS_Pr->SiS_P3cb, temp);
- temp = SiS_GetRegByte(SiS_Pr->SiS_P3cd) & 0xf0;
- temp |= (value & 0x0f);
- SiS_SetRegByte(SiS_Pr->SiS_P3cd, temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,backupreg);
+
+ tempr1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ tempr2 = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00);
+ if(tempr1 & SetCRT2ToAVIDEO) tempr2 &= 0xF7;
+ if(tempr1 & SetCRT2ToSVIDEO) tempr2 &= 0xFB;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,tempr2);
+
+ if(tempr1 & SetCRT2ToLCD) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
+ }
+ } else if((HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,backupreg);
+ }
+ }
+
+ /* SetPitch: Adapt to virtual size & position */
+ SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+
+ return TRUE;
}
+#endif /* Dualhead */
+#endif /* Linux_XF86 */
-static void
-SiS_SetSegRegUpper(SiS_Private *SiS_Pr, USHORT value)
+#ifdef LINUX_XF86
+/* TW: We need pScrn for setting the pitch correctly */
+BOOLEAN
+SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch)
+#else
+BOOLEAN
+SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo)
+#endif
{
- USHORT temp;
-
- value &= 0x00ff;
- temp = SiS_GetRegByte(SiS_Pr->SiS_P3cb) & 0x0f;
- temp |= (value & 0xf0);
- SiS_SetRegByte(SiS_Pr->SiS_P3cb, temp);
- temp = SiS_GetRegByte(SiS_Pr->SiS_P3cd) & 0x0f;
- temp |= (value << 4);
- SiS_SetRegByte(SiS_Pr->SiS_P3cd, temp);
+ ULONG temp;
+ USHORT ModeIdIndex,KeepLockReg;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
+ unsigned char backupreg=0, tempr1, tempr2;
+
+#ifndef LINUX_XF86
+ SiS_Pr->UseCustomMode = FALSE;
+ SiS_Pr->CRT1UsesCustomMode = FALSE;
+#endif
+
+ if(SiS_Pr->UseCustomMode) {
+ ModeNo = 0xfe;
+ }
+
+ SiSInitPtr(SiS_Pr, HwDeviceExtension);
+
+ SiSRegInit(SiS_Pr, BaseAddr);
+
+ SiS_GetSysFlags(SiS_Pr, HwDeviceExtension);
+
+#ifdef LINUX_XF86
+ if(pScrn) SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
+ else
+#endif
+ SiS_Pr->SiS_VGAINFO = 0x11;
+
+#ifdef LINUX_XF86
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "VGAInfo 0x%02x\n", SiS_Pr->SiS_VGAINFO);
+#endif
+#endif
+
+ SiSInitPCIetc(SiS_Pr, HwDeviceExtension);
+
+ SiSSetLVDSetc(SiS_Pr, HwDeviceExtension, ModeNo);
+
+ SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr);
+
+ if(!SiS_Pr->UseCustomMode) {
+ /* TW: Shift the clear-buffer-bit away */
+ ModeNo = ((ModeNo & 0x80) << 8) | (ModeNo & 0x7f);
+ }
+
+#ifdef LINUX_XF86
+ /* We never clear the buffer in X */
+ ModeNo |= 0x8000;
+#endif
+
+ if(ModeNo & 0x8000) {
+ ModeNo &= 0x7fff;
+ SiS_Pr->SiS_flag_clearbuffer = 0;
+ } else {
+ SiS_Pr->SiS_flag_clearbuffer = 1;
+ }
+
+ /* 1.Openkey */
+ KeepLockReg = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x05);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+
+ SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
+
+ if(!SiS_Pr->UseCustomMode) {
+
+ /* 2.Get ModeID Table */
+ temp = SiS_SearchModeID(SiS_Pr,ROMAddr,&ModeNo,&ModeIdIndex);
+ if(temp == 0) return(0);
+
+ } else {
+
+ ModeIdIndex = 0;
+
+ }
+
+ /* Determine VBType (301,301B,301LV,302B,302LV) */
+ SiS_GetVBType(SiS_Pr,BaseAddr,HwDeviceExtension);
+
+ /* Init/restore some VB registers */
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ temp = ROMAddr[VB310Data_1_2_Offset];
+ temp |= 0x40;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x02,temp);
+ }
+ }
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x32,0x10);
+
+ SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x02,0x0c);
+
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ } else {
+ backupreg = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ }
+ }
+
+ /* Get VB information (connectors, connected devices) */
+ if(SiS_Pr->UseCustomMode) {
+ SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,0);
+ } else {
+ SiS_GetVBInfo(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,1);
+ }
+ SiS_SetHiVision(SiS_Pr,BaseAddr,HwDeviceExtension);
+ SiS_GetLCDResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+
+#ifndef LINUX_XF86
+ /* 3. Check memory size (Kernel framebuffer driver only) */
+ temp = SiS_CheckMemorySize(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex);
+ if(!temp) return(0);
+#endif
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(ModeNo != 0x10) SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ } else if((IS_SIS651) && (SiS_Pr->SiS_VBType & VB_NoLCD)) {
+ SiS_Pr->SiS_SetFlag |= SetDOSMode;
+ }
+ }
+
+ if(IS_SIS650) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
+ if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
+ }
+ }
+ }
+
+ if(SiS_Pr->UseCustomMode) {
+ SiS_Pr->CRT1UsesCustomMode = TRUE;
+ SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
+ SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
+ } else {
+ SiS_Pr->CRT1UsesCustomMode = FALSE;
+ }
+
+ /* Set mode on CRT1 */
+ if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
+ SiS_SetCRT1Group(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+ } else {
+ if(!(SiS_Pr->SiS_VBInfo & SwitchToCRT2)) {
+ SiS_SetCRT1Group(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,BaseAddr);
+ }
+ }
+
+ /* Set mode on CRT2 */
+ if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA)) {
+ switch (HwDeviceExtension->ujVBChipID) {
+ case VB_CHIP_301:
+ case VB_CHIP_301B:
+ case VB_CHIP_301C:
+ case VB_CHIP_301LV:
+ case VB_CHIP_302:
+ case VB_CHIP_302B:
+ case VB_CHIP_302LV:
+ SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+ break;
+ case VB_CHIP_UNKNOWN:
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1 ||
+ SiS_Pr->SiS_IF_DEF_CH70xx != 0 ||
+ SiS_Pr->SiS_IF_DEF_TRUMPION != 0)
+ SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,ModeNo,HwDeviceExtension);
+ break;
+ }
+ }
+
+ SiS_HandleCRT1(SiS_Pr);
+
+ SiS_StrangeStuff(SiS_Pr, HwDeviceExtension);
+
+ SiS_DisplayOn(SiS_Pr);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
+ }
+ }
+ }
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0xFE);
+ }
+
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,backupreg);
+
+ tempr1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ tempr2 = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00);
+ if(tempr1 & SetCRT2ToAVIDEO) tempr2 &= 0xF7;
+ if(tempr1 & SetCRT2ToSVIDEO) tempr2 &= 0xFB;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,tempr2);
+
+ if((IS_SIS650) && (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30) & 0xfc)) {
+ if((ModeNo == 0x03) || (ModeNo == 0x10)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x80);
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x56,0x08);
+ }
+ }
+
+ if(tempr1 & SetCRT2ToLCD) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
+ }
+ } else if((HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,backupreg);
+ }
+ }
+
+#ifdef LINUX_XF86
+ if(pScrn) {
+ /* SetPitch: Adapt to virtual size & position */
+ if((ModeNo > 0x13) && (dosetpitch)) {
+ SiS_SetPitch(SiS_Pr, pScrn, BaseAddr);
+ }
+
+ /* Backup/Set ModeNo in BIOS scratch area */
+ SiS_GetSetModeID(pScrn, ModeNo);
+ }
+#endif
+
+#ifndef LINUX_XF86 /* We never lock registers in XF86 */
+ if(KeepLockReg == 0xA1) SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+ else SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x00);
+#endif
+
+ return TRUE;
}
-static void
-SiS_SetSegmentReg(SiS_Private *SiS_Pr, USHORT value)
+void
+SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable)
{
- SiS_SetSegRegLower(SiS_Pr, value);
- SiS_SetSegRegUpper(SiS_Pr, value);
+ SiS_Pr->SiS_IF_DEF_DSTN = enable ? 1 : 0;
}
-static void
-SiS_ResetSegmentReg(SiS_Private *SiS_Pr)
+void
+SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable)
{
- SiS_SetSegmentReg(SiS_Pr, 0);
+ SiS_Pr->SiS_IF_DEF_FSTN = enable ? 1 : 0;
}
-static void
-SiS_SetSegmentRegOver(SiS_Private *SiS_Pr, USHORT value)
+void
+SiS_HandleCRT1(SiS_Private *SiS_Pr)
{
- USHORT temp = value >> 8;
+ /* TW: We don't do this at all. There is a new
+ * CRT1-is-connected-at-boot-time logic in the 650 BIOS, which
+ * confuses our own. So just clear the bit and skip the rest.
+ */
- temp &= 0x07;
- temp |= (temp << 4);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x1d,temp);
- SiS_SetSegmentReg(SiS_Pr, value);
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x63,0xbf);
+
+#if 0
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x01)) {
+ if((SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15) & 0x0a) ||
+ (SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x01)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x63,0x40);
+ }
+ }
+#endif
}
-static void
-SiS_ResetSegmentRegOver(SiS_Private *SiS_Pr)
+void
+SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- SiS_SetSegmentRegOver(SiS_Pr, 0);
+ unsigned char cr5f, temp1, temp2;
+
+ /* You should use the macros, not these flags directly */
+
+ SiS_Pr->SiS_SysFlags = 0;
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ cr5f = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x5c,0x07);
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x5c,0xf8);
+ temp2 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
+ if((!temp1) || (temp2)) {
+ switch(cr5f) {
+ case 0x80:
+ case 0x90:
+ case 0xc0:
+ SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
+ case 0xa0:
+ case 0xb0:
+ case 0xe0:
+ SiS_Pr->SiS_SysFlags |= SF_Is651; break;
+ }
+ } else {
+ switch(cr5f) {
+ case 0x90:
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5c) & 0xf8;
+ switch(temp1) {
+ case 0x00: SiS_Pr->SiS_SysFlags |= SF_IsM652; break;
+ case 0x40: SiS_Pr->SiS_SysFlags |= SF_IsM653; break;
+ default: SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
+ }
+ break;
+ case 0xb0:
+ SiS_Pr->SiS_SysFlags |= SF_Is652; break;
+ default:
+ SiS_Pr->SiS_SysFlags |= SF_IsM650; break;
+ }
+ }
+ }
}
-static void
-SiS_ResetSegmentRegisters(SiS_Private *SiS_Pr,PSIS_HW_INFO HwInfo)
+void
+SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- if((IS_SIS65x) || (HwInfo->jChipType >= SIS_661)) {
- SiS_ResetSegmentReg(SiS_Pr);
- SiS_ResetSegmentRegOver(SiS_Pr);
+ if((IS_SIS651) || (IS_SISM650)) {
+ SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x3f, 0x00); /* Fiddle with capture regs */
+ SiS_SetReg1(SiS_Pr->SiS_VidCapt, 0x00, 0x00);
+ SiS_SetReg1(SiS_Pr->SiS_VidPlay, 0x00, 0x86); /* (BIOS does NOT unlock) */
+ SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x30, 0xfe); /* Fiddle with video regs */
+ SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x3f, 0xef);
}
+ /* !!! This does not support modes < 0x13 !!! */
}
-/*********************************************/
-/* HELPER: GetVBType */
-/*********************************************/
-
void
-SiS_GetVBType(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_SetCRT1Group(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT ModeIdIndex,USHORT BaseAddr)
{
- USHORT flag=0, rev=0, nolcd=0;
+ USHORT StandTableIndex,RefreshRateTableIndex;
- SiS_Pr->SiS_VBType = 0;
+ SiS_Pr->SiS_CRT1Mode = ModeNo;
+ StandTableIndex = SiS_GetModePtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
+ SiS_DisableBridge(SiS_Pr,HwDeviceExtension,BaseAddr);
+ }
+ }
- if((SiS_Pr->SiS_IF_DEF_LVDS) || (SiS_Pr->SiS_IF_DEF_CONEX))
- return;
+ /* 550, 651 */
+ SiS_WhatTheHellIsThis(SiS_Pr,HwDeviceExtension,BaseAddr);
- flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);
+ SiS_SetSeqRegs(SiS_Pr,ROMAddr,StandTableIndex);
+ SiS_SetMiscRegs(SiS_Pr,ROMAddr,StandTableIndex);
+ SiS_SetCRTCRegs(SiS_Pr,ROMAddr,HwDeviceExtension,StandTableIndex);
+ SiS_SetATTRegs(SiS_Pr,ROMAddr,StandTableIndex,HwDeviceExtension);
+ SiS_SetGRCRegs(SiS_Pr,ROMAddr,StandTableIndex);
+ SiS_ClearExt1Regs(SiS_Pr,HwDeviceExtension);
+ SiS_ResetCRT1VCLK(SiS_Pr,ROMAddr,HwDeviceExtension);
- if(flag > 3) return;
+ SiS_Pr->SiS_SelectCRT2Rate = 0;
+ SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
- rev = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01);
+#ifdef LINUX_XF86
+ xf86DrvMsgVerb(0, X_PROBED, 3, "(init: VBType=0x%04x, VBInfo=0x%04x)\n",
+ SiS_Pr->SiS_VBType, SiS_Pr->SiS_VBInfo);
+#endif
- if(flag >= 2) {
- SiS_Pr->SiS_VBType = VB_SIS302B;
- } else if(flag == 1) {
- if(rev >= 0xC0) {
- SiS_Pr->SiS_VBType = VB_SIS301C;
- } else if(rev >= 0xB0) {
- SiS_Pr->SiS_VBType = VB_SIS301B;
- /* Check if 30xB DH version (no LCD support, use Panel Link instead) */
- nolcd = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x23);
- if(!(nolcd & 0x02)) SiS_Pr->SiS_VBType |= VB_NoLCD;
- } else {
- SiS_Pr->SiS_VBType = VB_SIS301;
- }
- }
- if(SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS301C | VB_SIS302B)) {
- if(rev >= 0xE0) {
- flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x39);
- if(flag == 0xff) SiS_Pr->SiS_VBType = VB_SIS302LV;
- else SiS_Pr->SiS_VBType = VB_SIS302ELV;
- } else if(rev >= 0xD0) {
- SiS_Pr->SiS_VBType = VB_SIS301LV;
+ if(SiS_Pr->SiS_VBInfo & SetSimuScanMode) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
}
}
-}
-
-/*********************************************/
-/* HELPER: GetDRAMSize */
-/*********************************************/
-#ifndef LINUX_XF86
-static ULONG
-GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- ULONG AdapterMemorySize = 0;
-#ifdef SIS315H
- USHORT counter;
-#endif
-
- switch(HwInfo->jChipType) {
-#ifdef SIS315H
- case SIS_315H:
- case SIS_315:
- case SIS_315PRO:
- counter = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- AdapterMemorySize = 1 << ((counter & 0xF0) >> 4);
- counter >>= 2;
- counter &= 0x03;
- if(counter == 0x02) {
- AdapterMemorySize += (AdapterMemorySize / 2); /* DDR asymetric */
- } else if(counter != 0) {
- AdapterMemorySize <<= 1; /* SINGLE_CHANNEL_2_RANK or DUAL_CHANNEL_1_RANK */
- }
- AdapterMemorySize *= (1024*1024);
- break;
-
- case SIS_330:
- counter = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- AdapterMemorySize = 1 << ((counter & 0xF0) >> 4);
- counter &= 0x0c;
- if(counter != 0) {
- AdapterMemorySize <<= 1;
- }
- AdapterMemorySize *= (1024*1024);
- break;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+ }
- case SIS_550:
- case SIS_650:
- case SIS_740:
- counter = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
- counter++;
- AdapterMemorySize = counter * 4;
- AdapterMemorySize *= (1024*1024);
- break;
+ RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
- case SIS_661:
- case SIS_741:
- counter = (SiS_GetReg(SiS_Pr->SiS_P3c4,0x79) & 0xf0) >> 4;
- AdapterMemorySize = 1 << counter;
- AdapterMemorySize *= (1024*1024);
- break;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ SiS_Pr->SiS_SetFlag &= ~ProgrammingCRT2;
+ }
- case SIS_660:
- case SIS_760:
- counter = (SiS_GetReg(SiS_Pr->SiS_P3c4,0x79) & 0xf0) >> 4;
- if(counter) {
- AdapterMemorySize = 1 << counter;
- AdapterMemorySize *= (1024*1024);
- }
- counter = SiS_GetReg(SiS_Pr->SiS_P3c4,0x78) & 0x30;
- if(counter) {
- if(counter == 0x10) AdapterMemorySize += (32 * 1024 * 1024);
- else AdapterMemorySize += (64 * 1024 * 1024);
- }
- break;
-#endif
+ if(RefreshRateTableIndex != 0xFFFF) {
+ SiS_SetSync(SiS_Pr,ROMAddr,RefreshRateTableIndex);
+ SiS_SetCRT1CRTC(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwDeviceExtension);
+ SiS_SetCRT1Offset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwDeviceExtension);
+ SiS_SetCRT1VCLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension,RefreshRateTableIndex);
+ }
#ifdef SIS300
- case SIS_300:
- case SIS_540:
- case SIS_630:
- case SIS_730:
- AdapterMemorySize = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
- AdapterMemorySize++;
- AdapterMemorySize *= (1024*1024);
- break;
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ SiS_SetCRT1FIFO_300(SiS_Pr,ROMAddr,ModeNo,HwDeviceExtension,RefreshRateTableIndex);
+ }
+ if((HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730) ||
+ (HwDeviceExtension->jChipType == SIS_540)) {
+ SiS_SetCRT1FIFO_630(SiS_Pr,ROMAddr,ModeNo,HwDeviceExtension,RefreshRateTableIndex);
+ }
#endif
- default:
- break;
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetCRT1FIFO_310(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
}
-
- return AdapterMemorySize;
-}
#endif
-/*********************************************/
-/* HELPER: Check RAM size */
-/*********************************************/
+ SiS_SetCRT1ModeRegs(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex,RefreshRateTableIndex);
+
+ SiS_LoadDAC(SiS_Pr,HwDeviceExtension,ROMAddr,ModeNo,ModeIdIndex);
#ifndef LINUX_XF86
-static BOOLEAN
-SiS_CheckMemorySize(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex)
-{
- USHORT memorysize,modeflag;
- ULONG temp;
+ if(SiS_Pr->SiS_flag_clearbuffer) {
+ SiS_ClearBuffer(SiS_Pr,HwDeviceExtension,ModeNo);
+ }
+#endif
- if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- } else {
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
+ if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2 | SetCRT2ToLCDA))) {
+ SiS_LongWait(SiS_Pr);
+ SiS_DisplayOn(SiS_Pr);
}
+}
- memorysize = modeflag & MemoryInfoFlag;
- memorysize >>= MemorySizeShift; /* Get required memory size */
- memorysize++;
+#ifdef LINUX_XF86
+void
+SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr)
+{
+ SISPtr pSiS = SISPTR(pScrn);
+ BOOLEAN isslavemode = FALSE;
- temp = GetDRAMSize(SiS_Pr, HwInfo); /* Get adapter memory size (in MB) */
- temp /= (1024*1024);
+ if( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
+ ( ((pSiS->VGAEngine == SIS_300_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
+ ((pSiS->VGAEngine == SIS_315_VGA) && (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
+ isslavemode = TRUE;
+ }
- if(temp < memorysize) return(FALSE);
- else return(TRUE);
+ /* We need to set pitch for CRT1 if bridge is in slave mode, too */
+ if( (pSiS->VBFlags & DISPTYPE_DISP1) || (isslavemode) ) {
+ SiS_SetPitchCRT1(SiS_Pr, pScrn, BaseAddr);
+ }
+ /* We must not set the pitch for CRT2 if bridge is in slave mode */
+ if( (pSiS->VBFlags & DISPTYPE_DISP2) && (!isslavemode) ) {
+ SiS_SetPitchCRT2(SiS_Pr, pScrn, BaseAddr);
+ }
}
-#endif
-/*********************************************/
-/* HELPER: Get DRAM type */
-/*********************************************/
-
-#ifdef SIS315H
-static UCHAR
-SiS_Get310DRAMType(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_SetPitchCRT1(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr)
{
- UCHAR data, temp;
+ SISPtr pSiS = SISPTR(pScrn);
+ ULong HDisplay,temp;
- if(*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) {
- data = *SiS_Pr->pSiS_SoftSetting & 0x03;
- } else {
- if(HwInfo->jChipType >= SIS_660) {
- /* data = SiS_GetReg(SiS_Pr->SiS_P3d4,0x78) & 0x07; */
- data = ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x78) & 0xc0) >> 6);
- } else if(HwInfo->jChipType >= SIS_661) {
- data = SiS_GetReg(SiS_Pr->SiS_P3d4,0x78) & 0x07;
- } else if(IS_SIS550650740) {
- data = SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x07;
- } else { /* 315, 330 */
- data = SiS_GetReg(SiS_Pr->SiS_P3c4,0x3a) & 0x03;
- if(HwInfo->jChipType == SIS_330) {
- if(data > 1) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0x30;
- switch(temp) {
- case 0x00: data = 1; break;
- case 0x10: data = 3; break;
- case 0x20: data = 3; break;
- case 0x30: data = 2; break;
- }
- } else {
- data = 0;
- }
- }
- }
- }
-
- return data;
+ HDisplay = pSiS->scrnPitch / 8;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4, 0x13, (HDisplay & 0xFF));
+ temp = (SiS_GetReg1(SiS_Pr->SiS_P3c4, 0x0E) & 0xF0) | (HDisplay>>8);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4, 0x0E, temp);
}
-USHORT
-SiS_GetMCLK(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_SetPitchCRT2(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr)
{
- USHORT index;
-
- index = SiS_Get310DRAMType(SiS_Pr, HwInfo);
- if(HwInfo->jChipType >= SIS_661) {
- return(SiS_Pr->SiS_MCLKData_0[index].CLOCK);
- } else if(index >= 4) {
- index -= 4;
- return(SiS_Pr->SiS_MCLKData_1[index].CLOCK);
- } else {
- return(SiS_Pr->SiS_MCLKData_0[index].CLOCK);
- }
+ SISPtr pSiS = SISPTR(pScrn);
+ ULong HDisplay,temp;
+
+ HDisplay = pSiS->scrnPitch2 / 8;
+
+ /* Unlock CRT2 */
+ if (pSiS->VGAEngine == SIS_315_VGA)
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2F, 0x01);
+ else
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24, 0x01);
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07, (HDisplay & 0xFF));
+ temp = (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x09) & 0xF0) | ((HDisplay >> 8) & 0xFF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x09, temp);
}
#endif
-/*********************************************/
-/* HELPER: ClearBuffer */
-/*********************************************/
-
-#ifndef LINUX_XF86
-static void
-SiS_ClearBuffer(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
+void
+SiS_GetVBType(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- UCHAR *VideoMemoryAddress = HwInfo->pjVideoMemoryAddress;
- ULONG AdapterMemorySize = (ULONG)HwInfo->ulVideoMemorySize;
- USHORT *pBuffer;
- int i;
+ USHORT flag=0, rev=0, nolcd=0;
- if(SiS_Pr->SiS_ModeType >= ModeEGA) {
- if(ModeNo > 0x13) {
- AdapterMemorySize = GetDRAMSize(SiS_Pr, HwInfo);
- SiS_SetMemory(VideoMemoryAddress,AdapterMemorySize,0);
- } else {
- pBuffer = (USHORT *)VideoMemoryAddress;
- for(i=0; i<0x4000; i++)
- pBuffer[i] = 0x0000;
- }
- } else {
- pBuffer = (USHORT *)VideoMemoryAddress;
- if(SiS_Pr->SiS_ModeType < ModeCGA) {
- for(i=0; i<0x4000; i++)
- pBuffer[i] = 0x0720;
- } else {
- SiS_SetMemory(VideoMemoryAddress,0x8000,0);
- }
+ SiS_Pr->SiS_VBType = 0;
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) return;
+
+ flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00);
+
+ if(flag > 3) return;
+
+ rev = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);
+
+ if(flag >= 2) {
+ SiS_Pr->SiS_VBType = VB_SIS302B;
+ } else if(flag == 1) {
+ SiS_Pr->SiS_VBType = VB_SIS301;
+ if(rev >= 0xC0) {
+ SiS_Pr->SiS_VBType = VB_SIS301C;
+ } else if(rev >= 0xB0) {
+ SiS_Pr->SiS_VBType = VB_SIS301B;
+ /* Check if 30xB DH version (no LCD support, use Panel Link instead) */
+ nolcd = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x23);
+ if(!(nolcd & 0x02)) SiS_Pr->SiS_VBType |= VB_NoLCD;
+ }
+ }
+ if(SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS301C | VB_SIS302B)) {
+ if(rev >= 0xD0) {
+ SiS_Pr->SiS_VBType &= ~(VB_SIS301B | VB_SIS301C | VB_SIS302B);
+ SiS_Pr->SiS_VBType |= VB_SIS301LV;
+ SiS_Pr->SiS_VBType &= ~(VB_NoLCD);
+ if(rev >= 0xE0) {
+ SiS_Pr->SiS_VBType &= ~(VB_SIS301LV);
+ SiS_Pr->SiS_VBType |= VB_SIS302LV;
+ }
+ }
}
}
-#endif
-
-/*********************************************/
-/* HELPER: SearchModeID */
-/*********************************************/
BOOLEAN
-SiS_SearchModeID(SiS_Private *SiS_Pr, USHORT *ModeNo, USHORT *ModeIdIndex)
+SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT *ModeNo,USHORT *ModeIdIndex)
{
UCHAR VGAINFO = SiS_Pr->SiS_VGAINFO;
@@ -1901,12 +1860,61 @@ SiS_SearchModeID(SiS_Private *SiS_Pr, USHORT *ModeNo, USHORT *ModeIdIndex)
return TRUE;
}
-/*********************************************/
-/* HELPER: GetModePtr */
-/*********************************************/
+BOOLEAN
+SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo)
+{
+ USHORT ModeIdIndex;
+ UCHAR VGAINFO = SiS_Pr->SiS_VGAINFO;
+
+ if(*ModeNo <= 5) *ModeNo |= 1;
+
+ for(ModeIdIndex=0; ; ModeIdIndex++) {
+ if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == *ModeNo) break;
+ if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == 0xFF) return FALSE;
+ }
+
+ if(*ModeNo != 0x07) {
+ if(*ModeNo > 0x03) return ((BOOLEAN)ModeIdIndex);
+ if(VGAINFO & 0x80) return ((BOOLEAN)ModeIdIndex);
+ ModeIdIndex++;
+ }
+ if(VGAINFO & 0x10) ModeIdIndex++; /* 400 lines */
+ /* else 350 lines */
+ return ((BOOLEAN)ModeIdIndex);
+}
+
+#ifndef LINUX_XF86
+BOOLEAN
+SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT ModeIdIndex)
+{
+ USHORT memorysize,modeflag;
+ ULONG temp;
+
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
+ }
+
+ memorysize = modeflag & MemoryInfoFlag;
+ memorysize >>= MemorySizeShift; /* Get required memory size */
+ memorysize++;
+
+ temp = GetDRAMSize(SiS_Pr, HwDeviceExtension); /* Get adapter memory size */
+ temp /= (1024*1024); /* (in MB) */
+
+ if(temp < memorysize) return(FALSE);
+ else return(TRUE);
+}
+#endif
UCHAR
-SiS_GetModePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex)
+SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
UCHAR index;
@@ -1919,150 +1927,88 @@ SiS_GetModePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex)
return index;
}
-/*********************************************/
-/* HELPER: LowModeTests */
-/*********************************************/
-
-static BOOLEAN
-SiS_DoLowModeTest(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo)
+static void
+SiS_WhatIsThis1a(SiS_Private *SiS_Pr, USHORT somevalue)
{
- USHORT temp,temp1,temp2;
-
- if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12))
- return(1);
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x11);
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x11,0x80);
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x00);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x00,0x55);
- temp2 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x00);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x00,temp1);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x11,temp);
- if((HwInfo->jChipType >= SIS_315H) ||
- (HwInfo->jChipType == SIS_300)) {
- if(temp2 == 0x55) return(0);
- else return(1);
- } else {
- if(temp2 != 0x55) return(1);
- else {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
- return(0);
- }
- }
+ USHORT temp, tempbl, tempbh;
+
+ tempbl = tempbh = somevalue;
+ temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
+ temp &= 0xf0;
+ tempbl >>= 4;
+ temp |= tempbl;
+ SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
+ temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
+ temp &= 0xf0;
+ tempbh &= 0x0f;
+ temp |= tempbh;
+ SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
}
static void
-SiS_SetLowModeTest(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo)
+SiS_WhatIsThis1b(SiS_Private *SiS_Pr, USHORT somevalue)
{
- if(SiS_DoLowModeTest(SiS_Pr, ModeNo, HwInfo)) {
- SiS_Pr->SiS_SetFlag |= LowModeTests;
- }
+ USHORT temp, tempbl, tempbh;
+
+ tempbl = tempbh = somevalue;
+ temp = SiS_GetReg2(SiS_Pr->SiS_P3cb);
+ temp &= 0x0f;
+ tempbl &= 0xf0;
+ temp |= tempbl;
+ SiS_SetReg3(SiS_Pr->SiS_P3cb, temp);
+ temp = SiS_GetReg2(SiS_Pr->SiS_P3cd);
+ temp &= 0x0f;
+ tempbh <<= 4;
+ temp |= tempbh;
+ SiS_SetReg3(SiS_Pr->SiS_P3cd, temp);
}
-/*********************************************/
-/* HELPER: ENABLE CRT1 */
-/*********************************************/
-
static void
-SiS_SetupCR5x(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_WhatIsThis2b(SiS_Private *SiS_Pr, USHORT somevalue)
{
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(IS_SIS650) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
- if(IS_SIS651) SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x20);
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
- } else if(IS_SIS661741660760) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x61,0xf7);
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x51,0x1f);
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x56,0xe7);
- if(!SiS_Pr->SiS_ROMNew) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x3a,0xef);
- }
- }
- }
+ SiS_WhatIsThis1a(SiS_Pr, somevalue);
+ SiS_WhatIsThis1b(SiS_Pr, somevalue);
}
static void
-SiS_HandleCRT1(SiS_Private *SiS_Pr)
+SiS_WhatIsThis1(SiS_Private *SiS_Pr)
{
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,SiS_Pr->SiS_MyCR63,0xbf);
-#if 0
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x15) & 0x01)) {
- if((SiS_GetReg(SiS_Pr->SiS_P3c4,0x15) & 0x0a) ||
- (SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x01)) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,SiS_Pr->SiS_MyCR63,0x40);
- }
- }
-#endif
+ SiS_WhatIsThis2b(SiS_Pr, 0);
}
-/*********************************************/
-/* HELPER: GetColorDepth */
-/*********************************************/
-
-USHORT
-SiS_GetColorDepth(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex)
+static void
+SiS_WhatIsThis2a(SiS_Private *SiS_Pr, USHORT somevalue)
{
- USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8};
- SHORT index;
- USHORT modeflag;
+ USHORT temp = somevalue >> 8;
- /* Do NOT check UseCustomMode, will skrew up FIFO */
- if(ModeNo == 0xfe) {
- modeflag = SiS_Pr->CModeFlag;
- } else {
- if(ModeNo <= 0x13)
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- else
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
-
- index = (modeflag & ModeInfoFlag) - ModeEGA;
- if(index < 0) index = 0;
- return(ColorDepth[index]);
+ temp &= 0x07;
+ temp |= (temp << 4);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1d,temp);
+ SiS_WhatIsThis2b(SiS_Pr, somevalue);
}
-/*********************************************/
-/* HELPER: GetOffset */
-/*********************************************/
-
-USHORT
-SiS_GetOffset(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,PSIS_HW_INFO HwInfo)
+static void
+SiS_WhatIsThis2(SiS_Private *SiS_Pr)
{
- USHORT xres, temp, colordepth, infoflag;
-
- if(SiS_Pr->UseCustomMode) {
- infoflag = SiS_Pr->CInfoFlag;
- xres = SiS_Pr->CHDisplay;
- } else {
- infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
- xres = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes;
- }
-
- colordepth = SiS_GetColorDepth(SiS_Pr,ModeNo,ModeIdIndex);
-
- temp = xres / 16;
- if(infoflag & InterlaceMode) temp <<= 1;
- temp *= colordepth;
- if(xres % 16) {
- colordepth >>= 1;
- temp += colordepth;
- }
-
- return(temp);
+ SiS_WhatIsThis2a(SiS_Pr, 0);
}
-/*********************************************/
-/* SEQ */
-/*********************************************/
+void
+SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+{
+ if(IS_SIS65x) {
+ SiS_WhatIsThis1(SiS_Pr);
+ SiS_WhatIsThis2(SiS_Pr);
+ }
+}
-static void
-SiS_SetSeqRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex, PSIS_HW_INFO HwInfo)
+void
+SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex)
{
UCHAR SRdata;
USHORT i;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x03); /* Set SR0 */
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x00,0x03); /* Set SR0 */
SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[0];
@@ -2070,13 +2016,7 @@ SiS_SetSeqRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex, PSIS_HW_INFO HwInfo)
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
SRdata |= 0x01;
}
- if(HwInfo->jChipType >= SIS_661) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SRdata |= 0x01; /* 8 dot clock */
- }
- }
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
if(SiS_Pr->SiS_VBType & VB_NoLCD) {
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
SRdata |= 0x01; /* 8 dot clock */
@@ -2084,60 +2024,49 @@ SiS_SetSeqRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex, PSIS_HW_INFO HwInfo)
}
}
}
-
if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SRdata |= 0x01; /* 8 dot clock */
- }
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SRdata |= 0x01; /* 8 dot clock */
+ SRdata |= 0x01; /* 8 dot clock */
}
- }
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ SRdata |= 0x01; /* 8 dot clock */
+ }
+ }
}
SRdata |= 0x20; /* screen off */
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x01,SRdata);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x01,SRdata);
for(i = 2; i <= 4; i++) {
- SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[i-1];
- SiS_SetReg(SiS_Pr->SiS_P3c4,i,SRdata);
+ SRdata = SiS_Pr->SiS_StandTable[StandTableIndex].SR[i-1];
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,i,SRdata);
}
}
-/*********************************************/
-/* MISC */
-/*********************************************/
-
-static void
-SiS_SetMiscRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex, PSIS_HW_INFO HwInfo)
+void
+SiS_SetMiscRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex)
{
UCHAR Miscdata;
Miscdata = SiS_Pr->SiS_StandTable[StandTableIndex].MISC;
- if(HwInfo->jChipType < SIS_661) {
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- Miscdata |= 0x0C;
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ Miscdata |= 0x0C;
}
}
- SiS_SetRegByte(SiS_Pr->SiS_P3c2,Miscdata);
+ SiS_SetReg3(SiS_Pr->SiS_P3c2,Miscdata);
}
-/*********************************************/
-/* CRTC */
-/*********************************************/
-
-static void
-SiS_SetCRTCRegs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+void
+SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
USHORT StandTableIndex)
{
UCHAR CRTCdata;
@@ -2147,274 +2076,317 @@ SiS_SetCRTCRegs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
for(i = 0; i <= 0x18; i++) {
CRTCdata = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[i];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,CRTCdata); /* Set CRTC(3d4) */
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,CRTCdata); /* Set CRTC(3d4) */
}
- if(HwInfo->jChipType >= SIS_661) {
- SiS_SetupCR5x(SiS_Pr, HwInfo);
- for(i = 0x13; i <= 0x14; i++) {
- CRTCdata = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[i];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,CRTCdata);
- }
- } else if( ( (HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730) ) &&
- (HwInfo->jChipRevision >= 0x30) ) { /* for 630S0 */
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x18,0xFE);
- }
- }
+ if( ( (HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730) ) &&
+ (HwDeviceExtension->jChipRevision >= 0x30) ) { /* for 630S0 */
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x18,0xFE);
+ }
+ }
}
}
-/*********************************************/
-/* ATT */
-/*********************************************/
-
-static void
-SiS_SetATTRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex,
- PSIS_HW_INFO HwInfo)
+void
+SiS_SetATTRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
UCHAR ARdata;
USHORT i;
for(i = 0; i <= 0x13; i++) {
- ARdata = SiS_Pr->SiS_StandTable[StandTableIndex].ATTR[i];
+ ARdata = SiS_Pr->SiS_StandTable[StandTableIndex].ATTR[i];
#if 0
- if((i <= 0x0f) || (i == 0x11)) {
- if(ds:489 & 0x08) {
- continue;
- }
- }
+ if((i <= 0x0f) || (i == 0x11)) {
+ if(ds:489 & 0x08) {
+ continue;
+ }
+ }
#endif
- if(i == 0x13) {
- /* Pixel shift. If screen on LCD or TV is shifted left or right,
- * this might be the cause.
- */
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ARdata=0;
- }
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
- }
+ if(i == 0x13) {
+ /* Pixel shift. If screen on LCD or TV is shifted left or right,
+ * this might be the cause.
+ */
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ARdata=0;
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
}
}
- if(HwInfo->jChipType >= SIS_661) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
- }
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(HwInfo->jChipType >= SIS_315H) {
- if(IS_SIS550650740660) {
- /* 315, 330 don't do this */
- if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
- } else {
- ARdata = 0;
- }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(IS_SIS550650740660) {
+ /* 315, 330 don't do this */
+ if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
+ } else {
+ ARdata = 0;
}
- } else {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
}
- }
+ } else {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0;
+ }
}
- SiS_GetRegByte(SiS_Pr->SiS_P3da); /* reset 3da */
- SiS_SetRegByte(SiS_Pr->SiS_P3c0,i); /* set index */
- SiS_SetRegByte(SiS_Pr->SiS_P3c0,ARdata); /* set data */
+ }
+ SiS_GetReg2(SiS_Pr->SiS_P3da); /* reset 3da */
+ SiS_SetReg3(SiS_Pr->SiS_P3c0,i); /* set index */
+ SiS_SetReg3(SiS_Pr->SiS_P3c0,ARdata); /* set data */
}
- SiS_GetRegByte(SiS_Pr->SiS_P3da); /* reset 3da */
- SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x14); /* set index */
- SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x00); /* set data */
+ SiS_GetReg2(SiS_Pr->SiS_P3da); /* reset 3da */
+ SiS_SetReg3(SiS_Pr->SiS_P3c0,0x14); /* set index */
+ SiS_SetReg3(SiS_Pr->SiS_P3c0,0x00); /* set data */
- SiS_GetRegByte(SiS_Pr->SiS_P3da);
- SiS_SetRegByte(SiS_Pr->SiS_P3c0,0x20); /* Enable Attribute */
- SiS_GetRegByte(SiS_Pr->SiS_P3da);
+ SiS_GetReg2(SiS_Pr->SiS_P3da);
+ SiS_SetReg3(SiS_Pr->SiS_P3c0,0x20); /* Enable Attribute */
+ SiS_GetReg2(SiS_Pr->SiS_P3da);
}
-/*********************************************/
-/* GRC */
-/*********************************************/
-
-static void
-SiS_SetGRCRegs(SiS_Private *SiS_Pr, USHORT StandTableIndex)
+void
+SiS_SetGRCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex)
{
UCHAR GRdata;
USHORT i;
for(i = 0; i <= 0x08; i++) {
- GRdata = SiS_Pr->SiS_StandTable[StandTableIndex].GRC[i];
- SiS_SetReg(SiS_Pr->SiS_P3ce,i,GRdata);
+ GRdata = SiS_Pr->SiS_StandTable[StandTableIndex].GRC[i];
+ SiS_SetReg1(SiS_Pr->SiS_P3ce,i,GRdata); /* Set GR(3ce) */
}
if(SiS_Pr->SiS_ModeType > ModeVGA) {
- /* 256 color disable */
- SiS_SetRegAND(SiS_Pr->SiS_P3ce,0x05,0xBF);
+ SiS_SetRegAND(SiS_Pr->SiS_P3ce,0x05,0xBF); /* 256 color disable */
}
}
-/*********************************************/
-/* CLEAR EXTENDED REGISTERS */
-/*********************************************/
-
-static void
-SiS_ClearExt1Regs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
+void
+SiS_ClearExt1Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT i;
for(i = 0x0A; i <= 0x0E; i++) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,i,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0x00); /* Clear SR0A-SR0E */
}
- if(HwInfo->jChipType >= SIS_315H) {
+ /* TW: 330, 650/LVDS/301LV, 740/LVDS */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x37,0xFE);
- if(ModeNo <= 0x13) {
- if(ModeNo == 0x06 || ModeNo >= 0x0e) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x0e,0x20);
- }
- }
}
}
-/*********************************************/
-/* RESET VCLK */
-/*********************************************/
-
-static void
-SiS_ResetCRT1VCLK(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if(HwInfo->jChipType >= SIS_315H) {
- if(HwInfo->jChipType < SIS_661) {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 0) return;
- }
- } else {
- if((SiS_Pr->SiS_IF_DEF_LVDS == 0) &&
- (!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) {
- return;
- }
- }
-
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xCF,0x20);
- } else {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x20);
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[1].SR2B);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[1].SR2C);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x80);
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xcf,0x10);
- } else {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x10);
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[0].SR2B);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[0].SR2C);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x80);
-}
-
-/*********************************************/
-/* SYNC */
-/*********************************************/
-
-static void
-SiS_SetCRT1Sync(SiS_Private *SiS_Pr, USHORT RefreshRateTableIndex)
+void
+SiS_SetSync(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT RefreshRateTableIndex)
{
USHORT sync;
+ USHORT temp;
if(SiS_Pr->UseCustomMode) {
sync = SiS_Pr->CInfoFlag >> 8;
} else {
sync = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
- }
+ }
sync &= 0xC0;
- sync |= 0x2f;
- SiS_SetRegByte(SiS_Pr->SiS_P3c2,sync);
+ temp = 0x2F | sync;
+ SiS_SetReg3(SiS_Pr->SiS_P3c2,temp); /* Set Misc(3c2) */
}
-/*********************************************/
-/* CRTC/2 */
-/*********************************************/
-
-static void
-SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
+void
+SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
USHORT RefreshRateTableIndex,
- PSIS_HW_INFO HwInfo)
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
UCHAR index;
- USHORT temp,i,j,modeflag;
+ USHORT tempah,i,modeflag,j;
+#ifdef SIS315H
+ USHORT temp;
+ USHORT ResIndex,DisplayType;
+ const SiS_LCDACRT1DataStruct *LCDACRT1Ptr = NULL;
+#endif
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f); /* unlock cr0-7 */
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f); /*unlock cr0-7 */
if(SiS_Pr->UseCustomMode) {
-
modeflag = SiS_Pr->CModeFlag;
-
- for(i=0,j=0;i<=7;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x10;i<=10;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x15;i<=12;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x0A;i<=15;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,j,SiS_Pr->CCRT1CRTC[i]);
- }
-
- temp = SiS_Pr->CCRT1CRTC[16] & 0xE0;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x0E,temp);
-
- temp = (SiS_Pr->CCRT1CRTC[16] & 0x01) << 5;
- if(modeflag & DoubleScanMode) temp |= 0x80;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0x5F,temp);
-
} else {
-
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
} else {
modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
}
+ }
+
+ if((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+#ifdef SIS315H
+
+ /* LCDA */
+
+ temp = SiS_GetLCDACRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,&ResIndex,&DisplayType);
+
+ switch(DisplayType) {
+ case Panel_800x600 : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_1; break;
+ case Panel_1024x768 : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_1; break;
+ case Panel_1280x1024 : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11280x1024_1; break;
+ case Panel_1400x1050 : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11400x1050_1; break;
+ case Panel_1600x1200 : LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11600x1200_1; break;
+ case Panel_800x600 + 16: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_1_H; break;
+ case Panel_1024x768 + 16: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_1_H; break;
+ case Panel_1280x1024 + 16: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11280x1024_1_H; break;
+ case Panel_1400x1050 + 16: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11400x1050_1_H; break;
+ case Panel_1600x1200 + 16: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11600x1200_1_H; break;
+ case Panel_800x600 + 32: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_2; break;
+ case Panel_1024x768 + 32: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_2; break;
+ case Panel_1280x1024 + 32: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11280x1024_2; break;
+ case Panel_1400x1050 + 32: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11400x1050_2; break;
+ case Panel_1600x1200 + 32: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11600x1200_2; break;
+ case Panel_800x600 + 48: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT1800x600_2_H; break;
+ case Panel_1024x768 + 48: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_2_H; break;
+ case Panel_1280x1024 + 48: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11280x1024_2_H; break;
+ case Panel_1400x1050 + 48: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11400x1050_2_H; break;
+ case Panel_1600x1200 + 48: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11600x1200_2_H; break;
+ default: LCDACRT1Ptr = SiS_Pr->SiS_LCDACRT11024x768_1; break;
+ }
- for(i=0,j=0;i<=7;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->SiS_CRT1Table[index].CR[i]);
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[0];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
+ for(i=0x01,j=1;i<=0x07;i++,j++){
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
- for(j=0x10;i<=10;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->SiS_CRT1Table[index].CR[i]);
+ for(i=0x10,j=8;i<=0x12;i++,j++){
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
- for(j=0x15;i<=12;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->SiS_CRT1Table[index].CR[i]);
+ for(i=0x15,j=11;i<=0x16;i++,j++){
+ tempah =(LCDACRT1Ptr+ResIndex)->CR[j];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
- for(j=0x0A;i<=15;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,j,SiS_Pr->SiS_CRT1Table[index].CR[i]);
+ for(i=0x0A,j=13;i<=0x0C;i++,j++){
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[j];
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
}
- temp = SiS_Pr->SiS_CRT1Table[index].CR[16] & 0xE0;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x0E,temp);
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+ tempah &= 0x0E0;
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x0E,tempah);
+
+ tempah = (LCDACRT1Ptr+ResIndex)->CR[16];
+ tempah &= 0x01;
+ tempah <<= 5;
+ if(modeflag & DoubleScanMode) tempah |= 0x080;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,~0x020,tempah);
+
+#endif
+
+ } else {
+
+ /* LVDS, 301, 301B, 301LV, 302LV, ... (non-LCDA) */
+
+ if(SiS_Pr->UseCustomMode) {
+
+ for(i=0,j=0;i<=07;i++,j++) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
+ }
+ for(j=0x10;i<=10;i++,j++) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
+ }
+ for(j=0x15;i<=12;i++,j++) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
+ }
+ for(j=0x0A;i<=15;i++,j++) {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,j,SiS_Pr->CCRT1CRTC[i]);
+ }
+
+ tempah = SiS_Pr->CCRT1CRTC[16] & 0xE0;
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x0E,tempah);
+
+ tempah = SiS_Pr->CCRT1CRTC[16];
+ tempah &= 0x01;
+ tempah <<= 5;
+ if(modeflag & DoubleScanMode) tempah |= 0x80;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0xDF,tempah);
+
+
+ } else {
+
+ index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */
+#if 0 /* Not any longer... */
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ index &= 0x3F;
+ }
+#endif
+
+ for(i=0,j=0;i<=07;i++,j++) {
+ tempah=SiS_Pr->SiS_CRT1Table[index].CR[i];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,tempah);
+ }
+ for(j=0x10;i<=10;i++,j++) {
+ tempah=SiS_Pr->SiS_CRT1Table[index].CR[i];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,tempah);
+ }
+ for(j=0x15;i<=12;i++,j++) {
+ tempah=SiS_Pr->SiS_CRT1Table[index].CR[i];
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,j,tempah);
+ }
+ for(j=0x0A;i<=15;i++,j++) {
+ tempah=SiS_Pr->SiS_CRT1Table[index].CR[i];
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,j,tempah);
+ }
+
+ tempah = SiS_Pr->SiS_CRT1Table[index].CR[16];
+ tempah &= 0xE0;
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x0E,tempah);
- temp = ((SiS_Pr->SiS_CRT1Table[index].CR[16]) & 0x01) << 5;
- if(modeflag & DoubleScanMode) temp |= 0x80;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0x5F,temp);
+ tempah = SiS_Pr->SiS_CRT1Table[index].CR[16];
+ tempah &= 0x01;
+ tempah <<= 5;
+ if(modeflag & DoubleScanMode) tempah |= 0x80;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0xDF,tempah);
+ }
}
- if(SiS_Pr->SiS_ModeType > ModeVGA) SiS_SetReg(SiS_Pr->SiS_P3d4,0x14,0x4F);
+ if(SiS_Pr->SiS_ModeType > ModeVGA) SiS_SetReg1(SiS_Pr->SiS_P3d4,0x14,0x4F);
}
-/*********************************************/
-/* OFFSET & PITCH */
-/*********************************************/
-/* (partly overruled by SetPitch() in XF86) */
-/*********************************************/
+BOOLEAN
+SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *ResIndex,
+ USHORT *DisplayType)
+ {
+ USHORT tempbx=0,modeflag=0;
+ USHORT CRT2CRTC=0;
+
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ CRT2CRTC = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ CRT2CRTC = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
-static void
-SiS_SetCRT1Offset(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
+ tempbx = SiS_Pr->SiS_LCDResInfo;
+
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 32;
+ if(modeflag & HalfDCLK) tempbx += 16;
+
+ *ResIndex = CRT2CRTC & 0x3F;
+ *DisplayType = tempbx;
+
+ return 1;
+}
+
+/* TW: Set offset and pitch - partly overruled by SetPitch() in XF86 */
+void
+SiS_SetCRT1Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
USHORT RefreshRateTableIndex,
- PSIS_HW_INFO HwInfo)
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT temp, DisplayUnit, infoflag;
@@ -2423,132 +2395,815 @@ SiS_SetCRT1Offset(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
} else {
infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
}
-
- DisplayUnit = SiS_GetOffset(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
+
+ DisplayUnit = SiS_GetOffset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
temp = (DisplayUnit >> 8) & 0x0f;
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0xF0,temp);
temp = DisplayUnit & 0xFF;
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x13,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x13,temp);
if(infoflag & InterlaceMode) DisplayUnit >>= 1;
DisplayUnit <<= 5;
temp = (DisplayUnit & 0xff00) >> 8;
- if(DisplayUnit & 0xff) temp++;
+ if (DisplayUnit & 0xff) temp++;
temp++;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x10,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x10,temp);
}
-/*********************************************/
-/* VCLK */
-/*********************************************/
+/* TW: New from 650/LVDS 1.10.07, 630/301B and 630/LVDS BIOS */
+void
+SiS_ResetCRT1VCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT index;
-static void
-SiS_SetCRT1VCLK(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo, USHORT RefreshRateTableIndex)
+ /* TW: We only need to do this if Panel Link is to be
+ * initialized, thus on 630/LVDS/301BDH, and 650/LVDS
+ */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) return;
+ } else {
+ if( (SiS_Pr->SiS_IF_DEF_LVDS == 0) &&
+ (!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) {
+ return;
+ }
+ }
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xCF,0x20);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x20);
+ }
+ index = 1;
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[index].SR2B);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[index].SR2C);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x80);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x31,0xcf,0x10);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x10);
+ }
+ index = 0;
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[index].SR2B);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[index].SR2C);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x80);
+}
+
+void
+SiS_SetCRT1VCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT RefreshRateTableIndex)
{
- USHORT index=0, clka, clkb;
+ USHORT index=0;
+
+ if(!SiS_Pr->UseCustomMode) {
+ index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ }
+
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ){
+
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x31,0xCF);
+
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VBVCLKData[index].Part4_A);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VBVCLKData[index].Part4_B);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x01);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x80);
+ }
+
+ } else {
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x31,0xCF);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x00);
+ }
+
+ if(SiS_Pr->UseCustomMode) {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->CSR2B);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->CSR2C);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2B,SiS_Pr->SiS_VCLKData[index].SR2B);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2C,SiS_Pr->SiS_VCLKData[index].SR2C);
+ }
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x01);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2D,0x80);
+ }
+ }
+}
+
+#if 0 /* TW: Not used */
+void
+SiS_IsLowResolution(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+ USHORT ModeFlag;
+
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0x7F);
+
+ if(ModeNo > 0x13) {
+ ModeFlag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x0F,0x80);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x01,0xF7);
+ }
+ }
+}
+#endif
+
+void
+SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex)
+{
+ USHORT data,data2,data3;
+ USHORT infoflag=0,modeflag;
+ USHORT resindex,xres;
+#ifdef SIS315H
+ ULONG longdata;
+#endif
if(SiS_Pr->UseCustomMode) {
- clka = SiS_Pr->CSR2B;
- clkb = SiS_Pr->CSR2C;
+ modeflag = SiS_Pr->CModeFlag;
+ infoflag = SiS_Pr->CInfoFlag;
} else {
- index = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- clka = SiS_Pr->SiS_VBVCLKData[index].Part4_A;
- clkb = SiS_Pr->SiS_VBVCLKData[index].Part4_B;
+ if(ModeNo > 0x13) {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
} else {
- clka = SiS_Pr->SiS_VCLKData[index].SR2B;
- clkb = SiS_Pr->SiS_VCLKData[index].SR2C;
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ }
+ }
+
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1F,0x3F); /* DAC pedestal */
+
+ if(ModeNo > 0x13) data = infoflag;
+ else data = 0;
+
+ data2 = 0;
+ if(ModeNo > 0x13) {
+ if(SiS_Pr->SiS_ModeType > 0x02) {
+ data2 |= 0x02;
+ data3 = (SiS_Pr->SiS_ModeType - ModeVGA) << 2;
+ data2 |= data3;
}
}
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "Debug: Mode infoflag = %x, Chiptype %d\n",
+ data, HwDeviceExtension->jChipType);
+#endif
+ if(data & InterlaceMode) data2 |= 0x20;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x06,0xC0,data2);
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x31,0xCF);
+ if(SiS_Pr->UseCustomMode) {
+ xres = SiS_Pr->CHDisplay;
} else {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x00);
+ resindex = SiS_GetResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ if(ModeNo <= 0x13) {
+ xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
+ } else {
+ xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
+ }
+ }
+
+ if(HwDeviceExtension->jChipType != SIS_300) {
+ data = 0x0000;
+ if(infoflag & InterlaceMode) {
+ if(xres <= 800) data = 0x0020;
+ else if(xres <= 1024) data = 0x0035;
+ else data = 0x0048;
+ }
+ data2 = data & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x19,data2);
+ data2 = (data & 0xFF00) >> 8;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x1a,0xFC,data2);
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2B,clka);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2C,clkb);
+ if(modeflag & HalfDCLK) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x08);
+ }
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x01);
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ if(modeflag & LineCompareOff) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x0F,0x08);
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0xF7);
+ }
+ } else if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(modeflag & LineCompareOff) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0F,0xB7,0x08);
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0xB7);
+ }
+ /* 630 BIOS does something for mode 0x12 here */
} else {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x2D,0x80);
+ if(modeflag & LineCompareOff) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0F,0xB7,0x08);
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x0F,0xB7);
+ }
+ /* 651 BIOS does something for mode 0x12 here */
+ }
+
+ if(HwDeviceExtension->jChipType != SIS_300) {
+ if(SiS_Pr->SiS_ModeType == ModeEGA) {
+ if(ModeNo > 0x13) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x0F,0x40);
+ }
+ }
}
+
+#ifdef SIS315H
+ /* TW: 315 BIOS sets SR17 at this point */
+ if(HwDeviceExtension->jChipType == SIS_315PRO) {
+ data = SiS_Get310DRAMType(SiS_Pr,ROMAddr,HwDeviceExtension);
+ data = SiS_Pr->SiS_SR15[2][data];
+ if(SiS_Pr->SiS_ModeType == ModeText) {
+ data &= 0xc7;
+ } else {
+ data2 = SiS_GetOffset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ data2 >>= 1;
+ if(infoflag & InterlaceMode) data2 >>= 1;
+ data3 = SiS_GetColorDepth(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ data3 >>= 1;
+ if(data3 == 0) data3++;
+ data2 /= data3;
+ if(data2 >= 0x50) {
+ data &= 0x0f;
+ data |= 0x50;
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,data);
+ }
+
+ /* TW: 330 BIOS sets SR17 at this point */
+ if(HwDeviceExtension->jChipType == SIS_330) {
+ data = SiS_Get310DRAMType(SiS_Pr,ROMAddr,HwDeviceExtension);
+ data = SiS_Pr->SiS_SR15[2][data];
+ if(SiS_Pr->SiS_ModeType <= ModeEGA) {
+ data &= 0xc7;
+ } else {
+ if(SiS_Pr->UseCustomMode) {
+ data2 = SiS_Pr->CSRClock;
+ } else {
+ data2 = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ data2 = SiS_Pr->SiS_VCLKData[data2].CLOCK;
+ }
+
+ data3 = SiS_GetColorDepth(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ data3 >>= 1;
+
+ data2 *= data3;
+
+ data3 = SiS_GetMCLK(SiS_Pr,ROMAddr, HwDeviceExtension);
+ longdata = data3 * 1024;
+
+ data2 = longdata / data2;
+
+ if(SiS_Pr->SiS_ModeType != Mode16Bpp) {
+ if(data2 >= 0x19c) data = 0xba;
+ else if(data2 >= 0x140) data = 0x7a;
+ else if(data2 >= 0x101) data = 0x3a;
+ else if(data2 >= 0xf5) data = 0x32;
+ else if(data2 >= 0xe2) data = 0x2a;
+ else if(data2 >= 0xc4) data = 0x22;
+ else if(data2 >= 0xac) data = 0x1a;
+ else if(data2 >= 0x9e) data = 0x12;
+ else if(data2 >= 0x8e) data = 0x0a;
+ else data = 0x02;
+ } else {
+ if(data2 >= 0x127) data = 0xba;
+ else data = 0x7a;
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,data);
+ }
+#endif
+
+ data = 0x60;
+ if(SiS_Pr->SiS_ModeType != ModeText) {
+ data ^= 0x60;
+ if(SiS_Pr->SiS_ModeType != ModeEGA) {
+ data ^= 0xA0;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x21,0x1F,data);
+
+ SiS_SetVCLKState(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,RefreshRateTableIndex,ModeIdIndex);
+
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40) {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x52,0x2c);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x52,0x6c);
+ }
+ }
+#endif
}
-/*********************************************/
-/* FIFO */
-/*********************************************/
+void
+SiS_SetVCLKState(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT RefreshRateTableIndex,
+ USHORT ModeIdIndex)
+{
+ USHORT data, data2=0;
+ USHORT VCLK, index=0;
-#ifdef SIS300
-static USHORT
-SiS_DoCalcDelay(SiS_Private *SiS_Pr, USHORT MCLK, USHORT VCLK, USHORT colordepth, USHORT key)
+ if (ModeNo <= 0x13) VCLK = 0;
+ else {
+ if(SiS_Pr->UseCustomMode) {
+ VCLK = SiS_Pr->CSRClock;
+ } else {
+ index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;
+ }
+ }
+
+ if(HwDeviceExtension->jChipType < SIS_315H) { /* 300 series */
+
+ data2 = 0x00;
+ if(VCLK > 150) data2 |= 0x80;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0x7B,data2); /* DAC speed */
+
+ data2 = 0x00;
+ if(VCLK >= 150) data2 |= 0x08; /* VCLK > 150 */
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xF7,data2);
+
+ } else { /* 315 series */
+
+ data = 0;
+ if(VCLK >= 166) data |= 0x0c; /* TW: Was 200; is 166 in 650, 315 and 330 BIOSes */
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xf3,data);
+
+ if(VCLK >= 166) { /* TW: Was 200, is 166 in 650, 315 and 330 BIOSes */
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1f,0xe7);
+ }
+ }
+
+ data2 = 0x03;
+ if((VCLK >= 135) && (VCLK < 160)) data2 = 0x02;
+ if((VCLK >= 160) && (VCLK < 260)) data2 = 0x01;
+ if(VCLK >= 260) data2 = 0x00;
+
+ if(HwDeviceExtension->jChipType == SIS_540) {
+ if((VCLK == 203) || (VCLK < 234)) data2 = 0x02;
+ }
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0xFC,data2); /* DAC speed */
+ } else {
+ if(HwDeviceExtension->jChipType > SIS_315PRO) {
+ /* TW: This "if" is done in 330 and 650/LVDS/301LV BIOSes; Not in 315 BIOS */
+ if(ModeNo > 0x13) data2 &= 0xfc;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0xF8,data2); /* DAC speed */
+ }
+}
+
+void
+SiS_LoadDAC(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- const UCHAR ThLowA[] = { 61, 3,52, 5,68, 7,100,11,
- 43, 3,42, 5,54, 7, 78,11,
- 34, 3,37, 5,47, 7, 67,11 };
+ USHORT data,data2;
+ USHORT time,i,j,k;
+ USHORT m,n,o;
+ USHORT si,di,bx,dl;
+ USHORT al,ah,dh;
+ USHORT DACAddr, DACData, shiftflag;
+ const USHORT *table = NULL;
+#if 0
+ USHORT tempah,tempch,tempcl,tempdh,tempal,tempbx;
+#endif
- const UCHAR ThLowB[] = { 81, 4,72, 6,88, 8,120,12,
- 55, 4,54, 6,66, 8, 90,12,
- 42, 4,45, 6,55, 8, 75,12 };
+ if(ModeNo <= 0x13) {
+ data = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ } else {
+ if(SiS_Pr->UseCustomMode) {
+ data = SiS_Pr->CModeFlag;
+ } else {
+ data = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
+ }
- const UCHAR ThTiming[] = { 1, 2, 2, 3, 0, 1, 1, 2 };
+#if 0
+ if(!(ds:489 & 0x08)) {
+#endif
- USHORT tempah, tempal, tempcl, tempbx, temp;
- ULONG longtemp;
+ data &= DACInfoFlag;
+ time = 64;
+ if(data == 0x00) table = SiS_MDA_DAC;
+ if(data == 0x08) table = SiS_CGA_DAC;
+ if(data == 0x10) table = SiS_EGA_DAC;
+ if(data == 0x18) {
+ time = 256;
+ table = SiS_VGA_DAC;
+ }
+ if(time == 256) j = 16;
+ else j = time;
+
+ if( ( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && /* 301B-DH LCD */
+ (SiS_Pr->SiS_VBType & VB_NoLCD) ) ||
+ (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) || /* LCDA */
+ (!(SiS_Pr->SiS_SetFlag & ProgrammingCRT2)) ) { /* Programming CRT1 */
+ DACAddr = SiS_Pr->SiS_P3c8;
+ DACData = SiS_Pr->SiS_P3c9;
+ shiftflag = 0;
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0xFF);
+ } else {
+ shiftflag = 1;
+ DACAddr = SiS_Pr->SiS_Part5Port;
+ DACData = SiS_Pr->SiS_Part5Port + 1;
+ }
- tempah = SiS_GetReg(SiS_Pr->SiS_P3c4,0x18);
- tempah &= 0x62;
- tempah >>= 1;
- tempal = tempah;
- tempah >>= 3;
- tempal |= tempah;
- tempal &= 0x07;
- tempcl = ThTiming[tempal];
- tempbx = SiS_GetReg(SiS_Pr->SiS_P3c4,0x16);
- tempbx >>= 6;
- tempah = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- tempah >>= 4;
- tempah &= 0x0c;
- tempbx |= tempah;
- tempbx <<= 1;
- if(key == 0) {
- tempal = ThLowA[tempbx + 1];
- tempal *= tempcl;
- tempal += ThLowA[tempbx];
+ SiS_SetReg3(DACAddr,0x00);
+
+ for(i=0; i<j; i++) {
+ data = table[i];
+ for(k=0; k<3; k++) {
+ data2 = 0;
+ if(data & 0x01) data2 = 0x2A;
+ if(data & 0x02) data2 += 0x15;
+ if(shiftflag) data2 <<= 2;
+ SiS_SetReg3(DACData,data2);
+ data >>= 2;
+ }
+ }
+
+ if(time == 256) {
+ for(i = 16; i < 32; i++) {
+ data = table[i];
+ if(shiftflag) data <<= 2;
+ for(k=0; k<3; k++) SiS_SetReg3(DACData,data);
+ }
+ si = 32;
+ for(m = 0; m < 9; m++) {
+ di = si;
+ bx = si + 4;
+ dl = 0;
+ for(n = 0; n < 3; n++) {
+ for(o = 0; o < 5; o++) {
+ dh = table[si];
+ ah = table[di];
+ al = table[bx];
+ si++;
+ SiS_WriteDAC(SiS_Pr,DACData,shiftflag,dl,ah,al,dh);
+ }
+ si -= 2;
+ for(o = 0; o < 3; o++) {
+ dh = table[bx];
+ ah = table[di];
+ al = table[si];
+ si--;
+ SiS_WriteDAC(SiS_Pr,DACData,shiftflag,dl,ah,al,dh);
+ }
+ dl++;
+ } /* for n < 3 */
+ si += 5;
+ } /* for m < 9 */
+ }
+#if 0
+ } /* ds:489 & 0x08 */
+#endif
+
+#if 0
+ if((!(ds:489 & 0x08)) && (ds:489 & 0x06)) {
+ tempbx = 0;
+ for(i=0; i< 256; i++) {
+ SiS_SetReg3(SiS_Pr->SiS_P3c8-1,tempbx); /* 7f87 */
+ tempah = SiS_GetReg3(SiS_Pr->SiS_P3c8+1); /* 7f83 */
+ tempch = SiS_GetReg3(SiS_Pr->SiS_P3c8+1);
+ tempcl = SiS_GetReg3(SiS_Pr->SiS_P3c8+1);
+ tempdh = tempah;
+ tempal = 0x4d * tempdh; /* 7fb8 */
+ tempbx += tempal;
+ tempal = 0x97 * tempch;
+ tempbx += tempal;
+ tempal = 0x1c * tempcl;
+ tempbx += tempal;
+ if((tempbx & 0x00ff) > 0x80) tempbx += 0x100;
+ tempdh = (tempbx & 0x00ff) >> 8;
+ tempch = tempdh;
+ tempcl = tempdh;
+ SiS_SetReg3(SiS_Pr->SiS_P3c8,(tempbx & 0xff)); /* 7f7c */
+ SiS_SetReg3(SiS_Pr->SiS_P3c8+1,tempdh); /* 7f92 */
+ SiS_SetReg3(SiS_Pr->SiS_P3c8+1,tempch);
+ SiS_SetReg3(SiS_Pr->SiS_P3c8+1,tempcl);
+ }
+ }
+#endif
+}
+
+void
+SiS_WriteDAC(SiS_Private *SiS_Pr, USHORT DACData, USHORT shiftflag,
+ USHORT dl, USHORT ah, USHORT al, USHORT dh)
+{
+ USHORT temp;
+ USHORT bh,bl;
+
+ bh = ah;
+ bl = al;
+ if(dl != 0) {
+ temp = bh;
+ bh = dh;
+ dh = temp;
+ if(dl == 1) {
+ temp = bl;
+ bl = dh;
+ dh = temp;
+ } else {
+ temp = bl;
+ bl = bh;
+ bh = temp;
+ }
+ }
+ if(shiftflag) {
+ dh <<= 2;
+ bh <<= 2;
+ bl <<= 2;
+ }
+ SiS_SetReg3(DACData,(USHORT)dh);
+ SiS_SetReg3(DACData,(USHORT)bh);
+ SiS_SetReg3(DACData,(USHORT)bl);
+}
+
+#ifndef LINUX_XF86
+static ULONG
+GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ ULONG AdapterMemorySize = 0;
+#ifdef SIS315H
+ USHORT counter;
+#endif
+
+ switch(HwDeviceExtension->jChipType) {
+#ifdef SIS315H
+ case SIS_315H:
+ case SIS_315:
+ case SIS_315PRO:
+ counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ AdapterMemorySize = 1 << ((counter & 0xF0) >> 4);
+ counter >>= 2;
+ counter &= 0x03;
+ if(counter == 0x02) {
+ AdapterMemorySize += (AdapterMemorySize / 2); /* DDR asymetric */
+ } else if(counter != 0) {
+ AdapterMemorySize <<= 1; /* SINGLE_CHANNEL_2_RANK or DUAL_CHANNEL_1_RANK */
+ }
+ AdapterMemorySize *= (1024*1024);
+ break;
+
+ case SIS_330:
+ counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ AdapterMemorySize = 1 << ((counter & 0xF0) >> 4);
+ counter &= 0x0c;
+ if(counter != 0) {
+ AdapterMemorySize <<= 1;
+ }
+ AdapterMemorySize *= (1024*1024);
+ break;
+
+ case SIS_550:
+ case SIS_650:
+ case SIS_740:
+ case SIS_660:
+ case SIS_760:
+ counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
+ counter++;
+ AdapterMemorySize = counter * 4;
+ AdapterMemorySize *= (1024*1024);
+ break;
+#endif
+
+#ifdef SIS300
+ case SIS_300:
+ case SIS_540:
+ case SIS_630:
+ case SIS_730:
+ AdapterMemorySize = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F;
+ AdapterMemorySize++;
+ AdapterMemorySize *= (1024*1024);
+ break;
+#endif
+ default:
+ break;
+ }
+
+ return AdapterMemorySize;
+}
+#endif
+
+#ifndef LINUX_XF86
+void
+SiS_ClearBuffer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo)
+{
+ PVOID VideoMemoryAddress = (PVOID)HwDeviceExtension->pjVideoMemoryAddress;
+ ULONG AdapterMemorySize = (ULONG)HwDeviceExtension->ulVideoMemorySize;
+ PUSHORT pBuffer;
+ int i;
+
+ if (SiS_Pr->SiS_ModeType>=ModeEGA) {
+ if(ModeNo > 0x13) {
+ AdapterMemorySize = GetDRAMSize(SiS_Pr, HwDeviceExtension);
+ SiS_SetMemory(VideoMemoryAddress,AdapterMemorySize,0);
+ } else {
+ pBuffer = VideoMemoryAddress;
+ for(i=0; i<0x4000; i++)
+ pBuffer[i] = 0x0000;
+ }
} else {
- tempal = ThLowB[tempbx + 1];
- tempal *= tempcl;
- tempal += ThLowB[tempbx];
+ pBuffer = VideoMemoryAddress;
+ if (SiS_Pr->SiS_ModeType < ModeCGA) {
+ for(i=0; i<0x4000; i++)
+ pBuffer[i] = 0x0720;
+ } else {
+ SiS_SetMemory(VideoMemoryAddress,0x8000,0);
+ }
}
- longtemp = tempal * VCLK * colordepth;
- temp = longtemp % (MCLK * 16);
- longtemp /= (MCLK * 16);
- if(temp) longtemp++;
- return((USHORT)longtemp);
}
+#endif
-static USHORT
-SiS_CalcDelay(SiS_Private *SiS_Pr, USHORT VCLK, USHORT colordepth, USHORT MCLK)
+void
+SiS_DisplayOn(SiS_Private *SiS_Pr)
{
- USHORT tempax, tempbx;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x01,0xDF,0x00);
+}
- tempbx = SiS_DoCalcDelay(SiS_Pr, MCLK, VCLK, colordepth, 0);
- tempax = SiS_DoCalcDelay(SiS_Pr, MCLK, VCLK, colordepth, 1);
- if(tempax < 4) tempax = 4;
- tempax -= 4;
- if(tempbx < tempax) tempbx = tempax;
- return(tempbx);
+void
+SiS_DisplayOff(SiS_Private *SiS_Pr)
+{
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x01,0xDF,0x20);
}
-static void
-SiS_SetCRT1FIFO_300(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo,
+
+/* ========================================== */
+/* SR CRTC GR */
+void
+SiS_SetReg1(USHORT port, USHORT index, USHORT data)
+{
+ OutPortByte(port,index);
+ OutPortByte(port+1,data);
+}
+
+/* ========================================== */
+/* AR(3C0) */
+void
+SiS_SetReg2(SiS_Private *SiS_Pr, USHORT port, USHORT index, USHORT data)
+{
+ InPortByte(port+0x3da-0x3c0);
+ OutPortByte(SiS_Pr->SiS_P3c0,index);
+ OutPortByte(SiS_Pr->SiS_P3c0,data);
+ OutPortByte(SiS_Pr->SiS_P3c0,0x20);
+}
+
+void
+SiS_SetReg3(USHORT port, USHORT data)
+{
+ OutPortByte(port,data);
+}
+
+void
+SiS_SetReg4(USHORT port, ULONG data)
+{
+ OutPortLong(port,data);
+}
+
+void
+SiS_SetReg5(USHORT port, USHORT data)
+{
+ OutPortWord(port,data);
+}
+
+UCHAR SiS_GetReg1(USHORT port, USHORT index)
+{
+ UCHAR data;
+
+ OutPortByte(port,index);
+ data = InPortByte(port+1);
+
+ return(data);
+}
+
+UCHAR
+SiS_GetReg2(USHORT port)
+{
+ UCHAR data;
+
+ data= InPortByte(port);
+
+ return(data);
+}
+
+ULONG
+SiS_GetReg3(USHORT port)
+{
+ ULONG data;
+
+ data = InPortLong(port);
+
+ return(data);
+}
+
+USHORT
+SiS_GetReg4(USHORT port)
+{
+ ULONG data;
+
+ data = InPortWord(port);
+
+ return(data);
+}
+
+void
+SiS_ClearDAC(SiS_Private *SiS_Pr, ULONG port)
+{
+ int i;
+
+ OutPortByte(port, 0);
+ port++;
+ for (i=0; i < (256 * 3); i++) {
+ OutPortByte(port, 0);
+ }
+
+}
+
+#if 0 /* TW: Unused */
+void
+SiS_SetInterlace(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT RefreshRateTableIndex)
+{
+ ULONG Temp;
+ USHORT data,Temp2;
+
+ if (ModeNo<=0x13) return;
+
+ Temp = (ULONG)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x01);
+ Temp++;
+ Temp <<= 3;
+
+ if(Temp == 1024) data = 0x0035;
+ else if(Temp == 1280) data = 0x0048;
+ else data = 0x0000;
+
+ Temp2 = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+ Temp2 &= InterlaceMode;
+ if(Temp2 == 0) data=0x0000;
+
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x19,data);
+
+ Temp = (ULONG)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x1A);
+ Temp = (USHORT)(Temp & 0xFC);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x1A,(USHORT)Temp);
+
+ Temp = (ULONG)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x0f);
+ Temp2 = (USHORT)Temp & 0xBF;
+ if(ModeNo==0x37) Temp2 |= 0x40;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x1A,(USHORT)Temp2);
+}
+#endif
+
+#ifdef SIS315H
+void
+SiS_SetCRT1FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT modeflag;
+
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x3D,0xFE); /* disable auto-threshold */
+
+ if(ModeNo > 0x13) {
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
+ if( (!(modeflag & DoubleScanMode)) || (!(modeflag & HalfDCLK))) {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x08,0x34);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x09,0xF0);
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x3D,0x01);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x08,0xAE);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x09,0xF0);
+ }
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x08,0xAE);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x09,0xF0);
+ }
+}
+#endif
+
+#ifdef SIS300
+void
+SiS_SetCRT1FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,PSIS_HW_DEVICE_INFO HwDeviceExtension,
USHORT RefreshRateTableIndex)
{
USHORT ThresholdLow = 0;
@@ -2574,21 +3229,21 @@ SiS_SetCRT1FIFO_300(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo,
case 5 : colorth = 4; break;
}
- index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x3A);
+ index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A);
index &= 0x07;
MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK; /* Get MCLK */
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
tempah &= 0xc3;
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x16,0x3c,tempah);
do {
- ThresholdLow = SiS_CalcDelay(SiS_Pr, VCLK, colorth, MCLK);
+ ThresholdLow = SiS_CalcDelay(SiS_Pr, ROMAddr, VCLK, colorth, MCLK);
ThresholdLow++;
if(ThresholdLow < 0x13) break;
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x16,0xfc);
ThresholdLow = 0x13;
- tempah = SiS_GetReg(SiS_Pr->SiS_P3c4,0x16);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16);
tempah >>= 6;
if(!(tempah)) break;
tempah--;
@@ -2600,77 +3255,90 @@ SiS_SetCRT1FIFO_300(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo,
/* Write CRT/CPU threshold low, CRT/Engine threshold high */
temp = (ThresholdLow << 4) | 0x0f;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x08,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x08,temp);
temp = (ThresholdLow & 0x10) << 1;
if(ModeNo > 0x13) temp |= 0x40;
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0f,0x9f,temp);
/* What is this? */
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x3B,0x09);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x3B,0x09);
/* Write CRT/CPU threshold high */
temp = ThresholdLow + 3;
if(temp > 0x0f) temp = 0x0f;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x09,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x09,temp);
}
-static USHORT
-SiS_CalcDelay2(SiS_Private *SiS_Pr, UCHAR key, PSIS_HW_INFO HwInfo)
+USHORT
+SiS_CalcDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT VCLK, USHORT colordepth, USHORT MCLK)
{
- USHORT data,index;
- const UCHAR LatencyFactor[] = {
- 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */
- 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */
- 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */
- 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */
- 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */
- 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */
- 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */
- 00, 68, 66, 59, 57, 37 /*; 128 bit BQ=1 */
- };
- const UCHAR LatencyFactor730[] = {
- 69, 63, 61,
- 86, 79, 77,
- 103, 96, 94,
- 120,113,111,
- 137,130,128, /* --- Table ends with this entry, data below */
- 137,130,128, /* to avoid using illegal values */
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- };
+ USHORT tempax, tempbx;
- if(HwInfo->jChipType == SIS_730) {
- index = ((key & 0x0f) * 3) + ((key & 0xC0) >> 6);
- data = LatencyFactor730[index];
+ tempbx = SiS_DoCalcDelay(SiS_Pr, MCLK, VCLK, colordepth, 0);
+ tempax = SiS_DoCalcDelay(SiS_Pr, MCLK, VCLK, colordepth, 1);
+ if(tempax < 4) tempax = 4;
+ tempax -= 4;
+ if(tempbx < tempax) tempbx = tempax;
+ return(tempbx);
+}
+
+USHORT
+SiS_DoCalcDelay(SiS_Private *SiS_Pr, USHORT MCLK, USHORT VCLK, USHORT colordepth, USHORT key)
+{
+ const UCHAR ThLowA[] = { 61, 3,52, 5,68, 7,100,11,
+ 43, 3,42, 5,54, 7, 78,11,
+ 34, 3,37, 5,47, 7, 67,11 };
+
+ const UCHAR ThLowB[] = { 81, 4,72, 6,88, 8,120,12,
+ 55, 4,54, 6,66, 8, 90,12,
+ 42, 4,45, 6,55, 8, 75,12 };
+
+ const UCHAR ThTiming[] = { 1, 2, 2, 3, 0, 1, 1, 2 };
+
+ USHORT tempah, tempal, tempcl, tempbx, temp;
+ ULONG longtemp;
+
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18);
+ tempah &= 0x62;
+ tempah >>= 1;
+ tempal = tempah;
+ tempah >>= 3;
+ tempal |= tempah;
+ tempal &= 0x07;
+ tempcl = ThTiming[tempal];
+ tempbx = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16);
+ tempbx >>= 6;
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ tempah >>= 4;
+ tempah &= 0x0c;
+ tempbx |= tempah;
+ tempbx <<= 1;
+ if(key == 0) {
+ tempal = ThLowA[tempbx + 1];
+ tempal *= tempcl;
+ tempal += ThLowA[tempbx];
} else {
- index = (key & 0xE0) >> 5;
- if(key & 0x10) index +=6;
- if(!(key & 0x01)) index += 24;
- data = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- if(data & 0x0080) index += 12;
- data = LatencyFactor[index];
+ tempal = ThLowB[tempbx + 1];
+ tempal *= tempcl;
+ tempal += ThLowB[tempbx];
}
- return(data);
+ longtemp = tempal * VCLK * colordepth;
+ temp = longtemp % (MCLK * 16);
+ longtemp /= (MCLK * 16);
+ if(temp) longtemp++;
+ return((USHORT)longtemp);
}
-static void
-SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
- PSIS_HW_INFO HwInfo,
+void
+SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,
USHORT RefreshRateTableIndex)
{
USHORT i,index,data,VCLK,MCLK,colorth=0;
ULONG B,eax,bl,data2;
USHORT ThresholdLow=0;
- UCHAR FQBQData[]= {
+ UCHAR FQBQData[]= {
0x01,0x21,0x41,0x61,0x81,
0x31,0x51,0x71,0x91,0xb1,
0x00,0x20,0x40,0x60,0x80,
@@ -2696,7 +3364,7 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
}
- index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1A);
+ index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A);
index &= 0x07;
MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK; /* Get MCLK */
@@ -2710,10 +3378,10 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
case 5 : colorth = 4; break;
}
- if(HwInfo->jChipType == SIS_730) {
-
+ if(HwDeviceExtension->jChipType == SIS_730) {
+
do {
- B = SiS_CalcDelay2(SiS_Pr, FQBQData730[i], HwInfo) * VCLK * colorth;
+ B = SiS_CalcDelay2(SiS_Pr, ROMAddr, FQBQData730[i], HwDeviceExtension) * VCLK * colorth;
bl = B / (MCLK * 16);
if(B == bl * 16 * MCLK) {
@@ -2737,7 +3405,7 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
} else {
do {
- B = SiS_CalcDelay2(SiS_Pr, FQBQData[i], HwInfo) * VCLK * colorth;
+ B = SiS_CalcDelay2(SiS_Pr, ROMAddr, FQBQData[i], HwDeviceExtension) * VCLK * colorth;
bl = B / (MCLK * 16);
if(B == bl * 16 * MCLK) {
@@ -2760,7 +3428,7 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
}
}
else {
- if(HwInfo->jChipType == SIS_730) {
+ if(HwDeviceExtension->jChipType == SIS_730) {
} else {
i = 9;
}
@@ -2768,18 +3436,18 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
}
/* Write foreground and background queue */
- if(HwInfo->jChipType == SIS_730) {
+ if(HwDeviceExtension->jChipType == SIS_730) {
data2 = FQBQData730[i];
data2 = (data2 & 0xC0) >> 5;
data2 <<= 8;
#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x80000050);
- eax = SiS_GetRegLong(0xcfc);
+ SiS_SetReg4(0xcf8,0x80000050);
+ eax = SiS_GetReg3(0xcfc);
eax &= 0xfffff9ff;
eax |= data2;
- SiS_SetRegLong(0xcfc,eax);
+ SiS_SetReg4(0xcfc,eax);
#else
/* We use pci functions X offers. We use pcitag 0, because
* we want to read/write to the host bridge (which is always
@@ -2795,32 +3463,32 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
data2 = FQBQData730[i] << 8;
data2 = (data2 & 0x0f00) | ((data2 & 0x3000) >> 8);
data2 <<= 20;
-
+
#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x800000A0);
- eax = SiS_GetRegLong(0xcfc);
+ SiS_SetReg4(0xcf8,0x800000A0);
+ eax = SiS_GetReg3(0xcfc);
eax &= 0x00ffffff;
eax |= data2;
- SiS_SetRegLong(0xcfc,eax);
+ SiS_SetReg4(0xcfc,eax);
#else
eax = pciReadLong(0x00000000, 0xA0);
eax &= 0x00ffffff;
eax |= data2;
pciWriteLong(0x00000000, 0xA0, eax);
-#endif
+#endif
} else {
-
+
data2 = FQBQData[i];
data2 = (data2 & 0xf0) >> 4;
data2 <<= 24;
#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x80000050);
- eax = SiS_GetRegLong(0xcfc);
+ SiS_SetReg4(0xcf8,0x80000050);
+ eax = SiS_GetReg3(0xcfc);
eax &= 0xf0ffffff;
eax |= data2;
- SiS_SetRegLong(0xcfc,eax);
+ SiS_SetReg4(0xcfc,eax);
#else
eax = pciReadLong(0x00000000, 0x50);
eax &= 0xf0ffffff;
@@ -2834,1229 +3502,87 @@ SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, USHORT ModeNo,
data2 <<= 24;
#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x800000A0);
- eax = SiS_GetRegLong(0xcfc);
+ SiS_SetReg4(0xcf8,0x800000A0);
+ eax = SiS_GetReg3(0xcfc);
eax &= 0xf0ffffff;
eax |= data2;
- SiS_SetRegLong(0xcfc,eax);
+ SiS_SetReg4(0xcfc,eax);
#else
eax = pciReadLong(0x00000000, 0xA0);
eax &= 0xf0ffffff;
eax |= data2;
pciWriteLong(0x00000000, 0xA0, eax);
#endif
-
+
}
/* Write CRT/CPU threshold low, CRT/Engine threshold high */
data = ((ThresholdLow & 0x0f) << 4) | 0x0f;
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x08,data);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x08,data);
data = (ThresholdLow & 0x10) << 1;
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0F,0xDF,data);
/* What is this? */
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x3B,0x09);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x3B,0x09);
/* Write CRT/CPU threshold high (gap = 3) */
data = ThresholdLow + 3;
if(data > 0x0f) data = 0x0f;
SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x09,0x80,data);
}
-#endif
-
-#ifdef SIS315H
-static void
-SiS_SetCRT1FIFO_310(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
-{
- USHORT modeflag;
- /* disable auto-threshold */
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x3D,0xFE);
-
- if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- } else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
-
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x08,0xAE);
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x09,0xF0);
- if(ModeNo > 0x13) {
- if(HwInfo->jChipType >= SIS_661) {
- if(!(modeflag & HalfDCLK)) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x08,0x34);
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x3D,0x01);
- }
- } else {
- if((!(modeflag & DoubleScanMode)) || (!(modeflag & HalfDCLK))) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x08,0x34);
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x3D,0x01);
- }
- }
- }
-}
-#endif
-
-/*********************************************/
-/* MODE REGISTERS */
-/*********************************************/
-
-static void
-SiS_SetVCLKState(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT RefreshRateTableIndex,
- USHORT ModeIdIndex)
-{
- USHORT data=0, VCLK=0, index=0;
-
- if(ModeNo > 0x13) {
- if(SiS_Pr->UseCustomMode) {
- VCLK = SiS_Pr->CSRClock;
- } else {
- index = SiS_GetVCLK2Ptr(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
- VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK;
- }
- }
-
- if(HwInfo->jChipType < SIS_315H) {
-
- if(VCLK > 150) data |= 0x80;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0x7B,data);
-
- data = 0x00;
- if(VCLK >= 150) data |= 0x08;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xF7,data);
-
- } else {
-
- if(VCLK >= 166) data |= 0x0c;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x32,0xf3,data);
-
- if(VCLK >= 166) {
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1f,0xe7);
- }
- }
-
- /* DAC speed */
- if(HwInfo->jChipType >= SIS_661) {
-
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0xE8,0x10);
-
- } else {
-
- data = 0x03;
- if((VCLK >= 135) && (VCLK < 160)) data = 0x02;
- else if((VCLK >= 160) && (VCLK < 260)) data = 0x01;
- else if(VCLK >= 260) data = 0x00;
-
- if(HwInfo->jChipType == SIS_540) {
- if((VCLK == 203) || (VCLK < 234)) data = 0x02;
- }
-
- if(HwInfo->jChipType < SIS_315H) {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0xFC,data);
- } else {
- if(HwInfo->jChipType > SIS_315PRO) {
- if(ModeNo > 0x13) data &= 0xfc;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x07,0xF8,data);
- }
-
- }
-}
-
-static void
-SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex)
-{
- USHORT data,infoflag=0,modeflag;
- USHORT resindex,xres;
-#ifdef SIS315H
- USHORT data2,data3;
- ULONG longdata;
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
-#endif
-
- if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- infoflag = SiS_Pr->CInfoFlag;
- xres = SiS_Pr->CHDisplay;
- } else {
- resindex = SiS_GetResInfo(SiS_Pr,ModeNo,ModeIdIndex);
- if(ModeNo > 0x13) {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
- xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
- } else {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
- }
- }
-
- /* Disable DPMS */
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1F,0x3F);
-
- data = 0;
- if(ModeNo > 0x13) {
- if(SiS_Pr->SiS_ModeType > 0x02) {
- data |= 0x02;
- data |= ((SiS_Pr->SiS_ModeType - ModeVGA) << 2);
- }
- if(infoflag & InterlaceMode) data |= 0x20;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x06,0xC0,data);
-
- if(HwInfo->jChipType != SIS_300) {
- data = 0;
- if(infoflag & InterlaceMode) {
- if(xres <= 800) data = 0x0020;
- else if(xres <= 1024) data = 0x0035;
- else data = 0x0048;
- }
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x19,(data & 0xFF));
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x1a,0xFC,(data >> 8));
- }
-
- if(modeflag & HalfDCLK) {
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x08);
- }
-
- data = 0;
- if(modeflag & LineCompareOff) data = 0x08;
- if(HwInfo->jChipType == SIS_300) {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0F,0xF7,data);
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0F,0xB7,data);
- if(SiS_Pr->SiS_ModeType == ModeEGA) {
- if(ModeNo > 0x13) {
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x0F,0x40);
- }
- }
- }
-
- if(HwInfo->jChipType >= SIS_661) {
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x31,0xfb);
- }
-
-#ifdef SIS315H
- if(HwInfo->jChipType == SIS_315PRO) {
-
- data = SiS_Get310DRAMType(SiS_Pr, HwInfo);
- data = SiS_Pr->SiS_SR15[2][data];
- if(SiS_Pr->SiS_ModeType == ModeText) {
- data &= 0xc7;
- } else {
- data2 = SiS_GetOffset(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
- data2 >>= 1;
- if(infoflag & InterlaceMode) data2 >>= 1;
- data3 = SiS_GetColorDepth(SiS_Pr,ModeNo,ModeIdIndex) >> 1;
- if(!data3) data3++;
- data2 /= data3;
- if(data2 >= 0x50) {
- data &= 0x0f;
- data |= 0x50;
- }
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x17,data);
-
- } else if( (HwInfo->jChipType == SIS_330) ||
- ((HwInfo->jChipType == SIS_760) && (SiS_Pr->SiS_SysFlags & SF_760UMA))) {
-
- data = SiS_Get310DRAMType(SiS_Pr, HwInfo);
- if(HwInfo->jChipType == SIS_330) {
- data = SiS_Pr->SiS_SR15[2][data];
- } else {
- if(SiS_Pr->SiS_ROMNew) data = ROMAddr[0xf6];
- else if(SiS_Pr->SiS_UseROM) data = ROMAddr[0x100 + data];
- else data = 0xba;
- }
- if(SiS_Pr->SiS_ModeType <= ModeEGA) {
- data &= 0xc7;
- } else {
- if(SiS_Pr->UseCustomMode) {
- data2 = SiS_Pr->CSRClock;
- } else {
- data2 = SiS_GetVCLK2Ptr(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
- data2 = SiS_Pr->SiS_VCLKData[data2].CLOCK;
- }
-
- data3 = SiS_GetColorDepth(SiS_Pr,ModeNo,ModeIdIndex) >> 1;
- if(data3) data2 *= data3;
-
- longdata = SiS_GetMCLK(SiS_Pr, HwInfo) * 1024;
-
- data2 = longdata / data2;
-
- if(HwInfo->jChipType == SIS_330) {
- if(SiS_Pr->SiS_ModeType != Mode16Bpp) {
- if (data2 >= 0x19c) data = 0xba;
- else if(data2 >= 0x140) data = 0x7a;
- else if(data2 >= 0x101) data = 0x3a;
- else if(data2 >= 0xf5) data = 0x32;
- else if(data2 >= 0xe2) data = 0x2a;
- else if(data2 >= 0xc4) data = 0x22;
- else if(data2 >= 0xac) data = 0x1a;
- else if(data2 >= 0x9e) data = 0x12;
- else if(data2 >= 0x8e) data = 0x0a;
- else data = 0x02;
- } else {
- if(data2 >= 0x127) data = 0xba;
- else data = 0x7a;
- }
- } else {
- if (data2 >= 0x190) data = 0xba;
- else if(data2 >= 0xff) data = 0x7a;
- else if(data2 >= 0xd3) data = 0x3a;
- else if(data2 >= 0xa9) data = 0x1a;
- else if(data2 >= 0x93) data = 0x0a;
- else data = 0x02;
- }
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x17,data);
- }
-#endif
-
- data = 0x60;
- if(SiS_Pr->SiS_ModeType != ModeText) {
- data ^= 0x60;
- if(SiS_Pr->SiS_ModeType != ModeEGA) {
- data ^= 0xA0;
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x21,0x1F,data);
-
- SiS_SetVCLKState(SiS_Pr, HwInfo, ModeNo, RefreshRateTableIndex, ModeIdIndex);
-
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x52,0x2c);
- } else {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x52,0x6c);
- }
- }
-#endif
-}
-
-/*********************************************/
-/* LOAD DAC */
-/*********************************************/
-
-#if 0
-static void
-SiS_ClearDAC(SiS_Private *SiS_Pr, ULONG port)
-{
- int i;
-
- OutPortByte(port, 0);
- port++;
- for (i=0; i < (256 * 3); i++) {
- OutPortByte(port, 0);
- }
-}
-#endif
-
-static void
-SiS_WriteDAC(SiS_Private *SiS_Pr, SISIOADDRESS DACData, USHORT shiftflag,
- USHORT dl, USHORT ah, USHORT al, USHORT dh)
-{
- USHORT temp,bh,bl;
-
- bh = ah;
- bl = al;
- if(dl != 0) {
- temp = bh;
- bh = dh;
- dh = temp;
- if(dl == 1) {
- temp = bl;
- bl = dh;
- dh = temp;
- } else {
- temp = bl;
- bl = bh;
- bh = temp;
- }
- }
- if(shiftflag) {
- dh <<= 2;
- bh <<= 2;
- bl <<= 2;
- }
- SiS_SetRegByte(DACData,(USHORT)dh);
- SiS_SetRegByte(DACData,(USHORT)bh);
- SiS_SetRegByte(DACData,(USHORT)bl);
-}
-
-void
-SiS_LoadDAC(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex)
-{
- USHORT data,data2;
- USHORT time,i,j,k,m,n,o;
- USHORT si,di,bx,dl,al,ah,dh;
- USHORT shiftflag;
- SISIOADDRESS DACAddr, DACData;
- const USHORT *table = NULL;
-
- if(ModeNo <= 0x13) {
- data = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else {
- if(SiS_Pr->UseCustomMode) {
- data = SiS_Pr->CModeFlag;
- } else {
- data = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- }
-
- data &= DACInfoFlag;
- time = 64;
- if(data == 0x00) table = SiS_MDA_DAC;
- if(data == 0x08) table = SiS_CGA_DAC;
- if(data == 0x10) table = SiS_EGA_DAC;
- if(data == 0x18) {
- time = 256;
- table = SiS_VGA_DAC;
- }
- if(time == 256) j = 16;
- else j = time;
-
- if( ( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && /* 301B-DH LCD */
- (SiS_Pr->SiS_VBType & VB_NoLCD) ) ||
- (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) || /* LCDA */
- (!(SiS_Pr->SiS_SetFlag & ProgrammingCRT2)) ) { /* Programming CRT1 */
- DACAddr = SiS_Pr->SiS_P3c8;
- DACData = SiS_Pr->SiS_P3c9;
- shiftflag = 0;
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
- } else {
- shiftflag = 1;
- DACAddr = SiS_Pr->SiS_Part5Port;
- DACData = SiS_Pr->SiS_Part5Port + 1;
- }
-
- SiS_SetRegByte(DACAddr,0x00);
-
- for(i=0; i<j; i++) {
- data = table[i];
- for(k=0; k<3; k++) {
- data2 = 0;
- if(data & 0x01) data2 = 0x2A;
- if(data & 0x02) data2 += 0x15;
- if(shiftflag) data2 <<= 2;
- SiS_SetRegByte(DACData, data2);
- data >>= 2;
- }
- }
-
- if(time == 256) {
- for(i = 16; i < 32; i++) {
- data = table[i];
- if(shiftflag) data <<= 2;
- for(k = 0; k < 3; k++) SiS_SetRegByte(DACData, data);
- }
- si = 32;
- for(m = 0; m < 9; m++) {
- di = si;
- bx = si + 4;
- dl = 0;
- for(n = 0; n < 3; n++) {
- for(o = 0; o < 5; o++) {
- dh = table[si];
- ah = table[di];
- al = table[bx];
- si++;
- SiS_WriteDAC(SiS_Pr, DACData, shiftflag, dl, ah, al, dh);
- }
- si -= 2;
- for(o = 0; o < 3; o++) {
- dh = table[bx];
- ah = table[di];
- al = table[si];
- si--;
- SiS_WriteDAC(SiS_Pr, DACData, shiftflag, dl, ah, al, dh);
- }
- dl++;
- } /* for n < 3 */
- si += 5;
- } /* for m < 9 */
- }
-}
-
-/*********************************************/
-/* SET CRT1 REGISTER GROUP */
-/*********************************************/
-
-static void
-SiS_SetCRT1Group(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex)
+USHORT
+SiS_CalcDelay2(SiS_Private *SiS_Pr, UCHAR *ROMAddr,UCHAR key, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT StandTableIndex,RefreshRateTableIndex;
-
- SiS_Pr->SiS_CRT1Mode = ModeNo;
- StandTableIndex = SiS_GetModePtr(SiS_Pr, ModeNo, ModeIdIndex);
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchCRT2)) {
- SiS_DisableBridge(SiS_Pr, HwInfo);
- }
- }
-
- SiS_ResetSegmentRegisters(SiS_Pr, HwInfo);
-
- SiS_SetSeqRegs(SiS_Pr, StandTableIndex, HwInfo);
- SiS_SetMiscRegs(SiS_Pr, StandTableIndex, HwInfo);
- SiS_SetCRTCRegs(SiS_Pr, HwInfo, StandTableIndex);
- SiS_SetATTRegs(SiS_Pr, StandTableIndex, HwInfo);
- SiS_SetGRCRegs(SiS_Pr, StandTableIndex);
- SiS_ClearExt1Regs(SiS_Pr, HwInfo, ModeNo);
- SiS_ResetCRT1VCLK(SiS_Pr, HwInfo);
-
- SiS_Pr->SiS_SelectCRT2Rate = 0;
- SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
-
-#ifdef LINUX_XF86
- xf86DrvMsgVerb(0, X_PROBED, 4, "(init: VBType=0x%04x, VBInfo=0x%04x)\n",
- SiS_Pr->SiS_VBType, SiS_Pr->SiS_VBInfo);
-#endif
-
- if(SiS_Pr->SiS_VBInfo & SetSimuScanMode) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
- }
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
- }
-
- RefreshRateTableIndex = SiS_GetRatePtr(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
-
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- SiS_Pr->SiS_SetFlag &= ~ProgrammingCRT2;
- }
-
- if(RefreshRateTableIndex != 0xFFFF) {
- SiS_SetCRT1Sync(SiS_Pr, RefreshRateTableIndex);
- SiS_SetCRT1CRTC(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- SiS_SetCRT1Offset(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- SiS_SetCRT1VCLK(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
- }
-
-#ifdef SIS300
- if(HwInfo->jChipType == SIS_300) {
- SiS_SetCRT1FIFO_300(SiS_Pr, ModeNo,HwInfo,RefreshRateTableIndex);
- } else if((HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730) ||
- (HwInfo->jChipType == SIS_540)) {
- SiS_SetCRT1FIFO_630(SiS_Pr, ModeNo, HwInfo, RefreshRateTableIndex);
- }
-#endif
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetCRT1FIFO_310(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- }
-#endif
-
- SiS_SetCRT1ModeRegs(SiS_Pr, HwInfo, ModeNo, ModeIdIndex, RefreshRateTableIndex);
-
- SiS_LoadDAC(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
-
-#ifndef LINUX_XF86
- if(SiS_Pr->SiS_flag_clearbuffer) {
- SiS_ClearBuffer(SiS_Pr,HwInfo,ModeNo);
- }
-#endif
+ USHORT data,index;
+ const UCHAR LatencyFactor[] = {
+ 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */
+ 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */
+ 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */
+ 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */
+ 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */
+ 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */
+ 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */
+ 00, 68, 66, 59, 57, 37 /*; 128 bit BQ=1 */
+ };
+ const UCHAR LatencyFactor730[] = {
+ 69, 63, 61,
+ 86, 79, 77,
+ 103, 96, 94,
+ 120,113,111,
+ 137,130,128, /* --- Table ends with this entry, data below */
+ 137,130,128, /* to avoid using illegal values */
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ };
- if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchCRT2 | SetCRT2ToLCDA))) {
- SiS_WaitRetrace1(SiS_Pr);
- SiS_DisplayOn(SiS_Pr);
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ index = ((key & 0x0f) * 3) + ((key & 0xC0) >> 6);
+ data = LatencyFactor730[index];
+ } else {
+ index = (key & 0xE0) >> 5;
+ if(key & 0x10) index +=6;
+ if(!(key & 0x01)) index += 24;
+ data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ if(data & 0x0080) index += 12;
+ data = LatencyFactor[index];
}
+ return(data);
}
-
-
-
-/*********************************************/
-/* HELPER: RESET VIDEO BRIDGE */
-/*********************************************/
-
-static void
-SiS_ResetVB(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT temp;
-
- if(SiS_Pr->SiS_UseROM) {
- if(HwInfo->jChipType < SIS_330) {
- temp = ROMAddr[VB310Data_1_2_Offset] | 0x40;
- if(SiS_Pr->SiS_ROMNew) temp = ROMAddr[0x80] | 0x40;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x02,temp);
- } else if(HwInfo->jChipType >= SIS_661) {
- temp = ROMAddr[0x7e];
- if(SiS_Pr->SiS_ROMNew) temp = ROMAddr[0x80];
- if(HwInfo->jChipType >= SIS_660) temp |= 0x40;
- else if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x7b) >= 100) temp |= 0x40;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x02,temp);
- }
- }
-}
-
-/*********************************************/
-/* HELPER: SET VIDEO REGISTERS */
-/*********************************************/
-
-static void
-SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if((IS_SIS651) || (IS_SISM650)) {
- SiS_SetReg(SiS_Pr->SiS_VidCapt, 0x3f, 0x00); /* Fiddle with capture regs */
- SiS_SetReg(SiS_Pr->SiS_VidCapt, 0x00, 0x00);
- SiS_SetReg(SiS_Pr->SiS_VidPlay, 0x00, 0x86); /* (BIOS does NOT unlock) */
- SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x30, 0xfe); /* Fiddle with video regs */
- SiS_SetRegAND(SiS_Pr->SiS_VidPlay, 0x3f, 0xef);
- }
- /* !!! This does not support modes < 0x13 !!! */
-}
-
-/*********************************************/
-/* XFree86: SET SCREEN PITCH */
-/*********************************************/
-
-#ifdef LINUX_XF86
-static void
-SiS_SetPitchCRT1(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
-{
- SISPtr pSiS = SISPTR(pScrn);
- UShort HDisplay = pSiS->scrnPitch >> 3;
-
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x13,(HDisplay & 0xFF));
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0xF0,(HDisplay>>8));
-}
-
-static void
-SiS_SetPitchCRT2(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
-{
- SISPtr pSiS = SISPTR(pScrn);
- UShort HDisplay = pSiS->scrnPitch2 >> 3;
-
- /* Unlock CRT2 */
- if(pSiS->VGAEngine == SIS_315_VGA)
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2F, 0x01);
- else
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24, 0x01);
-
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x07,(HDisplay & 0xFF));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0xF0,(HDisplay >> 8));
-}
-
-static void
-SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
-{
- SISPtr pSiS = SISPTR(pScrn);
- BOOLEAN isslavemode = FALSE;
-
- if( (pSiS->VBFlags & VB_VIDEOBRIDGE) &&
- ( ((pSiS->VGAEngine == SIS_300_VGA) &&
- (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
- ((pSiS->VGAEngine == SIS_315_VGA) &&
- (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
- isslavemode = TRUE;
- }
-
- /* We need to set pitch for CRT1 if bridge is in slave mode, too */
- if((pSiS->VBFlags & DISPTYPE_DISP1) || (isslavemode)) {
- SiS_SetPitchCRT1(SiS_Pr, pScrn);
- }
- /* We must not set the pitch for CRT2 if bridge is in slave mode */
- if((pSiS->VBFlags & DISPTYPE_DISP2) && (!isslavemode)) {
- SiS_SetPitchCRT2(SiS_Pr, pScrn);
- }
-}
-#endif
-
-/*********************************************/
-/* SiSSetMode() */
-/*********************************************/
-
-#ifdef LINUX_XF86
-/* We need pScrn for setting the pitch correctly */
-BOOLEAN
-SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch)
-#else
-BOOLEAN
-SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,USHORT ModeNo)
-#endif
-{
- USHORT ModeIdIndex;
- SISIOADDRESS BaseAddr = HwInfo->ulIOAddress;
- unsigned char backupreg=0;
-#ifndef LINUX_XF86
- USHORT KeepLockReg;
- ULONG temp;
-
- SiS_Pr->UseCustomMode = FALSE;
- SiS_Pr->CRT1UsesCustomMode = FALSE;
-#endif
-
- if(SiS_Pr->UseCustomMode) {
- ModeNo = 0xfe;
- }
-
- SiSInitPtr(SiS_Pr, HwInfo);
- SiSRegInit(SiS_Pr, BaseAddr);
- SiS_GetSysFlags(SiS_Pr, HwInfo);
-
-#if defined(LINUX_XF86) && (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__))
- if(pScrn) SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
- else
-#endif
- SiS_Pr->SiS_VGAINFO = 0x11;
-
- SiSInitPCIetc(SiS_Pr, HwInfo);
- SiSSetLVDSetc(SiS_Pr, HwInfo);
- SiSDetermineROMUsage(SiS_Pr, HwInfo);
-
- SiS_Pr->SiS_flag_clearbuffer = 0;
-
- if(!SiS_Pr->UseCustomMode) {
-#ifndef LINUX_XF86
- if(!(ModeNo & 0x80)) SiS_Pr->SiS_flag_clearbuffer = 1;
-#endif
- ModeNo &= 0x7f;
- }
-
-#ifndef LINUX_XF86
- KeepLockReg = SiS_GetReg(SiS_Pr->SiS_P3c4,0x05);
-#endif
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
-
- SiS_UnLockCRT2(SiS_Pr, HwInfo);
-
- if(!SiS_Pr->UseCustomMode) {
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
- } else {
- ModeIdIndex = 0;
- }
-
- SiS_GetVBType(SiS_Pr, HwInfo);
-
- /* Init/restore some VB registers */
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_ResetVB(SiS_Pr, HwInfo);
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x32,0x10);
- SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x00,0x0c);
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- } else {
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- }
- }
-
- /* Get VB information (connectors, connected devices) */
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, (SiS_Pr->UseCustomMode) ? 0 : 1);
- SiS_SetYPbPr(SiS_Pr, HwInfo);
- SiS_SetTVMode(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_GetLCDResInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_SetLowModeTest(SiS_Pr, ModeNo, HwInfo);
-
-#ifndef LINUX_XF86
- /* 3. Check memory size (Kernel framebuffer driver only) */
- temp = SiS_CheckMemorySize(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
- if(!temp) return(0);
-#endif
-
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetupCR5x(SiS_Pr, HwInfo);
- }
-
- if(SiS_Pr->UseCustomMode) {
- SiS_Pr->CRT1UsesCustomMode = TRUE;
- SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
- SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
- } else {
- SiS_Pr->CRT1UsesCustomMode = FALSE;
- }
-
- /* Set mode on CRT1 */
- if( (SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) ||
- (!(SiS_Pr->SiS_VBInfo & SwitchCRT2)) ) {
- SiS_SetCRT1Group(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
- }
-
- /* Set mode on CRT2 */
- if(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchCRT2 | SetCRT2ToLCDA)) {
- if( (SiS_Pr->SiS_VBType & VB_SISVB) ||
- (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- (SiS_Pr->SiS_IF_DEF_CH70xx != 0) ||
- (SiS_Pr->SiS_IF_DEF_TRUMPION != 0) ) {
- SiS_SetCRT2Group(SiS_Pr, HwInfo, ModeNo);
- }
- }
-
- SiS_HandleCRT1(SiS_Pr);
-
- SiS_StrangeStuff(SiS_Pr, HwInfo);
-
- SiS_DisplayOn(SiS_Pr);
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
-
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(!(SiS_IsDualEdge(SiS_Pr, HwInfo))) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
- }
- }
- }
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- if(!SiS_Pr->SiS_ROMNew) {
- if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
- } else {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0xFE);
- }
- }
-
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupreg);
-
- if((IS_SIS650) && (SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & 0xfc)) {
- if((ModeNo == 0x03) || (ModeNo == 0x10)) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x51,0x80);
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x56,0x08);
- }
- }
-
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & SetCRT2ToLCD) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
- }
- } else if((HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730)) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupreg);
- }
- }
-
-#ifdef LINUX_XF86
- if(pScrn) {
- /* SetPitch: Adapt to virtual size & position */
- if((ModeNo > 0x13) && (dosetpitch)) {
- SiS_SetPitch(SiS_Pr, pScrn);
- }
-
- /* Backup/Set ModeNo in BIOS scratch area */
- SiS_GetSetModeID(pScrn, ModeNo);
- }
-#endif
-
-#ifndef LINUX_XF86 /* We never lock registers in XF86 */
- if(KeepLockReg == 0xA1) SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
- else SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x00);
-#endif
-
- return TRUE;
-}
-
-/*********************************************/
-/* XFree86: SiSBIOSSetMode() */
-/* for non-Dual-Head mode */
-/*********************************************/
-
-#ifdef LINUX_XF86
-BOOLEAN
-SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom)
-{
- SISPtr pSiS = SISPTR(pScrn);
- UShort ModeNo=0;
-
- SiS_Pr->UseCustomMode = FALSE;
-
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting custom mode %dx%d\n",
- SiS_Pr->CHDisplay,
- (mode->Flags & V_INTERLACE ? SiS_Pr->CVDisplay * 2 :
- (mode->Flags & V_DBLSCAN ? SiS_Pr->CVDisplay / 2 :
- SiS_Pr->CVDisplay)));
-
- return(SiSSetMode(SiS_Pr, HwInfo, pScrn, ModeNo, TRUE));
-
- }
-
- ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes);
- if(!ModeNo) return FALSE;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
-
- return(SiSSetMode(SiS_Pr, HwInfo, pScrn, ModeNo, TRUE));
-}
-
-/*********************************************/
-/* XFree86: SiSBIOSSetModeCRT2() */
-/* for Dual-Head modes */
-/*********************************************/
-BOOLEAN
-SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom)
-{
- USHORT ModeIdIndex;
- SISIOADDRESS BaseAddr = HwInfo->ulIOAddress;
- UShort ModeNo = 0;
- unsigned char backupreg=0;
- SISPtr pSiS = SISPTR(pScrn);
-#ifdef SISDUALHEAD
- SISEntPtr pSiSEnt = pSiS->entityPrivate;
-#endif
-
- SiS_Pr->UseCustomMode = FALSE;
-
- /* Remember: Custom modes for CRT2 are ONLY supported
- * -) on 315/330 series,
- * -) on the 30x/B/C, and
- * -) if CRT2 is LCD or VGA
- */
-
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
-
- ModeNo = 0xfe;
-
- } else {
-
- BOOLEAN havecustommodes = pSiS->HaveCustomModes;
-
-#ifdef SISMERGED
- if(pSiS->MergedFB) havecustommodes = pSiS->HaveCustomModes2;
-#endif
-
- ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, havecustommodes);
- if(!ModeNo) return FALSE;
-
- }
-
- SiSRegInit(SiS_Pr, BaseAddr);
- SiSInitPtr(SiS_Pr, HwInfo);
- SiS_GetSysFlags(SiS_Pr, HwInfo);
-#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__))
- SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
-#else
- SiS_Pr->SiS_VGAINFO = 0x11;
-#endif
- SiSInitPCIetc(SiS_Pr, HwInfo);
- SiSSetLVDSetc(SiS_Pr, HwInfo);
- SiSDetermineROMUsage(SiS_Pr, HwInfo);
-
- /* Save mode info so we can set it from within SetMode for CRT1 */
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- pSiSEnt->CRT2ModeNo = ModeNo;
- pSiSEnt->CRT2DMode = mode;
- pSiSEnt->CRT2IsCustom = IsCustom;
- pSiSEnt->CRT2CR30 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- pSiSEnt->CRT2CR31 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
- pSiSEnt->CRT2CR35 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- pSiSEnt->CRT2CR38 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
-#if 0
- /* We can't set CRT2 mode before CRT1 mode is set */
- if(pSiSEnt->CRT1ModeNo == -1) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "Setting CRT2 mode delayed until after setting CRT1 mode\n");
- return TRUE;
- }
-#endif
- pSiSEnt->CRT2ModeSet = TRUE;
- }
-#endif
-
- /* We don't clear the buffer under X */
- SiS_Pr->SiS_flag_clearbuffer=0;
-
- if(SiS_Pr->UseCustomMode) {
-
- USHORT temptemp = SiS_Pr->CVDisplay;
-
- if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
- else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "Setting custom mode %dx%d on CRT2\n",
- SiS_Pr->CHDisplay, temptemp);
-
- } else {
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "Setting standard mode 0x%x on CRT2\n", ModeNo);
-
- }
-
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
-
- SiS_UnLockCRT2(SiS_Pr, HwInfo);
-
- if(!SiS_Pr->UseCustomMode) {
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
- } else {
- ModeIdIndex = 0;
- }
-
- SiS_GetVBType(SiS_Pr, HwInfo);
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_ResetVB(SiS_Pr, HwInfo);
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x32,0x10);
- SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x00,0x0c);
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- } else {
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- }
- }
-
- /* Get VB information (connectors, connected devices) */
- if(!SiS_Pr->UseCustomMode) {
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, 1);
- } else {
- /* If this is a custom mode, we don't check the modeflag for CRT2Mode */
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, 0);
- }
- SiS_SetYPbPr(SiS_Pr, HwInfo);
- SiS_SetTVMode(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_GetLCDResInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_SetLowModeTest(SiS_Pr, ModeNo, HwInfo);
-
- /* Set mode on CRT2 */
- if( (SiS_Pr->SiS_VBType & VB_SISVB) ||
- (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- (SiS_Pr->SiS_IF_DEF_CH70xx != 0) ||
- (SiS_Pr->SiS_IF_DEF_TRUMPION != 0) ) {
- SiS_SetCRT2Group(SiS_Pr, HwInfo, ModeNo);
- }
-
- SiS_StrangeStuff(SiS_Pr, HwInfo);
-
- SiS_DisplayOn(SiS_Pr);
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
-
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(!(SiS_IsDualEdge(SiS_Pr, HwInfo))) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
- }
- }
- }
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- if(!SiS_Pr->SiS_ROMNew) {
- if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
- } else {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0xFE);
- }
- }
-
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupreg);
-
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & SetCRT2ToLCD) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
- }
- } else if((HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730)) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupreg);
- }
- }
-
- /* SetPitch: Adapt to virtual size & position */
- SiS_SetPitchCRT2(SiS_Pr, pScrn);
-
- return TRUE;
-}
-
-/*********************************************/
-/* XFree86: SiSBIOSSetModeCRT1() */
-/* for Dual-Head modes */
-/*********************************************/
-
-BOOLEAN
-SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom)
-{
- SISPtr pSiS = SISPTR(pScrn);
- SISIOADDRESS BaseAddr = HwInfo->ulIOAddress;
- USHORT ModeIdIndex, ModeNo=0;
- UCHAR backupreg=0;
-#ifdef SISDUALHEAD
- SISEntPtr pSiSEnt = pSiS->entityPrivate;
- UCHAR backupcr30, backupcr31, backupcr38, backupcr35, backupp40d=0;
- BOOLEAN backupcustom;
-#endif
-
- SiS_Pr->UseCustomMode = FALSE;
-
- if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
-
- USHORT temptemp = SiS_Pr->CVDisplay;
-
- if(SiS_Pr->CModeFlag & DoubleScanMode) temptemp >>= 1;
- else if(SiS_Pr->CInfoFlag & InterlaceMode) temptemp <<= 1;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "Setting custom mode %dx%d on CRT1\n",
- SiS_Pr->CHDisplay, temptemp);
- ModeNo = 0xfe;
-
- } else {
-
- ModeNo = SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes);
- if(!ModeNo) return FALSE;
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "Setting standard mode 0x%x on CRT1\n", ModeNo);
- }
-
- SiSInitPtr(SiS_Pr, HwInfo);
- SiSRegInit(SiS_Pr, BaseAddr);
- SiS_GetSysFlags(SiS_Pr, HwInfo);
-#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__))
- SiS_Pr->SiS_VGAINFO = SiS_GetSetBIOSScratch(pScrn, 0x489, 0xff);
-#else
- SiS_Pr->SiS_VGAINFO = 0x11;
#endif
- SiSInitPCIetc(SiS_Pr, HwInfo);
- SiSSetLVDSetc(SiS_Pr, HwInfo);
- SiSDetermineROMUsage(SiS_Pr, HwInfo);
-
- /* We don't clear the buffer under X */
- SiS_Pr->SiS_flag_clearbuffer = 0;
-
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x86);
-
- SiS_UnLockCRT2(SiS_Pr, HwInfo);
-
- if(!SiS_Pr->UseCustomMode) {
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
- } else {
- ModeIdIndex = 0;
- }
-
- /* Determine VBType */
- SiS_GetVBType(SiS_Pr, HwInfo);
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- } else {
- backupreg = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- }
- }
-
- /* Get VB information (connectors, connected devices) */
- /* (We don't care if the current mode is a CRT2 mode) */
- SiS_GetVBInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, 0);
- SiS_SetYPbPr(SiS_Pr, HwInfo);
- SiS_SetTVMode(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_GetLCDResInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_SetLowModeTest(SiS_Pr, ModeNo, HwInfo);
-
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetupCR5x(SiS_Pr, HwInfo);
- }
-
- /* Set mode on CRT1 */
- SiS_SetCRT1Group(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetCRT2Group(SiS_Pr, HwInfo, ModeNo);
- }
-
- /* SetPitch: Adapt to virtual size & position */
- SiS_SetPitchCRT1(SiS_Pr, pScrn);
-
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- pSiSEnt->CRT1ModeNo = ModeNo;
- pSiSEnt->CRT1DMode = mode;
- }
-#endif
-
- if(SiS_Pr->UseCustomMode) {
- SiS_Pr->CRT1UsesCustomMode = TRUE;
- SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
- SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
- } else {
- SiS_Pr->CRT1UsesCustomMode = FALSE;
- }
-
- /* Reset CRT2 if changing mode on CRT1 */
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- if(pSiSEnt->CRT2ModeNo != -1) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
- "(Re-)Setting mode for CRT2\n");
- backupcustom = SiS_Pr->UseCustomMode;
- backupcr30 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- backupcr31 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
- backupcr35 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- backupcr38 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- /* Backup LUT-enable */
- if(pSiSEnt->CRT2ModeSet) {
- backupp40d = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x0d) & 0x08;
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x30,pSiSEnt->CRT2CR30);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x31,pSiSEnt->CRT2CR31);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,pSiSEnt->CRT2CR35);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,pSiSEnt->CRT2CR38);
- }
- SiSBIOSSetModeCRT2(SiS_Pr, HwInfo, pSiSEnt->pScrn_1,
- pSiSEnt->CRT2DMode, pSiSEnt->CRT2IsCustom);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x30,backupcr30);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x31,backupcr31);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupcr35);
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupcr38);
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0d, ~0x08, backupp40d);
- }
- SiS_Pr->UseCustomMode = backupcustom;
- }
- }
-#endif
-
- /* Warning: From here, the custom mode entries in SiS_Pr are
- * possibly overwritten
- */
-
- SiS_HandleCRT1(SiS_Pr);
-
- SiS_StrangeStuff(SiS_Pr, HwInfo);
-
- SiS_DisplayOn(SiS_Pr);
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xFF);
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(HwInfo->jChipType >= SIS_315H) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x38,backupreg);
- } else if((HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730)) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x35,backupreg);
- }
- }
-
- /* Backup/Set ModeNo in BIOS scratch area */
- SiS_GetSetModeID(pScrn,ModeNo);
-
- return TRUE;
-}
-#endif /* Linux_XF86 */
-
#ifdef LINUX_XF86
BOOLEAN
-SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
const USHORT PanelTypeTable300[16] = {
0xc101, 0xc117, 0x0121, 0xc135, 0xc142, 0xc152, 0xc162, 0xc072,
@@ -4070,249 +3596,70 @@ SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
0xc111, 0xc122, 0xc133, 0xc144, 0xc155, 0xc166, 0xc177, 0xc188,
0xc199, 0xc0aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
};
- USHORT tempax,tempbx,temp;
-
- if(HwInfo->jChipType < SIS_315H) {
-
- tempax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x18);
- tempbx = tempax & 0x0F;
- if(!(tempax & 0x10)){
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1){
- tempbx = 0;
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x38);
- if(temp & 0x40) tempbx |= 0x08;
- if(temp & 0x20) tempbx |= 0x02;
- if(temp & 0x01) tempbx |= 0x01;
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x39);
- if(temp & 0x80) tempbx |= 0x04;
- } else {
- return 0;
- }
- }
- tempbx = PanelTypeTable300[tempbx];
- tempbx |= LCDSync;
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x36,temp);
- temp = (tempbx & 0xFF00) >> 8;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,~(LCDSyncBit|LCDRGB18Bit),temp);
+ USHORT tempax,tempbx,tempah,temp;
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+
+ tempax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18);
+ tempbx = tempax & 0x0F;
+ if(!(tempax & 0x10)){
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1){
+ tempbx = 0;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x38);
+ if(temp & 0x40) tempbx |= 0x08;
+ if(temp & 0x20) tempbx |= 0x02;
+ if(temp & 0x01) tempbx |= 0x01;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x39);
+ if(temp & 0x80) tempbx |= 0x04;
+ } else {
+ return 0;
+ }
+ }
+ tempbx = PanelTypeTable300[tempbx];
+ tempbx |= LCDSync;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
+ temp = (tempbx & 0xFF00) >> 8;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,~(LCDSyncBit|LCDRGB18Bit),temp);
} else {
- if(HwInfo->jChipType >= SIS_661) return 0;
-
- tempax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1a);
- tempax &= 0x1e;
- tempax >>= 1;
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(tempax == 0) {
+ tempax = tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1a);
+ tempax &= 0x1e;
+ tempax >>= 1;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(tempax == 0) {
/* TODO: Include HUGE detection routine
(Probably not worth bothering)
*/
return 0;
- }
- temp = tempax & 0xff;
- tempax--;
- tempbx = PanelTypeTable310LVDS[tempax];
- } else {
- tempbx = PanelTypeTable31030x[tempax];
- temp = tempbx & 0xff;
- }
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x36,temp);
- tempbx = (tempbx & 0xff00) >> 8;
- temp = tempbx & 0xc1;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,~(LCDSyncBit|LCDRGB18Bit),temp);
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- temp = tempbx & 0x04;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x39,0xfb,temp);
- }
+ }
+ temp = tempax & 0xff;
+ tempax--;
+ tempbx = PanelTypeTable310LVDS[tempax];
+ } else {
+ tempbx = PanelTypeTable31030x[tempax];
+ temp = tempbx & 0xff;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
+ tempbx = (tempbx & 0xff00) >> 8;
+ temp = tempbx & 0xc1;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,~(LCDSyncBit|LCDRGB18Bit),temp);
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ temp = tempbx & 0x04;
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x39,0xfb,temp);
+ }
}
return 1;
}
#endif
-#ifndef GETBITSTR
-#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l))
-#define GENMASK(mask) BITMASK(1?mask,0?mask)
-#define GETBITS(var,mask) (((var) & GENMASK(mask)) >> (0?mask))
-#define GETBITSTR(val,from,to) ((GETBITS(val,from)) << (0?to))
-#endif
-
-static void
-SiS_CalcCRRegisters(SiS_Private *SiS_Pr, int depth)
-{
- SiS_Pr->CCRT1CRTC[0] = ((SiS_Pr->CHTotal >> 3) - 5) & 0xff; /* CR0 */
- SiS_Pr->CCRT1CRTC[1] = (SiS_Pr->CHDisplay >> 3) - 1; /* CR1 */
- SiS_Pr->CCRT1CRTC[2] = (SiS_Pr->CHBlankStart >> 3) - 1; /* CR2 */
- SiS_Pr->CCRT1CRTC[3] = (((SiS_Pr->CHBlankEnd >> 3) - 1) & 0x1F) | 0x80; /* CR3 */
- SiS_Pr->CCRT1CRTC[4] = (SiS_Pr->CHSyncStart >> 3) + 3; /* CR4 */
- SiS_Pr->CCRT1CRTC[5] = ((((SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) | /* CR5 */
- (((SiS_Pr->CHSyncEnd >> 3) + 3) & 0x1F);
-
- SiS_Pr->CCRT1CRTC[6] = (SiS_Pr->CVTotal - 2) & 0xFF; /* CR6 */
- SiS_Pr->CCRT1CRTC[7] = (((SiS_Pr->CVTotal - 2) & 0x100) >> 8) /* CR7 */
- | (((SiS_Pr->CVDisplay - 1) & 0x100) >> 7)
- | ((SiS_Pr->CVSyncStart & 0x100) >> 6)
- | (((SiS_Pr->CVBlankStart - 1) & 0x100) >> 5)
- | 0x10
- | (((SiS_Pr->CVTotal - 2) & 0x200) >> 4)
- | (((SiS_Pr->CVDisplay - 1) & 0x200) >> 3)
- | ((SiS_Pr->CVSyncStart & 0x200) >> 2);
-
- SiS_Pr->CCRT1CRTC[16] = ((((SiS_Pr->CVBlankStart - 1) & 0x200) >> 4) >> 5); /* CR9 */
-
- if(depth != 8) {
- if(SiS_Pr->CHDisplay >= 1600) SiS_Pr->CCRT1CRTC[16] |= 0x60; /* SRE */
- else if(SiS_Pr->CHDisplay >= 640) SiS_Pr->CCRT1CRTC[16] |= 0x40;
- }
-
-#if 0
- if (mode->VScan >= 32)
- regp->CRTC[9] |= 0x1F;
- else if (mode->VScan > 1)
- regp->CRTC[9] |= mode->VScan - 1;
-#endif
-
- SiS_Pr->CCRT1CRTC[8] = (SiS_Pr->CVSyncStart ) & 0xFF; /* CR10 */
- SiS_Pr->CCRT1CRTC[9] = ((SiS_Pr->CVSyncEnd ) & 0x0F) | 0x80; /* CR11 */
- SiS_Pr->CCRT1CRTC[10] = (SiS_Pr->CVDisplay - 1) & 0xFF; /* CR12 */
- SiS_Pr->CCRT1CRTC[11] = (SiS_Pr->CVBlankStart - 1) & 0xFF; /* CR15 */
- SiS_Pr->CCRT1CRTC[12] = (SiS_Pr->CVBlankEnd - 1) & 0xFF; /* CR16 */
-
- SiS_Pr->CCRT1CRTC[13] = /* SRA */
- GETBITSTR((SiS_Pr->CVTotal -2), 10:10, 0:0) |
- GETBITSTR((SiS_Pr->CVDisplay -1), 10:10, 1:1) |
- GETBITSTR((SiS_Pr->CVBlankStart-1), 10:10, 2:2) |
- GETBITSTR((SiS_Pr->CVSyncStart ), 10:10, 3:3) |
- GETBITSTR((SiS_Pr->CVBlankEnd -1), 8:8, 4:4) |
- GETBITSTR((SiS_Pr->CVSyncEnd ), 4:4, 5:5) ;
-
- SiS_Pr->CCRT1CRTC[14] = /* SRB */
- GETBITSTR((SiS_Pr->CHTotal >> 3) - 5, 9:8, 1:0) |
- GETBITSTR((SiS_Pr->CHDisplay >> 3) - 1, 9:8, 3:2) |
- GETBITSTR((SiS_Pr->CHBlankStart >> 3) - 1, 9:8, 5:4) |
- GETBITSTR((SiS_Pr->CHSyncStart >> 3) + 3, 9:8, 7:6) ;
-
-
- SiS_Pr->CCRT1CRTC[15] = /* SRC */
- GETBITSTR((SiS_Pr->CHBlankEnd >> 3) - 1, 7:6, 1:0) |
- GETBITSTR((SiS_Pr->CHSyncEnd >> 3) + 3, 5:5, 2:2) ;
-}
-
-void
-SiS_CalcLCDACRT1Timing(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex)
-{
- USHORT modeflag, tempax, tempbx, VGAHDE = SiS_Pr->SiS_VGAHDE;
- int i,j;
-
- /* 1:1 data: use data set by setcrt1crtc() */
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) return;
-
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- } else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
-
- if(modeflag & HalfDCLK) VGAHDE >>= 1;
-
- SiS_Pr->CHDisplay = VGAHDE;
- SiS_Pr->CHBlankStart = VGAHDE;
-
- SiS_Pr->CVDisplay = SiS_Pr->SiS_VGAVDE;
- SiS_Pr->CVBlankStart = SiS_Pr->SiS_VGAVDE;
-
- tempbx = SiS_Pr->PanelHT - SiS_Pr->PanelXRes;
- tempax = SiS_Pr->SiS_VGAHDE; /* not /2 ! */
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- tempax = SiS_Pr->PanelXRes;
- }
- tempbx += tempax;
- if(modeflag & HalfDCLK) tempbx -= VGAHDE;
- SiS_Pr->CHTotal = SiS_Pr->CHBlankEnd = tempbx;
-
- tempax = VGAHDE;
- tempbx = SiS_Pr->CHTotal;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- tempbx = SiS_Pr->PanelXRes;
- if(modeflag & HalfDCLK) tempbx >>= 1;
- tempax += ((tempbx - tempax) >> 1);
- }
-
- tempax += SiS_Pr->PanelHRS;
- SiS_Pr->CHSyncStart = tempax;
- tempax += SiS_Pr->PanelHRE;
- SiS_Pr->CHSyncEnd = tempax;
-
- tempbx = SiS_Pr->PanelVT - SiS_Pr->PanelYRes;
- tempax = SiS_Pr->SiS_VGAVDE;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- tempax = SiS_Pr->PanelYRes;
- }
- SiS_Pr->CVTotal = SiS_Pr->CVBlankEnd = tempbx + tempax;
-
- tempax = SiS_Pr->SiS_VGAVDE;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- tempax += (SiS_Pr->PanelYRes - tempax) >> 1;
- }
- tempax += SiS_Pr->PanelVRS;
- SiS_Pr->CVSyncStart = tempax;
- tempax += SiS_Pr->PanelVRE;
- SiS_Pr->CVSyncEnd = tempax;
-
- SiS_CalcCRRegisters(SiS_Pr, 8);
- SiS_Pr->CCRT1CRTC[16] &= ~0xE0;
-
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
-
- for(i=0,j=0;i<=7;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x10;i<=10;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x15;i<=12;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3d4,j,SiS_Pr->CCRT1CRTC[i]);
- }
- for(j=0x0A;i<=15;i++,j++) {
- SiS_SetReg(SiS_Pr->SiS_P3c4,j,SiS_Pr->CCRT1CRTC[i]);
- }
-
- tempax = SiS_Pr->CCRT1CRTC[16] & 0xE0;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x0E,0x1F,tempax);
-
- tempax = (SiS_Pr->CCRT1CRTC[16] & 0x01) << 5;
- if(modeflag & DoubleScanMode) tempax |= 0x80;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,0x5F,tempax);
-
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "%d %d %d %d %d %d %d %d (%d %d %d %d)\n",
- SiS_Pr->CHDisplay, SiS_Pr->CHSyncStart, SiS_Pr->CHSyncEnd, SiS_Pr->CHTotal,
- SiS_Pr->CVDisplay, SiS_Pr->CVSyncStart, SiS_Pr->CVSyncEnd, SiS_Pr->CVTotal,
- SiS_Pr->CHBlankStart, SiS_Pr->CHBlankEnd, SiS_Pr->CVBlankStart, SiS_Pr->CVBlankEnd);
-
- xf86DrvMsg(0, X_INFO, " {{0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
- SiS_Pr->CCRT1CRTC[0], SiS_Pr->CCRT1CRTC[1],
- SiS_Pr->CCRT1CRTC[2], SiS_Pr->CCRT1CRTC[3],
- SiS_Pr->CCRT1CRTC[4], SiS_Pr->CCRT1CRTC[5],
- SiS_Pr->CCRT1CRTC[6], SiS_Pr->CCRT1CRTC[7]);
- xf86DrvMsg(0, X_INFO, " 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
- SiS_Pr->CCRT1CRTC[8], SiS_Pr->CCRT1CRTC[9],
- SiS_Pr->CCRT1CRTC[10], SiS_Pr->CCRT1CRTC[11],
- SiS_Pr->CCRT1CRTC[12], SiS_Pr->CCRT1CRTC[13],
- SiS_Pr->CCRT1CRTC[14], SiS_Pr->CCRT1CRTC[15]);
- xf86DrvMsg(0, X_INFO, " 0x%02x}},\n", SiS_Pr->CCRT1CRTC[16]);
-#endif
-}
-
/* ================ XFREE86 ================= */
/* Helper functions */
#ifdef LINUX_XF86
-
USHORT
SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags)
{
@@ -4344,17 +3691,17 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags)
pSiS->SiS_Pr->CFlags = mode->Flags;
if(pSiS->SiS_Pr->CFlags & V_INTERLACE) {
- pSiS->SiS_Pr->CVDisplay >>= 1;
- pSiS->SiS_Pr->CVSyncStart >>= 1;
- pSiS->SiS_Pr->CVSyncEnd >>= 1;
- pSiS->SiS_Pr->CVTotal >>= 1;
+ pSiS->SiS_Pr->CVDisplay >>= 1;
+ pSiS->SiS_Pr->CVSyncStart >>= 1;
+ pSiS->SiS_Pr->CVSyncEnd >>= 1;
+ pSiS->SiS_Pr->CVTotal >>= 1;
}
if(pSiS->SiS_Pr->CFlags & V_DBLSCAN) {
- /* pSiS->SiS_Pr->CDClock <<= 1; */
- pSiS->SiS_Pr->CVDisplay <<= 1;
- pSiS->SiS_Pr->CVSyncStart <<= 1;
- pSiS->SiS_Pr->CVSyncEnd <<= 1;
- pSiS->SiS_Pr->CVTotal <<= 1;
+ /* pSiS->SiS_Pr->CDClock <<= 1; */
+ pSiS->SiS_Pr->CVDisplay <<= 1;
+ pSiS->SiS_Pr->CVSyncStart <<= 1;
+ pSiS->SiS_Pr->CVSyncEnd <<= 1;
+ pSiS->SiS_Pr->CVTotal <<= 1;
}
pSiS->SiS_Pr->CHBlankStart = pSiS->SiS_Pr->CHDisplay;
@@ -4393,56 +3740,118 @@ SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags)
pSiS->SiS_Pr->CSRClock = (pSiS->SiS_Pr->CDClock / 1000) + 1;
- SiS_CalcCRRegisters(pSiS->SiS_Pr, depth);
+ pSiS->SiS_Pr->CCRT1CRTC[0] = ((pSiS->SiS_Pr->CHTotal >> 3) - 5) & 0xff;
+ pSiS->SiS_Pr->CCRT1CRTC[1] = (pSiS->SiS_Pr->CHDisplay >> 3) - 1;
+ pSiS->SiS_Pr->CCRT1CRTC[2] = (pSiS->SiS_Pr->CHBlankStart >> 3) - 1;
+ pSiS->SiS_Pr->CCRT1CRTC[3] = (((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x1F) | 0x80;
+ pSiS->SiS_Pr->CCRT1CRTC[4] = (pSiS->SiS_Pr->CHSyncStart >> 3) + 3;
+ pSiS->SiS_Pr->CCRT1CRTC[5] = ((((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1) & 0x20) << 2) |
+ (((pSiS->SiS_Pr->CHSyncEnd >> 3) + 3) & 0x1F);
+
+ pSiS->SiS_Pr->CCRT1CRTC[6] = (pSiS->SiS_Pr->CVTotal - 2) & 0xFF;
+ pSiS->SiS_Pr->CCRT1CRTC[7] = (((pSiS->SiS_Pr->CVTotal - 2) & 0x100) >> 8)
+ | (((pSiS->SiS_Pr->CVDisplay - 1) & 0x100) >> 7)
+ | ((pSiS->SiS_Pr->CVSyncStart & 0x100) >> 6)
+ | (((pSiS->SiS_Pr->CVBlankStart - 1) & 0x100) >> 5)
+ | 0x10
+ | (((pSiS->SiS_Pr->CVTotal - 2) & 0x200) >> 4)
+ | (((pSiS->SiS_Pr->CVDisplay - 1) & 0x200) >> 3)
+ | ((pSiS->SiS_Pr->CVSyncStart & 0x200) >> 2);
+
+ pSiS->SiS_Pr->CCRT1CRTC[16] = ((((pSiS->SiS_Pr->CVBlankStart - 1) & 0x200) >> 4) >> 5); /* cr9 */
- switch(depth) {
- case 8: pSiS->SiS_Pr->CModeFlag |= 0x223b; break;
- case 16: pSiS->SiS_Pr->CModeFlag |= 0x227d; break;
- case 32: pSiS->SiS_Pr->CModeFlag |= 0x22ff; break;
- default: return 0;
- }
+#if 0
+ if (mode->VScan >= 32)
+ regp->CRTC[9] |= 0x1F;
+ else if (mode->VScan > 1)
+ regp->CRTC[9] |= mode->VScan - 1;
+#endif
- if(pSiS->SiS_Pr->CFlags & V_DBLSCAN)
- pSiS->SiS_Pr->CModeFlag |= DoubleScanMode;
+ pSiS->SiS_Pr->CCRT1CRTC[8] = (pSiS->SiS_Pr->CVSyncStart ) & 0xFF; /* cr10 */
+ pSiS->SiS_Pr->CCRT1CRTC[9] = ((pSiS->SiS_Pr->CVSyncEnd ) & 0x0F) | 0x80; /* cr11 */
+ pSiS->SiS_Pr->CCRT1CRTC[10] = (pSiS->SiS_Pr->CVDisplay - 1) & 0xFF; /* cr12 */
+ pSiS->SiS_Pr->CCRT1CRTC[11] = (pSiS->SiS_Pr->CVBlankStart - 1) & 0xFF; /* cr15 */
+ pSiS->SiS_Pr->CCRT1CRTC[12] = (pSiS->SiS_Pr->CVBlankEnd - 1) & 0xFF; /* cr16 */
- if((pSiS->SiS_Pr->CVDisplay >= 1024) ||
- (pSiS->SiS_Pr->CVTotal >= 1024) ||
- (pSiS->SiS_Pr->CHDisplay >= 1024))
- pSiS->SiS_Pr->CModeFlag |= LineCompareOff;
+ pSiS->SiS_Pr->CCRT1CRTC[13] =
+ GETBITSTR((pSiS->SiS_Pr->CVTotal -2), 10:10, 0:0) |
+ GETBITSTR((pSiS->SiS_Pr->CVDisplay -1), 10:10, 1:1) |
+ GETBITSTR((pSiS->SiS_Pr->CVBlankStart-1), 10:10, 2:2) |
+ GETBITSTR((pSiS->SiS_Pr->CVSyncStart ), 10:10, 3:3) |
+ GETBITSTR((pSiS->SiS_Pr->CVBlankEnd -1), 8:8, 4:4) |
+ GETBITSTR((pSiS->SiS_Pr->CVSyncEnd ), 4:4, 5:5) ;
- if(pSiS->SiS_Pr->CFlags & V_CLKDIV2)
- pSiS->SiS_Pr->CModeFlag |= HalfDCLK;
+ pSiS->SiS_Pr->CCRT1CRTC[14] =
+ GETBITSTR((pSiS->SiS_Pr->CHTotal >> 3) - 5, 9:8, 1:0) |
+ GETBITSTR((pSiS->SiS_Pr->CHDisplay >> 3) - 1, 9:8, 3:2) |
+ GETBITSTR((pSiS->SiS_Pr->CHBlankStart >> 3) - 1, 9:8, 5:4) |
+ GETBITSTR((pSiS->SiS_Pr->CHSyncStart >> 3) + 3, 9:8, 7:6) ;
- pSiS->SiS_Pr->CInfoFlag = 0x0007;
- if(pSiS->SiS_Pr->CFlags & V_NHSYNC)
- pSiS->SiS_Pr->CInfoFlag |= 0x4000;
+ pSiS->SiS_Pr->CCRT1CRTC[15] =
+ GETBITSTR((pSiS->SiS_Pr->CHBlankEnd >> 3) - 1, 7:6, 1:0) |
+ GETBITSTR((pSiS->SiS_Pr->CHSyncEnd >> 3) + 3, 5:5, 2:2) ;
- if(pSiS->SiS_Pr->CFlags & V_NVSYNC)
- pSiS->SiS_Pr->CInfoFlag |= 0x8000;
+ switch(depth) {
+ case 8:
+ pSiS->SiS_Pr->CModeFlag |= 0x223b;
+ break;
+ case 16:
+ pSiS->SiS_Pr->CModeFlag |= 0x227d;
+ break;
+ case 32:
+ pSiS->SiS_Pr->CModeFlag |= 0x22ff;
+ break;
+ default:
+ return 0;
+ }
+
+ if(pSiS->SiS_Pr->CFlags & V_DBLSCAN)
+ pSiS->SiS_Pr->CModeFlag |= DoubleScanMode;
+ if((pSiS->SiS_Pr->CVDisplay >= 1024) ||
+ (pSiS->SiS_Pr->CVTotal >= 1024) ||
+ (pSiS->SiS_Pr->CHDisplay >= 1024))
+ pSiS->SiS_Pr->CModeFlag |= LineCompareOff;
+ if(pSiS->SiS_Pr->CFlags & V_CLKDIV2)
+ pSiS->SiS_Pr->CModeFlag |= HalfDCLK;
- if(pSiS->SiS_Pr->CFlags & V_INTERLACE)
- pSiS->SiS_Pr->CInfoFlag |= InterlaceMode;
+ pSiS->SiS_Pr->CInfoFlag = 0x0007;
+ if(pSiS->SiS_Pr->CFlags & V_NHSYNC)
+ pSiS->SiS_Pr->CInfoFlag |= 0x4000;
+ if(pSiS->SiS_Pr->CFlags & V_NVSYNC)
+ pSiS->SiS_Pr->CInfoFlag |= 0x8000;
+ if(pSiS->SiS_Pr->CFlags & V_INTERLACE)
+ pSiS->SiS_Pr->CInfoFlag |= InterlaceMode;
pSiS->SiS_Pr->UseCustomMode = TRUE;
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Custom mode %dx%d:\n",
+ xf86DrvMsg(0, X_INFO, "Custom mode %dx%d:\n",
pSiS->SiS_Pr->CHDisplay,pSiS->SiS_Pr->CVDisplay);
xf86DrvMsg(0, X_INFO, "Modeflag %04x, Infoflag %04x\n",
pSiS->SiS_Pr->CModeFlag, pSiS->SiS_Pr->CInfoFlag);
xf86DrvMsg(0, X_INFO, " {{0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
- pSiS->SiS_Pr->CCRT1CRTC[0], pSiS->SiS_Pr->CCRT1CRTC[1],
- pSiS->SiS_Pr->CCRT1CRTC[2], pSiS->SiS_Pr->CCRT1CRTC[3],
- pSiS->SiS_Pr->CCRT1CRTC[4], pSiS->SiS_Pr->CCRT1CRTC[5],
- pSiS->SiS_Pr->CCRT1CRTC[6], pSiS->SiS_Pr->CCRT1CRTC[7]);
+ pSiS->SiS_Pr->CCRT1CRTC[0],
+ pSiS->SiS_Pr->CCRT1CRTC[1],
+ pSiS->SiS_Pr->CCRT1CRTC[2],
+ pSiS->SiS_Pr->CCRT1CRTC[3],
+ pSiS->SiS_Pr->CCRT1CRTC[4],
+ pSiS->SiS_Pr->CCRT1CRTC[5],
+ pSiS->SiS_Pr->CCRT1CRTC[6],
+ pSiS->SiS_Pr->CCRT1CRTC[7]);
xf86DrvMsg(0, X_INFO, " 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n",
- pSiS->SiS_Pr->CCRT1CRTC[8], pSiS->SiS_Pr->CCRT1CRTC[9],
- pSiS->SiS_Pr->CCRT1CRTC[10], pSiS->SiS_Pr->CCRT1CRTC[11],
- pSiS->SiS_Pr->CCRT1CRTC[12], pSiS->SiS_Pr->CCRT1CRTC[13],
- pSiS->SiS_Pr->CCRT1CRTC[14], pSiS->SiS_Pr->CCRT1CRTC[15]);
+ pSiS->SiS_Pr->CCRT1CRTC[8],
+ pSiS->SiS_Pr->CCRT1CRTC[9],
+ pSiS->SiS_Pr->CCRT1CRTC[10],
+ pSiS->SiS_Pr->CCRT1CRTC[11],
+ pSiS->SiS_Pr->CCRT1CRTC[12],
+ pSiS->SiS_Pr->CCRT1CRTC[13],
+ pSiS->SiS_Pr->CCRT1CRTC[14],
+ pSiS->SiS_Pr->CCRT1CRTC[15]);
xf86DrvMsg(0, X_INFO, " 0x%02x}},\n", pSiS->SiS_Pr->CCRT1CRTC[16]);
xf86DrvMsg(0, X_INFO, "Clock: 0x%02x, 0x%02x, %d\n",
- pSiS->SiS_Pr->CSR2B, pSiS->SiS_Pr->CSR2C, pSiS->SiS_Pr->CSRClock);
+ pSiS->SiS_Pr->CSR2B,
+ pSiS->SiS_Pr->CSR2C,
+ pSiS->SiS_Pr->CSRClock);
#endif
return 1;
}
@@ -4470,15 +3879,15 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
/* Initialize our pointers */
if(pSiS->VGAEngine == SIS_300_VGA) {
#ifdef SIS300
- InitTo300Pointer(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ InitTo300Pointer(pSiS->SiS_Pr, &pSiS->sishw_ext);
#else
- return NULL;
+ return NULL;
#endif
} else if(pSiS->VGAEngine == SIS_315_VGA) {
#ifdef SIS315H
- InitTo310Pointer(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ InitTo310Pointer(pSiS->SiS_Pr, &pSiS->sishw_ext);
#else
- return NULL;
+ return NULL;
#endif
} else return NULL;
@@ -4486,6 +3895,9 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
while(pSiS->SiS_Pr->SiS_RefIndex[i].Ext_InfoFlag != 0xFFFF) {
index = pSiS->SiS_Pr->SiS_RefIndex[i].Ext_CRT1CRTC;
+#if 0 /* Not any longer */
+ if(pSiS->VGAEngine == SIS_300_VGA) index &= 0x3F;
+#endif
/* 0x5a (320x240) is a pure FTSN mode, not DSTN! */
if((!pSiS->FSTN) &&
@@ -4559,7 +3971,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
/* Horizontal display enable end */
HDE = (cr_data & 0xff) |
((unsigned short) (sr_data & 0x0C) << 6);
- E = HDE + 1; /* 0x80 0x64 */
+ E = HDE + 1;
cr_data = pSiS->SiS_Pr->SiS_CRT1Table[index].CR[4];
/* inSISIDXREG(SISCR, 0x04, cr_data); */
@@ -4567,7 +3979,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
/* Horizontal retrace (=sync) start */
HRS = (cr_data & 0xff) |
((unsigned short) (sr_data & 0xC0) << 2);
- F = HRS - E - 3; /* 0x06 0x06 */
+ F = HRS - E - 3;
cr_data = pSiS->SiS_Pr->SiS_CRT1Table[index].CR[2];
/* inSISIDXREG(SISCR, 0x02, cr_data); */
@@ -4597,7 +4009,7 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
B = (temp > 0) ? temp : (temp + 256);
temp = HRE - ((E + F + 3) & 63);
- C = (temp > 0) ? temp : (temp + 64); /* 0x0b 0x0b */
+ C = (temp > 0) ? temp : (temp + 64);
D = B - F - C;
@@ -4784,8 +4196,6 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
current->name, (float)current->Clock / 1000,
current->HDisplay, current->HSyncStart, current->HSyncEnd, current->HTotal,
current->VDisplay, current->VSyncStart, current->VSyncEnd, current->VTotal);
-#else
- (void)VBS; (void)HBS; (void)A;
#endif
i++;
@@ -4795,10 +4205,8 @@ SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfo
if(!includelcdmodes) return first;
- if(pSiS->SiS_Pr->CP_Vendor) {
- xf86DrvMsg(0, X_INFO, "Checking database for vendor %x, product %x\n",
- pSiS->SiS_Pr->CP_Vendor, pSiS->SiS_Pr->CP_Product);
- }
+ xf86DrvMsg(0, X_INFO, "Checking database for vendor %x, product %x\n",
+ pSiS->SiS_Pr->CP_Vendor, pSiS->SiS_Pr->CP_Product);
i = 0;
while((!done) && (SiS_PlasmaTable[i].vendor) && (pSiS->SiS_Pr->CP_Vendor)) {
@@ -5015,68 +4423,74 @@ SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber)
#ifdef LINUX_KERNEL
int
-sisfb_mode_rate_to_dclock(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+sisfb_mode_rate_to_dclock(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, unsigned char rateindex)
{
USHORT ModeNo = modeno;
USHORT ModeIdIndex = 0, ClockIndex = 0;
USHORT RefreshRateTableIndex = 0;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ ULONG temp = 0;
int Clock;
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300
- InitTo300Pointer(SiS_Pr, HwInfo);
+ InitTo300Pointer(SiS_Pr, HwDeviceExtension);
#else
- return 65 * 1000;
+ return 65 * 1000 * 1000;
#endif
} else {
#ifdef SIS315H
- InitTo310Pointer(SiS_Pr, HwInfo);
+ InitTo310Pointer(SiS_Pr, HwDeviceExtension);
#else
- return 65 * 1000;
+ return 65 * 1000 * 1000;
#endif
}
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) {;
+ temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
+ if(!temp) {
printk(KERN_ERR "Could not find mode %x\n", ModeNo);
- return 65 * 1000;
+ return 65 * 1000 * 1000;
}
-
+
RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
RefreshRateTableIndex += (rateindex - 1);
ClockIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
ClockIndex &= 0x3F;
}
- Clock = SiS_Pr->SiS_VCLKData[ClockIndex].CLOCK * 1000;
+ Clock = SiS_Pr->SiS_VCLKData[ClockIndex].CLOCK * 1000 * 1000;
return(Clock);
}
BOOLEAN
-sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex)
{
USHORT ModeNo = modeno;
USHORT ModeIdIndex = 0, CRT1Index = 0;
USHORT RefreshRateTableIndex = 0;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
+ ULONG temp = 0;
unsigned char sr_data, cr_data, cr_data2;
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300
- InitTo300Pointer(SiS_Pr, HwInfo);
+ InitTo300Pointer(SiS_Pr, HwDeviceExtension);
#else
return FALSE;
#endif
} else {
#ifdef SIS315H
- InitTo310Pointer(SiS_Pr, HwInfo);
+ InitTo310Pointer(SiS_Pr, HwDeviceExtension);
#else
return FALSE;
#endif
}
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
+ temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
+ if(!temp) return FALSE;
RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
RefreshRateTableIndex += (rateindex - 1);
@@ -5101,7 +4515,7 @@ sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
}
int
-sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, unsigned char rateindex,
ULONG *left_margin, ULONG *right_margin,
ULONG *upper_margin, ULONG *lower_margin,
@@ -5111,27 +4525,29 @@ sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
USHORT ModeNo = modeno;
USHORT ModeIdIndex = 0, index = 0;
USHORT RefreshRateTableIndex = 0;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
unsigned short VRE, VBE, VRS, VBS, VDE, VT;
unsigned short HRE, HBE, HRS, HBS, HDE, HT;
unsigned char sr_data, cr_data, cr_data2, cr_data3;
int A, B, C, D, E, F, temp, j;
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300
- InitTo300Pointer(SiS_Pr, HwInfo);
+ InitTo300Pointer(SiS_Pr, HwDeviceExtension);
#else
return 0;
#endif
} else {
#ifdef SIS315H
- InitTo310Pointer(SiS_Pr, HwInfo);
+ InitTo310Pointer(SiS_Pr, HwDeviceExtension);
#else
return 0;
#endif
}
-
- if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return 0;
-
+
+ temp = SiS_SearchModeID(SiS_Pr, ROMAddr, &ModeNo, &ModeIdIndex);
+ if(!temp) return 0;
+
RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
RefreshRateTableIndex += (rateindex - 1);
index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
@@ -5278,7 +4694,7 @@ sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
else
*sync |= FB_SYNC_HOR_HIGH_ACT;
- *vmode = FB_VMODE_NONINTERLACED;
+ *vmode = FB_VMODE_NONINTERLACED;
if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag & 0x0080)
*vmode = FB_VMODE_INTERLACED;
else {
diff --git a/src/init.h b/src/init.h
index 9684c68..63d5db3 100644
--- a/src/init.h
+++ b/src/init.h
@@ -1,52 +1,36 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.h,v 1.23 2003/09/09 10:29:00 twini Exp $ */
/*
* Data and prototypes for init.c
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
#ifndef _INIT_
@@ -83,41 +67,6 @@
#endif
#endif
-/* Mode numbers */
-const USHORT ModeIndex_320x200[] = {0x59, 0x41, 0x00, 0x4f};
-const USHORT ModeIndex_320x240[] = {0x50, 0x56, 0x00, 0x53};
-const USHORT ModeIndex_320x240_FSTN[] = {0x5a, 0x5b, 0x00, 0x00}; /* FSTN */
-const USHORT ModeIndex_400x300[] = {0x51, 0x57, 0x00, 0x54};
-const USHORT ModeIndex_512x384[] = {0x52, 0x58, 0x00, 0x5c};
-const USHORT ModeIndex_640x400[] = {0x2f, 0x5d, 0x00, 0x5e};
-const USHORT ModeIndex_640x480[] = {0x2e, 0x44, 0x00, 0x62};
-const USHORT ModeIndex_720x480[] = {0x31, 0x33, 0x00, 0x35};
-const USHORT ModeIndex_720x576[] = {0x32, 0x34, 0x00, 0x36};
-const USHORT ModeIndex_768x576[] = {0x5f, 0x60, 0x00, 0x61};
-const USHORT ModeIndex_800x480[] = {0x70, 0x7a, 0x00, 0x76};
-const USHORT ModeIndex_800x600[] = {0x30, 0x47, 0x00, 0x63};
-const USHORT ModeIndex_848x480[] = {0x39, 0x3b, 0x00, 0x3e};
-const USHORT ModeIndex_856x480[] = {0x3f, 0x42, 0x00, 0x45};
-const USHORT ModeIndex_1024x768[] = {0x38, 0x4a, 0x00, 0x64};
-const USHORT ModeIndex_1024x576[] = {0x71, 0x74, 0x00, 0x77};
-const USHORT ModeIndex_1024x600[] = {0x20, 0x21, 0x00, 0x22}; /* 300 series only */
-const USHORT ModeIndex_1280x1024[] = {0x3a, 0x4d, 0x00, 0x65};
-const USHORT ModeIndex_1280x960[] = {0x7c, 0x7d, 0x00, 0x7e};
-const USHORT ModeIndex_1152x768[] = {0x23, 0x24, 0x00, 0x25}; /* 300 series only */
-const USHORT ModeIndex_1152x864[] = {0x29, 0x2a, 0x00, 0x2b};
-const USHORT ModeIndex_300_1280x768[] = {0x55, 0x5a, 0x00, 0x5b};
-const USHORT ModeIndex_310_1280x768[] = {0x23, 0x24, 0x00, 0x25};
-const USHORT ModeIndex_1280x720[] = {0x79, 0x75, 0x00, 0x78};
-const USHORT ModeIndex_1280x800[] = {0x14, 0x15, 0x00, 0x16};
-const USHORT ModeIndex_1360x768[] = {0x48, 0x4b, 0x00, 0x4e};
-const USHORT ModeIndex_300_1360x1024[]= {0x67, 0x6f, 0x00, 0x72}; /* 300 series, BARCO only */
-const USHORT ModeIndex_1400x1050[] = {0x26, 0x27, 0x00, 0x28}; /* 315 series only */
-const USHORT ModeIndex_1680x1050[] = {0x17, 0x18, 0x00, 0x19}; /* 315 series only */
-const USHORT ModeIndex_1600x1200[] = {0x3c, 0x3d, 0x00, 0x66};
-const USHORT ModeIndex_1920x1440[] = {0x68, 0x69, 0x00, 0x6b};
-const USHORT ModeIndex_300_2048x1536[]= {0x6c, 0x6d, 0x00, 0x00};
-const USHORT ModeIndex_310_2048x1536[]= {0x6c, 0x6d, 0x00, 0x6e};
-
const USHORT SiS_DRAMType[17][5]={
{0x0C,0x0A,0x02,0x40,0x39},
{0x0D,0x0A,0x01,0x40,0x48},
@@ -252,9 +201,7 @@ static const SiS_ModeResInfoStruct SiS_ModeResInfo[] =
{ 1024, 600, 8,16}, /* 0x19 */
{ 1152, 768, 8,16}, /* 0x1a */
{ 768, 576, 8,16}, /* 0x1b */
- { 1360,1024, 8,16}, /* 0x1c */
- { 1280, 800, 8,16}, /* 0x1d */
- { 1680,1050, 8,16} /* 0x1e */
+ { 1360,1024, 8,16} /* 0x1c */
};
static SiS_StandTableStruct SiS_StandTable[]=
@@ -696,14 +643,6 @@ static SiS_StandTableStruct SiS_StandTable[]=
}
};
-/**************************************************************/
-/* SIS VIDEO BRIDGE ----------------------------------------- */
-/**************************************************************/
-
-static const UCHAR SiS_SoftSetting = 0x30; /* RAM setting */
-
-static const UCHAR SiS_OutputSelect = 0x40;
-
static const UCHAR SiS_NTSCTiming[] = {
0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
@@ -759,7 +698,6 @@ static const UCHAR SiS_HiTVSt2Timing[] = {
0x63,0x4f,0x27,0x00,0xfc,0xff,0x6a,0x00
};
-#if 0
static const UCHAR SiS_HiTVTextTiming[] = {
0x32,0x65,0x2c,0x5f,0x08,0x31,0x3a,0x65,
0x28,0x02,0x01,0x3d,0x06,0x3e,0x35,0x6d,
@@ -770,7 +708,6 @@ static const UCHAR SiS_HiTVTextTiming[] = {
0x60,0x80,0x14,0x90,0x8c,0x60,0x04,0x96,
0x72,0x5c,0x11,0x00,0xfc,0xff,0x32,0x00
};
-#endif
static const UCHAR SiS_HiTVGroup3Data[] = {
0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0x5f,
@@ -794,7 +731,6 @@ static const UCHAR SiS_HiTVGroup3Simu[] = {
0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
};
-#if 0
static const UCHAR SiS_HiTVGroup3Text[] = {
0x00,0x1a,0x22,0x63,0x62,0x22,0x08,0xa7,
0xf5,0x20,0xce,0xce,0x55,0x47,0x2a,0xa6,
@@ -805,10 +741,9 @@ static const UCHAR SiS_HiTVGroup3Text[] = {
0x01,0x05,0x03,0x7e,0x65,0x31,0x14,0x75,
0x18,0x05,0x18,0x05,0x4c,0xa8,0x01
};
-#endif
-static const UCHAR SiS_NTSCPhase[] = {0x21,0xed,0xba,0x08};
-static const UCHAR SiS_PALPhase[] = {0x2a,0x05,0xe3,0x00};
+static const UCHAR SiS_NTSCPhase[] = {0x21,0xed,0xba,0x08}; /* Was {0x21,0xed,0x8a,0x08}; */
+static const UCHAR SiS_PALPhase[] = {0x2a,0x05,0xe3,0x00}; /* Was {0x2a,0x05,0xd3,0x00}; */
static const UCHAR SiS_PALMPhase[] = {0x21,0xE4,0x2E,0x9B};
static const UCHAR SiS_PALNPhase[] = {0x21,0xF4,0x3E,0xBA};
static const UCHAR SiS_NTSCPhase2[] = {0x21,0xF0,0x7B,0xD6};
@@ -816,10 +751,8 @@ static const UCHAR SiS_PALPhase2[] = {0x2a,0x09,0x86,0xe9};
static const UCHAR SiS_PALMPhase2[] = {0x21,0xE6,0xEF,0xA4};
static const UCHAR SiS_PALNPhase2[] = {0x21,0xF6,0x94,0x46};
static const UCHAR SiS_SpecialPhase[] = {0x1e,0x8c,0x5c,0x7a};
-static const UCHAR SiS_SpecialPhaseM[]= {0x1e,0x83,0x0a,0xe0};
-static const UCHAR SiS_SpecialPhaseJ[]= {0x25,0xd4,0xfd,0x5e};
-static const SiS_TVDataStruct SiS_StPALData[] =
+static const SiS_TVDataStruct SiS_StPALData[]=
{
{ 1, 1, 864, 525,1270, 400, 100, 0, 760,0xf4,0xff,0x1c,0x22},
{ 1, 1, 864, 525,1270, 350, 100, 0, 760,0xf4,0xff,0x1c,0x22},
@@ -839,11 +772,10 @@ static const SiS_TVDataStruct SiS_ExtPALData[] =
/*{ 36, 25,1060, 648,1316, 530, 438, 0, 438,0xeb,0x05,0x25,0x16},*//* 800x600, 400x300 */
{ 36, 25,1060, 648,1270, 530, 438, 0, 438,0xeb,0x05,0x25,0x16}, /* 800x600, 400x300 - better */
{ 3, 2,1080, 619,1270, 540, 438, 0, 438,0xf3,0x00,0x1d,0x20}, /* 720x576 */
- { 1, 1,1170, 821,1270, 520, 686, 0, 686,0xF3,0x00,0x1D,0x20}, /* 1024x768 */
- { 1, 1,1170, 821,1270, 520, 686, 0, 686,0xF3,0x00,0x1D,0x20} /* 1024x768 (for NTSC equ) */
+ { 1, 1,1170, 821,1270, 520, 686, 0, 686,0xF3,0x00,0x1D,0x20} /* 1024x768 */
};
-static const SiS_TVDataStruct SiS_StNTSCData[] =
+static const SiS_TVDataStruct SiS_StNTSCData[]=
{
{ 1, 1, 858, 525,1270, 400, 50, 0, 760,0xf1,0x04,0x1f,0x18},
{ 1, 1, 858, 525,1270, 350, 50, 0, 640,0xf1,0x04,0x1f,0x18},
@@ -852,7 +784,7 @@ static const SiS_TVDataStruct SiS_StNTSCData[] =
{ 1, 1, 858, 525,1270, 480, 0, 0, 760,0xf1,0x04,0x1f,0x18}
};
-static const SiS_TVDataStruct SiS_ExtNTSCData[] =
+static const SiS_TVDataStruct SiS_ExtNTSCData[]=
{
{ 143, 65, 858, 443,1270, 440, 171, 0, 171,0xf1,0x04,0x1f,0x18}, /* 640x400, 320x200 */
{ 88, 35, 858, 393,1270, 440, 171, 0, 171,0xf1,0x04,0x1f,0x18},
@@ -860,163 +792,102 @@ static const SiS_TVDataStruct SiS_ExtNTSCData[] =
{ 143, 70, 924, 393,1270, 440, 92, 0, 92,0xf4,0x0b,0x1c,0x0a},
{ 143, 76, 836, 523,1270, 440, 224, 0, 0,0xf1,0x05,0x1f,0x16}, /* 640x480, 320x240 */
{ 143, 120,1056, 643,1270, 440, 0, 128, 0,0xf4,0x10,0x1c,0x00}, /* 800x600, 400x300 */
-/*{ 2, 1, 858, 503,1270, 480, 0, 128, 0,0xee,0x0c,0x22,0x08},*/ /* 720x480 (old, from 650) */
{ 143, 76, 836, 523,1270, 440, 0, 128, 0,0xee,0x0c,0x22,0x08}, /* 720x480 - BETTER (from 300 series) */
-/*{ 65, 64,1056, 791,1270, 480, 638, 0, 0,0xEE,0x0C,0x22,0x08} */ /* 1024x768 (525i) */
- { 1, 1,1100, 811,1412, 440, 0, 128, 0,0xee,0x0c,0x22,0x08}, /* 1024x768 (525i) CORRECTED */
- { 65, 64,1056, 791,1270, 480, 455, 0, 0,0x00,0x00,0x00,0x00} /* 1024x768 (525p) */
+/*{ 2, 1, 858, 503,1270, 480, 0, 128, 0,0xee,0x0c,0x22,0x08},*/ /* 720x480 (old, from 650) */
+ { 1, 1,1100, 811,1412, 440, 0, 128, 0,0xee,0x0c,0x22,0x08} /* 1024x768 CORRECTED */
+/*{ 65, 64,1056, 791,1270, 480, 638, 0, 0,0xEE,0x0C,0x22,0x08} */ /* 1024x768 */
+#if 0 /* 300 series was: */
+ { 143, 65, 858, 443,1270, 440, 171, 0, 171,0xf1,0x04,0x1f,0x18},
+ { 88, 35, 858, 393,1270, 440, 171, 0, 171,0xf1,0x04,0x1f,0x18},
+ { 143, 70, 924, 443,1270, 440, 92, 0, 92,0xf1,0x04,0x1f,0x18},
+ { 143, 70, 924, 393,1270, 440, 92, 0, 92,0xf4,0x0b,0x1c,0x0a},
+ { 143, 76, 836, 523,1270, 440, 224, 0, 0,0xf1,0x05,0x1f,0x16},
+ { 143, 120,1056, 643,1270, 440, 0, 128, 0,0xf4,0x10,0x1c,0x00},
+ { 143, 76, 836, 523,1270, 440, 0, 128, 0,0xee,0x0c,0x22,0x08},
+ { 65, 64,1056, 791,1270, 480, 638, 0, 0,0xf1,0x04,0x1f,0x18}
+#endif
};
-static const SiS_TVDataStruct SiS_StHiTVData[] = /* Slave + TVSimu */
-{
- { 1, 1, 0x37c,0x233,0x2b2,0x320, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x37c,0x233,0x2b2,0x2bc, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x37c,0x233,0x2b2,0x320, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x37c,0x233,0x2b2,0x2bc, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x37c,0x233,0x2b2,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 8, 5, 0x41a,0x2ab,0x670,0x3c0,0x150,128, 0, 0x00,0x00,0x00,0x00}
-};
-static const SiS_TVDataStruct SiS_St2HiTVData[] = /* Slave */
+static const SiS_TVDataStruct SiS_St2HiTVData[]=
{
{ 3, 1, 0x348,0x1e3,0x670,0x3c0,0x032, 0, 0, 0x00,0x00,0x00,0x00},
{ 1, 1, 0x37c,0x233,0x2b2,0x2bc, 0, 0, 0, 0x00,0x00,0x00,0x00},
{ 3, 1, 0x348,0x1e3,0x670,0x3c0,0x032, 0, 0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x37c,0x233,0x2b2,0x2bc, 0, 0, 0, 0x00,0x00,0x00,0x00},
+ { 1, 1, 0x3e8,0x233,0x311,0x2bc, 0, 0, 0, 0x00,0x00,0x00,0x00},
{ 5, 2, 0x348,0x233,0x670,0x3c0,0x08d,128, 0, 0x00,0x00,0x00,0x00},
{ 8, 5, 0x41a,0x2ab,0x670,0x3c0,0x17c,128, 0, 0x00,0x00,0x00,0x00}
};
-static const SiS_TVDataStruct SiS_ExtHiTVData[] =
+static const SiS_TVDataStruct SiS_ExtHiTVData[]=
{
{ 6, 1, 0x348,0x233,0x660,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
{ 3, 1, 0x3c0,0x233,0x660,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
- { 6, 1, 0x348,0x233,0x660,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
+ { 3, 1, 0x348,0x1e3,0x660,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
{ 3, 1, 0x3c0,0x233,0x660,0x3c0, 0, 0, 0, 0x00,0x00,0x00,0x00},
{ 5, 1, 0x348,0x233,0x670,0x3c0,0x166,128, 0, 0x00,0x00,0x00,0x00}, /* 640x480 */
{ 16, 5, 0x41a,0x2ab,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00}, /* 800x600 */
{ 25, 12, 0x4ec,0x353,0x670,0x3c0,0x032, 0, 0, 0x00,0x00,0x00,0x00}, /* 1024x768 */
{ 5, 4, 0x627,0x464,0x670,0x3c0,0x128, 0, 0, 0x00,0x00,0x00,0x00}, /* 1280x1024 */
- { 4, 1, 0x41a,0x233,0x60c,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00}, /* 800x480 */
+ { 4, 1, 0x41a,0x233,0x670,0x3c0,0x143,128, 0, 0x00,0x00,0x00,0x00}, /* 800x480 */
{ 5, 2, 0x578,0x293,0x670,0x3c0,0x032, 0, 0, 0x00,0x00,0x00,0x00}, /* 1024x576 */
{ 8, 5, 0x6d6,0x323,0x670,0x3c0,0x128, 0, 0, 0x00,0x00,0x00,0x00} /* 1280x720 */
};
-static const SiS_TVDataStruct SiS_St525pData[] =
-{
- { 1, 1, 0x6b4,0x20d,0x4f6,0x190, 50, 0, 0x2f8, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x6b4,0x20d,0x4f6,0x15e, 50, 0, 0x280, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x6b4,0x20d,0x4f6,0x190, 50, 0, 0x2f8, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x6b4,0x20d,0x4f6,0x15e, 50, 0, 0x280, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x6b4,0x20d,0x4f6,0x1e0, 0, 0, 0x2f8, 0x00,0x00,0x00,0x00}
-};
-
-static const SiS_TVDataStruct SiS_St750pData[] =
-{
- { 1, 1, 0x672,0x2ee,0x500,0x190, 50, 0, 0x2f8, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x672,0x2ee,0x500,0x15e, 50, 0, 0x280, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x672,0x2ee,0x500,0x190, 0, 0, 0x2d0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x672,0x2ee,0x500,0x15e, 0, 0, 0x2d0, 0x00,0x00,0x00,0x00},
- { 1, 1, 0x672,0x2ee,0x500,0x1e0, 0, 0, 0x2f8, 0x00,0x00,0x00,0x00}
-};
-
-static const SiS_TVDataStruct SiS_Ext750pData[] =
-{
- { 3, 1, 0x3a7,0x1d6,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00},
- { 24, 7, 0x3a7,0x1a4,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00},
- { 3, 1, 0x3a7,0x1d6,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00},
- { 24, 7, 0x3a7,0x1a4,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00},
- { 99, 32, 0x320,0x1fe,0x500,0x2d0, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* 640x480 */
- { 5, 4, 0x5d8,0x29e,0x500,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00}, /* 800x600 */
- { 2, 1, 0x35a,0x1f7,0x4f6,0x1e0, 0,128, 0, 0x00,0x00,0x00,0x00}, /* 720x480 */
- { 68, 64, 0x55f,0x346,0x500,0x2a8,0x27e, 0, 0, 0x00,0x00,0x00,0x00}, /* 1024x768 */
- { 25, 24, 0x5d8,0x2f3,0x460,0x2a8, 50, 0, 0, 0x00,0x00,0x00,0x00} /* 1280x720 */
-};
-
-static const SiS_LCDDataStruct SiS_LCD1280x720Data[] =
-{
- { 14, 5, 864, 432, 1344, 806 }, /* 640x400 */
- { 16, 5, 864, 378, 1344, 806 },
- { 14, 5, 864, 432, 1344, 806 },
- { 16, 5, 864, 378, 1344, 806 },
- { 24, 11, 924, 523, 1344, 806 }, /* 640x480 */
- { 7, 5, 1152, 664, 1344, 806 }, /* 800x600 */
- { 0, 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0, 0 },
- { 1, 1, 1344, 806, 1344, 806 } /* 1280x720 */
-};
-
-/* About 1280x768: For TMDS, Panel_1280x768 will only be set if
- * the panel is a Fujitsu 7911 (VL-17WDX8) (with clock 81, 1688x802)
- * Other TMDS panels of this resolution will be treated as custom.
- * For LVDS, we know two types. Data follows:
- */
-
-static const SiS_LCDDataStruct SiS_StLCD1280x768_2Data[] =
-{
- { 64, 21, 858, 434, 1408, 806 }, /* 640x400 */
- { 32, 9, 858, 372, 1408, 806 },
- { 64, 21, 858, 434, 1408, 806 },
- { 32, 9, 858, 372, 1408, 806 },
- { 143, 68, 1024, 527, 1408, 806 }, /* 640x480 */
- { 64, 51, 1364, 663, 1408, 806 }, /* 800x600 */
- { 88, 81, 1296, 806, 1408, 806 }, /* 1024x768 */
- { 0, 0, 0, 0, 0, 0 },
- { 1, 1, 1408, 806, 1408, 806 } /* 1280x768 */
-};
-
-static const SiS_LCDDataStruct SiS_ExtLCD1280x768_2Data[] =
-{
- { 64, 25, 1056, 422, 1408, 806 }, /*, 664 */
- { 128, 39, 884, 396, 1408, 806 }, /*, 640 */
- { 64, 25, 1056, 422, 1408, 806 }, /*, 664 */
- { 128, 39, 884, 396, 1408, 806 }, /*, 640 */
- { 32, 15, 1056, 513, 1408, 806 }, /*, 664 */
- { 176, 125, 1280, 640, 1408, 806 }, /*, 768 */
- { 88, 81, 1296, 806, 1408, 806 },
- { 0, 0, 0, 0, 0, 0 },
- { 1, 1, 1408, 806, 1408, 806 }
-};
-
-static const SiS_LCDDataStruct SiS_LCD1280x768_3Data[] =
-{
- { 64, 25, 1056, 422, 1664, 798 }, /* 640x400 */
- { 128, 39, 884, 396, 1408, 806 }, /* ,640 */
- { 64, 25, 1056, 422, 1664, 798 }, /* 640x400 */
- { 128, 39, 884, 396, 1408, 806 }, /* ,640 */
- { 32, 15, 1056, 513, 1408, 806 }, /* ,664 */ /* 640x480 */
- { 176, 125, 1280, 640, 1408, 806 }, /* ,768 */ /* 800x600 */
- { 64, 61, 1342, 806, 1408, 806 }, /* 1024x768 */
- { 0, 0, 0, 0, 0, 0 },
- { 1, 1, 1408, 806, 1408, 806 } /* 1280x768 */
-};
+static const UCHAR SiS_OutputSelect = 0x40;
-static const SiS_LCDDataStruct SiS_LCD1280x800Data[] =
-{
- { 128, 51, 1122, 412, 1408, 816 }, /* 640x400 */
- { 128, 49, 1232, 361, 1408, 816 },
- { 128, 51, 1122, 412, 1408, 816 },
- { 128, 49, 1232, 361, 1408, 816 },
- { 8, 3, 880, 491, 1408, 816 }, /* 640x480 */
- { 11, 6, 1024, 612, 1408, 816 }, /* 800x600 */
- { 22, 21, 1400, 784, 1408, 816 }, /* 1024x768 */
- { 0, 0, 0, 0, 0, 0 },
- { 1, 1, 1408, 816, 1408, 816 } /* 1280x800 */
-};
+static const UCHAR SiS_SoftSetting = 0x30; /* RAM setting */
static const SiS_LCDDataStruct SiS_LCD1280x960Data[] =
{
- { 9, 2, 800, 500, 1800, 1000 },
- { 9, 2, 800, 500, 1800, 1000 },
- { 4, 1, 900, 500, 1800, 1000 },
- { 4, 1, 900, 500, 1800, 1000 },
- { 9, 2, 800, 500, 1800, 1000 },
- { 30, 11, 1056, 625, 1800, 1000 },
- { 5, 3, 1350, 800, 1800, 1000 },
- { 1, 1, 1576, 1050, 1576, 1050 },
- { 1, 1, 1800, 1000, 1800, 1000 }
+ { 9, 2, 800, 500,1800,1000},
+ { 9, 2, 800, 500,1800,1000},
+ { 4, 1, 900, 500,1800,1000},
+ { 4, 1, 900, 500,1800,1000},
+ { 9, 2, 800, 500,1800,1000},
+ { 30, 11,1056, 625,1800,1000},
+ { 5, 3,1350, 800,1800,1000},
+ { 1, 1,1576,1050,1576,1050},
+ { 1, 1,1800,1000,1800,1000}
+};
+
+static const SiS_LCDDataStruct SiS_StLCD1280x768Data[] =
+{
+ { 211, 100, 2100, 408, 1688, 802 }, /* These values are *wrong* */
+ { 211, 64, 1536, 358, 1688, 802 }, /* (which is why they aren't used yet) */
+ { 211, 100, 2100, 408, 1688, 802 },
+ { 211, 64, 1536, 358, 1688, 802 },
+ { 211, 48, 840, 488, 1688, 802 },
+ { 211, 72, 1008, 609, 1688, 802 },
+ { 211, 128, 1400, 776, 1688, 802 },
+ { 211, 205, 1680, 1041, 1688, 802 },
+ { 1, 1, 1688, 802, 1688, 802 } /* That's the only one that *might* be correct */
+};
+
+static const SiS_LCDDataStruct SiS_ExtLCD1280x768Data[] =
+{
+ { 211, 100, 2100, 408, 1688, 802 }, /* These values are *wrong* */
+ { 211, 64, 1536, 358, 1688, 802 }, /* (which is why they aren't used yet) */
+ { 211, 100, 2100, 408, 1688, 802 },
+ { 211, 64, 1536, 358, 1688, 802 },
+ { 211, 48, 840, 488, 1688, 802 },
+ { 211, 72, 1008, 609, 1688, 802 },
+ { 211, 128, 1400, 776, 1688, 802 },
+ { 211, 205, 1680, 1041, 1688, 802 },
+ { 1, 1, 1688, 802, 1688, 802 } /* That's the only one that *might* be correct */
+};
+
+static const SiS_LCDDataStruct SiS_NoScaleData1280x768[] =
+{ /* All values guessed */
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802},
+ { 1, 1, 1688, 802, 1688, 802}
};
static const SiS_LCDDataStruct SiS_StLCD1400x1050Data[] =
@@ -1034,32 +905,28 @@ static const SiS_LCDDataStruct SiS_StLCD1400x1050Data[] =
static const SiS_LCDDataStruct SiS_ExtLCD1400x1050Data[] =
{
- { 211, 100, 2100, 408, 1688, 1066 }, /* 640x400 */
+ { 211, 100, 2100, 408, 1688, 1066 },
{ 211, 64, 1536, 358, 1688, 1066 },
{ 211, 100, 2100, 408, 1688, 1066 },
{ 211, 64, 1536, 358, 1688, 1066 },
- { 211, 48, 840, 488, 1688, 1066 }, /* 640x480 */
- { 211, 72, 1008, 609, 1688, 1066 }, /* 800x600 */
+ { 211, 48, 840, 488, 1688, 1066 },
+ { 211, 72, 1008, 609, 1688, 1066 },
{ 211, 128, 1400, 776, 1688, 1066 },
{ 211, 205, 1680, 1041, 1688, 1066 },
{ 1, 1, 1688, 1066, 1688, 1066 }
};
-static const SiS_LCDDataStruct SiS_LCD1680x1050Data[] =
+static const SiS_LCDDataStruct SiS_NoScaleData1400x1050[] =
{
- { 95, 24, 1260, 410, 1900, 1066 }, /* 0 640x400 */
- { 10, 3, 1710, 362, 1900, 1066 },
- { 95, 24, 1260, 410, 1900, 1066 },
- { 10, 3, 1710, 362, 1900, 1066 },
- { 95, 32, 1400, 490, 1900, 1066 }, /* 4 640x480 */
- { 95, 42, 1470, 610, 1900, 1066 }, /* 5 800x600 */
- { 95, 64, 1750, 784, 1900, 1066 }, /* 6 1024x768 */
- { 95, 94, 1900, 1055, 1900, 1066 }, /* 7 1280x1024 */
- { 41, 31, 1900, 806, 1900, 1066 }, /* 8 1280x768 */
- { 95, 69, 1800, 817, 1900, 1066 }, /* 9 1280x800 patch */
- { 13, 9, 1900, 739, 1900, 1066 }, /* 10 1280x720 */
- { 95, 94, 1880, 1066, 1900, 1066 }, /* 11 1400x1050 patch */
- { 1, 1, 1900, 1066, 1900, 1066 } /* 12 1680x1050 */
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 },
+ { 1, 1, 1688, 1066, 1688, 1066 }
};
static const SiS_LCDDataStruct SiS_StLCD1600x1200Data[] =
@@ -1090,33 +957,34 @@ static const SiS_LCDDataStruct SiS_ExtLCD1600x1200Data[] =
{ 1, 1,2160,1250, 2160, 1250 }
};
+static const SiS_LCDDataStruct SiS_NoScaleData1600x1200[] =
+{
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+ {1, 1, 2160, 1250, 2048, 1250},
+};
+
static const SiS_LCDDataStruct SiS_NoScaleData[] =
{
- { 1, 1, 800, 449, 800, 449 }, /* 0x00: 320x200, 640x400 */
+ { 1, 1, 800, 449, 800, 449 },
{ 1, 1, 800, 449, 800, 449 },
{ 1, 1, 900, 449, 900, 449 },
{ 1, 1, 900, 449, 900, 449 },
- { 1, 1, 800, 525, 800, 525 }, /* 0x04: 320x240, 640x480 */
- { 1, 1,1056, 628,1056, 628 }, /* 0x05: 400x300, 800x600 */
- { 1, 1,1344, 806,1344, 806 }, /* 0x06: 512x384, 1024x768 */
- { 1, 1,1688,1066,1688,1066 }, /* 0x07: 1280x1024 */
- { 1, 1,1688, 802,1688, 802 }, /* 0x08: 1280x768: Fujitsu, TMDS only */
- { 1, 1,2160,1250,2160,1250 }, /* 0x09: 1600x1200 */
- { 1, 1,1800,1000,1800,1000 }, /* 0x0a: 1280x960 */
- { 1, 1,1688,1066,1688,1066 }, /* 0x0b: 1400x1050 */
- { 1, 1,1650, 750,1650, 750 }, /* 0x0c: 1280x720 (TMDS) */
- { 1, 1,1408, 816,1408, 816 }, /* 0x0d: 1280x800 */
- { 1, 1,1900,1066,1900,1066 }, /* 0x0e: 1680x1050 (LVDS) */
- { 1, 1,1408, 806,1408, 806 }, /* 0x0f: 1280x768_2 */
- { 1, 1,1664, 798,1664, 798 }, /* 0x10: 1280x768_3 */
- { 1, 1,1688, 802,1688, 802 }, /* 0x11: 1280x768: Std, TMDS only */
- { 1, 1,1344, 806,1344, 806 } /* 0x12: 1280x720 (LVDS) */
-};
-
-
-/**************************************************************/
-/* LVDS ----------------------------------------------------- */
-/**************************************************************/
+ { 1, 1, 800, 525, 800, 525 },
+ { 1, 1,1056, 628,1056, 628 },
+ { 1, 1,1344, 806,1344, 806 },
+ { 1, 1,1688,1066,1688,1066 },
+ { 1, 1,1688, 802,1688, 802 }, /* 1280x768: 802 was 806 in both cases */
+ { 1, 1,2160,1250,2160,1250 }, /* 1600x1200 */
+ { 1, 1,1800,1000,1800,1000 } /* 1280x960 */
+};
static const SiS_LVDSDataStruct SiS_LVDS320x480Data_1[]=
{
@@ -1131,30 +999,6 @@ static const SiS_LVDSDataStruct SiS_LVDS320x480Data_1[]=
{ 800, 525,1000, 635}
};
-static const SiS_LVDSDataStruct SiS_LVDS640x480Data_1[]=
-{
- { 800, 445, 800, 525}, /* 800, 449, 800, 449 */
- { 800, 395, 800, 525},
- { 800, 445, 800, 525},
- { 800, 395, 800, 525},
- { 800, 525, 800, 525},
- { 800, 525, 800, 525}, /* pseudo */
- { 800, 525, 800, 525} /* pseudo */
-};
-
-/* FSTN 320x240 */
-static const SiS_LVDSDataStruct SiS_LVDS640x480Data_2[]=
-{
- { 800, 445, 800, 525},
- { 800, 395, 800, 525},
- { 800, 445, 800, 525},
- { 800, 395, 800, 525},
- { 800, 525, 800, 525},
- { 800, 525, 800, 525}, /* pseudo */
- { 800, 525, 800, 525} /* pseudo */
-};
-
-
static const SiS_LVDSDataStruct SiS_LVDS800x600Data_1[]=
{
{ 848, 433,1060, 629},
@@ -1163,7 +1007,9 @@ static const SiS_LVDSDataStruct SiS_LVDS800x600Data_1[]=
{ 848, 389,1060, 629},
{ 848, 518,1060, 629},
{1056, 628,1056, 628},
- {1056, 628,1056, 628}
+ {1056, 628,1056, 628},
+ { 800, 449,1000, 644},
+ { 800, 525,1000, 635}
};
static const SiS_LVDSDataStruct SiS_LVDS800x600Data_2[]=
@@ -1174,7 +1020,35 @@ static const SiS_LVDSDataStruct SiS_LVDS800x600Data_2[]=
{1056, 628,1056, 628},
{1056, 628,1056, 628},
{1056, 628,1056, 628},
- {1056, 628,1056, 628}
+ {1056, 628,1056, 628},
+ { 800, 449,1000, 644},
+ { 800, 525,1000, 635}
+};
+
+
+
+static const SiS_LVDSDataStruct SiS_LVDS1280x1024Data_1[]=
+{
+ {1048, 442,1688,1066},
+ {1048, 392,1688,1066},
+ {1048, 442,1688,1066},
+ {1048, 392,1688,1066},
+ {1048, 522,1688,1066},
+ {1208, 642,1688,1066},
+ {1432, 810,1688,1066},
+ {1688,1066,1688,1066}
+};
+
+static const SiS_LVDSDataStruct SiS_LVDS1280x1024Data_2[]=
+{
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066}
};
static const SiS_LVDSDataStruct SiS_LVDS1024x768Data_1[]=
@@ -1186,6 +1060,8 @@ static const SiS_LVDSDataStruct SiS_LVDS1024x768Data_1[]=
{ 840, 518,1344, 806}, /* 640x480 */
{1050, 638,1344, 806}, /* 800x600 */
{1344, 806,1344, 806}, /* 1024x768 */
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
static const SiS_LVDSDataStruct SiS_LVDS1024x768Data_2[]=
@@ -1197,30 +1073,58 @@ static const SiS_LVDSDataStruct SiS_LVDS1024x768Data_2[]=
{1344, 806,1344, 806},
{1344, 806,1344, 806},
{1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
-static const SiS_LVDSDataStruct SiS_LVDS1280x1024Data_1[]=
+/* Custom data for Barco iQ R300 */
+static const SiS_LVDSDataStruct SiS_LVDSBARCO1366Data_1[]=
{
- {1048, 442,1688,1066},
- {1048, 392,1688,1066},
- {1048, 442,1688,1066},
- {1048, 392,1688,1066},
- {1048, 522,1688,1066},
- {1208, 642,1688,1066},
- {1432, 810,1688,1066},
- {1688,1066,1688,1066}
+ { 832, 438,1331, 806},
+ { 832, 388,1331, 806},
+ { 832, 438,1331, 806},
+ { 832, 388,1331, 806},
+ { 832, 518,1331, 806},
+ {1050, 638,1344, 806},
+ {1344, 806,1344, 806},
+ {1688,1066,1688,1066},
+ {1688,1066,1688,1066} /* 1360x1024 */
};
-static const SiS_LVDSDataStruct SiS_LVDS1280x1024Data_2[]=
+/* Custom data for Barco iQ R300 */
+static const SiS_LVDSDataStruct SiS_LVDSBARCO1366Data_2[]=
{
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
{1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066}
+ {1688,1066,1688,1066} /* 1360x1024 */
+};
+
+static const SiS_LVDSDataStruct SiS_LVDSBARCO1024Data_1[]=
+{
+ { 832, 438,1331, 806},
+ { 832, 409,1331, 806},
+ { 832, 438,1331, 806},
+ { 832, 409,1331, 806},
+ { 832, 518,1331, 806}, /* 640x480 */
+ {1050, 638,1344, 806}, /* 800x600 */
+ {1344, 806,1344, 806}, /* 1024x768 */
+};
+
+static const SiS_LVDSDataStruct SiS_LVDSBARCO1024Data_2[]=
+{
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
};
static const SiS_LVDSDataStruct SiS_LVDS1400x1050Data_1[]=
@@ -1251,17 +1155,6 @@ static const SiS_LVDSDataStruct SiS_LVDS1400x1050Data_2[]=
static const SiS_LVDSDataStruct SiS_LVDS1600x1200Data_1[]=
{
- {1088, 520, 2048,1320},
- {1088, 470, 2048,1320},
- {1088, 520, 2048,1320},
- {1088, 470, 2048,1320},
- {1088, 600, 2048,1320},
- {1248, 720, 2048,1320},
- {1472, 888, 2048,1320},
- {1728,1144, 2048,1320},
- {1848,1170, 2048,1320},
- {2048,1320, 2048,1320}
-#if 0
{1088, 450, 2048,1250},
{1088, 400, 2048,1250},
{1088, 450, 2048,1250},
@@ -1272,47 +1165,20 @@ static const SiS_LVDSDataStruct SiS_LVDS1600x1200Data_1[]=
{1728,1066, 2048,1250},
{1848,1066, 2048,1250},
{2048,1250, 2048,1250}
-#endif
};
static const SiS_LVDSDataStruct SiS_LVDS1600x1200Data_2[]=
{
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320},
- {2048,1320, 2048,1320}
-};
-
-static const SiS_LVDSDataStruct SiS_LVDS1280x960Data_1[]=
-{
- { 840, 438,1344, 806},
- { 840, 409,1344, 806},
- { 840, 438,1344, 806},
- { 840, 409,1344, 806},
- { 840, 518,1344, 806},
- {1050, 638,1344, 806},
- {1344, 806,1344, 806},
- { 800, 449,1280, 801},
- { 800, 525,1280, 813}
-};
-
-static const SiS_LVDSDataStruct SiS_LVDS1280x960Data_2[]=
-{
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- { 800, 449,1280, 801},
- { 800, 525,1280, 813}
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250},
+ {2048,1250, 2048,1250}
};
static const SiS_LVDSDataStruct SiS_LVDS1280x768Data_1[]=
@@ -1343,13 +1209,15 @@ static const SiS_LVDSDataStruct SiS_LVDS1280x768Data_2[]=
static const SiS_LVDSDataStruct SiS_LVDS1024x600Data_1[] =
{
- { 840, 604,1344, 800},
- { 840, 560,1344, 800},
- { 840, 604,1344, 800},
- { 840, 560,1344, 800},
- { 840, 689,1344, 800},
+ {840, 604,1344, 800},
+ {840, 560,1344, 800},
+ {840, 604,1344, 800},
+ {840, 560,1344, 800},
+ {840, 689,1344, 800},
{1050, 800,1344, 800},
- {1344, 800,1344, 800}
+ {1344, 800,1344, 800},
+ {800, 449,1280, 789},
+ {800, 525,1280, 785}
};
static const SiS_LVDSDataStruct SiS_LVDS1024x600Data_2[] =
@@ -1360,7 +1228,9 @@ static const SiS_LVDSDataStruct SiS_LVDS1024x600Data_2[] =
{1344, 800,1344, 800},
{1344, 800,1344, 800},
{1344, 800,1344, 800},
- {1344, 800,1344, 800}
+ {1344, 800,1344, 800},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
static const SiS_LVDSDataStruct SiS_LVDS1152x768Data_1[] =
@@ -1371,7 +1241,9 @@ static const SiS_LVDSDataStruct SiS_LVDS1152x768Data_1[] =
{ 840, 409,1344, 806},
{ 840, 518,1344, 806},
{1050, 638,1344, 806},
- {1344, 806,1344, 806}
+ {1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
static const SiS_LVDSDataStruct SiS_LVDS1152x768Data_2[] =
@@ -1382,10 +1254,12 @@ static const SiS_LVDSDataStruct SiS_LVDS1152x768Data_2[] =
{1344, 806,1344, 806},
{1344, 806,1344, 806},
{1344, 806,1344, 806},
- {1344, 806,1344, 806}
+ {1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
-/* Pass 1:1 data */
+/* TW: Pass 1:1 data */
static const SiS_LVDSDataStruct SiS_LVDSXXXxXXXData_1[]=
{
{ 800, 449, 800, 449},
@@ -1395,53 +1269,49 @@ static const SiS_LVDSDataStruct SiS_LVDSXXXxXXXData_1[]=
{ 800, 525, 800, 525}, /* 640x480 */
{1056, 628, 1056, 628}, /* 800x600 */
{1344, 806, 1344, 806}, /* 1024x768 */
- {1688,1066, 1688,1066}, /* 1280x1024 */ /* INSERTED ! */
+ {1344,1066, 1344,1066}, /* 1280x1024 */ /* INSERTED ! */
{1688, 806, 1688, 806}, /* 1280x768 */
/* No other panels ! */
};
-/* Custom data for Barco iQ R series */
-static const SiS_LVDSDataStruct SiS_LVDSBARCO1366Data_1[]=
+static const SiS_LVDSDataStruct SiS_LVDS640x480Data_1[]=
{
- { 832, 438,1331, 806},
- { 832, 388,1331, 806},
- { 832, 438,1331, 806},
- { 832, 388,1331, 806},
- { 832, 518,1331, 806},
- {1050, 638,1344, 806},
- {1344, 806,1344, 806},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066} /* 1360x1024 */
+ { 800, 445, 800, 525}, /* 800, 449, 800, 449 */
+ { 800, 395, 800, 525},
+ { 800, 445, 800, 525},
+ { 800, 395, 800, 525},
+ { 800, 525, 800, 525},
+ { 800, 525, 800, 525}, /* pseudo */
+ { 800, 525, 800, 525} /* pseudo */
};
-/* Custom data for Barco iQ R series */
-static const SiS_LVDSDataStruct SiS_LVDSBARCO1366Data_2[]=
+/* FSTN 320x240 */
+static const SiS_LVDSDataStruct SiS_LVDS640x480Data_2[]=
{
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1344, 806,1344, 806},
- {1688,1066,1688,1066},
- {1688,1066,1688,1066} /* 1360x1024 */
+ { 800, 445, 800, 525},
+ { 800, 395, 800, 525},
+ { 800, 445, 800, 525},
+ { 800, 395, 800, 525},
+ { 800, 525, 800, 525},
+ { 800, 525, 800, 525}, /* pseudo */
+ { 800, 525, 800, 525} /* pseudo */
};
-/* Custom data for Barco iQ G series */
-static const SiS_LVDSDataStruct SiS_LVDSBARCO1024Data_1[]=
+
+static const SiS_LVDSDataStruct SiS_LVDS1280x960Data_1[]=
{
- { 832, 438,1331, 806},
- { 832, 409,1331, 806},
- { 832, 438,1331, 806},
- { 832, 409,1331, 806},
- { 832, 518,1331, 806}, /* 640x480 */
- {1050, 638,1344, 806}, /* 800x600 */
- {1344, 806,1344, 806}, /* 1024x768 */
+ { 840, 438,1344, 806},
+ { 840, 409,1344, 806},
+ { 840, 438,1344, 806},
+ { 840, 409,1344, 806},
+ { 840, 518,1344, 806},
+ {1050, 638,1344, 806},
+ {1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
-/* Custom data for Barco iQ G series */
-static const SiS_LVDSDataStruct SiS_LVDSBARCO1024Data_2[]=
+static const SiS_LVDSDataStruct SiS_LVDS1280x960Data_2[]=
{
{1344, 806,1344, 806},
{1344, 806,1344, 806},
@@ -1450,9 +1320,10 @@ static const SiS_LVDSDataStruct SiS_LVDSBARCO1024Data_2[]=
{1344, 806,1344, 806},
{1344, 806,1344, 806},
{1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
};
-/* Custom data for 848x480 parallel panel */
static const SiS_LVDSDataStruct SiS_LVDS848x480Data_1[]=
{
{ 0, 0, 0, 0},
@@ -1470,7 +1341,6 @@ static const SiS_LVDSDataStruct SiS_LVDS848x480Data_1[]=
{1088, 525,1088, 525} /* 1360x768 TODO */
};
-/* Custom data for 848x480 parallel panel */
static const SiS_LVDSDataStruct SiS_LVDS848x480Data_2[]=
{
{ 0, 0, 0, 0},
@@ -1488,6 +1358,63 @@ static const SiS_LVDSDataStruct SiS_LVDS848x480Data_2[]=
{1088, 525,1088, 525} /* 1360x768 TODO */
};
+/* LCDA */
+
+static const SiS_LVDSDataStruct SiS_LCDA1400x1050Data_1[]=
+{ /* TW: Might be temporary (invalid) data */
+ { 928, 416, 1688,1066},
+ { 928, 366, 1688,1066},
+ {1008, 416, 1688,1066},
+ {1008, 366, 1688,1066},
+ {1200, 530, 1688,1066},
+ {1088, 616, 1688,1066},
+ {1312, 784, 1688,1066},
+ {1568,1040, 1688,1066},
+ {1688,1066, 1688,1066}
+};
+
+static const SiS_LVDSDataStruct SiS_LCDA1400x1050Data_2[]=
+{ /* TW: Temporary data. Not valid */
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
+};
+
+static const SiS_LVDSDataStruct SiS_LCDA1600x1200Data_1[]=
+{ /* TW: Temporary data. Not valid */
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ {1344, 806,1344, 806},
+ { 800, 449,1280, 801},
+ { 800, 525,1280, 813}
+};
+
+static const SiS_LVDSDataStruct SiS_LCDA1600x1200Data_2[]=
+{ /* TW: Temporary data. Not valid */
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0}
+};
+
static const SiS_LVDSDataStruct SiS_CHTVUNTSCData[]=
{
{ 840, 600, 840, 600},
@@ -1510,7 +1437,139 @@ static const SiS_LVDSDataStruct SiS_CHTVONTSCData[]=
{1160, 840,1160, 840}
};
-/* Chrontel TV Skew */
+static const SiS_LVDSDesStruct SiS_PanelType1076_1[]=
+{ /* 1024x768 */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1076_2[]=
+{ /* 1024x768 */
+ { 1184, 622 },
+ { 1184, 597 },
+ { 1184, 622 },
+ { 1184, 597 },
+ { 1152, 622 },
+ { 1232, 722 },
+ { 0, 0 },
+ { 0, 794 },
+ { 0, 0 }
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1210_1[]=
+{ /* 1280x1024 */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1210_2[]=
+{ /* 1280x1024 */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1296_1[]=
+{ /* 1400x1050 */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1296_2[]=
+{ /* 1400x1050 - looks heavily invalid */
+ { 808 , 740},
+ { 0 , 715},
+ { 632 , 740},
+ { 632 , 715},
+ { 1307, 780},
+ { 1387,1157},
+ { 1499, 924},
+ { 1627,1052},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1600_1[]=
+{ /* 1600x1200 */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelType1600_2[]=
+{ /* 1600x1200 - BIOS looks heavily invalid, not copied */
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
+
+static const SiS_LVDSDesStruct SiS_PanelTypeNS_1[]=
+{
+ { 8, 0},
+ { 8, 0},
+ { 8, 0},
+ { 8, 0},
+ { 8, 0},
+ { 0, 0},
+ { 0, 0},
+ { 0, 0},
+ { 0, 806},
+ { 0, 0 }
+};
+
+static const SiS_LVDSDesStruct SiS_PanelTypeNS_2[] =
+{
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0},
+ { 0 , 0}
+};
static const SiS_LVDSDesStruct SiS_CHTVUNTSCDesData[]=
{
@@ -1556,8 +1615,6 @@ static const SiS_LVDSDesStruct SiS_CHTVOPALDesData[]=
{ 0, 0}
};
-/* CRT1 CRTC data for slave modes */
-
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1320x480_1[] =
{
{{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
@@ -1583,345 +1640,204 @@ static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1320x480_1[] =
0x00 }}
};
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_1[] =
-{
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_1_H[] =
-{
- {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
- 0x00}},
- {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
- 0x83,0x85,0x63,0xba,0x00,0x00,0x00,
- 0x00}},
- {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
- 0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
- 0x00}},
- {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
- 0x83,0x85,0x63,0xba,0x00,0x00,0x00,
- 0x00}},
- {{0x2d,0x28,0x90,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_2[] =
-{
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_2_H[] =
-{
- {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
- 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
- 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_3[] =
-{
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
- 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}
-};
-
-static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_3_H[] =
-{
- {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
- 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
- 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
- 0x00}},
- {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
- 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
- 0x00}},
- {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
- 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
- 0x01}},
- {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
- 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
- 0x00}}
-};
-
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11024x600_1[] =
{
- {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
- 0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
- 0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
- 0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
- 0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
- 0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
- 0x00}},
- {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
- 0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
- 0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
- 0x01}}
+ {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+ 0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+ 0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x5a,0x3e,
+ 0xe8,0x8f,0x8f,0x5b,0x00,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x2e,0x3e,
+ 0xb9,0x80,0x5d,0x2f,0x00,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0xaf,0xba,
+ 0x3b,0x82,0xdf,0xb0,0x00,0x00,0x01,
+ 0x00}},
+ {{0x7e,0x63,0x82,0x68,0x15,0x1e,0xf1,
+ 0xae,0x85,0x57,0x1f,0x30,0x00,0x26,
+ 0x01}},
+ {{0xa3,0x7f,0x87,0x86,0x97,0x1e,0xf1,
+ 0xae,0x85,0x57,0x1f,0x30,0x00,0x02,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11024x600_1_H[] =
{
- {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
- 0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
- 0x00}},
- {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
- 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
- 0x01}},
- {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
+ {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+ 0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+ 0x00}},
+ {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+ 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+ 0x01}},
+ {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11024x600_2[] =
{
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
- 0xae,0x84,0x57,0x25,0x30,0x00,0x02,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
- 0x01}}
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+ 0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+ 0x01}},
+ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11024x600_2_H[] =
{
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
- 0xae,0x84,0x57,0x25,0x30,0x00,0x01,
- 0x01}},
- {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+ 0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+ 0x01}},
+ {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11152x768_1[] =
{
- {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
- 0x00}},
- {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
- 0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
- 0x00}},
- {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
- 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
- 0x01}}
+ {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x01,
+ 0x00}},
+ {{0x64,0x4f,0x88,0x54,0x9f,0x04,0x3e,
+ 0xe2,0x89,0xdf,0x05,0x00,0x00,0x01,
+ 0x00}},
+ {{0x7e,0x63,0x82,0x68,0x15,0x7c,0xf0,
+ 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x26,
+ 0x01}},
+ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11152x768_1_H[] =
{
- {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
- 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
- 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
- 0x00}},
- {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
- 0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
- 0x00}},
- {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
- 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
- 0x01}},
- {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
+ {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x97,0x1f,
+ 0x60,0x87,0x5d,0x83,0x10,0x00,0x44,
+ 0x00}},
+ {{0x2f,0x27,0x93,0x2b,0x90,0x04,0x3e,
+ 0xe2,0x89,0xdf,0x05,0x00,0x00,0x44,
+ 0x00}},
+ {{0x3c,0x31,0x80,0x35,0x1c,0x7c,0xf0,
+ 0x5a,0x8f,0x57,0x7d,0x20,0x00,0x55,
+ 0x01}},
+ {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11152x768_2[] =
{
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
- 0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
- 0x00}},
- {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
- 0xae,0x84,0x57,0x25,0x30,0x00,0x02,
- 0x01}},
- {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
- 0x01}}
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x4f,0x87,0x6e,0x9f,0x24,0xbb,
+ 0x72,0x88,0xdf,0x25,0x30,0x00,0x06,
+ 0x00}},
+ {{0xa3,0x63,0x87,0x78,0x89,0x24,0xf1,
+ 0xae,0x84,0x57,0x25,0x30,0x00,0x02,
+ 0x01}},
+ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11152x768_2_H[] =
{
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
- 0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
- 0x00}},
- {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
- 0xae,0x84,0x57,0x25,0x30,0x00,0x01,
- 0x01}},
- {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
- 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
- 0x01}}
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x4a,0x80,0x8f,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x31,0x87,0x5d,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x27,0x93,0x39,0x01,0x24,0xbb,
+ 0x72,0x88,0xdf,0x25,0x30,0x00,0x01,
+ 0x00}},
+ {{0x4f,0x31,0x93,0x3e,0x06,0x24,0xf1,
+ 0xae,0x84,0x57,0x25,0x30,0x00,0x01,
+ 0x01}},
+ {{0x4f,0x3f,0x93,0x45,0x0d,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 0x01}}
};
static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11280x768_1[] =
@@ -2048,9 +1964,202 @@ static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT11280x768_2_H[] =
0x01}}
};
-/**************************************************************/
-/* COMMON --------------------------------------------------- */
-/**************************************************************/
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1XXXxXXX_1[] =
+{
+ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}},
+ {{0xa3,0x7f,0x87,0x86,0x97,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x02,
+ 0x01}},
+ {{0xce,0x9f,0x92,0xa8,0x14,0x28,0x5a,
+ 0x00,0x84,0xff,0x29,0x09,0x00,0x07,
+ 0x01}},
+ {{0xce,0x9f,0x92,0xa9,0x17,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x07,
+ 0x01}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1XXXxXXX_1_H[] =
+{
+ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+ 0x00}},
+ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+ 0x00}},
+ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+ 0x00}},
+ {{0x38,0x27,0x9c,0x2c,0x80,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x30,0x00,0x00,
+ 0x00}},
+ {{0x38,0x27,0x9c,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}},
+ {{0x4d,0x31,0x91,0x3b,0x03,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x01,
+ 0x01}},
+ {{0x63,0x3f,0x87,0x4a,0x92,0x24,0xf5,
+ 0x02,0x88,0xff,0x25,0x10,0x00,0x01,
+ 0x01}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_1[] =
+{
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_1_H[] =
+{
+ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
+ 0x00}},
+ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+ 0x83,0x85,0x63,0xba,0x00,0x00,0x00,
+ 0x00}},
+ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+ 0x9c,0x8e,0x96,0xb9,0x00,0x00,0x00,
+ 0x00}},
+ {{0x2d,0x28,0x90,0x2b,0xa0,0xbf,0x1f,
+ 0x83,0x85,0x63,0xba,0x00,0x00,0x00,
+ 0x00}},
+ {{0x2d,0x28,0x90,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_2[] =
+{
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x30,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}},
+ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_2_H[] =
+{
+ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
+ 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
+ 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}},
+ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_3[] =
+{
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x5f,0x4f,0x82,0x55,0x81,0x0b,0x3e,
+ 0xe9,0x8b,0xdf,0x04,0x00,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}},
+ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}}
+};
+
+static const SiS_LVDSCRT1DataStruct SiS_LVDSCRT1640x480_3_H[] =
+{
+ {{0x65,0x4f,0x89,0x56,0x83,0xaa,0x1f,
+ 0x90,0x85,0x8f,0xab,0x30,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x54,0x9f,0xc4,0x1f,
+ 0x92,0x89,0x8f,0xb5,0x30,0x00,0x01,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x83,0x1f,
+ 0x5e,0x83,0x5d,0x79,0x10,0x00,0x05,
+ 0x00}},
+ {{0x65,0x4f,0x89,0x56,0x83,0x04,0x3e,
+ 0xe0,0x85,0xdf,0xfb,0x10,0x00,0x05,
+ 0x00}},
+ {{0x7f,0x63,0x83,0x6c,0x1c,0x72,0xf0,
+ 0x58,0x8c,0x57,0x73,0x20,0x00,0x06,
+ 0x01}},
+ {{0x2d,0x27,0x90,0x2c,0x80,0x0b,0x3e,
+ 0xe9,0x8b,0xe7,0x04,0x00,0x00,0x00,
+ 0x00}}
+};
#define SIS_PL_HSYNCP 0x01
#define SIS_PL_HSYNCN 0x02
@@ -2067,6 +2176,7 @@ typedef struct _SiS_PlasmaModes
UCHAR SyncFlags;
} SiS_PlasmaModes;
+
typedef struct _SiS_PlasmaTables
{
USHORT vendor;
@@ -2173,17 +2283,7 @@ static const SiS_PlasmaModes SiS_PlasmaMode[] = {
36000,
800, 1024, 24, 2,
600, 625, 1, 2,
- SIS_PL_HSYNCP | SIS_PL_VSYNCP },
- { "1072x600", /* 19: Panasonic 1072x600 (sync?) */
- 54100,
- 1072, 1424, 48, 176,
- 600, 628, 16, 1,
- SIS_PL_HSYNCP | SIS_PL_VSYNCP },
- { "848x480", /* 20: Panasonic 848x480 (sync?) */
- 33070, /* is 852x480, but we can't use 852 */
- 848, 1068, 20, 40, /* differs from DDC data, better centered */
- 480, 516, 3, 5, /* won't work assumingly, because data is % 8 */
- SIS_PL_HSYNCN | SIS_PL_VSYNCN },
+ SIS_PL_HSYNCP | SIS_PL_VSYNCP }
};
static const SiS_PlasmaTables SiS_PlasmaTable[] = {
@@ -2297,109 +2397,160 @@ static const SiS_PlasmaTables SiS_PlasmaTable[] = {
{ 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
},
- { 0x34a9, 1,
- { 0xa005, 0x0000, 0x0000, 0x0000, 0x0000 },
- { "TH-42PW*4", "", "", "", "" },
- "Panasonic TH-42PW5",
- 1, /* No special modes otherwise; no DVI. */
- {20|0x40,19|0x40, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
- },
{ 0x0000 }
};
-USHORT SiS_GetModeID(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay,
- int Depth, BOOLEAN FSTN, int LCDwith, int LCDheight);
-USHORT SiS_GetModeID_LCD(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth, BOOLEAN FSTN,
- USHORT CustomT, int LCDwith, int LCDheight);
-USHORT SiS_GetModeID_TV(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth);
-USHORT SiS_GetModeID_VGA2(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth);
-
-void SiS_SetReg(SISIOADDRESS port, USHORT index, USHORT data);
-void SiS_SetRegByte(SISIOADDRESS port, USHORT data);
-void SiS_SetRegShort(SISIOADDRESS port, USHORT data);
-void SiS_SetRegLong(SISIOADDRESS port, ULONG data);
-UCHAR SiS_GetReg(SISIOADDRESS port, USHORT index);
-UCHAR SiS_GetRegByte(SISIOADDRESS port);
-USHORT SiS_GetRegShort(SISIOADDRESS port);
-ULONG SiS_GetRegLong(SISIOADDRESS port);
-void SiS_SetRegANDOR(SISIOADDRESS Port,USHORT Index,USHORT DataAND,USHORT DataOR);
-void SiS_SetRegAND(SISIOADDRESS Port,USHORT Index,USHORT DataAND);
-void SiS_SetRegOR(SISIOADDRESS Port,USHORT Index,USHORT DataOR);
-void SiS_DisplayOn(SiS_Private *SiS_Pr);
-void SiS_DisplayOff(SiS_Private *SiS_Pr);
-void SiSRegInit(SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr);
-void SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-BOOLEAN SiSDetermineROMLayout661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
-void SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
-void SiS_GetVBType(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-USHORT SiS_GetMCLK(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-BOOLEAN SiS_SearchModeID(SiS_Private *SiS_Pr, USHORT *ModeNo, USHORT *ModeIdIndex);
-UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex);
-USHORT SiS_GetColorDepth(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex);
-USHORT SiS_GetOffset(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,PSIS_HW_INFO HwInfo);
-void SiS_LoadDAC(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo, USHORT ModeIdIndex);
-void SiS_CalcLCDACRT1Timing(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_SetReg1(USHORT, USHORT, USHORT);
+void SiS_SetReg2(SiS_Private *, USHORT, USHORT, USHORT);
+void SiS_SetReg3(USHORT, USHORT);
+void SiS_SetReg4(USHORT, ULONG);
+void SiS_SetReg5(USHORT, USHORT);
+UCHAR SiS_GetReg1(USHORT, USHORT);
+UCHAR SiS_GetReg2(USHORT);
+ULONG SiS_GetReg3(USHORT);
+USHORT SiS_GetReg4(USHORT);
+void SiS_ClearDAC(SiS_Private *SiS_Pr, ULONG);
+BOOLEAN SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo);
+void SiS_IsLowResolution(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#ifdef SIS315H
+UCHAR SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#endif
+void SiS_HandleCRT1(SiS_Private *SiS_Pr);
+void SiS_Handle301B_1400x1050(SiS_Private *SiS_Pr, USHORT ModeNo);
+void SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
+void SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+BOOLEAN SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex);
+#ifndef LINUX_XF86
+BOOLEAN SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT ModeIdIndex);
+#endif
+UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+void SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetSeqRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+void SiS_SetMiscRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+void SiS_SetCRTCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT StandTableIndex);
+void SiS_SetATTRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetGRCRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT StandTableIndex);
+void SiS_ClearExt1Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetSync(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT RefreshRateTableIndex);
+void SiS_SetCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+BOOLEAN SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *ResInfo,USHORT *DisplayType);
+void SiS_ResetCRT1VCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCRT1VCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO,
+ USHORT RefreshRateTableIndex);
+void SiS_SetVCLKState(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO, USHORT ModeNo,
+ USHORT RefreshRateTableIndex, USHORT ModeIdIndex);
+void SiS_LoadDAC(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_WriteDAC(SiS_Private *SiS_Pr, USHORT, USHORT, USHORT, USHORT, USHORT, USHORT);
+void SiS_DisplayOn(SiS_Private *SiS_Pr);
+void SiS_DisplayOff(SiS_Private *SiS_Pr);
+void SiS_SetCRT1ModeRegs(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO,USHORT ModeNo,
+ USHORT ModeIdIndex,USHORT RefreshRateTableIndex);
+void SiS_GetVBType(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+USHORT SiS_ChkBUSWidth(SiS_Private *SiS_Pr, UCHAR *ROMAddr);
+USHORT SiS_GetModeIDLength(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT);
+USHORT SiS_GetRefindexLength(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT);
+void SiS_SetInterlace(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT RefreshRateTableIndex);
+void SiS_Set_LVDS_TRUMPION(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCRT1Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT,USHORT,USHORT,PSIS_HW_DEVICE_INFO);
+#ifdef SIS315H
+void SiS_SetCRT1FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT,USHORT,PSIS_HW_DEVICE_INFO);
+#endif
+#ifdef SIS300
+void SiS_SetCRT1FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,PSIS_HW_DEVICE_INFO,
+ USHORT RefreshRateTableIndex);
+void SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,PSIS_HW_DEVICE_INFO,
+ USHORT RefreshRateTableIndex);
+USHORT SiS_CalcDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT VCLK,
+ USHORT colordepth, USHORT MCLK);
+USHORT SiS_DoCalcDelay(SiS_Private *SiS_Pr, USHORT MCLK, USHORT VCLK, USHORT colordepth, USHORT key);
+USHORT SiS_CalcDelay2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, UCHAR,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#endif
+void SiS_ClearBuffer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT ModeNo);
+void SiS_SetCRT1Group(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeNo,USHORT ModeIdIndex,USHORT BaseAddr);
+void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
+void SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo);
+void SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiSDetermineROMUsage(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr);
+
#ifdef LINUX_XF86
-BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch);
-BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom);
-BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom);
-BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, ScrnInfoPtr pScrn,
- DisplayModePtr mode, BOOLEAN IsCustom);
-int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber);
-BOOLEAN SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_INFO);
-USHORT SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags);
-DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi);
-#else
-BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,USHORT ModeNo);
+BOOLEAN SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO);
+USHORT SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags);
+void SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr);
+void SiS_SetPitchCRT1(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr);
+void SiS_SetPitchCRT2(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr);
+extern int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
+ int *out_sbit, int *out_scale);
+extern void SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk);
+
+extern unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
+extern unsigned char SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id);
+extern USHORT SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN hcm);
#endif
+
+extern USHORT SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern USHORT SiS_GetColorDepth(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+extern void SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+extern BOOLEAN SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+extern void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr);
+extern BOOLEAN SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr);
+extern BOOLEAN SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO );
+extern void SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension, int chkcrt2mode);
+extern void SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern USHORT SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_WhatIsThis(SiS_Private *SiS_Pr, USHORT myvbinfo);
+extern void SiS_LongWait(SiS_Private *SiS_Pr);
+extern void SiS_SetRegOR(USHORT Port,USHORT Index,USHORT DataOR);
+extern void SiS_SetRegAND(USHORT Port,USHORT Index,USHORT DataAND);
+extern void SiS_SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR);
+extern USHORT SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+extern void SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
+extern USHORT SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
+extern void SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
+extern USHORT SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
+extern void SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
+extern USHORT SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
+extern BOOLEAN SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,
+ USHORT *ResInfo,USHORT *DisplayType);
+extern USHORT SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern BOOLEAN SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr);
+extern BOOLEAN SiS_IsM650(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+extern BOOLEAN SiS_LowModeStuff(SiS_Private *SiS_Pr, USHORT ModeNo,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern BOOLEAN SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+extern BOOLEAN SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+extern USHORT SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+
#ifdef LINUX_KERNEL
-int sisfb_mode_rate_to_dclock(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+int sisfb_mode_rate_to_dclock(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, unsigned char rateindex);
-int sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+int sisfb_mode_rate_to_ddata(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, unsigned char rateindex,
ULONG *left_margin, ULONG *right_margin,
ULONG *upper_margin, ULONG *lower_margin,
ULONG *hsync_len, ULONG *vsync_len,
ULONG *sync, ULONG *vmode);
-BOOLEAN sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
+BOOLEAN sisfb_gettotalfrommode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
unsigned char modeno, int *htotal, int *vtotal, unsigned char rateindex);
#endif
-extern void SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo, int chkcrt2mode);
-extern void SiS_GetLCDResInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo);
-extern void SiS_SetYPbPr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-extern void SiS_SetTVMode(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo);
-extern void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-extern void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-extern void SiS_DisableBridge(SiS_Private *, PSIS_HW_INFO);
-extern BOOLEAN SiS_SetCRT2Group(SiS_Private *, PSIS_HW_INFO, USHORT);
-extern USHORT SiS_GetRatePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo);
-extern void SiS_WaitRetrace1(SiS_Private *SiS_Pr);
-extern USHORT SiS_GetResInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex);
-extern USHORT SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
-extern USHORT SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo);
-extern BOOLEAN SiS_IsVAMode(SiS_Private *, PSIS_HW_INFO);
-extern BOOLEAN SiS_IsDualEdge(SiS_Private *, PSIS_HW_INFO);
-
-#ifdef LINUX_XF86
-extern int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
- int *out_sbit, int *out_scale);
-extern void SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk);
-
-extern unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
-extern unsigned char SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id);
-extern USHORT SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBFlags,
- BOOLEAN hcm);
-#endif
-
#endif
diff --git a/src/init301.c b/src/init301.c
index ab20ab6..3552a29 100644
--- a/src/init301.c
+++ b/src/init301.c
@@ -1,57 +1,34 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.29 2003/09/09 10:29:00 twini Exp $ */
/*
- * Mode initializing code (CRT2 section)
- * for SiS 300/305/540/630/730 and
- * SiS 315/550/650/M650/651/661FX/M661xX/740/741/M741/330/660/M660/760/M760
+ * Mode switching code (CRT2 section)
+ * for SiS 300/305/540/630/730/315/550/650/M650/651/740/330/660/M660/760/M760
* (Universal module for Linux kernel framebuffer and XFree86 4.x)
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
- *
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
- *
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Copyright 2002, 2003 by Thomas Winischhofer <thomas@winischhofer.net>
+ * Formerly based on non-functional code-fragements for 300 series by SiS, Inc.
*
- * Otherwise, the following license terms apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * Otherwise, the following terms apply:
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * Formerly based on non-functional code-fragements for 300 series by SiS, Inc.
- * Used by permission.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* TW says: This code looks awful, I know. But please don't do anything about
* this otherwise debugging will be hell.
@@ -59,20 +36,24 @@
* video bridges and combinations thereof. If anything is changed, extreme
* care has to be taken that that change doesn't break it for other chipsets,
* bridges or combinations thereof.
- * All comments in this file are by me, regardless if marked TW or not.
+ * All comments in this file are by me, regardless if they are marked TW or not.
*
*/
-
-#if 1
-#define SET_EMI /* 302LV/ELV: Set EMI values */
+
+#if 1
+#define NEWCH701x
#endif
-#define COMPAL_HACK /* Needed for Compal 1400x1050 (EMI) */
-#define COMPAQ_HACK /* Needed for Inventec/Compaq 1280x1024 (EMI) */
-#define ASUS_HACK /* Needed for Asus A2H 1024x768 (EMI) */
+#if 0
+#define SET_EMI
+#endif
#include "init301.h"
+#if 0
+#define TWNEWPANEL
+#endif
+
#ifdef SIS300
#include "oem300.h"
#endif
@@ -84,2850 +65,3342 @@
#define SiS_I2CDELAY 1000
#define SiS_I2CDELAYSHORT 150
-static USHORT SiS_GetBIOSLCDResInfo(SiS_Private *SiS_Pr);
-
-/*********************************************/
-/* HELPER: Lock/Unlock CRT2 */
-/*********************************************/
-
-void
-SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+BOOLEAN
+SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- if(HwInfo->jChipType >= SIS_315H)
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
- else
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
-}
+ USHORT ModeIdIndex;
+ USHORT RefreshRateTableIndex;
-void
-SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if(HwInfo->jChipType >= SIS_315H)
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
- else
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
-}
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
-/*********************************************/
-/* HELPER: Write SR11 */
-/*********************************************/
+ if(!SiS_Pr->UseCustomMode) {
+ SiS_SearchModeID(SiS_Pr,ROMAddr,&ModeNo,&ModeIdIndex);
+ } else {
+ ModeIdIndex = 0;
+ }
-static void
-SiS_SetRegSR11ANDOR(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT DataAND, USHORT DataOR)
-{
- if(HwInfo->jChipType >= SIS_661) DataAND &= 0x0f;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,DataAND,DataOR);
-}
+ /* Used for shifting CR33 */
+ SiS_Pr->SiS_SelectCRT2Rate = 4;
-/*********************************************/
-/* HELPER: Get Pointer to LCD structure */
-/*********************************************/
+ SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr);
-#ifdef SIS315H
-static UCHAR *
-GetLCDStructPtr661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- UCHAR *myptr = NULL;
- USHORT romindex = 0;
+ RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr, ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
- /* Use the BIOS tables only for LVDS panels; DVI is unreliable
- * due to the variaty of panels the BIOS doesn't know about.
- */
+ SiS_SaveCRT2Info(SiS_Pr,ModeNo);
- if((SiS_Pr->SiS_ROMNew) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
- myptr = (UCHAR *)SiS_LCDStruct661;
- romindex = SISGETROMW(0x100); /* 10c, 0.93: 10e */
- if(romindex) {
- romindex += ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x7d) & 0x1f) * 26);
- myptr = &ROMAddr[romindex];
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ SiS_DisableBridge(SiS_Pr,HwDeviceExtension,BaseAddr);
+ if((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (HwDeviceExtension->jChipType == SIS_730)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,0x80);
}
+ SiS_SetCRT2ModeRegs(SiS_Pr,BaseAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
}
- return myptr;
-}
-static USHORT
-GetLCDStructPtr661_2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT romptr = 0;
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ SiS_LockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
+ SiS_DisplayOn(SiS_Pr);
+ return(TRUE);
+ }
- /* Use the BIOS tables only for LVDS panels; DVI is unreliable
- * due to the variaty of panels the BIOS doesn't know about.
- */
+ SiS_GetCRT2Data(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
- if((SiS_Pr->SiS_ROMNew) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
- romptr = SISGETROMW(0x102); /* 2ad */
- romptr += ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) * SiS_Pr->SiS661LCD2TableSize);
+ /* Set up Panel Link for LVDS, 301BDH and 650/30xLV(for LCDA) */
+ if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
+ ((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ||
+ ((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) {
+ SiS_GetLVDSDesData(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension, BaseAddr);
+ } else {
+ SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0;
}
- return(romptr);
-}
+#ifdef LINUX_XF86
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "(init301: LCDHDES 0x%03x LCDVDES 0x%03x)\n", SiS_Pr->SiS_LCDHDES, SiS_Pr->SiS_LCDVDES);
+ xf86DrvMsg(0, X_INFO, "(init301: HDE 0x%03x VDE 0x%03x)\n", SiS_Pr->SiS_HDE, SiS_Pr->SiS_VDE);
+ xf86DrvMsg(0, X_INFO, "(init301: VGAHDE 0x%03x VGAVDE 0x%03x)\n", SiS_Pr->SiS_VGAHDE, SiS_Pr->SiS_VGAVDE);
+ xf86DrvMsg(0, X_INFO, "(init301: HT 0x%03x VT 0x%03x)\n", SiS_Pr->SiS_HT, SiS_Pr->SiS_VT);
+ xf86DrvMsg(0, X_INFO, "(init301: VGAHT 0x%03x VGAVT 0x%03x)\n", SiS_Pr->SiS_VGAHT, SiS_Pr->SiS_VGAVT);
+#endif
#endif
-/*********************************************/
-/* Adjust Rate for CRT2 */
-/*********************************************/
-
-static BOOLEAN
-SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT *i,
- PSIS_HW_INFO HwInfo)
-{
- USHORT checkmask=0,modeid,infoflag;
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ SiS_SetGroup1(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+ }
- modeid = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+ SiS_SetGroup2(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ SiS_SetGroup3(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension);
+ SiS_SetGroup4(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ SiS_SetGroup5(SiS_Pr,HwDeviceExtension, BaseAddr,ROMAddr,
+ ModeNo,ModeIdIndex);
- checkmask |= SupportRAMDAC2;
- if(HwInfo->jChipType >= SIS_315H) {
- checkmask |= SupportRAMDAC2_135;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- checkmask |= SupportRAMDAC2_162;
- if(SiS_Pr->SiS_VBType & VB_SIS301C) {
- checkmask |= SupportRAMDAC2_202;
+ /* For 301BDH (Panel link initialization): */
+ if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(!((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo = 0x10)))) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ SiS_ModCRT1CRTC(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ }
+ }
}
+ SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
}
- }
+ }
- } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+ } else {
- checkmask |= SupportLCD;
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- if(modeid == 0x2e) checkmask |= Support64048060Hz;
- }
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+ SiS_ModCRT1CRTC(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
}
}
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
-
- checkmask |= SupportHiVision;
-
- } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToYPbPr525750|SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
+ SiS_SetCRT2ECLK(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
- checkmask |= SupportTV;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- checkmask |= SupportTV1024;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
- checkmask |= SupportYPbPr750p;
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+#ifdef SIS315H
+ SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
+#endif
+ }
}
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ SiS_SetCHTVReg(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex);
+ }
+ }
}
- }
+ }
- } else { /* LVDS */
+#ifdef SIS300
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ if(SiS_Pr->SiS_UseOEM) {
+ if((SiS_Pr->SiS_UseROM) && ROMAddr && (SiS_Pr->SiS_UseOEM == -1)) {
+ if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+ SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex);
+ }
+ } else {
+ SiS_OEM300Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex);
+ }
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
+ (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
+ SetOEMLCDData2(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,
+ ModeIdIndex,RefreshRateTableIndex);
+ }
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ SiS_DisplayOn(SiS_Pr);
+ }
+ }
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(HwDeviceExtension->jChipType != SIS_730) {
+ SiS_DisplayOn(SiS_Pr);
+ }
+ }
+ }
+#endif
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- checkmask |= SupportCHTV;
- }
- }
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ SiS_FinalizeLCD(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex, HwDeviceExtension);
+ if(SiS_Pr->SiS_UseOEM) {
+ SiS_OEM310Setting(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+ }
+ SiS_CRT2AutoThreshold(SiS_Pr,BaseAddr);
+ }
+ }
+#endif
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- checkmask |= SupportLCD;
- }
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ SiS_EnableBridge(SiS_Pr,HwDeviceExtension,BaseAddr);
+ }
- }
+ SiS_DisplayOn(SiS_Pr);
- /* Look backwards in table for matching CRT2 mode */
- for(; SiS_Pr->SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID == modeid; (*i)--) {
- infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
- if(infoflag & checkmask) return TRUE;
- if((*i) == 0) break;
- }
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ /* Disable LCD panel when using TV */
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x11,0x0C);
+ } else {
+ /* Disable TV when using LCD */
+ SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
+ }
+ }
- /* Look through the whole mode-section of the table from the beginning
- * for a matching CRT2 mode if no mode was found yet.
- */
- for((*i) = 0; ; (*i)++) {
- if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != modeid) {
- return FALSE;
- }
- infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
- if(infoflag & checkmask) return TRUE;
- }
- return TRUE;
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
+ SiS_LockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
+ }
+
+ return 1;
}
-/*********************************************/
-/* Get rate index */
-/*********************************************/
+BOOLEAN
+SiS_LowModeStuff(SiS_Private *SiS_Pr, USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT temp,temp1,temp2;
+
+ if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12))
+ return(1);
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x11);
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x11,0x80);
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,0x55);
+ temp2 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,temp1);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x11,temp);
+ if((HwDeviceExtension->jChipType >= SIS_315H) ||
+ (HwDeviceExtension->jChipType == SIS_300)) {
+ if(temp2 == 0x55) return(0);
+ else return(1);
+ } else {
+ if(temp2 != 0x55) return(1);
+ else {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
+ return(0);
+ }
+ }
+}
-USHORT
-SiS_GetRatePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+/* Set Part1 registers */
+void
+SiS_SetGroup1(SiS_Private *SiS_Pr,USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT RefreshRateTableIndex)
{
- SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01,
- 0x01, 0x01, 0x01, 0x01,
- 0x00, 0x00, 0x00, 0x00 };
- USHORT RefreshRateTableIndex,i,backup_i;
- USHORT modeflag,index,temp,backupindex;
-
- /* Do NOT check for UseCustomMode here, will skrew up FIFO */
- if(ModeNo == 0xfe) return 0;
+ USHORT temp=0, tempax=0, tempbx=0, tempcx=0;
+ USHORT pushbx=0, CRT1Index=0;
+#ifdef SIS315H
+ USHORT tempbl=0;
+#endif
+ USHORT modeflag, resinfo=0;
- if(ModeNo <= 0x13)
+ if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- else
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
-
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(modeflag & HalfDCLK) return 0;
+ } else {
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
}
}
- if(ModeNo < 0x14) return 0xFFFF;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+#ifdef SIS315H
+ SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
+ RefreshRateTableIndex,HwDeviceExtension);
- index = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x33) >> SiS_Pr->SiS_SelectCRT2Rate) & 0x0F;
- backupindex = index;
+ SiS_SetGroup1_LCDA(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+#endif
+ } else {
- if(index > 0) index--;
+ if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+ (SiS_Pr->SiS_IF_DEF_LVDS == 1) &&
+ (SiS_Pr->SiS_VBInfo & SetInSlaveMode) ) {
+
+ SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
+ RefreshRateTableIndex,HwDeviceExtension);
- if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->SiS_VBType & VB_NoLCD) index = 0;
- else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index = backupindex = 0;
- }
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
- temp = LCDRefreshIndex[SiS_GetBIOSLCDResInfo(SiS_Pr)];
- if(index > temp) index = temp;
- }
- }
} else {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) index = 0;
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) index = 0;
- }
- }
- }
- RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
- ModeNo = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].ModeID;
+ SiS_SetCRT2Offset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
- if(HwInfo->jChipType >= SIS_315H) {
- if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
- if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
- (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x107) ) {
- if(backupindex <= 1) RefreshRateTableIndex++;
- }
- }
- }
+ if (HwDeviceExtension->jChipType < SIS_315H ) {
+#ifdef SIS300
+ SiS_SetCRT2FIFO_300(SiS_Pr,ROMAddr,ModeNo,HwDeviceExtension);
+#endif
+ } else {
+#ifdef SIS315H
+ SiS_SetCRT2FIFO_310(SiS_Pr,ROMAddr,ModeNo,HwDeviceExtension);
+#endif
+ }
- i = 0;
- do {
- if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo) break;
- temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
- temp &= ModeInfoFlag;
- if(temp < SiS_Pr->SiS_ModeType) break;
- i++;
- index--;
- } while(index != 0xFFFF);
+ SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo,
+ RefreshRateTableIndex,HwDeviceExtension);
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i - 1].Ext_InfoFlag;
- if(temp & InterlaceMode) i++;
- }
- }
+ /* 1. Horizontal setup */
- i--;
+ if (HwDeviceExtension->jChipType < SIS_315H ) {
- if((SiS_Pr->SiS_SetFlag & ProgrammingCRT2) && (!(SiS_Pr->SiS_VBInfo & DisableCRT2Display))) {
- backup_i = i;
- if(!(SiS_AdjustCRT2Rate(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, &i, HwInfo))) {
- i = backup_i;
- }
- }
+#ifdef SIS300 /* ------------- 300 series --------------*/
- return(RefreshRateTableIndex + i);
-}
+ temp = (SiS_Pr->SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp); /* CRT2 Horizontal Total */
-/*********************************************/
-/* STORE CRT2 INFO in CR34 */
-/*********************************************/
+ temp = (((SiS_Pr->SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp); /* CRT2 Horizontal Total Overflow [7:4] */
-static void
-SiS_SaveCRT2Info(SiS_Private *SiS_Pr, USHORT ModeNo)
-{
- USHORT temp1,temp2;
+ temp = (SiS_Pr->SiS_VGAHDE + 12) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp); /* CRT2 Horizontal Display Enable End */
- /* Store CRT1 ModeNo in CR34 */
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x34,ModeNo);
- temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
- temp2 = ~(SetInSlaveMode >> 8);
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x31,temp2,temp1);
-}
+ pushbx = SiS_Pr->SiS_VGAHDE + 12; /* bx BTVGA@HRS 0x0B,0x0C */
+ tempcx = (SiS_Pr->SiS_VGAHT - SiS_Pr->SiS_VGAHDE) >> 2;
+ tempbx = pushbx + tempcx;
+ tempcx <<= 1;
+ tempcx += tempbx;
-/*********************************************/
-/* HELPER: GET SOME DATA FROM BIOS ROM */
-/*********************************************/
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
-#ifdef SIS300
-static BOOLEAN
-SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = (UCHAR *)HwInfo->pjVirtualRomBase;
- USHORT temp,temp1;
+ if(SiS_Pr->UseCustomMode) {
+ tempbx = SiS_Pr->CHSyncStart + 12;
+ tempcx = SiS_Pr->CHSyncEnd + 12;
+ }
- if(SiS_Pr->SiS_UseROM) {
- if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
- temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xff) >> 4);
- temp1 = SISGETROMW(0x23b);
- if(temp1 & temp) return TRUE;
- }
- }
- return FALSE;
-}
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+ unsigned char cr4, cr14, cr5, cr15;
+ if(SiS_Pr->UseCustomMode) {
+ cr4 = SiS_Pr->CCRT1CRTC[4];
+ cr14 = SiS_Pr->CCRT1CRTC[14];
+ cr5 = SiS_Pr->CCRT1CRTC[5];
+ cr15 = SiS_Pr->CCRT1CRTC[15];
+ } else {
+ cr4 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+ cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
+ cr5 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+ cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+ }
+ tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 1) << 3;
+ tempcx = (((cr5 & 0x1F) | ((cr15 & 0x04) << (6-2))) - 1) << 3;
+ }
+
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)){
+ tempbx = 1040;
+ tempcx = 1042;
+ }
+ }
+ }
-static BOOLEAN
-SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = (UCHAR *)HwInfo->pjVirtualRomBase;
- USHORT temp,temp1;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp); /* CRT2 Horizontal Retrace Start */
+#endif /* SIS300 */
- if(SiS_Pr->SiS_UseROM) {
- if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
- temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xff) >> 4);
- temp1 = SISGETROMW(0x23d);
- if(temp1 & temp) return TRUE;
- }
- }
- return FALSE;
-}
-#endif
+ } else {
-/*********************************************/
-/* HELPER: DELAY FUNCTIONS */
-/*********************************************/
+#ifdef SIS315H /* ------------------- 315/330 series --------------- */
-void
-SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime)
-{
- USHORT i, j;
+ tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HT 0x08,0x09 */
+ if(modeflag & HalfDCLK) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ tempax = SiS_Pr->SiS_VGAHDE >> 1;
+ tempcx = SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE + tempax;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ tempcx = SiS_Pr->SiS_HT - tempax;
+ }
+ } else {
+ tempcx >>= 1;
+ }
+ }
+ tempcx--;
- for(i=0; i<delaytime; i++) {
- j += SiS_GetReg(SiS_Pr->SiS_P3c4,0x05);
- }
-}
+ temp = tempcx & 0xff;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,temp); /* CRT2 Horizontal Total */
-static void
-SiS_GenericDelay(SiS_Private *SiS_Pr, USHORT delay)
-{
- USHORT temp,flag;
+ temp = ((tempcx & 0xff00) >> 8) << 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp); /* CRT2 Horizontal Total Overflow [7:4] */
- flag = SiS_GetRegByte(0x61) & 0x10;
+ tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HDEE 0x0A,0x0C */
+ tempbx = SiS_Pr->SiS_VGAHDE;
+ tempcx -= tempbx;
+ tempcx >>= 2;
+ if(modeflag & HalfDCLK) {
+ tempbx >>= 1;
+ tempcx >>= 1;
+ }
+ tempbx += 16;
- while(delay) {
- temp = SiS_GetRegByte(0x61) & 0x10;
- if(temp == flag) continue;
- flag = temp;
- delay--;
- }
-}
+ temp = tempbx & 0xff;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp); /* CRT2 Horizontal Display Enable End */
-#ifdef SIS315H
-static void
-SiS_LongDelay(SiS_Private *SiS_Pr, USHORT delay)
-{
- while(delay--) {
- SiS_GenericDelay(SiS_Pr,0x19df);
- }
-}
+ pushbx = tempbx;
+ tempcx >>= 1;
+ tempbx += tempcx;
+ tempcx += tempbx;
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+
+ if(SiS_Pr->UseCustomMode) {
+ tempbx = SiS_Pr->CHSyncStart + 16;
+ tempcx = SiS_Pr->CHSyncEnd + 16;
+ tempax = SiS_Pr->SiS_VGAHT;
+ if(modeflag & HalfDCLK) tempax >>= 1;
+ tempax--;
+ if(tempcx > tempax) tempcx = tempax;
+ }
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+ unsigned char cr4, cr14, cr5, cr15;
+ if(SiS_Pr->UseCustomMode) {
+ cr4 = SiS_Pr->CCRT1CRTC[4];
+ cr14 = SiS_Pr->CCRT1CRTC[14];
+ cr5 = SiS_Pr->CCRT1CRTC[5];
+ cr15 = SiS_Pr->CCRT1CRTC[15];
+ } else {
+ cr4 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
+ cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
+ cr5 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
+ cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
+ }
+ tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 3) << 3; /* (VGAHRS-3)*8 */
+ tempcx = (((cr5 & 0x1f) | ((cr15 & 0x04) << (5-2))) - 3) << 3; /* (VGAHRE-3)*8 */
+ tempcx &= 0x00FF;
+ tempcx |= (tempbx & 0xFF00);
+ tempbx += 16;
+ tempcx += 16;
+ tempax = SiS_Pr->SiS_VGAHT;
+ if(modeflag & HalfDCLK) tempax >>= 1;
+ tempax--;
+ if(tempcx > tempax) tempcx = tempax;
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if(resinfo == SIS_RI_1024x768) {
+ tempbx = 1040;
+ tempcx = 1042;
+ }
+ }
+ }
+#if 0
+ /* Makes no sense, but is in 650/30xLV 1.10.6s */
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (resinfo == SIS_RI_1024x768)){
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ tempbx = 1040;
+ tempcx = 1042;
+ }
+ }
+ }
#endif
+ }
-static void
-SiS_ShortDelay(SiS_Private *SiS_Pr, USHORT delay)
-{
- while(delay--) {
- SiS_GenericDelay(SiS_Pr,0x42);
- }
-}
+ temp = tempbx & 0xff;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp); /* CRT2 Horizontal Retrace Start */
+#endif /* SIS315H */
-static void
-SiS_PanelDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT DelayTime)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT PanelID, DelayIndex, Delay=0;
+ } /* 315/330 series */
- if(HwInfo->jChipType < SIS_315H) {
+ /* The following is done for all bridge/chip types/series */
-#ifdef SIS300
+ tempax = tempbx & 0xFF00;
+ tempbx = pushbx;
+ tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
+ tempax |= (tempbx & 0xFF00);
+ temp = (tempax & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp); /* Overflow */
- PanelID = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x18) & 0x10)) PanelID = 0x12;
- }
- DelayIndex = PanelID >> 4;
- if((DelayTime >= 2) && ((PanelID & 0x0f) == 1)) {
- Delay = 3;
- } else {
- if(DelayTime >= 2) DelayTime -= 2;
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp); /* CRT2 Horizontal Retrace End */
- if(!(DelayTime & 0x01)) {
- Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
- } else {
- Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
- }
- if(SiS_Pr->SiS_UseROM) {
- if(ROMAddr[0x220] & 0x40) {
- if(!(DelayTime & 0x01)) {
- Delay = (USHORT)ROMAddr[0x225];
- } else {
- Delay = (USHORT)ROMAddr[0x226];
- }
- }
- }
- }
- SiS_ShortDelay(SiS_Pr,Delay);
+ /* 2. Vertical setup */
-#endif /* SIS300 */
+ tempcx = SiS_Pr->SiS_VGAVT - 1;
+ temp = tempcx & 0x00FF;
- } else {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
+ temp--;
+ }
+ }
+ } else {
+ temp--;
+ }
+ } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+ /* 650/30xLV 1.10.6s */
+ temp--;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp); /* CRT2 Vertical Total */
+
+ tempbx = SiS_Pr->SiS_VGAVDE - 1;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,temp); /* CRT2 Vertical Display Enable End */
+
+ temp = ((tempbx & 0xFF00) << 3) >> 8;
+ temp |= ((tempcx & 0xFF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,temp); /* Overflow (and HWCursor Test Mode) */
+
+ /* 650/LVDS (1.10.07), 650/30xLV (1.10.6s) */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ tempbx++;
+ tempax = tempbx;
+ tempcx++;
+ tempcx -= tempax;
+ tempcx >>= 2;
+ tempbx += tempcx;
+ if(tempcx < 4) tempcx = 4;
+ tempcx >>= 2;
+ tempcx += tempbx;
+ tempcx++;
+ } else {
+ /* 300 series, LVDS/301B: */
+ tempbx = (SiS_Pr->SiS_VGAVT + SiS_Pr->SiS_VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */
+ tempcx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */
+ }
-#ifdef SIS315H
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
- if(HwInfo->jChipType >= SIS_661) {
+ if(SiS_Pr->UseCustomMode) {
+ tempbx = SiS_Pr->CVSyncStart;
+ tempcx = (tempcx & 0xFF00) | (SiS_Pr->CVSyncEnd & 0x00FF);
+ }
- if(!(DelayTime & 0x01)) {
- SiS_DDC2Delay(SiS_Pr, 0x1000);
- } else {
- SiS_DDC2Delay(SiS_Pr, 0x4000);
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+ unsigned char cr8, cr7, cr13, cr9;
+ if(SiS_Pr->UseCustomMode) {
+ cr8 = SiS_Pr->CCRT1CRTC[8];
+ cr7 = SiS_Pr->CCRT1CRTC[7];
+ cr13 = SiS_Pr->CCRT1CRTC[13];
+ cr9 = SiS_Pr->CCRT1CRTC[9];
+ } else {
+ cr8 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
+ cr7 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
+ cr13 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
+ cr9 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
+ }
+ tempbx = cr8;
+ if(cr7 & 0x04) tempbx |= 0x0100;
+ if(cr7 & 0x80) tempbx |= 0x0200;
+ if(cr13 & 0x08) tempbx |= 0x0400;
+ tempcx = (tempcx & 0xFF00) | (cr9 & 0x00FF);
+ }
+ }
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp); /* CRT2 Vertical Retrace Start */
- } else if(HwInfo->jChipType >= SIS_330) return;
+ temp = ((tempbx & 0xFF00) >> 8) << 4;
+ temp |= (tempcx & 0x000F);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,temp); /* CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
- if((SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
- (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) { /* 315 series, LVDS; Special */
+ /* 3. Panel compensation delay */
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- PanelID = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
- if(SiS_Pr->SiS_CustomT == CUT_CLEVO1400) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x1b) & 0x10)) PanelID = 0x12;
- }
- if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- DelayIndex = PanelID & 0x0f;
- } else {
- DelayIndex = PanelID >> 4;
- }
- if((DelayTime >= 2) && ((PanelID & 0x0f) == 1)) {
- Delay = 3;
- } else {
- if(DelayTime >= 2) DelayTime -= 2;
- if(!(DelayTime & 0x01)) {
- Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[0];
- } else {
- Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[1];
- }
- if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
- if(ROMAddr[0x13c] & 0x40) {
- if(!(DelayTime & 0x01)) {
- Delay = (USHORT)ROMAddr[0x17e];
- } else {
- Delay = (USHORT)ROMAddr[0x17f];
- }
- }
- }
- }
- SiS_ShortDelay(SiS_Pr,Delay);
- }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) { /* 315 series, all bridges */
+#ifdef SIS300 /* ---------- 300 series -------------- */
- DelayIndex = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
- if(!(DelayTime & 0x01)) {
- Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
- } else {
- Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
- }
- Delay <<= 8;
- SiS_DDC2Delay(SiS_Pr, Delay);
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ temp = 0x20;
- }
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ temp = 0x10;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) temp = 0x2c;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+ }
+ if(SiS_Pr->SiS_VBType & VB_SIS301) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+ }
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) temp = 0x24;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) temp = 0x2c;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x08;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) temp = 0x2c;
+ else temp = 0x20;
+ }
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(ROMAddr[0x220] & 0x80) {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV-SetCRT2ToHiVisionTV))
+ temp = ROMAddr[0x221];
+ else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)
+ temp = ROMAddr[0x222];
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)
+ temp = ROMAddr[0x223];
+ else
+ temp = ROMAddr[0x224];
+ temp &= 0x3c;
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(HwDeviceExtension->pdc) {
+ temp = HwDeviceExtension->pdc & 0x3c;
+ }
+ }
+ } else {
+ temp = 0x20;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) temp = 0x04;
+ }
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ if(ROMAddr[0x220] & 0x80) {
+ temp = ROMAddr[0x220] & 0x3c;
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(HwDeviceExtension->pdc) {
+ temp = HwDeviceExtension->pdc & 0x3c;
+ }
+ }
+ }
-#endif /* SIS315H */
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x03C,temp); /* Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
- }
-}
+#endif /* SIS300 */
-#ifdef SIS315H
-static void
-SiS_PanelDelayLoop(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT DelayTime, USHORT DelayLoop)
-{
- int i;
- for(i=0; i<DelayLoop; i++) {
- SiS_PanelDelay(SiS_Pr, HwInfo, DelayTime);
- }
-}
-#endif
+ } else {
-/*********************************************/
-/* HELPER: WAIT-FOR-RETRACE FUNCTIONS */
-/*********************************************/
+#ifdef SIS315H /* --------------- 315/330 series ---------------*/
-void
-SiS_WaitRetrace1(SiS_Private *SiS_Pr)
-{
- USHORT watchdog;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ temp = 0x10;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) temp = 0x2c;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) temp = 0x20;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) temp = 0x24;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) temp = 0x2c;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ temp = 0x08;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ switch(SiS_Pr->SiS_HiVision) {
+ case 2:
+ case 1:
+ case 0:
+ temp = 0x08;
+ break;
+ default:
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) temp = 0x2c;
+ else temp = 0x20;
+ }
+ }
+ }
+ if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
+ tempbl = 0x00;
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ if(ROMAddr[0x13c] & 0x80) tempbl = 0xf0;
+ } else {
+ if(ROMAddr[0x1bc] & 0x80) tempbl = 0xf0;
+ }
+ }
+ } else { /* LV (550/301LV checks ROM byte, other LV BIOSes do not) */
+ tempbl = 0xF0;
+ }
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD|SetCRT2ToLCDA)) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(HwDeviceExtension->pdc) {
+ temp = HwDeviceExtension->pdc;
+ tempbl = 0;
+ }
+ }
+ }
+ } else {
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ temp = 0x03;
+ } else {
+ temp = 0x00;
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x0a;
+ tempbl = 0xF0;
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempbl = 0x0F;
+ }
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
+ temp = 0x08;
+ tempbl = 0;
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(ROMAddr[0x13c] & 0x80) tempbl = 0xf0;
+ }
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp); /* Panel Link Delay Compensation */
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+ tempax = 0;
+ if (modeflag & DoubleScanMode) tempax |= 0x80;
+ if (modeflag & HalfDCLK) tempax |= 0x40;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2C,0x3f,tempax);
- if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x17) & 0x80)) return;
+#endif /* SIS315H */
- watchdog = 65535;
- while((SiS_GetRegByte(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
- watchdog = 65535;
- while((!(SiS_GetRegByte(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
-}
+ }
-static void
-SiS_WaitRetrace2(SiS_Private *SiS_Pr, USHORT reg)
-{
- USHORT watchdog;
+ } /* Slavemode */
- watchdog = 65535;
- while((SiS_GetReg(SiS_Pr->SiS_Part1Port,reg) & 0x02) && --watchdog);
- watchdog = 65535;
- while((!(SiS_GetReg(SiS_Pr->SiS_Part1Port,reg) & 0x02)) && --watchdog);
-}
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+
+ /* For 301BDH with LCD, we set up the Panel Link */
+ if( (SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) {
+
+ SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+
+ } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+
+ SiS_SetGroup1_301(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+ }
-static void
-SiS_WaitVBRetrace(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if(HwInfo->jChipType < SIS_315H) {
-#ifdef SIS300
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x20)) return;
- }
- if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x80)) {
- SiS_WaitRetrace1(SiS_Pr);
} else {
- SiS_WaitRetrace2(SiS_Pr, 0x25);
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+
+ SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+ } else {
+
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+ }
+ } else {
+ SiS_SetGroup1_LVDS(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ HwDeviceExtension,RefreshRateTableIndex);
+ }
+
+ }
+
}
-#endif
+ } /* LCDA */
+}
+
+void
+SiS_SetGroup1_301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+{
+ USHORT push1,push2;
+ USHORT tempax,tempbx,tempcx,temp;
+ USHORT resinfo,modeflag;
+ unsigned char p1_7, p1_8;
+
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
} else {
-#ifdef SIS315H
- if(!(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x40)) {
- SiS_WaitRetrace1(SiS_Pr);
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ resinfo = 0;
} else {
- SiS_WaitRetrace2(SiS_Pr, 0x30);
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
-#endif
}
-}
-static void
-SiS_VBWait(SiS_Private *SiS_Pr)
-{
- USHORT tempal,temp,i,j;
+ /* The following is only done if bridge is in slave mode: */
- temp = 0;
- for(i=0; i<3; i++) {
- for(j=0; j<100; j++) {
- tempal = SiS_GetRegByte(SiS_Pr->SiS_P3da);
- if(temp & 0x01) {
- if((tempal & 0x08)) continue;
- if(!(tempal & 0x08)) break;
- } else {
- if(!(tempal & 0x08)) continue;
- if((tempal & 0x08)) break;
- }
- }
- temp ^= 0x01;
- }
-}
+ tempax = 0xFFFF;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempax = SiS_GetVGAHT2(SiS_Pr);
-static void
-SiS_VBLongWait(SiS_Private *SiS_Pr)
-{
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SiS_VBWait(SiS_Pr);
- } else {
- SiS_WaitRetrace1(SiS_Pr);
- }
-}
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) modeflag |= Charx8Dot;
-/*********************************************/
-/* HELPER: MISC */
-/*********************************************/
+ if(modeflag & Charx8Dot) tempcx = 0x08;
+ else tempcx = 0x09;
-static BOOLEAN
-SiS_Is301B(SiS_Private *SiS_Pr)
-{
- if(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01) >= 0xb0) return TRUE;
- return FALSE;
-}
+ if(tempax >= SiS_Pr->SiS_VGAHT) tempax = SiS_Pr->SiS_VGAHT;
-static BOOLEAN
-SiS_CRT2IsLCD(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ if(modeflag & HalfDCLK) tempax >>= 1;
- if(HwInfo->jChipType == SIS_730) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3c4,0x13);
- if(flag & 0x20) return TRUE;
- }
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(flag & 0x20) return TRUE;
- return FALSE;
-}
+ tempax = (tempax / tempcx) - 5;
+ tempbx = tempax & 0x00FF;
-BOOLEAN
-SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
-#ifdef SIS315H
- USHORT flag;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0xff); /* set MAX HT */
- if(HwInfo->jChipType >= SIS_315H) {
- if((HwInfo->jChipType != SIS_650) || (SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0)) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(flag & EnableDualEdge) return TRUE;
+ tempax = SiS_Pr->SiS_VGAHDE; /* 0x04 Horizontal Display End */
+ if(modeflag & HalfDCLK) tempax >>= 1;
+ tempax = (tempax / tempcx) - 1;
+ tempbx |= ((tempax & 0x00FF) << 8);
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,temp);
+
+ temp = (tempbx & 0xFF00) >> 8;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+ temp += 2;
}
}
-#endif
- return FALSE;
-}
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_HiVision == 3) {
+ if(resinfo == SIS_RI_800x600) temp -= 2;
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x05,temp); /* 0x05 Horizontal Display Start */
-BOOLEAN
-SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
-#ifdef SIS315H
- USHORT flag;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x06,0x03); /* 0x06 Horizontal Blank end */
- if(HwInfo->jChipType >= SIS_315H) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if((flag & EnableDualEdge) && (flag & SetToLCDA)) return TRUE;
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
+ temp = (tempbx & 0x00FF) - 1;
+ if(!(modeflag & HalfDCLK)) {
+ temp -= 6;
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ temp -= 2;
+ if(ModeNo > 0x13) temp -= 10;
+ }
+ }
+ } else {
+ tempcx = tempbx & 0x00FF;
+ tempbx = (tempbx & 0xFF00) >> 8;
+ tempcx = (tempcx + tempbx) >> 1;
+ temp = (tempcx & 0x00FF) + 2;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ temp--;
+ if(!(modeflag & HalfDCLK)) {
+ if((modeflag & Charx8Dot)) {
+ temp += 4;
+ if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
+ }
+ }
+ }
+ } else {
+ if(!(modeflag & HalfDCLK)) {
+ temp -= 4;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+ if(SiS_Pr->SiS_VGAHDE >= 800) {
+ temp -= 7;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ /* 650/301LV(x) does not do this, 630/301B, 300/301LV do */
+ if(SiS_Pr->SiS_ModeType == ModeEGA) {
+ if(SiS_Pr->SiS_VGAVDE == 1024) {
+ temp += 15;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)
+ temp += 7;
+ }
+ }
+ }
+ if(SiS_Pr->SiS_VGAHDE >= 1280) {
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
+ }
+ }
+ }
+ }
+ }
}
-#endif
- return FALSE;
-}
-static BOOLEAN
-SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- if((SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ||
- (SiS_IsVAMode(SiS_Pr, HwInfo))) {
- if(SiS_Pr->SiS_LCDInfo & LCDDualLink) return TRUE;
+ p1_7 = temp;
+ p1_8 = 0x00;
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ if(ModeNo <= 0x01) {
+ p1_7 = 0x2a;
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_8 = 0x61;
+ else p1_8 = 0x41;
+ } else if(SiS_Pr->SiS_ModeType == ModeText) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) p1_7 = 0x54;
+ else p1_7 = 0x55;
+ p1_8 = 0x00;
+ } else if(ModeNo <= 0x13) {
+ if(modeflag & HalfDCLK) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ p1_7 = 0x30;
+ p1_8 = 0x03;
+ } else {
+ p1_7 = 0x2f;
+ p1_8 = 0x02;
+ }
+ } else {
+ p1_7 = 0x5b;
+ p1_8 = 0x03;
+ }
+ } else if( ((HwDeviceExtension->jChipType >= SIS_315H) &&
+ ((ModeNo == 0x50) || (ModeNo = 0x56) || (ModeNo = 0x53))) ||
+ ((HwDeviceExtension->jChipType < SIS_315H) &&
+ (resinfo == SIS_RI_320x200 || resinfo == SIS_RI_320x240)) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ p1_7 = 0x30,
+ p1_8 = 0x03;
+ } else {
+ p1_7 = 0x2f;
+ p1_8 = 0x03;
+ }
+ }
}
}
-#endif
- return FALSE;
-}
-#ifdef SIS315H
-static BOOLEAN
-SiS_TVEnabled(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) != 0x0c) return TRUE;
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS301LV302LV)) {
- if(SiS_GetReg(SiS_Pr->SiS_Part2Port,0x4d) & 0x10) return TRUE;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_HiVision & 0x03) {
+ p1_7 = 0xb2;
+ if(SiS_Pr->SiS_HiVision & 0x02) {
+ p1_7 = 0xab;
+ }
+ }
}
- return FALSE;
-}
-#endif
-#ifdef SIS315H
-static BOOLEAN
-SiS_LCDAEnabled(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) return TRUE;
- return FALSE;
-}
-#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,p1_7); /* 0x07 Horizontal Retrace Start */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x08,p1_8); /* 0x08 Horizontal Retrace End */
-#ifdef SIS315H
-static BOOLEAN
-SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
- if((HwInfo->jChipType >= SIS_315H) && (HwInfo->jChipType < SIS_661)) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x79);
- if(flag & 0x10) return TRUE;
- }
- return FALSE;
-}
-#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x03); /* 0x18 SR08 (FIFO Threshold?) */
-#ifdef SIS315H
-static BOOLEAN
-SiS_IsNotM650orLater(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x19,0xF0);
- if(HwInfo->jChipType == SIS_650) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f);
- flag &= 0xF0;
- /* Check for revision != A0 only */
- if((flag == 0xe0) || (flag == 0xc0) ||
- (flag == 0xb0) || (flag == 0x90)) return FALSE;
- } else if(HwInfo->jChipType >= SIS_661) return FALSE;
- return TRUE;
-}
-#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x09,0xFF); /* 0x09 Set Max VT */
-#ifdef SIS315H
-static BOOLEAN
-SiS_IsYPbPr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ tempcx = 0x121;
+ tempbx = SiS_Pr->SiS_VGAVDE; /* 0x0E Vertical Display End */
+ if (tempbx == 357) tempbx = 350;
+ else if(tempbx == 360) tempbx = 350;
+ else if(tempbx == 375) tempbx = 350;
+ else if(tempbx == 405) tempbx = 400;
+ else if(tempbx == 420) tempbx = 400;
+ else if(tempbx == 525) tempbx = 480;
+ push2 = tempbx;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+ if (tempbx == 350) tempbx += 5;
+ else if(tempbx == 480) tempbx += 5;
+ }
+ }
+ }
+ tempbx -= 2;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp); /* 0x10 vertical Blank Start */
- if(HwInfo->jChipType >= SIS_315H) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(flag & EnableCHYPbPr) return TRUE; /* = YPrPb = 0x08 */
+ tempbx = push2;
+ tempbx--;
+ temp = tempbx & 0x00FF;
+#if 0
+ /* Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
+ if(xxx()) {
+ if(temp == 0xdf) temp = 0xda;
}
- return FALSE;
-}
#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0E,temp);
-#ifdef SIS315H
-static BOOLEAN
-SiS_IsChScart(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ if(tempbx & 0x0100) tempcx |= 0x0002;
- if(HwInfo->jChipType >= SIS_315H) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(flag & EnableCHScart) return TRUE; /* = Scart = 0x04 */
- }
- return FALSE;
-}
-#endif
+ tempax = 0x000B;
+ if(modeflag & DoubleScanMode) tempax |= 0x8000;
-#ifdef SIS315H
-static BOOLEAN
-SiS_IsTVOrYPbPrOrScart(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ if(tempbx & 0x0200) tempcx |= 0x0040;
- if(HwInfo->jChipType >= SIS_315H) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(flag & SetCRT2ToTV) return TRUE;
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(flag & EnableCHYPbPr) return TRUE; /* = YPrPb = 0x08 */
- if(flag & EnableCHScart) return TRUE; /* = Scart = 0x04 - TW */
- } else {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(flag & SetCRT2ToTV) return TRUE;
- }
- return FALSE;
-}
-#endif
+ temp = (tempax & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0B,temp);
-#ifdef SIS315H
-static BOOLEAN
-SiS_IsLCDOrLCDA(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ if(tempbx & 0x0400) tempcx |= 0x0600;
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x11,0x00); /* 0x11 Vertical Blank End */
+
+ tempax = (SiS_Pr->SiS_VGAVT - tempbx) >> 2;
+
+ if((ModeNo > 0x13) || (HwDeviceExtension->jChipType < SIS_315H)) {
+ if(resinfo != SIS_RI_1280x1024) {
+ tempbx += (tempax << 1);
+ }
+ } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+ tempbx += (tempax << 1);
+ }
+ }
- if(HwInfo->jChipType >= SIS_315H) {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(flag & SetCRT2ToLCD) return TRUE;
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(flag & SetToLCDA) return TRUE;
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
+ tempbx -= 10;
} else {
- flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(flag & SetCRT2ToLCD) return TRUE;
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+ tempbx += 40;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
+ }
+ }
+ }
+ }
}
- return FALSE;
-}
-#endif
+ tempax >>= 2;
+ tempax++;
+ tempax += tempbx;
+ push1 = tempax;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ if(tempbx <= 513) {
+ if(tempax >= 513) tempbx = 513;
+ }
+ }
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0C,temp); /* 0x0C Vertical Retrace Start */
-static BOOLEAN
-SiS_BridgeIsOn(SiS_Private *SiS_Pr)
-{
- USHORT flag;
+ tempbx--;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x10,temp);
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- return FALSE;
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);
- if((flag == 1) || (flag == 2)) return FALSE;
- }
- return TRUE;
-}
+ if(tempbx & 0x0100) tempcx |= 0x0008;
-static BOOLEAN
-SiS_BridgeIsEnabled(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- USHORT flag;
+ if(tempbx & 0x0200) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
+ }
+ tempbx++;
- if(!(SiS_BridgeIsOn(SiS_Pr))) {
- flag = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
- if(HwInfo->jChipType < SIS_315H) {
- flag &= 0xa0;
- if((flag == 0x80) || (flag == 0x20)) return FALSE;
- } else {
- flag &= 0x50;
- if((flag == 0x40) || (flag == 0x10)) return FALSE;
- }
+ if(tempbx & 0x0100) tempcx |= 0x0004;
+ if(tempbx & 0x0200) tempcx |= 0x0080;
+ if(tempbx & 0x0400) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
+ else tempcx |= 0x0C00;
}
- return TRUE;
-}
-static BOOLEAN
-SiS_BridgeInSlave(SiS_Private *SiS_Pr)
-{
- USHORT flag1;
+ tempbx = push1;
+ temp = tempbx & 0x000F;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0D,temp); /* 0x0D vertical Retrace End */
- flag1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
- if(flag1 & (SetInSlaveMode >> 8)) return TRUE;
- return FALSE;
-}
+ if(tempbx & 0x0010) tempcx |= 0x2000;
-/*********************************************/
-/* GET VIDEO BRIDGE CONFIG INFO */
-/*********************************************/
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0A,temp); /* 0x0A CR07 */
-/* Setup general purpose IO for Chrontel communication */
-void
-SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo)
-{
- unsigned long acpibase;
- unsigned short temp;
+ temp = (tempcx & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp); /* 0x17 SR0A */
- if(!(SiS_Pr->SiS_ChSW)) return;
+ tempax = modeflag;
+ temp = (tempax & 0xFF00) >> 8;
+ temp = (temp >> 1) & 0x09;
+ if(!(SiS_Pr->SiS_VBType & VB_SIS301)) {
+ /* Only use 8 dot clock */
+ temp |= 0x01;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp); /* 0x16 SR01 */
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0F,0x00); /* 0x0F CR14 */
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x12,0x00); /* 0x12 CR17 */
+
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+ if(IS_SIS650) {
+ /* 650/30xLV 1.10.6s */
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+ temp = 0x80;
+ }
+ } else temp = 0x80;
+ } else temp = 0x00;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp); /* 0x1A SR0E */
-#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x80000874); /* get ACPI base */
- acpibase = SiS_GetRegLong(0xcfc);
-#else
- acpibase = pciReadLong(0x00000800, 0x74);
-#endif
- acpibase &= 0xFFFF;
- temp = SiS_GetRegShort((USHORT)(acpibase + 0x3c)); /* ACPI register 0x3c: GP Event 1 I/O mode select */
- temp &= 0xFEFF;
- SiS_SetRegShort((USHORT)(acpibase + 0x3c), temp);
- temp = SiS_GetRegShort((USHORT)(acpibase + 0x3c));
- temp = SiS_GetRegShort((USHORT)(acpibase + 0x3a)); /* ACPI register 0x3a: GP Pin Level (low/high) */
- temp &= 0xFEFF;
- if(!(myvbinfo & SetCRT2ToTV)) temp |= 0x0100;
- SiS_SetRegShort((USHORT)(acpibase + 0x3a), temp);
- temp = SiS_GetRegShort((USHORT)(acpibase + 0x3a));
}
void
-SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo, int checkcrt2mode)
+SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr,USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT RefreshRateTableIndex)
{
- USHORT tempax,tempbx,temp;
- USHORT modeflag, resinfo=0;
+ USHORT modeflag, resinfo;
+ USHORT push1, push2, tempax, tempbx, tempcx, temp;
+#ifdef SIS315H
+ USHORT pushcx;
+#endif
+ ULONG tempeax=0, tempebx, tempecx, tempvcfact=0;
+
+ /* This is not supported on LVDS */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
+ if(SiS_Pr->UseCustomMode) return;
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
} else {
modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
- SiS_Pr->SiS_SetFlag = 0;
-
- SiS_Pr->SiS_ModeType = modeflag & ModeInfoFlag;
+ /* Set up Panel Link */
- tempbx = 0;
- if(SiS_BridgeIsOn(SiS_Pr) == 0) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
-#if 0
- if(HwInfo->jChipType < SIS_661) {
- /* NO - YPbPr not set yet ! */
- if(SiS_Pr->SiS_YPbPr & <all ypbpr except 525i>) {
- temp &= (SetCRT2ToHiVision | SwitchCRT2 | SetSimuScanMode); /* 0x83 */
- temp |= SetCRT2ToHiVision; /* 0x80 */
- }
- if(SiS_Pr->SiS_YPbPr & <ypbpr525i>) {
- temp &= (SetCRT2ToHiVision | SwitchCRT2 | SetSimuScanMode); /* 0x83 */
- temp |= SetCRT2ToSVIDEO; /* 0x08 */
- }
- }
-#endif
- tempbx |= temp;
- tempax = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) << 8;
- tempax &= (DriverMode | LoadDACFlag | SetNotSimuMode | SetPALTV);
- tempbx |= tempax;
+ /* 1. Horizontal setup */
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VBType & (VB_SIS301C|VB_SIS302B|VB_SIS301LV|VB_SIS302LV|VB_SIS302ELV)) {
- if(ModeNo == 0x03) {
- /* Mode 0x03 is never in driver mode */
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x31,0xbf);
- }
- if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8))) {
- /* Reset LCDA setting */
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
- }
- if(IS_SIS650) {
- if(SiS_Pr->SiS_UseLCDA) {
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {
- if((ModeNo <= 0x13) || (!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA));
- }
- }
- }
- }
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if((temp & (EnableDualEdge | SetToLCDA)) == (EnableDualEdge | SetToLCDA)) {
- tempbx |= SetCRT2ToLCDA;
- }
- }
+ tempax = SiS_Pr->SiS_LCDHDES;
- if(SiS_Pr->SiS_VBType & (VB_SIS301LV|VB_SIS302LV|VB_SIS302ELV)) {
- tempbx &= ~(SetCRT2ToRAMDAC);
- }
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+ if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) &&
+ (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
+ tempax -= 8;
+ }
+ }
- if(HwInfo->jChipType >= SIS_661) {
- tempbx &= ~(SetCRT2ToYPbPr525750 | SetCRT2ToHiVision);
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(SiS_Pr->SiS_VBType & (VB_SIS301C|VB_SIS301LV|VB_SIS302LV|VB_SIS302ELV)) {
- if(temp & 0x04) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35) & 0xe0;
- if(temp == 0x60) tempbx |= SetCRT2ToHiVision;
- else tempbx |= SetCRT2ToYPbPr525750;
- }
- } else if(SiS_Pr->SiS_VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B)) {
- if(temp & 0x04) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35) & 0xe0;
- if(temp == 0x60) tempbx |= SetCRT2ToHiVision;
- }
- }
- }
+ tempcx = SiS_Pr->SiS_HT; /* Horiz. Total */
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(temp & SetToLCDA) {
- tempbx |= SetCRT2ToLCDA;
- }
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(temp & EnableCHYPbPr) {
- tempbx |= SetCRT2ToCHYPbPr;
- }
- }
- }
- }
+ tempbx = SiS_Pr->SiS_HDE; /* Horiz. Display End */
-#endif /* SIS315H */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
+ tempbx >>= 1;
+ }
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- temp = SetCRT2ToSVIDEO |
- SetCRT2ToAVIDEO |
- SetCRT2ToSCART |
- SetCRT2ToLCDA |
- SetCRT2ToLCD |
- SetCRT2ToRAMDAC |
- SetCRT2ToHiVision |
- SetCRT2ToYPbPr525750;
- } else {
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- temp = SetCRT2ToAVIDEO |
- SetCRT2ToSVIDEO |
- SetCRT2ToSCART |
- SetCRT2ToLCDA |
- SetCRT2ToLCD |
- SetCRT2ToCHYPbPr;
- } else {
- temp = SetCRT2ToLCDA |
- SetCRT2ToLCD;
- }
- } else {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- temp = SetCRT2ToTV | SetCRT2ToLCD;
- } else {
- temp = SetCRT2ToLCD;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
+ tempbx = SiS_Pr->PanelXRes;
+ } else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ tempbx = SiS_Pr->PanelXRes;
+ if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
+ tempbx = 800;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+ tempbx = 1024;
}
}
- }
+ }
+ }
+ }
+ tempcx = (tempcx - tempbx) >> 2; /* HT-HDE / 4 */
- if(!(tempbx & temp)) {
- tempax = DisableCRT2Display;
- tempbx = 0;
- }
+ push1 = tempax;
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- USHORT clearmask = ( DriverMode |
- DisableCRT2Display |
- LoadDACFlag |
- SetNotSimuMode |
- SetInSlaveMode |
- SetPALTV |
- SwitchCRT2 |
- SetSimuScanMode );
- if(tempbx & SetCRT2ToLCDA) tempbx &= (clearmask | SetCRT2ToLCDA);
- if(tempbx & SetCRT2ToRAMDAC) tempbx &= (clearmask | SetCRT2ToRAMDAC);
- if(tempbx & SetCRT2ToLCD) tempbx &= (clearmask | SetCRT2ToLCD);
- if(tempbx & SetCRT2ToSCART) tempbx &= (clearmask | SetCRT2ToSCART);
- if(tempbx & SetCRT2ToHiVision) tempbx &= (clearmask | SetCRT2ToHiVision);
- if(tempbx & SetCRT2ToYPbPr525750) tempbx &= (clearmask | SetCRT2ToYPbPr525750);
- } else {
- if(HwInfo->jChipType >= SIS_315H) {
- if(tempbx & SetCRT2ToLCDA) {
- tempbx &= (0xFF00|SwitchCRT2|SetSimuScanMode);
- }
- }
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(tempbx & SetCRT2ToTV) {
- tempbx &= (0xFF00|SetCRT2ToTV|SwitchCRT2|SetSimuScanMode);
- }
- }
- if(tempbx & SetCRT2ToLCD) {
- tempbx &= (0xFF00|SetCRT2ToLCD|SwitchCRT2|SetSimuScanMode);
- }
- if(HwInfo->jChipType >= SIS_315H) {
- if(tempbx & SetCRT2ToLCDA) {
- tempbx |= SetCRT2ToLCD;
- }
- }
- }
+ tempax += tempbx;
- if(tempax & DisableCRT2Display) {
- if(!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
- tempbx = SetSimuScanMode | DisableCRT2Display;
- }
- }
+ if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
- if(!(tempbx & DriverMode)) tempbx |= SetSimuScanMode;
+ push2 = tempax;
- /* LVDS/CHRONTEL (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
- if(SiS_Pr->SiS_ModeType <= ModeVGA) {
- if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- ((SiS_Pr->SiS_VBType & VB_NoLCD) && (tempbx & SetCRT2ToLCD)) ) {
- modeflag &= (~CRT2Mode);
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) &&
+ (!SiS_Pr->SiS_IF_DEF_DSTN) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
+ (SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0028;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0018;
+ else if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) ) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ tempcx = 0x0017;
+#ifdef TWNEWPANEL
+ tempcx = 0x0018;
+#endif
+ } else {
+ tempcx = 0x0017; /* A901; sometimes 0x0018; */
+ }
+ } else {
+ tempcx = 0x0018;
+ }
+ }
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0028;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0030;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0030;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0040;
}
- }
+ }
+ }
+ }
- if(!(tempbx & SetSimuScanMode)) {
- if(tempbx & SwitchCRT2) {
- if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
- if( (HwInfo->jChipType >= SIS_315H) &&
- (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
- if(resinfo != SIS_RI_1600x1200) {
- tempbx |= SetSimuScanMode;
- }
- } else {
- tempbx |= SetSimuScanMode;
- }
- }
- } else {
- if(!(SiS_BridgeIsEnabled(SiS_Pr,HwInfo))) {
- if(!(tempbx & DriverMode)) {
- if(SiS_BridgeInSlave(SiS_Pr)) {
- tempbx |= SetSimuScanMode;
- }
- }
- }
- }
- }
+ tempcx += tempax; /* lcdhrs */
+ if(tempcx >= SiS_Pr->SiS_HT) tempcx -= SiS_Pr->SiS_HT;
- if(!(tempbx & DisableCRT2Display)) {
- if(tempbx & DriverMode) {
- if(tempbx & SetSimuScanMode) {
- if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
- if( (HwInfo->jChipType >= SIS_315H) &&
- (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
- if(resinfo != SIS_RI_1600x1200) {
- tempbx |= SetInSlaveMode;
+ tempax = tempcx >> 3; /* BPLHRS */
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp); /* Part1_14h; Panel Link Horizontal Retrace Start */
+
+ if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ temp = (tempax & 0x00FF) + 2;
+ } else {
+ temp = (tempax & 0x00FF) + 10;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if((!SiS_Pr->SiS_IF_DEF_DSTN) &&
+ (!SiS_Pr->SiS_IF_DEF_FSTN) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
+ (SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ temp += 6;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+ temp++;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1024x768) {
+ temp += 7;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
+ temp -= 0x14;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x768) {
+ temp -= 10;
+ }
}
- } else {
- tempbx |= SetInSlaveMode;
- }
+ }
}
- }
- } else {
- tempbx |= SetInSlaveMode;
- }
- }
-
+ }
+ }
+ }
+ }
}
- SiS_Pr->SiS_VBInfo = tempbx;
+ temp &= 0x1F;
+ temp |= ((tempcx & 0x0007) << 5);
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20; /* WRONG? BIOS loads cl, not ah */
+#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp); /* Part1_15h; Panel Link Horizontal Retrace End/Skew */
- if(HwInfo->jChipType == SIS_630) {
- SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);
- }
+ tempbx = push2;
+ tempcx = push1; /* lcdhdes */
-#ifdef TWDEBUG
-#ifdef LINUX_KERNEL
- printk(KERN_DEBUG "sisfb: (VBInfo= 0x%04x, SetFlag=0x%04x)\n",
- SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
-#endif
-#ifdef LINUX_XF86
- xf86DrvMsgVerb(0, X_PROBED, 3, "(init301: VBInfo=0x%04x, SetFlag=0x%04x)\n",
- SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
-#endif
+ temp = (tempcx & 0x0007); /* BPLHDESKEW */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp); /* Part1_1Ah; Panel Link Vertical Retrace Start (2:0) */
+
+ tempcx >>= 3; /* BPLHDES */
+ temp = (tempcx & 0x00FF);
+#if 0 /* Not 550 FSTN */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(ModeNo == 0x5b) temp--; */
+ }
#endif
-}
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp); /* Part1_16h; Panel Link Horizontal Display Enable Start */
-/*********************************************/
-/* DETERMINE YPbPr MODE */
-/*********************************************/
+ if((HwDeviceExtension->jChipType < SIS_315H) ||
+ (SiS_Pr->SiS_IF_DEF_FSTN) ||
+ (SiS_Pr->SiS_IF_DEF_DSTN)) {
+ if(tempbx & 0x07) tempbx += 8;
+ }
+ tempbx >>= 3; /* BPLHDEE */
+ temp = tempbx & 0x00FF;
+#if 0 /* Not 550 FSTN */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(ModeNo == 0x5b) temp--;
+ }
+#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp); /* Part1_17h; Panel Link Horizontal Display Enable End */
-void
-SiS_SetYPbPr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
+ /* 2. Vertical setup */
- UCHAR temp;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ tempcx = SiS_Pr->SiS_VGAVT;
+ tempbx = SiS_Pr->SiS_VGAVDE;
+ if((SiS_Pr->SiS_CustomT != CUT_BARCO1366) && (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) {
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ tempbx = SiS_Pr->PanelYRes;
+ }
+ }
+ }
+ tempcx -= tempbx;
- /* Note: This variable is only used on 30xLV systems.
- * CR38 has a different meaning on LVDS/CH7019 systems.
- * On 661 and later, these bits moved to CR35.
- *
- * On 301, 301B, only HiVision 1080i is supported.
- * On 30xLV, 301C, only YPbPr 1080i is supported.
- */
+ } else {
- SiS_Pr->SiS_YPbPr = 0;
- if(HwInfo->jChipType >= SIS_661) return;
+ tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE; /* VGAVT-VGAVDE */
- if(SiS_Pr->SiS_VBType) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- SiS_Pr->SiS_YPbPr = YPbPrHiVision;
- }
}
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VBType & (VB_SIS301LV302LV | VB_SIS301C)) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(temp & 0x08) {
- switch((temp >> 4)) {
- case 0x00: SiS_Pr->SiS_YPbPr = YPbPr525i; break;
- case 0x01: SiS_Pr->SiS_YPbPr = YPbPr525p; break;
- case 0x02: SiS_Pr->SiS_YPbPr = YPbPr750p; break;
- case 0x03: SiS_Pr->SiS_YPbPr = YPbPrHiVision; break;
+ tempbx = SiS_Pr->SiS_LCDVDES; /* VGAVDES */
+ push1 = tempbx;
+
+ tempax = SiS_Pr->SiS_VGAVDE;
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ tempax = 600;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+ tempax = 768;
}
}
+ } else if( (SiS_Pr->SiS_IF_DEF_TRUMPION == 0) &&
+ (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
+ ((SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) ||
+ (SiS_Pr->SiS_IF_DEF_FSTN) ||
+ (SiS_Pr->SiS_IF_DEF_DSTN)) ) {
+ tempax = SiS_Pr->PanelYRes;
}
}
-}
+ tempbx += tempax;
+ if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
-/*********************************************/
-/* DETERMINE TVMode flag */
-/*********************************************/
+ push2 = tempbx;
-void
-SiS_SetTVMode(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT temp, temp1, resinfo = 0, romindex = 0;
- UCHAR OutputSelect = *SiS_Pr->pSiS_OutputSelect;
+ tempcx >>= 1;
- SiS_Pr->SiS_TVMode = 0;
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) &&
+ (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
+ (SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
+ tempcx = 0x0017;
+ } else if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+ if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0003;
+ else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768)) tempcx = 0x0003;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0001;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0001;
+ else tempcx = 0x0057;
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0001;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0001;
+ else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ tempcx = 0x0002;
+#ifdef TWNEWPANEL
+ tempcx = 0x0003;
+#endif
+ } else {
+ tempcx = 0x0002; /* A901; sometimes 0x0003; */
+ }
+ } else tempcx = 0x0003;
+ }
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0003;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0001;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0001;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0001;
+ else tempcx = 0x0057;
+ }
+ }
+ }
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;
- if(SiS_Pr->UseCustomMode) return;
+ tempbx += tempcx; /* BPLVRS */
- if(ModeNo > 0x13) {
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ if((HwDeviceExtension->jChipType < SIS_315H) ||
+ (SiS_Pr->SiS_IF_DEF_FSTN) ||
+ (SiS_Pr->SiS_IF_DEF_DSTN)) {
+ tempbx++;
}
- if(HwInfo->jChipType < SIS_661) {
+ if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
- if(SiS_Pr->SiS_VBInfo & SetPALTV) SiS_Pr->SiS_TVMode |= TVSetPAL;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp); /* Part1_18h; Panel Link Vertical Retrace Start */
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- temp = 0;
- if((HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730)) {
- temp = 0x35;
- romindex = 0xfe;
- } else if(HwInfo->jChipType >= SIS_315H) {
- temp = 0x38;
- romindex = 0xf3;
- if(HwInfo->jChipType >= SIS_330) romindex = 0x11b;
- }
- if(temp) {
- if(romindex && SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
- OutputSelect = ROMAddr[romindex];
- if(!(OutputSelect & EnablePALMN)) {
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,temp,0x3F);
- }
- }
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,temp);
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- if(temp1 & EnablePALM) { /* 0x40 */
- SiS_Pr->SiS_TVMode |= TVSetPALM;
- SiS_Pr->SiS_TVMode &= ~TVSetPAL;
- } else if(temp1 & EnablePALN) { /* 0x80 */
- SiS_Pr->SiS_TVMode |= TVSetPALN;
- }
- } else {
- if(temp1 & EnableNTSCJ) { /* 0x40 */
- SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
- }
- }
- }
- /* Translate HiVision/YPbPr to our new flags */
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- if(SiS_Pr->SiS_YPbPr == YPbPr750p) SiS_Pr->SiS_TVMode |= TVSetYPbPr750p;
- else if(SiS_Pr->SiS_YPbPr == YPbPr525p) SiS_Pr->SiS_TVMode |= TVSetYPbPr525p;
- else if(SiS_Pr->SiS_YPbPr == YPbPrHiVision) SiS_Pr->SiS_TVMode |= TVSetHiVision;
- else SiS_Pr->SiS_TVMode |= TVSetYPbPr525i;
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p | TVSetYPbPr525p | TVSetYPbPr525i)) {
- SiS_Pr->SiS_VBInfo &= ~SetCRT2ToHiVision;
- SiS_Pr->SiS_VBInfo |= SetCRT2ToYPbPr525750;
- } else if(SiS_Pr->SiS_TVMode & TVSetHiVision) {
- SiS_Pr->SiS_TVMode |= TVSetPAL;
- }
- }
- } else if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_CHOverScan) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- if((temp & TVOverScan) || (SiS_Pr->SiS_CHOverScan == 1)) {
- SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
- }
- } else if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x79);
- if((temp & 0x80) || (SiS_Pr->SiS_CHOverScan == 1)) {
- SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
- }
- }
- if(SiS_Pr->SiS_CHSOverScan) {
- SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
- }
+ tempcx >>= 3;
+
+ if((!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1366) &&
+ (SiS_Pr->SiS_CustomT != CUT_BARCO1024) &&
+ (SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if( (HwDeviceExtension->jChipType < SIS_315H) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) ) tempcx = 0x0001;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) tempcx = 0x0002;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempcx = 0x0002;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x0003;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) tempcx = 0x0005;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) tempcx = 0x0005;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 0x0011;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 0x0005;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x0002;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x0011;
+ else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ tempcx = 0x0004;
+#ifdef TWNEWPANEL
+ tempcx = 0x0005;
+#endif
+ } else {
+ tempcx = 0x0004; /* A901; Other BIOS sets 0x0005; */
+ }
+ } else {
+ tempcx = 0x0005;
+ }
}
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- if(temp & EnablePALM) SiS_Pr->SiS_TVMode |= TVSetPALM;
- else if(temp & EnablePALN) SiS_Pr->SiS_TVMode |= TVSetPALN;
- } else {
- if(temp & EnableNTSCJ) {
- SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
- }
- }
- }
}
+ }
- } else { /* 661 and later */
+ tempcx = tempcx + tempbx + 1; /* BPLVRE */
+ temp = tempcx & 0x000F;
+ if(SiS_Pr->SiS_IF_DEF_FSTN ||
+ SiS_Pr->SiS_IF_DEF_DSTN ||
+ (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
+ (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
+ (SiS_Pr->SiS_CustomT == CUT_PANEL848)) {
+ temp |= 0x30;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; Panel Link Vertical Retrace End (3:0); Misc. */
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- if(temp1 & 0x01) {
- SiS_Pr->SiS_TVMode |= TVSetPAL;
- if(temp1 & 0x08) {
- SiS_Pr->SiS_TVMode |= TVSetPALN;
- } else if(temp1 & 0x04) {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- SiS_Pr->SiS_TVMode &= ~TVSetPAL;
- }
- SiS_Pr->SiS_TVMode |= TVSetPALM;
- }
- } else {
- if(temp1 & 0x02) {
- SiS_Pr->SiS_TVMode |= TVSetNTSCJ;
- }
+ temp = ((tempbx & 0x0700) >> 8) << 3; /* BPLDESKEW =0 */
+ if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
+ if(SiS_Pr->SiS_HDE != 640) {
+ if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
}
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(SiS_Pr->SiS_CHOverScan) {
- if((temp1 & 0x10) || (SiS_Pr->SiS_CHOverScan == 1)) {
- SiS_Pr->SiS_TVMode |= TVSetCHOverScan;
+ } else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
+ if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) temp |= 0x40;
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+ temp |= 0x80;
+ }
+ } else {
+ if( (HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730) ) {
+ if(HwDeviceExtension->jChipRevision >= 0x30) {
+ temp |= 0x80;
}
}
}
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- temp1 &= 0xe0;
- if(temp1 == 0x00) SiS_Pr->SiS_TVMode |= TVSetYPbPr525i;
- else if(temp1 == 0x20) SiS_Pr->SiS_TVMode |= TVSetYPbPr525p;
- else if(temp1 == 0x40) SiS_Pr->SiS_TVMode |= TVSetYPbPr750p;
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- SiS_Pr->SiS_TVMode |= (TVSetHiVision | TVSetPAL);
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp); /* Part1_1Ah; Panel Link Control Signal (7:3); Vertical Retrace Start (2:0) */
+
+ if (HwDeviceExtension->jChipType < SIS_315H) {
+
+#ifdef SIS300 /* 300 series */
+
+ tempeax = SiS_Pr->SiS_VGAVDE << 6;
+ temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
+ tempeax = tempeax / (ULONG)SiS_Pr->SiS_VDE;
+ if(temp != 0) tempeax++;
+ tempebx = tempeax; /* BPLVCFACT */
+
+ if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
+ tempebx = 0x003F;
}
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToYPbPr525750 | SetCRT2ToHiVision)) {
- if(resinfo == SIS_RI_800x480 || resinfo == SIS_RI_1024x576 || resinfo == SIS_RI_1280x720) {
- SiS_Pr->SiS_TVMode |= TVAspect169;
- } else {
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x39);
- if(temp1 & 0x02) {
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p | TVSetHiVision)) {
- SiS_Pr->SiS_TVMode |= TVAspect169;
- } else {
- SiS_Pr->SiS_TVMode |= TVAspect43LB;
- }
- } else {
- SiS_Pr->SiS_TVMode |= TVAspect43;
- }
- }
+
+ temp = (USHORT)(tempebx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,temp); /* Part1_1Eh; Panel Link Vertical Scaling Factor */
+
+#endif /* SIS300 */
+
+ } else {
+
+#ifdef SIS315H /* 315 series */
+
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x03);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1E,0x23);
+ }
+
+ tempeax = SiS_Pr->SiS_VGAVDE << 18;
+ temp = (USHORT)(tempeax % (ULONG)SiS_Pr->SiS_VDE);
+ tempeax = tempeax / SiS_Pr->SiS_VDE;
+ if(temp != 0) tempeax++;
+ tempebx = tempeax; /* BPLVCFACT */
+ tempvcfact = tempeax;
+ temp = (USHORT)(tempebx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp); /* Part1_37h; Panel Link Vertical Scaling Factor */
+ temp = (USHORT)((tempebx & 0x00FF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp); /* Part1_36h; Panel Link Vertical Scaling Factor */
+ temp = (USHORT)((tempebx & 0x00030000) >> 16);
+ temp &= 0x03;
+ if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp); /* Part1_35h; Panel Link Vertical Scaling Factor */
+
+#endif /* SIS315H */
+
+ }
+
+ tempbx = push2; /* BPLVDEE */
+ tempcx = push1;
+
+ push1 = temp;
+
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(!SiS_Pr->SiS_IF_DEF_FSTN && !SiS_Pr->SiS_IF_DEF_DSTN) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ if(resinfo == SIS_RI_1024x600) tempcx++;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ if(resinfo == SIS_RI_800x600) tempcx++;
+ }
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ if(resinfo == SIS_RI_800x600) tempcx++;
+ if(resinfo == SIS_RI_1024x768) tempcx++; /* Doesnt make sense anyway... */
+ } else if(resinfo == SIS_RI_1024x768) tempcx++;
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ if(resinfo == SIS_RI_800x600) tempcx++;
+ }
+ }
}
+ }
+
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+ tempcx = SiS_Pr->SiS_VGAVDE;
+ tempbx = SiS_Pr->SiS_VGAVDE - 1;
}
}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) SiS_Pr->SiS_TVMode |= TVSetPAL;
+ temp = ((tempbx & 0x0700) >> 8) << 3;
+ temp |= ((tempcx & 0x0700) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp); /* Part1_1Dh; Vertical Display Overflow; Control Signal */
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ temp = tempbx & 0x00FF;
+ /* if(SiS_Pr->SiS_IF_DEF_FSTN) temp++; */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp); /* Part1_1Ch; Panel Link Vertical Display Enable End */
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- SiS_Pr->SiS_TVMode |= TVSetPAL;
- SiS_Pr->SiS_TVMode &= ~(TVSetPALM | TVSetPALN | TVSetNTSCJ);
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525i | TVSetYPbPr525p | TVSetYPbPr750p)) {
- SiS_Pr->SiS_TVMode &= ~(TVSetPAL | TVSetNTSCJ | TVSetPALM | TVSetPALN);
- }
- }
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp); /* Part1_1Bh; Panel Link Vertical Display Enable Start */
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
- SiS_Pr->SiS_TVMode |= TVSetTVSimuMode;
- }
- }
+ /* 3. Additional horizontal setup (scaling, etc) */
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
- /* BIOS sets TVNTSC1024 without checking 525p here. Wrong? */
- if(!(SiS_Pr->SiS_TVMode & (TVSetHiVision | TVSetYPbPr525p | TVSetYPbPr750p))) {
- if(resinfo == SIS_RI_1024x768) {
- SiS_Pr->SiS_TVMode |= TVSetNTSC1024;
- }
- }
+ tempecx = SiS_Pr->SiS_VGAHDE;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+ if(modeflag & HalfDCLK) tempecx >>= 1;
+ }
+ }
+ tempebx = SiS_Pr->SiS_HDE;
+ if(tempecx == tempebx) tempeax = 0xFFFF;
+ else {
+ tempeax = tempecx;
+ tempeax <<= 16;
+ temp = (USHORT)(tempeax % tempebx);
+ tempeax = tempeax / tempebx;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(temp) tempeax++;
}
+ }
+ tempecx = tempeax;
- SiS_Pr->SiS_TVMode |= TVRPLLDIV2XO;
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) &&
- (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
- } else if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr750p)) {
- SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
- } else if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- SiS_Pr->SiS_TVMode &= ~TVRPLLDIV2XO;
- }
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ tempeax = SiS_Pr->SiS_VGAHDE;
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
+ if(modeflag & HalfDCLK) tempeax >>= 1;
}
+ tempeax <<= 16;
+ tempeax = (tempeax / tempecx) - 1;
+ } else {
+ tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
+ }
+ tempecx <<= 16;
+ tempecx |= (tempeax & 0xFFFF);
+ temp = (USHORT)(tempecx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp); /* Part1_1Fh; Panel Link DDA Operational Number in each horiz. line */
+ tempbx = SiS_Pr->SiS_VDE;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
+ tempbx = (USHORT)(tempeax & 0x0FFFF);
+ } else {
+ tempeax = SiS_Pr->SiS_VGAVDE << 6;
+ tempbx = push1 & 0x3f;
+ if(tempbx == 0) tempbx = 64;
+ tempeax /= tempbx;
+ tempbx = (USHORT)(tempeax & 0x0FFFF);
+ }
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx--;
+ if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
+ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
+ else if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempbx = 1;
}
- SiS_Pr->SiS_VBInfo &= ~SetPALTV;
+ temp = ((tempbx & 0xFF00) >> 8) << 3;
+ temp |= (USHORT)((tempecx & 0x0700) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp); /* Part1_20h; Overflow register */
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "(init301: TVMode %x, VBInfo %x)\n", SiS_Pr->SiS_TVMode, SiS_Pr->SiS_VBInfo);
-#endif
-}
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp); /* Part1_21h; Panel Link Vertical Accumulator Register */
-/*********************************************/
-/* GET LCD INFO */
-/*********************************************/
+ tempecx >>= 16; /* BPLHCFACT */
+ if((HwDeviceExtension->jChipType < SIS_315H) || (SiS_Pr->SiS_IF_DEF_FSTN) || (SiS_Pr->SiS_IF_DEF_DSTN)) {
+ if(modeflag & HalfDCLK) tempecx >>= 1;
+ }
+ temp = (USHORT)((tempecx & 0xFF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp); /* Part1_22h; Panel Link Horizontal Scaling Factor High */
-static USHORT
-SiS_GetBIOSLCDResInfo(SiS_Private *SiS_Pr)
-{
- USHORT temp = SiS_Pr->SiS_LCDResInfo;
- /* Translate my LCDResInfo to BIOS value */
- if(temp == Panel_1280x768_2) temp = Panel_1280x768;
- if(temp == Panel_1280x768_3) temp = Panel_1280x768;
- return temp;
-}
+ temp = (USHORT)(tempecx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp); /* Part1_22h; Panel Link Horizontal Scaling Factor Low */
+
+ /* 630/301B and 630/LVDS do something for 640x480 panels here */
-static void
-SiS_GetLCDInfoBIOS(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
#ifdef SIS315H
- UCHAR *ROMAddr;
-
- if((ROMAddr = GetLCDStructPtr661(SiS_Pr, HwInfo))) {
- SiS_Pr->PanelHT = SISGETROMW(6);
- SiS_Pr->PanelVT = SISGETROMW(8);
- SiS_Pr->PanelHRS = SISGETROMW(10);
- SiS_Pr->PanelHRE = SISGETROMW(12);
- SiS_Pr->PanelVRS = SISGETROMW(14);
- SiS_Pr->PanelVRE = SISGETROMW(16);
- SiS_Pr->PanelVCLKIdx315 = VCLK_CUSTOM_315;
- SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].CLOCK =
- SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].CLOCK = (USHORT)ROMAddr[18];
- SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].SR2B =
- SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].Part4_A = ROMAddr[19];
- SiS_Pr->SiS_VCLKData[VCLK_CUSTOM_315].SR2B =
- SiS_Pr->SiS_VBVCLKData[VCLK_CUSTOM_315].Part4_B = ROMAddr[20];
- }
-#endif
+ if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x25,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x26,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x27,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x28,0x87);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x29,0x5A);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x007,0x03);
+ tempax = SiS_Pr->SiS_HDE; /* Blps = lcdhdee(lcdhdes+HDE) + 64 */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
+ tempax += 64;
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,temp);
+ temp = ((tempax & 0xFF00) >> 8) << 3;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
+ tempax += 32; /* Blpe=lBlps+32 */
+ temp = tempax & 0x00FF;
+ if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3A,0x00); /* Bflml=0 */
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
+
+ tempax = SiS_Pr->SiS_VDE;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
+ tempax >>= 1;
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3B,temp);
+ temp = ((tempax & 0xFF00) >> 8) << 3;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
+
+ tempeax = SiS_Pr->SiS_HDE;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempeax >>= 1;
+ tempeax <<= 2; /* BDxFIFOSTOP = (HDE*4)/128 */
+ tempebx = 128;
+ temp = (USHORT)(tempeax % tempebx);
+ tempeax = tempeax / tempebx;
+ if(temp) tempeax++;
+ temp = (USHORT)(tempeax & 0x003F);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3F,0x00); /* BDxWadrst0 */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3E,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3D,0x10);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
+
+ tempax = SiS_Pr->SiS_HDE;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
+ tempax >>= 4; /* BDxWadroff = HDE*4/8/8 */
+ pushcx = tempax;
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,temp);
+ temp = ((tempax & 0xFF00) >> 8) << 3;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
+
+ tempax = SiS_Pr->SiS_VDE; /* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) tempax >>= 1;
+ tempeax = (tempax * pushcx);
+ tempebx = 0x00100000 + tempeax;
+ temp = (USHORT)tempebx & 0x000000FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,temp);
+ temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,temp);
+ temp = (USHORT)((tempebx & 0x00FF0000) >> 16);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,temp);
+ temp = (USHORT)(((tempebx & 0x01000000) >> 24) << 7);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x03);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x50);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x04,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2F,0x01);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0x38);
+
+ if(SiS_Pr->SiS_IF_DEF_FSTN) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2b,0x02);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2c,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,0x0c);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x38,0x80);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x39,0xA0);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3a,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3c,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3d,0x10);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3e,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x3f,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x40,0x10);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x41,0x25);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x42,0x80);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x43,0x14);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x44,0x03);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x45,0x0a);
+ }
+ }
+#endif /* SIS315H */
+
}
+#ifdef SIS315H
void
-SiS_GetLCDResInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+SiS_CRT2AutoThreshold(SiS_Private *SiS_Pr, USHORT BaseAddr)
{
-#ifdef SIS300
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x40);
+}
#endif
+
+
#ifdef SIS315H
- UCHAR *myptr = NULL;
-#endif
- USHORT temp,modeflag,resinfo=0;
- const unsigned char SiS300SeriesLCDRes[] =
- { 0, 1, 2, 3, 7, 4, 5, 8,
- 0, 0, 10, 0, 0, 0, 0, 15 };
+/* For LVDS / 302B/30xLV - LCDA (this must only be called on 315 series!) */
+void
+SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex)
+{
+ USHORT modeflag,resinfo;
+ USHORT push1,push2,tempax,tempbx,tempcx,temp;
+ ULONG tempeax=0,tempebx,tempecx,tempvcfact;
- SiS_Pr->SiS_LCDResInfo = 0;
- SiS_Pr->SiS_LCDTypeInfo = 0;
- SiS_Pr->SiS_LCDInfo = 0;
- SiS_Pr->PanelHRS = 999; /* HSync start */
- SiS_Pr->PanelHRE = 999; /* HSync end */
- SiS_Pr->PanelVRS = 999; /* VSync start */
- SiS_Pr->PanelVRE = 999; /* VSync end */
+ /* This is not supported with LCDA */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
+ if(SiS_Pr->UseCustomMode) return;
- if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return;
+ if(IS_SIS330) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10); /* Xabre 1.01.03 */
+ } else if(IS_SIS740) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 740/LVDS */
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04); /* 740/LVDS */
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x03);
+ } else {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10); /* 740/301LV, 301BDH */
+ }
+ } else {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 650/LVDS */
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04); /* 650/LVDS */
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x00); /* 650/LVDS 1.10.07 */
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2D,0x0f); /* 650/30xLv 1.10.6s */
+ }
+ }
if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
+ tempax = SiS_Pr->SiS_LCDHDES;
+ tempbx = SiS_Pr->SiS_HDE;
+ tempcx = SiS_Pr->SiS_HT;
- if((HwInfo->jChipType >= SIS_661) || (SiS_Pr->SiS_ROMNew)) {
- SiS_Pr->SiS_LCDTypeInfo = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x39) & 0x7c) >> 2;
- } else if((HwInfo->jChipType < SIS_315H) || (HwInfo->jChipType >= SIS_661)) {
- SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
- } else {
- SiS_Pr->SiS_LCDTypeInfo = (temp & 0x0F) - 1;
- }
- temp &= 0x0f;
- if(HwInfo->jChipType < SIS_315H) {
- /* Translate 300 series LCDRes to 315 series for unified usage */
- temp = SiS300SeriesLCDRes[temp];
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ tempbx = SiS_Pr->PanelXRes;
}
+ tempcx -= tempbx; /* HT-HDE */
+ push1 = tempax;
+ tempax += tempbx; /* lcdhdee */
+ tempbx = SiS_Pr->SiS_HT;
+ if(tempax >= tempbx) tempax -= tempbx;
- if(HwInfo->jChipType == SIS_550) {
- if(temp == Panel310_640x480_2) temp = Panel_640x480_2;
- if(temp == Panel310_640x480_3) temp = Panel_640x480_3;
- }
+ push2 = tempax; /* push ax lcdhdee */
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* SiS LVDS */
- if(temp == Panel310_1280x768) {
- temp = Panel_1280x768_2;
-#ifdef SIS315H
- if((myptr = GetLCDStructPtr661(SiS_Pr, HwInfo))) {
- if((myptr[8] | (myptr[9] << 8)) == 798) temp = Panel_1280x768_3;
- }
-#endif
+ tempcx >>= 2;
+
+ /* 650/30xLV 1.10.6s, 740/LVDS */
+ if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+ ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 0x28;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempcx = 0x18;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 0x30;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 0x40;
+ else tempcx = 0x30;
}
- }
+ }
- SiS_Pr->SiS_LCDResInfo = temp;
+ tempcx += tempax; /* lcdhrs */
+ if(tempcx >= tempbx) tempcx -= tempbx;
+ /* v ah,cl */
+ tempax = tempcx;
+ tempax >>= 3; /* BPLHRS */
+ temp = tempax & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,temp); /* Part1_14h */
+ temp += 10;
if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
- SiS_Pr->SiS_LCDResInfo = Panel_Barco1366;
- } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
- SiS_Pr->SiS_LCDResInfo = Panel_848x480;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ temp += 6;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) {
+ temp++;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1024x768) {
+ temp += 7;
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
+ temp -= 10;
+ }
+ }
+ }
+ }
}
}
+ temp &= 0x1F;
+ temp |= ((tempcx & 0x07) << 5);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,temp); /* Part1_15h */
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
- SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMin301;
- } else {
- if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMinLVDS)
- SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
- }
+ tempbx = push2; /* lcdhdee */
+ tempcx = push1; /* lcdhdes */
+ temp = (tempcx & 0x00FF);
+ temp &= 0x07; /* BPLHDESKEW */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1A,temp); /* Part1_1Ah */
- SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
+ tempcx >>= 3; /* BPLHDES */
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,temp); /* Part1_16h */
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_320x480: SiS_Pr->PanelXRes = 320; SiS_Pr->PanelYRes = 480;
- SiS_Pr->PanelHT = 400; SiS_Pr->PanelVT = 525;
- SiS_Pr->PanelVCLKIdx300 = VCLK28;
- SiS_Pr->PanelVCLKIdx315 = VCLK28;
- break;
- case Panel_640x480_2:
- case Panel_640x480_3: SiS_Pr->PanelXRes = 640; SiS_Pr->PanelYRes = 480;
- SiS_Pr->PanelVRS = 24; SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx300 = VCLK28;
- SiS_Pr->PanelVCLKIdx315 = VCLK28;
- break;
- case Panel_640x480: SiS_Pr->PanelXRes = 640; SiS_Pr->PanelYRes = 480;
- SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx300 = VCLK28;
- SiS_Pr->PanelVCLKIdx315 = VCLK28;
- break;
- case Panel_800x600: SiS_Pr->PanelXRes = 800; SiS_Pr->PanelYRes = 600;
- SiS_Pr->PanelHT = 1056; SiS_Pr->PanelVT = 628;
- SiS_Pr->PanelHRS = 40; SiS_Pr->PanelHRE = 128;
- SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 4;
- SiS_Pr->PanelVCLKIdx300 = VCLK40;
- SiS_Pr->PanelVCLKIdx315 = VCLK40;
- break;
- case Panel_1024x600: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 600;
- SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 800;
- SiS_Pr->PanelHRS = 24; SiS_Pr->PanelHRE = 136;
- SiS_Pr->PanelVRS = 88; SiS_Pr->PanelVRE = 6;
- SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
- break;
- case Panel_1024x768: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
- SiS_Pr->PanelHRS = 24; SiS_Pr->PanelHRE = 136;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
- if(HwInfo->jChipType < SIS_315H) {
- SiS_Pr->PanelHRS = 23;
- SiS_Pr->PanelVRE = 5;
- }
- SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1152x768: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
- SiS_Pr->PanelHRS = 24;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
- if(HwInfo->jChipType < SIS_315H) {
- SiS_Pr->PanelHRS = 23;
- SiS_Pr->PanelVRE = 5;
- }
- SiS_Pr->PanelVCLKIdx300 = VCLK65_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK65_315;
- break;
- case Panel_1152x864: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 864;
- break;
- case Panel_1280x720: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 720;
- SiS_Pr->PanelHT = 1650; SiS_Pr->PanelVT = 750;
- SiS_Pr->PanelHRS = 110; SiS_Pr->PanelHRE = 40;
- SiS_Pr->PanelVRS = 5; SiS_Pr->PanelVRE = 5;
- SiS_Pr->PanelVCLKIdx315 = VCLK_1280x720;
- /* Data above for TMDS (projector); get from BIOS for LVDS */
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1280x768: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 802;
- SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRS = 112;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
- SiS_Pr->PanelVCLKIdx300 = VCLK81_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK81_315;
- break;
- case Panel_1280x768_2: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1408; SiS_Pr->PanelVT = 806;
- SiS_Pr->PanelHRS = 16; SiS_Pr->PanelHRE = 64;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
- SiS_Pr->PanelVCLKIdx315 = VCLK_1280x768_2;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1280x768_3: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1664; SiS_Pr->PanelVT = 798;
- SiS_Pr->PanelHRS = 64; SiS_Pr->PanelHRE = 128;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 7;
- SiS_Pr->PanelVCLKIdx315 = VCLK_1280x768_3;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1280x800: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 800;
- SiS_Pr->PanelHT = 1408; SiS_Pr->PanelVT = 816;
- SiS_Pr->PanelHRS = 21; SiS_Pr->PanelHRE = 24;
- SiS_Pr->PanelVRS = 4; SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx315 = VCLK69_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1280x960: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 960;
- SiS_Pr->PanelHT = 1800; SiS_Pr->PanelVT = 1000;
- SiS_Pr->PanelVCLKIdx300 = VCLK108_3_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK108_3_315;
- if(resinfo == SIS_RI_1280x1024) {
- SiS_Pr->PanelVCLKIdx300 = VCLK100_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK100_315;
- }
- break;
- case Panel_1280x1024: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 1024;
- SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
- SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112;
- SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx300 = VCLK108_3_300;
- SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1400x1050: SiS_Pr->PanelXRes = 1400; SiS_Pr->PanelYRes = 1050;
- SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
- SiS_Pr->PanelHRS = 48; SiS_Pr->PanelHRE = 112; /* HRE OK for LVDS, not for LCDA */
- SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx315 = VCLK108_2_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1600x1200: SiS_Pr->PanelXRes = 1600; SiS_Pr->PanelYRes = 1200;
- SiS_Pr->PanelHT = 2160; SiS_Pr->PanelVT = 1250;
- SiS_Pr->PanelHRS = 64; SiS_Pr->PanelHRE = 192;
- SiS_Pr->PanelVRS = 1; SiS_Pr->PanelVRE = 3;
- SiS_Pr->PanelVCLKIdx315 = VCLK162_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_1680x1050: SiS_Pr->PanelXRes = 1680; SiS_Pr->PanelYRes = 1050;
- SiS_Pr->PanelHT = 1900; SiS_Pr->PanelVT = 1066;
- SiS_Pr->PanelHRS = 26; SiS_Pr->PanelHRE = 76;
- SiS_Pr->PanelVRS = 3; SiS_Pr->PanelVRE = 6;
- SiS_Pr->PanelVCLKIdx315 = VCLK121_315;
- SiS_GetLCDInfoBIOS(SiS_Pr, HwInfo);
- break;
- case Panel_Custom: SiS_Pr->PanelXRes = SiS_Pr->CP_MaxX;
- SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY;
- SiS_Pr->PanelHT = SiS_Pr->CHTotal;
- SiS_Pr->PanelVT = SiS_Pr->CVTotal;
- if(SiS_Pr->CP_PreferredIndex != -1) {
- SiS_Pr->PanelXRes = SiS_Pr->CP_HDisplay[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelYRes = SiS_Pr->CP_VDisplay[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelHT = SiS_Pr->CP_HTotal[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelVT = SiS_Pr->CP_VTotal[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelHRS = SiS_Pr->CP_HSyncStart[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelHRE = SiS_Pr->CP_HSyncEnd[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelVRS = SiS_Pr->CP_VSyncStart[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelVRE = SiS_Pr->CP_VSyncEnd[SiS_Pr->CP_PreferredIndex];
- SiS_Pr->PanelHRS -= SiS_Pr->PanelXRes;
- SiS_Pr->PanelHRE -= SiS_Pr->PanelHRS;
- SiS_Pr->PanelVRS -= SiS_Pr->PanelYRes;
- SiS_Pr->PanelVRE -= SiS_Pr->PanelVRS;
- }
- break;
- case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024;
- SiS_Pr->PanelHT = 1688; SiS_Pr->PanelVT = 1066;
- break;
- case Panel_848x480: SiS_Pr->PanelXRes = 848; SiS_Pr->PanelYRes = 480;
- SiS_Pr->PanelHT = 1088; SiS_Pr->PanelVT = 525;
- break;
- default: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768;
- SiS_Pr->PanelHT = 1344; SiS_Pr->PanelVT = 806;
- break;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(tempbx & 0x07) tempbx += 8;
+ }
+ tempbx >>= 3; /* BPLHDEE */
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,temp); /* Part1_17h */
+
+ tempcx = SiS_Pr->SiS_VGAVT;
+ tempbx = SiS_Pr->SiS_VGAVDE;
+ tempcx -= tempbx; /* GAVT-VGAVDE */
+ tempbx = SiS_Pr->SiS_LCDVDES; /* VGAVDES */
+ push1 = tempbx;
+ if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+ tempax = SiS_Pr->PanelYRes;
+ } else {
+ tempax = SiS_Pr->SiS_VGAVDE;
}
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
- SiS_Pr->SiS_LCDInfo = temp & ~0x000e;
+ tempbx += tempax;
+ tempax = SiS_Pr->SiS_VT; /* VT */
+ if(tempbx >= tempax) tempbx -= tempax;
- if(!(SiS_Pr->UsePanelScaler)) SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
- else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+ push2 = tempbx;
+
+ tempcx >>= 2;
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_661) {
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(temp & 0x08) SiS_Pr->SiS_LCDInfo |= LCDPass11;
- }
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- if(SiS_Pr->SiS_ROMNew) {
- if(temp & 0x02) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
- } else if((myptr = GetLCDStructPtr661(SiS_Pr, HwInfo))) {
- if(myptr[2] & 0x01) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
- }
- }
- } else if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x39) & 0x01) SiS_Pr->SiS_LCDInfo |= LCDPass11;
- }
- if((SiS_Pr->SiS_ROMNew) && (!(SiS_Pr->PanelSelfDetected))) {
- SiS_Pr->SiS_LCDInfo &= ~(LCDRGB18Bit);
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x35);
- if(temp & 0x01) SiS_Pr->SiS_LCDInfo |= LCDRGB18Bit;
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- if(temp & 0x02) SiS_Pr->SiS_LCDInfo |= LCDDualLink;
- }
+ /* 650/30xLV 1.10.6s, 740/LVDS */
+ if( ((SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) ||
+ ((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 1;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempcx = 3;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 3;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 1;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 1;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 1;
+ else tempcx = 0x0057;
}
}
-#endif
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- /* Always center screen on LVDS (if scaling is disabled) */
- SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- /* Always center screen on SiS LVDS (if scaling is disabled) */
- SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
- } else {
- /* By default, pass 1:1 on SiS TMDS (if scaling is disabled) */
- SiS_Pr->SiS_LCDInfo |= LCDPass11;
- if(SiS_Pr->CenterScreen == 1) SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
- }
+ tempbx += tempcx;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ tempbx++; /* BPLVRS */
}
+ if(tempbx >= tempax) tempbx -= tempax;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp); /* Part1_18h */
+ tempcx >>= 3;
if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
- SiS_Pr->SiS_LCDInfo = 0x80 | 0x40 | 0x20; /* neg h/v sync, RGB24(D0 = 0) */
- }
- }
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_Custom:
- /* For non-standard LCD resolution, we let the panel scale */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- break;
- case Panel_1280x720:
- if(SiS_Pr->PanelHT == 1650) {
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- }
- case Panel_1280x768: /* TMDS only */
- /* No idea about the timing and zoom factors */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- break;
- case Panel_1280x960:
- SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
- break;
- case Panel_1280x1024:
- if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e ||
- ModeNo == 0x79 || ModeNo == 0x75 || ModeNo == 0x78 ||
- ModeNo == 0x14 || ModeNo == 0x15 || ModeNo == 0x16) {
- /* We do not scale to 1280x720/800/960 (B/C bridges only) */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- }
- if(((HwInfo->jChipType >= SIS_315H) &&
- (ModeNo == 0x23 || ModeNo == 0x24 || ModeNo == 0x25)) ||
- ((HwInfo->jChipType < SIS_315H) &&
- (ModeNo == 0x55 || ModeNo == 0x5a || ModeNo == 0x5b))) {
- /* We do not scale to 1280x768 (B/C bridges only) */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- }
- }
- break;
- case Panel_1400x1050:
- if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
- /* We do not scale to 1280x1024 (all bridges) */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- }
- break;
- case Panel_1600x1200:
- if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- /* No idea about the timing and zoom factors (C bridge only) */
- SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- }
- break;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) tempcx = 3;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempcx = 5;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) tempcx = 5;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempcx = 5;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempcx = 2;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempcx = 2;
}
}
}
+ tempcx += tempbx;
+ tempcx++; /* BPLVRE */
+ temp = tempcx & 0x00FF;
+ temp &= 0x0F;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp);
+ } else {
+ /* 650/30xLV 1.10.6s, Xabre */
+ temp |= 0xC0;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp); /* Part1_19h */
+ }
-#ifdef SIS300
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_UseROM) {
- if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
- if(!(ROMAddr[0x235] & 0x02)) {
- SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
- }
- }
+ temp = (tempbx & 0xFF00) >> 8;
+ temp &= 0x07;
+ temp <<= 3; /* BPLDESKEW =0 */
+ tempbx = SiS_Pr->SiS_VGAVDE;
+ if(tempbx != SiS_Pr->SiS_VDE) temp |= 0x40;
+ if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) temp |= 0x40;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
+ }
+ } else {
+ if(IS_SIS650) {
+ /* 650/30xLV 1.10.6s */
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
}
- } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
- SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
- }
+ } else {
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x80;
}
}
-#endif
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,0x87,temp); /* Part1_1Ah */
- /* Special cases */
- if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
- SiS_Pr->SiS_LCDInfo |= (DontExpandLCD | LCDPass11);
- }
+ tempbx = push2; /* BPLVDEE */
+ tempcx = push1; /* NPLVDES */
+ push1 = (USHORT)(tempeax & 0xFFFF);
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480) {
- SiS_Pr->SiS_LCDInfo |= LCDPass11;
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ if(resinfo == SIS_RI_800x600) tempcx++;
+ }
}
-
- /* (In)validate LCDPass11 flag */
- if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
- SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ tempbx = SiS_Pr->SiS_VGAVDE;
+ tempcx = tempbx;
+ tempbx--;
}
- /* Special cases */
- if( (SiS_Pr->SiS_IF_DEF_FSTN) ||
- (SiS_Pr->SiS_IF_DEF_DSTN) ||
- (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
- (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
- (SiS_Pr->SiS_CustomT == CUT_PANEL848) ) {
- SiS_Pr->PanelHRS = 999;
- SiS_Pr->PanelHRE = 999;
- }
+ temp = (tempbx & 0xFF00) >> 8;
+ temp &= 0x07;
+ temp <<= 3;
+ temp = temp | (((tempcx & 0xFF00) >> 8) & 0x07);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1D,temp); /* Part1_1Dh */
- if( (SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
- (SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
- (SiS_Pr->SiS_CustomT == CUT_PANEL848) ) {
- SiS_Pr->PanelVRS = 999;
- SiS_Pr->PanelVRE = 999;
- }
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1C,temp); /* Part1_1Ch */
-#ifdef SIS315H
- if((HwInfo->jChipType >= SIS_315H) && (HwInfo->jChipType < SIS_661)) {
- if(!(SiS_Pr->SiS_ROMNew)) {
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- /* Enable 302LV/302ELV dual link mode.
- * For 661, this is done above.
- */
- if((SiS_Pr->SiS_CustomT == CUT_CLEVO1024) &&
- (SiS_Pr->SiS_LCDResInfo == Panel_1024x768)) {
- /* (Sets this in SenseLCD; new paneltypes) */
- SiS_Pr->SiS_LCDInfo |= LCDDualLink;
- }
- if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1680x1050)) {
- SiS_Pr->SiS_LCDInfo |= LCDDualLink;
- }
- }
- }
- }
-#endif
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1B,temp); /* Part1_1Bh */
- if(!((HwInfo->jChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & SetDOSMode))) {
+ tempecx = SiS_Pr->SiS_VGAVT;
+ tempebx = SiS_Pr->SiS_VDE;
+ tempeax = SiS_Pr->SiS_VGAVDE;
+ tempecx -= tempeax; /* VGAVT-VGAVDE */
+ tempeax <<= 18;
+ temp = (USHORT)(tempeax % tempebx);
+ tempeax = tempeax / tempebx;
+ if(temp) tempeax++;
+ tempebx = tempeax; /* BPLVCFACT */
+ tempvcfact = tempeax;
+ temp = (USHORT)(tempebx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x37,temp);
+
+ temp = (USHORT)((tempebx & 0x00FF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x36,temp);
+
+ temp = (USHORT)((tempebx & 0x00030000) >> 16);
+ if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x35,temp);
+
+ tempecx = SiS_Pr->SiS_VGAHDE;
+ if(modeflag & HalfDCLK) tempecx >>= 1;
+ tempebx = SiS_Pr->SiS_HDE;
+ tempeax = tempecx;
+ tempeax <<= 16;
+ temp = tempeax % tempebx;
+ tempeax = tempeax / tempebx;
+ if(temp) tempeax++;
+ if(tempebx == tempecx) tempeax = 0xFFFF;
+ tempecx = tempeax;
+ tempeax = SiS_Pr->SiS_VGAHDE;
+ if(modeflag & HalfDCLK) tempeax >>= 1;
+ tempeax <<= 16;
+ tempeax = tempeax / tempecx;
+ tempecx <<= 16;
+ tempeax--;
+ tempecx = tempecx | (tempeax & 0xFFFF);
+ temp = (USHORT)(tempecx & 0x00FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1F,temp); /* Part1_1Fh */
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
- if(ModeNo == 0x12) {
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- }
- }
- }
- }
+ tempeax = SiS_Pr->SiS_VGAVDE;
+ tempeax <<= 18;
+ tempeax = tempeax / tempvcfact;
+ tempbx = (USHORT)(tempeax & 0x0FFFF);
- if(modeflag & HalfDCLK) {
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_640x480) {
- SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- } else if(ModeNo > 0x13) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(resinfo == SIS_RI_512x384) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1024x600) {
- if((resinfo == SIS_RI_800x600) || (resinfo == SIS_RI_400x300)) {
- SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- }
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_800x600) {
- if(resinfo == SIS_RI_400x300) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
- }
- }
- }
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx--;
+ if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) tempbx = 1;
+
+ temp = ((tempbx & 0xFF00) >> 8) << 3;
+ temp = temp | (USHORT)(((tempecx & 0x0000FF00) >> 8) & 0x07);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x20,temp); /* Part1_20h */
+
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x21,temp); /* Part1_21h */
+
+ tempecx >>= 16; /* BPLHCFACT */
+ if(modeflag & HalfDCLK) tempecx >>= 1;
+ temp = (USHORT)((tempecx & 0x0000FF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x22,temp); /* Part1_22h */
+
+ temp=(USHORT)(tempecx & 0x000000FF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x23,temp);
+
+#if 0
+ /* Missing code (calles int 2f) (650/302LV 1.10.6s; 1.10.7w doesn't do this) */
+ if(xxx()) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x0e,0xda);
}
+#endif
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(SiS_Pr->SiS_VBInfo & SetNotSimuMode) {
- SiS_Pr->SiS_SetFlag |= LCDVESATiming;
- }
- } else {
- SiS_Pr->SiS_SetFlag |= LCDVESATiming;
+ /* Only for LVDS and 301LV/302LV */
+ if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBInfo & VB_SIS301LV302LV)){
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1e,0x20);
}
-#ifdef LINUX_KERNEL
-#ifdef TWDEBUG
- printk(KERN_DEBUG "sisfb: (LCDInfo=0x%04x LCDResInfo=0x%02x LCDTypeInfo=0x%02x)\n",
- SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo);
-#endif
-#endif
-#ifdef LINUX_XF86
- xf86DrvMsgVerb(0, X_PROBED, 4,
- "(init301: LCDInfo=0x%04x LCDResInfo=0x%02x LCDTypeInfo=0x%02x SetFlag=0x%04x)\n",
- SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo, SiS_Pr->SiS_SetFlag);
-#endif
}
+#endif /* SIS 315 */
+
+void SiS_SetCRT2Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex ,USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT offset;
+ UCHAR temp;
+
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) return;
-/*********************************************/
-/* GET VCLK */
-/*********************************************/
+ offset = SiS_GetOffset(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) offset >>= 1;
+
+ temp = (UCHAR)(offset & 0xFF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x07,temp);
+ temp = (UCHAR)((offset & 0xFF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x09,temp);
+ temp = (UCHAR)(((offset >> 3) & 0xFF) + 1);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,temp);
+}
USHORT
-SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT CRT2Index,VCLKIndex=0,VCLKIndexGEN=0;
- USHORT modeflag,resinfo,tempbx;
- const UCHAR *CHTVVCLKPtr = NULL;
+ USHORT temp,colordepth;
+ USHORT modeinfo,index,infoflag;
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- CRT2Index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- VCLKIndexGEN = (SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02)) >> 2) & 0x03;
+ if(SiS_Pr->UseCustomMode) {
+ infoflag = SiS_Pr->CInfoFlag;
+ temp = SiS_Pr->CHDisplay / 16;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- CRT2Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- VCLKIndexGEN = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
- if(HwInfo->jChipType < SIS_315H) VCLKIndexGEN &= 0x3f;
+ infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+ modeinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
+ index = (modeinfo >> 8) & 0xFF;
+ temp = SiS_Pr->SiS_ScreenOffset[index];
}
+
+ colordepth = SiS_GetColorDepth(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
- if(SiS_Pr->SiS_VBType & VB_SISVB) { /* 30x/B/LV */
+ if(infoflag & InterlaceMode) temp <<= 1;
- if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+ temp *= colordepth;
- CRT2Index >>= 6;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /* LCD */
-
- if(HwInfo->jChipType < SIS_315H) {
- VCLKIndex = SiS_Pr->PanelVCLKIdx300;
- } else {
- VCLKIndex = SiS_Pr->PanelVCLKIdx315;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- VCLKIndex = VCLKIndexGEN;
- if(resinfo == SIS_RI_1280x720) VCLKIndex = VCLK_1280x720;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x720) {
- if(SiS_Pr->PanelHT == 1344) VCLKIndex = VCLK_1280x720_2;
- }
- if(ModeNo <= 0x13) {
- if(HwInfo->jChipType <= SIS_315PRO) {
- if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
- } else {
- if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x00;
- }
- }
- if(HwInfo->jChipType <= SIS_315PRO) {
- if(VCLKIndex == 0) VCLKIndex = 0x41;
- if(VCLKIndex == 1) VCLKIndex = 0x43;
- if(VCLKIndex == 4) VCLKIndex = 0x44;
- }
- }
- }
+ if( ( ((ModeNo >= 0x26) && (ModeNo <= 0x28)) ||
+ ModeNo == 0x3f ||
+ ModeNo == 0x42 ||
+ ModeNo == 0x45 ) ||
+ (SiS_Pr->UseCustomMode && (SiS_Pr->CHDisplay % 16)) ) {
+ colordepth >>= 1;
+ temp += colordepth;
+ }
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* TV */
+ return(temp);
+}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- if(SiS_Pr->SiS_TVMode & TVRPLLDIV2XO) VCLKIndex = HiTVVCLKDIV2;
- else VCLKIndex = HiTVVCLK;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- if(modeflag & Charx8Dot) VCLKIndex = HiTVSimuVCLK;
- else VCLKIndex = HiTVTextVCLK;
- }
- } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) VCLKIndex = YPbPr750pVCLK;
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) VCLKIndex = TVVCLKDIV2;
- else if(SiS_Pr->SiS_TVMode & TVRPLLDIV2XO) VCLKIndex = TVVCLKDIV2;
- else VCLKIndex = TVVCLK;
-
- if(HwInfo->jChipType < SIS_315H) VCLKIndex += TVCLKBASE_300;
- else VCLKIndex += TVCLKBASE_315;
-
- } else { /* VGA2 */
-
- VCLKIndex = VCLKIndexGEN;
- if(HwInfo->jChipType < SIS_315H) {
- if(ModeNo > 0x13) {
- if( (HwInfo->jChipType == SIS_630) &&
- (HwInfo->jChipRevision >= 0x30)) {
- if(VCLKIndex == 0x14) VCLKIndex = 0x34;
- }
- /* Better VGA2 clock for 1280x1024@75 */
- if(VCLKIndex == 0x17) VCLKIndex = 0x45;
- }
- }
- }
+USHORT
+SiS_GetColorDepth(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
+{
+ USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8};
+ SHORT index;
+ USHORT modeflag;
- } else { /* If not programming CRT2 */
+ /* Do NOT check UseCustomMode, will skrew up FIFO */
+ if(ModeNo == 0xfe) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ if(ModeNo <= 0x13)
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ else
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
- VCLKIndex = VCLKIndexGEN;
- if(HwInfo->jChipType < SIS_315H) {
- if(ModeNo > 0x13) {
- if( (HwInfo->jChipType != SIS_630) &&
- (HwInfo->jChipType != SIS_300) ) {
- if(VCLKIndex == 0x1b) VCLKIndex = 0x35;
- }
- }
- }
- }
+ index = (modeflag & ModeInfoFlag) - ModeEGA;
+ if(index < 0) index = 0;
+ return(ColorDepth[index]);
+}
- } else { /* LVDS */
+void
+SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT tempah=0,tempbl,infoflag,flag;
- VCLKIndex = CRT2Index;
+ flag = 0;
+ tempbl = 0xC0;
- if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+ if(SiS_Pr->UseCustomMode) {
+ infoflag = SiS_Pr->CInfoFlag;
+ } else {
+ infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+ }
- if( (SiS_Pr->SiS_IF_DEF_CH70xx != 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* LVDS */
- VCLKIndex &= 0x1f;
- tempbx = 0;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- tempbx += 2;
- if(SiS_Pr->SiS_ModeType > ModeVGA) {
- if(SiS_Pr->SiS_CHSOverScan) tempbx = 8;
- }
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- tempbx = 4;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
- } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
- tempbx = 6;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
- }
- }
- switch(tempbx) {
- case 0: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUNTSC; break;
- case 1: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKONTSC; break;
- case 2: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPAL; break;
- case 3: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
- case 4: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALM; break;
- case 5: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALM; break;
- case 6: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALN; break;
- case 7: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALN; break;
- case 8: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKSOPAL; break;
- default: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
- }
- VCLKIndex = CHTVVCLKPtr[VCLKIndex];
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ tempah = 0;
+ } else if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDInfo & LCDSync)) {
+ tempah = SiS_Pr->SiS_LCDInfo;
+ } else tempah = infoflag >> 8;
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ tempah &= 0xC0;
- if(HwInfo->jChipType < SIS_315H) {
- VCLKIndex = SiS_Pr->PanelVCLKIdx300;
- } else {
- VCLKIndex = SiS_Pr->PanelVCLKIdx315;
- }
+ tempah |= 0x20;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- /* Special Timing: Barco iQ Pro R series */
- if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) VCLKIndex = 0x44;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
+ (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
+ tempah |= 0xc0;
+ }
+ }
- /* Special Timing: 848x480 parallel lvds */
- if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
- if(HwInfo->jChipType < SIS_315H) {
- VCLKIndex = VCLK34_300;
- /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */
- } else {
- VCLKIndex = VCLK34_315;
- /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */
- }
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ tempah >>= 3;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xE7,tempah);
+ }
+ } else {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
+ }
- } else {
+ } else {
- VCLKIndex = VCLKIndexGEN;
- if(HwInfo->jChipType < SIS_315H) {
- if(ModeNo > 0x13) {
- if( (HwInfo->jChipType == SIS_630) &&
- (HwInfo->jChipRevision >= 0x30) ) {
- if(VCLKIndex == 0x14) VCLKIndex = 0x2e;
- }
- }
- }
- }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
- } else { /* if not programming CRT2 */
+#ifdef SIS300 /* ---- 300 series --- */
- VCLKIndex = VCLKIndexGEN;
- if(HwInfo->jChipType < SIS_315H) {
- if(ModeNo > 0x13) {
- if( (HwInfo->jChipType != SIS_630) &&
- (HwInfo->jChipType != SIS_300) ) {
- if(VCLKIndex == 0x1b) VCLKIndex = 0x35;
- }
-#if 0
- if(HwInfo->jChipType == SIS_730) {
- if(VCLKIndex == 0x0b) VCLKIndex = 0x40; /* 1024x768-70 */
- if(VCLKIndex == 0x0d) VCLKIndex = 0x41; /* 1024x768-75 */
- }
-#endif
- }
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* 630 - 301B(-DH) */
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ tempah = SiS_Pr->SiS_LCDInfo;
+ if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+ flag = 1;
+ }
+ }
+ if(flag != 1) tempah = infoflag >> 8;
+ tempah &= 0xC0;
+
+ tempah |= 0x20;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- }
-
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "VCLKIndex %d (0x%x)\n", VCLKIndex, VCLKIndex);
+#if 0
+ if (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ /* BIOS does something here @@@ */
+ }
#endif
- return(VCLKIndex);
-}
+ tempah &= 0x3f;
+ tempah |= tempbl;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
-/*********************************************/
-/* SET CRT2 MODE TYPE REGISTERS */
-/*********************************************/
+ } else { /* 630 - 301 */
-static void
-SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
-{
- USHORT i,j,modeflag;
- USHORT tempcl,tempah=0;
-#ifdef SIS300
- USHORT temp;
-#endif
-#ifdef SIS315H
- USHORT tempbl, tempah2, tempbl2;
-#endif
+ tempah = infoflag >> 8;
+ tempah &= 0xC0;
+ tempah |= 0x20;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- } else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
-
- /* BIOS does not do this (neither 301 nor LVDS) */
- /* (But it's harmless; see SetCRT2Offset) */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,0x00); /* fix write part1 index 0 BTDRAM bit Bug */
+ }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+#endif /* SIS300 */
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xAF,0x40);
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0xF7);
+ } else {
- } else {
+#ifdef SIS315H /* ------- 315 series ------ */
- for(i=0,j=4; i<3; i++,j++) SiS_SetReg(SiS_Pr->SiS_Part1Port,j,0);
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* 315 - 30xLV */
- tempcl = SiS_Pr->SiS_ModeType;
+ if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
+ tempah = infoflag >> 8;
+ if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+ tempah = SiS_Pr->SiS_LCDInfo;
+ }
+ } else {
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+ }
+ tempah &= 0xC0;
- if(HwInfo->jChipType < SIS_315H) {
+ tempah |= 0x20;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
-#ifdef SIS300 /* ---- 300 series ---- */
+ } else { /* 315 - 301, 301B */
- /* For 301BDH: (with LCD via LVDS) */
- if(SiS_Pr->SiS_VBType & VB_NoLCD) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32);
- temp &= 0xef;
- temp |= 0x02;
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
- temp |= 0x10;
- temp &= 0xfd;
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
- }
+ tempah = infoflag >> 8;
+ if(!SiS_Pr->UseCustomMode) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+ tempah = SiS_Pr->SiS_LCDInfo;
+ }
+ }
+ }
+ tempah &= 0xC0;
+
+ tempah |= 0x20;
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
+
+#if 0
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ /* BIOS does something here @@@ */
+ }
+#endif
- if(ModeNo > 0x13) {
- tempcl -= ModeVGA;
- if((tempcl > 0) || (tempcl == 0)) { /* tempcl is USHORT -> always true! */
- tempah = ((0x10 >> tempcl) | 0x80);
- }
- } else tempah = 0x80;
+ if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* TEST, imitate BIOS bug */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ tempah |= 0xc0;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0xA0;
+ }
+
+#endif /* SIS315H */
+ }
+ }
+}
-#endif /* SIS300 */
+/* Set CRT2 FIFO on 300/630/730 */
+#ifdef SIS300
+void
+SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT temp,index;
+ USHORT modeidindex,refreshratetableindex;
+ USHORT VCLK=0,MCLK,colorth=0,data2=0;
+ USHORT tempal, tempah, tempbx, tempcl, tempax;
+ USHORT CRT1ModeNo,CRT2ModeNo;
+ USHORT SelectRate_backup;
+ ULONG data,eax;
+ const UCHAR LatencyFactor[] = {
+ 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */
+ 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */
+ 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */
+ 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */
+ 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */
+ 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */
+ 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */
+ 00, 68, 66, 59, 57, 37 /*; 128 bit BQ=1 */
+ };
+ const UCHAR LatencyFactor730[] = {
+ 69, 63, 61,
+ 86, 79, 77,
+ 103, 96, 94,
+ 120,113,111,
+ 137,130,128, /* <-- last entry, data below */
+ 137,130,128, /* to avoid using illegal values */
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ 137,130,128,
+ };
+ const UCHAR ThLowB[] = {
+ 81, 4, 72, 6, 88, 8,120,12,
+ 55, 4, 54, 6, 66, 8, 90,12,
+ 42, 4, 45, 6, 55, 8, 75,12
+ };
+ const UCHAR ThTiming[] = {
+ 1, 2, 2, 3, 0, 1, 1, 2
+ };
+
+ SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
- } else {
+ if(!SiS_Pr->CRT1UsesCustomMode) {
+
+ CRT1ModeNo = SiS_Pr->SiS_CRT1Mode; /* get CRT1 ModeNo */
+ SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT1ModeNo,&modeidindex);
+ SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+ SiS_Pr->SiS_SelectCRT2Rate = 0;
+ refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT1ModeNo,
+ modeidindex,HwDeviceExtension);
-#ifdef SIS315H /* ------- 315/330 series ------ */
+ if(CRT1ModeNo >= 0x13) {
+ index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
+ index &= 0x3F;
+ VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x08);
- }
- }
+ colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,modeidindex); /* Get colordepth */
+ colorth >>= 1;
+ if(!colorth) colorth++;
+ }
- if(ModeNo > 0x13) {
- tempcl -= ModeVGA;
- if((tempcl > 0) || (tempcl == 0)) { /* tempcl is USHORT -> always true! */
- tempah = (0x08 >> tempcl);
- if (tempah == 0) tempah = 1;
- tempah |= 0x40;
- }
- } else tempah = 0x40;
+ } else {
+
+ CRT1ModeNo = 0xfe;
+ VCLK = SiS_Pr->CSRClock_CRT1; /* Get VCLK */
+ data2 = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
+ switch(data2) { /* Get color depth */
+ case 0 : colorth = 1; break;
+ case 1 : colorth = 1; break;
+ case 2 : colorth = 2; break;
+ case 3 : colorth = 2; break;
+ case 4 : colorth = 3; break;
+ case 5 : colorth = 4; break;
+ default: colorth = 2;
+ }
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0x50;
+ }
-#endif /* SIS315H */
+ if(CRT1ModeNo >= 0x13) {
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A);
+ } else {
+ index = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A);
+ }
+ index &= 0x07;
+ MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK; /* Get MCLK */
- }
+ data2 = (colorth * VCLK) / MCLK;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ temp = ((temp & 0x00FF) >> 6) << 1;
+ if(temp == 0) temp = 1;
+ temp <<= 2;
+ temp &= 0xff;
- if(HwInfo->jChipType < SIS_315H) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,tempah);
- } else {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah);
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(IS_SIS740) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,tempah);
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah);
- }
- }
- }
+ data2 = temp - data2;
+
+ if((28 * 16) % data2) {
+ data2 = (28 * 16) / data2;
+ data2++;
+ } else {
+ data2 = (28 * 16) / data2;
+ }
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(HwDeviceExtension->jChipType == SIS_300) {
- tempah = 0x01;
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- tempah |= 0x02;
- }
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
- tempah ^= 0x05;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- tempah ^= 0x01;
- }
- }
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18);
+ tempah &= 0x62;
+ tempah >>= 1;
+ tempal = tempah;
+ tempah >>= 3;
+ tempal |= tempah;
+ tempal &= 0x07;
+ tempcl = ThTiming[tempal];
+ tempbx = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16);
+ tempbx >>= 6;
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ tempah >>= 4;
+ tempah &= 0x0c;
+ tempbx |= tempah;
+ tempbx <<= 1;
+ tempal = ThLowB[tempbx + 1];
+ tempal *= tempcl;
+ tempal += ThLowB[tempbx];
+ data = tempal;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
+ } else if(HwDeviceExtension->jChipType == SIS_730) {
+
+#ifndef LINUX_XF86
+ SiS_SetReg4(0xcf8,0x80000050);
+ eax = SiS_GetReg3(0xcfc);
+#else
+ eax = pciReadLong(0x00000000, 0x50);
+#endif
+ tempal = (USHORT)(eax >> 8);
+ tempal &= 0x06;
+ tempal <<= 5;
- if(HwInfo->jChipType < SIS_315H) {
+#ifndef LINUX_XF86
+ SiS_SetReg4(0xcf8,0x800000A0);
+ eax = SiS_GetReg3(0xcfc);
+#else
+ eax = pciReadLong(0x00000000, 0xA0);
+#endif
+ temp = (USHORT)(eax >> 28);
+ temp &= 0x0F;
+ tempal |= temp;
- tempah = (tempah << 5) & 0xFF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,tempah);
- tempah = (tempah >> 5) & 0xFF;
+ tempbx = tempal; /* BIOS BUG (2.04.5d, 2.04.6a use ah here, which is unset!) */
+ tempbx = 0; /* -- do it like the BIOS anyway... */
+ tempax = tempbx;
+ tempbx &= 0xc0;
+ tempbx >>= 6;
+ tempax &= 0x0f;
+ tempax *= 3;
+ tempbx += tempax;
+
+ data = LatencyFactor730[tempbx];
+ data += 15;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ if(!(temp & 0x80)) data += 5;
+
+ } else {
- } else {
+ index = 0;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ if(temp & 0x0080) index += 12;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2E,0xF8,tempah);
+#ifndef LINUX_XF86
+ SiS_SetReg4(0xcf8,0x800000A0);
+ eax = SiS_GetReg3(0xcfc);
+#else
+ /* We use pci functions X offers. We use tag 0, because
+ * we want to read/write to the host bridge (which is always
+ * 00:00.0 on 630, 730 and 540), not the VGA device.
+ */
+ eax = pciReadLong(0x00000000, 0xA0);
+#endif
+ temp = (USHORT)(eax >> 24);
+ if(!(temp&0x01)) index += 24;
- }
+#ifndef LINUX_XF86
+ SiS_SetReg4(0xcf8,0x80000050);
+ eax = SiS_GetReg3(0xcfc);
+#else
+ eax = pciReadLong(0x00000000, 0x50);
+#endif
+ temp=(USHORT)(eax >> 24);
+ if(temp & 0x01) index += 6;
- if((SiS_Pr->SiS_ModeType == ModeVGA) && (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode))) {
- tempah |= 0x10;
- }
+ temp = (temp & 0x0F) >> 1;
+ index += temp;
+
+ data = LatencyFactor[index];
+ data += 15;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14);
+ if(!(temp & 0x80)) data += 5;
+ }
+
+ data += data2; /* CRT1 Request Period */
+
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+ SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
- if((HwInfo->jChipType < SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301)) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1280x960)) {
- tempah |= 0x80;
- }
- } else {
- tempah |= 0x80;
- }
+ if(!SiS_Pr->UseCustomMode) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(!(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p | TVSetYPbPr525p))) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- tempah |= 0x20;
- }
- }
- }
+ CRT2ModeNo = ModeNo;
+ SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&modeidindex);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0D,0x40,tempah);
+ refreshratetableindex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+ modeidindex,HwDeviceExtension);
- tempah = 0;
+ index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex,
+ refreshratetableindex,HwDeviceExtension);
+ VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempah |= 0x40;
+ if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ if(ROMAddr[0x220] & 0x01) {
+ VCLK = ROMAddr[0x229] | (ROMAddr[0x22a] << 8);
+ }
+ }
+ }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_TVMode & TVRPLLDIV2XO) {
- tempah |= 0x40;
- }
- }
+ } else {
- if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1280x960) ||
- ((SiS_Pr->SiS_LCDResInfo == Panel_Custom) &&
- (SiS_Pr->CP_MaxX >= 1280) && (SiS_Pr->CP_MaxY >= 960))) {
- tempah |= 0x80;
- }
+ CRT2ModeNo = 0xfe;
+ VCLK = SiS_Pr->CSRClock; /* Get VCLK */
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0C,tempah);
+ }
- } else { /* LVDS */
+ colorth = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,modeidindex); /* Get colordepth */
+ colorth >>= 1;
+ if(!colorth) colorth++;
- if(HwInfo->jChipType >= SIS_315H) {
+ data = data * VCLK * colorth;
+ if(data % (MCLK << 4)) {
+ data = data / (MCLK << 4);
+ data++;
+ } else {
+ data = data / (MCLK << 4);
+ }
+
+ if(data <= 6) data = 6;
+ if(data > 0x14) data = 0x14;
- /* LVDS can only be slave in 8bpp modes */
- tempah = 0x80;
- if((modeflag & CRT2Mode) && (SiS_Pr->SiS_ModeType > ModeVGA)) {
- if(SiS_Pr->SiS_VBInfo & DriverMode) {
- tempah |= 0x02;
- }
- }
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x01);
+ if(HwDeviceExtension->jChipType == SIS_300) {
+ if(data <= 0x0f) temp = (temp & (~0x1F)) | 0x13;
+ else temp = (temp & (~0x1F)) | 0x16;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ temp = (temp & (~0x1F)) | 0x13;
+ }
+ } else {
+ if( ( (HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730) ) &&
+ (HwDeviceExtension->jChipRevision >= 0x30) ) /* 630s or 730(s?) */
+ {
+ temp = (temp & (~0x1F)) | 0x1b;
+ } else {
+ temp = (temp & (~0x1F)) | 0x16;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0xe0,temp);
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- tempah |= 0x02;
- }
+ if( (HwDeviceExtension->jChipType == SIS_630) &&
+ (HwDeviceExtension->jChipRevision >= 0x30) ) /* 630s, NOT 730 */
+ {
+ if(data > 0x13) data = 0x13;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,0xe0,data);
+
+ } else { /* If mode <= 0x13, we just restore everything */
+
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+ SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+
+ }
+}
+#endif
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- tempah ^= 0x01;
- }
+/* Set FIFO on 315/330 series */
+#ifdef SIS315H
+void
+SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+#if 0 /* This code is obsolete */
+ UCHAR CombCode[] = { 1, 1, 1, 4, 3, 1, 3, 4,
+ 4, 1, 4, 4, 5, 1, 5, 4};
+ UCHAR CRT2ThLow[] = { 39, 63, 55, 79, 78,102, 90,114,
+ 55, 87, 84,116,103,135,119,151};
+ USHORT temp3,tempax,tempbx,tempcx;
+ USHORT tempcl, tempch;
+ USHORT index;
+ USHORT CRT1ModeNo,CRT2ModeNo;
+ USHORT ModeIdIndex;
+ USHORT RefreshRateTableIndex;
+ USHORT SelectRate_backup;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- tempah = 1;
- }
+ SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
+#endif
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2e,0xF0,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,0x3B);
- } else {
+#if 0
+ if(!SiS_Pr->CRT1UsesCustomMode) {
+
+ CRT1ModeNo = SiS_Pr->SiS_CRT1Mode; /* get CRT1 ModeNo */
+ SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT1ModeNo,&ModeIdIndex);
- tempah = 0;
- if( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
- tempah |= 0x02;
- }
- tempah <<= 5;
+ SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
+ SiS_Pr->SiS_SelectCRT2Rate = 0;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
+ /* Get REFIndex for crt1 refreshrate */
+ RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT1ModeNo,
+ ModeIdIndex,HwDeviceExtension);
+ index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ tempax = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,tempah);
+ tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT1ModeNo,ModeIdIndex); /* Get colordepth */
+ tempbx >>= 1;
+ if(!tempbx) tempbx++;
- }
+ } else {
+ CRT1ModeNo = 0xfe;
+ tempax = SiS_Pr->CSRClock_CRT1; /* Get VCLK */
+ tempbx = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
+ switch(tempbx) { /* Get color depth */
+ case 0 : tempbx = 1; break;
+ case 1 : tempbx = 1; break;
+ case 2 : tempbx = 2; break;
+ case 3 : tempbx = 2; break;
+ case 4 : tempbx = 3; break;
+ case 5 : tempbx = 4; break;
+ default: tempbx = 2;
}
+
+ }
+
+ tempax *= tempbx;
- } /* LCDA */
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ tempbx = SiS_GetMCLK(SiS_Pr,ROMAddr, HwDeviceExtension); /* Get MCLK */
- if(HwInfo->jChipType >= SIS_315H) {
+ tempax /= tempbx;
-#ifdef SIS315H
+ tempbx = tempax;
- unsigned char bridgerev = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01);;
+ tempax = 16;
- /* The following is nearly unpreditable and varies from machine
- * to machine. Especially the 301DH seems to be a real trouble
- * maker. Some BIOSes simply set the registers (like in the
- * NoLCD-if-statements here), some set them according to the
- * LCDA stuff. It is very likely that some machines are not
- * treated correctly in the following, very case-orientated
- * code. What do I do then...?
- */
+ tempax -= tempbx;
- /* 740 variants match for 30xB, 301B-DH, 30xLV */
+ tempbx = tempax; /* tempbx = 16-DRamBus - DCLK*BytePerPixel/MCLK */
- if(!(IS_SIS740)) {
- tempah = 0x04; /* For all bridges */
- tempbl = 0xfb;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- tempah = 0x00;
- if(SiS_IsDualEdge(SiS_Pr, HwInfo)) {
- tempbl = 0xff;
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
- }
+ tempax = ((52 * 16) / tempbx);
- /* The following two are responsible for eventually wrong colors
- * in TV output. The DH (VB_NoLCD) conditions are unknown; the
- * b0 was found in some 651 machine (Pim; P4_23=0xe5); the b1 version
- * in a 650 box (Jake). What is the criteria?
- */
+ if ((52*16 % tempbx) != 0) {
+ tempax++;
+ }
+ tempcx = tempax;
+ tempcx += 40;
- if((IS_SIS740) || (HwInfo->jChipType >= SIS_661)) {
- tempah = 0x30;
- tempbl = 0xc0;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- tempah = 0x00;
- tempbl = 0x00;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,tempah);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,tempbl);
- } else if(SiS_Pr->SiS_VBType & VB_SIS301) {
- /* Fixes "TV-blue-bug" on 315+301 */
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xcf); /* For 301 */
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x21,0x3f);
- } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30); /* For 30xLV */
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x21,0xc0);
- } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30); /* For 30xB-DH rev b0 (or "DH on 651"?) */
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x21,0xc0);
- } else {
- tempah = 0x30; tempah2 = 0xc0; /* For 30xB (and 301BDH rev b1) */
- tempbl = 0xcf; tempbl2 = 0x3f;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- tempah = tempah2 = 0x00;
- if(SiS_IsDualEdge(SiS_Pr, HwInfo)) {
- tempbl = tempbl2 = 0xff;
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl2,tempah2);
- }
+ /* get DRAM latency */
+ tempcl = (SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) >> 3) & 0x7; /* SR17[5:3] DRAM Queue depth */
+ tempch = (SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) >> 6) & 0x3; /* SR17[7:6] DRAM Grant length */
- if(IS_SIS740) {
- tempah = 0x80;
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- tempah = 0x00;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,0x7f,tempah);
- } else {
- tempah = 0x00;
- tempbl = 0x7f;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- tempbl = 0xff;
- if(!(SiS_IsDualEdge(SiS_Pr, HwInfo))) {
- tempah = 0x80;
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
- }
+ for (temp3 = 0; temp3 < 16; temp3 += 2) {
+ if ((CombCode[temp3] == tempcl) && (CombCode[temp3+1] == tempch)) {
+ temp3 = CRT2ThLow[temp3 >> 1];
+ }
+ }
- /* 661: Sets p4 27 and 34 here, done in SetGroup4 here (old BIOS) */
+ tempcx += temp3; /* CRT1 Request Period */
-#endif /* SIS315H */
+ SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
+ SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
- } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(!SiS_Pr->UseCustomMode) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x21,0x3f);
+ CRT2ModeNo = ModeNo; /* get CRT2 ModeNo */
+ SiS_SearchModeID(SiS_Pr,ROMAddr,&CRT2ModeNo,&ModeIdIndex);
- if((SiS_Pr->SiS_VBInfo & DisableCRT2Display) ||
- ( (SiS_Pr->SiS_VBType & VB_NoLCD) &&
- (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) ) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x23,0x7F);
- } else {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x23,0x80);
- }
+ RefreshRateTableIndex = SiS_GetRatePtrCRT2(SiS_Pr,ROMAddr,CRT2ModeNo,
+ ModeIdIndex,HwDeviceExtension);
+ index = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ tempax = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
+ } else {
+ tempax = SiS_Pr->SiS_VBVCLKData[index].CLOCK;
}
- } else { /* LVDS */
-
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
+ } else {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ CRT2ModeNo = 0xfe; /* Get VCLK */
+ tempax = SiS_Pr->CSRClock;
- tempah = 0x04;
- tempbl = 0xfb;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- tempah = 0x00;
- if(SiS_IsDualEdge(SiS_Pr, HwInfo)) {
- tempbl = 0xff;
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+ }
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
- }
+ tempbx = SiS_GetColorDepth(SiS_Pr,ROMAddr,CRT2ModeNo,ModeIdIndex); /* Get colordepth */
+ tempbx >>= 1;
+ if(!tempbx) tempbx++;
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30);
+ tempax *= tempbx;
- } else if(HwInfo->jChipType == SIS_550) {
+ tempax *= tempcx;
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2c,0x30);
+ tempbx = SiS_GetMCLK(SiS_Pr,ROMAddr, HwDeviceExtension); /* Get MCLK */
+ tempbx <<= 4;
- }
+ tempcx = tempax;
+ tempax /= tempbx;
+ if(tempcx % tempbx) tempax++; /* CRT1 Request period * TCLK * BytePerPixel / (MCLK*16) */
- }
-#endif
+ if (tempax > 0x37) tempax = 0x37;
+ /* 650/LVDS, 650/301LV, 740, 330 overrule calculated value; 315 does not */
+ if(HwDeviceExtension->jChipType >= SIS_650) {
+ tempax = 0x04;
}
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,tempax);
+#else
-}
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3F,0x04);
-/*********************************************/
-/* GET RESOLUTION DATA */
-/*********************************************/
+#endif
+}
USHORT
-SiS_GetResInfo(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex)
+SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- if(ModeNo <= 0x13) return((USHORT)SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo);
- else return((USHORT)SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO);
+ USHORT index;
+
+ index = SiS_Get310DRAMType(SiS_Pr,ROMAddr,HwDeviceExtension);
+ if(index >= 4) {
+ index -= 4;
+ return(SiS_Pr->SiS_MCLKData_1[index].CLOCK);
+ } else {
+ return(SiS_Pr->SiS_MCLKData_0[index].CLOCK);
+ }
}
-static void
-SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+#endif
+
+/* Checked against 650/LVDS 1.10.07 BIOS */
+void
+SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr)
{
- USHORT xres,yres,modeflag=0,resindex;
+ USHORT modeflag;
+ USHORT PanelIndex,ResIndex;
+ const SiS_LVDSDesStruct *PanelDesPtr = NULL;
- if(SiS_Pr->UseCustomMode) {
- xres = SiS_Pr->CHDisplay;
- if(SiS_Pr->CModeFlag & HalfDCLK) xres *= 2;
- SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
- yres = SiS_Pr->CVDisplay;
- if(SiS_Pr->CModeFlag & DoubleScanMode) yres *= 2;
- SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = yres;
+ if((SiS_Pr->UseCustomMode) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) ||
+ (SiS_Pr->SiS_CustomT == CUT_PANEL848)) {
+ SiS_Pr->SiS_LCDHDES = 0;
+ SiS_Pr->SiS_LCDVDES = 0;
return;
}
- resindex = SiS_GetResInfo(SiS_Pr,ModeNo,ModeIdIndex);
+ if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+
+#ifdef SIS315H
+ SiS_GetLVDSDesPtrA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &PanelIndex,&ResIndex, HwDeviceExtension, BaseAddr);
+
+ switch (PanelIndex)
+ {
+ case 0: PanelDesPtr = SiS_Pr->LVDS1024x768Des_1; break; /* --- expanding --- */
+ case 1: PanelDesPtr = SiS_Pr->LVDS1280x1024Des_1; break;
+ case 2: PanelDesPtr = SiS_Pr->LVDS1400x1050Des_1; break;
+ case 3: PanelDesPtr = SiS_Pr->LVDS1600x1200Des_1; break;
+ case 4: PanelDesPtr = SiS_Pr->LVDS1024x768Des_2; break; /* --- non expanding --- */
+ case 5: PanelDesPtr = SiS_Pr->LVDS1280x1024Des_2; break;
+ case 6: PanelDesPtr = SiS_Pr->LVDS1400x1050Des_2; break;
+ case 7: PanelDesPtr = SiS_Pr->LVDS1600x1200Des_2; break;
+ case 80: PanelDesPtr = (SiS_LVDSDesStruct *)Clevo1024x768Des_1; break; /* custom */
+ case 81: PanelDesPtr = (SiS_LVDSDesStruct *)Clevo1024x768Des_2; break;
+ default: PanelDesPtr = SiS_Pr->LVDS1024x768Des_1; break;
+ }
+#endif
- if(ModeNo <= 0x13) {
- xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
- yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
} else {
- xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
- yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- }
- if(!SiS_Pr->SiS_IF_DEF_DSTN && !SiS_Pr->SiS_IF_DEF_FSTN) {
+ SiS_GetLVDSDesPtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &PanelIndex,&ResIndex,HwDeviceExtension);
+
+ switch (PanelIndex)
+ {
+ case 0: PanelDesPtr = SiS_Pr->SiS_PanelType00_1; break; /* --- */
+ case 1: PanelDesPtr = SiS_Pr->SiS_PanelType01_1; break;
+ case 2: PanelDesPtr = SiS_Pr->SiS_PanelType02_1; break;
+ case 3: PanelDesPtr = SiS_Pr->SiS_PanelType03_1; break;
+ case 4: PanelDesPtr = SiS_Pr->SiS_PanelType04_1; break;
+ case 5: PanelDesPtr = SiS_Pr->SiS_PanelType05_1; break;
+ case 6: PanelDesPtr = SiS_Pr->SiS_PanelType06_1; break;
+ case 7: PanelDesPtr = SiS_Pr->SiS_PanelType07_1; break;
+ case 8: PanelDesPtr = SiS_Pr->SiS_PanelType08_1; break;
+ case 9: PanelDesPtr = SiS_Pr->SiS_PanelType09_1; break;
+ case 10: PanelDesPtr = SiS_Pr->SiS_PanelType0a_1; break;
+ case 11: PanelDesPtr = SiS_Pr->SiS_PanelType0b_1; break;
+ case 12: PanelDesPtr = SiS_Pr->SiS_PanelType0c_1; break;
+ case 13: PanelDesPtr = SiS_Pr->SiS_PanelType0d_1; break;
+ case 14: PanelDesPtr = SiS_Pr->SiS_PanelType0e_1; break;
+ case 15: PanelDesPtr = SiS_Pr->SiS_PanelType0f_1; break;
+ case 16: PanelDesPtr = SiS_Pr->SiS_PanelType00_2; break; /* --- */
+ case 17: PanelDesPtr = SiS_Pr->SiS_PanelType01_2; break;
+ case 18: PanelDesPtr = SiS_Pr->SiS_PanelType02_2; break;
+ case 19: PanelDesPtr = SiS_Pr->SiS_PanelType03_2; break;
+ case 20: PanelDesPtr = SiS_Pr->SiS_PanelType04_2; break;
+ case 21: PanelDesPtr = SiS_Pr->SiS_PanelType05_2; break;
+ case 22: PanelDesPtr = SiS_Pr->SiS_PanelType06_2; break;
+ case 23: PanelDesPtr = SiS_Pr->SiS_PanelType07_2; break;
+ case 24: PanelDesPtr = SiS_Pr->SiS_PanelType08_2; break;
+ case 25: PanelDesPtr = SiS_Pr->SiS_PanelType09_2; break;
+ case 26: PanelDesPtr = SiS_Pr->SiS_PanelType0a_2; break;
+ case 27: PanelDesPtr = SiS_Pr->SiS_PanelType0b_2; break;
+ case 28: PanelDesPtr = SiS_Pr->SiS_PanelType0c_2; break;
+ case 29: PanelDesPtr = SiS_Pr->SiS_PanelType0d_2; break;
+ case 30: PanelDesPtr = SiS_Pr->SiS_PanelType0e_2; break;
+ case 31: PanelDesPtr = SiS_Pr->SiS_PanelType0f_2; break;
+ case 32: PanelDesPtr = SiS_Pr->SiS_PanelTypeNS_1; break; /* pass 1:1 */
+ case 33: PanelDesPtr = SiS_Pr->SiS_PanelTypeNS_2; break;
+ case 50: PanelDesPtr = SiS_Pr->SiS_CHTVUNTSCDesData; break; /* TV */
+ case 51: PanelDesPtr = SiS_Pr->SiS_CHTVONTSCDesData; break;
+ case 52: PanelDesPtr = SiS_Pr->SiS_CHTVUPALDesData; break;
+ case 53: PanelDesPtr = SiS_Pr->SiS_CHTVOPALDesData; break;
+ default:
+ if(HwDeviceExtension->jChipType < SIS_315H)
+ PanelDesPtr = SiS_Pr->SiS_PanelType0e_1;
+ else
+ PanelDesPtr = SiS_Pr->SiS_PanelType01_1;
+ break;
+ }
+ }
+ SiS_Pr->SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
+ SiS_Pr->SiS_LCDVDES = (PanelDesPtr+ResIndex)->LCDVDES;
- if((HwInfo->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
- if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
- if(yres == 350) yres = 400;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD){
+ if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ if(!(modeflag & HalfDCLK)) {
+ SiS_Pr->SiS_LCDHDES = 632;
+ }
}
- if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
- if(ModeNo == 0x12) yres = 400;
+ } else {
+ if(!(SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+ if( (HwDeviceExtension->jChipType < SIS_315H) ||
+ (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) ) {
+ if(SiS_Pr->SiS_LCDResInfo >= SiS_Pr->SiS_Panel1024x768){
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(!(modeflag & HalfDCLK)) SiS_Pr->SiS_LCDHDES = 320;
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
+ SiS_Pr->SiS_LCDHDES = 480;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)
+ SiS_Pr->SiS_LCDHDES = 804;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)
+ SiS_Pr->SiS_LCDHDES = 704;
+ if(!(modeflag & HalfDCLK)) {
+ SiS_Pr->SiS_LCDHDES = 320;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)
+ SiS_Pr->SiS_LCDHDES = 632;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)
+ SiS_Pr->SiS_LCDHDES = 542;
+ }
+ }
+ }
+ }
+ }
}
}
-
- if(modeflag & HalfDCLK) xres *= 2;
- if(modeflag & DoubleScanMode) yres *= 2;
-
}
- if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
-
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCDA | SetCRT2ToLCD | SetCRT2ToHiVision)) {
- if(xres == 720) xres = 640;
- }
+}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_1024x768:
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
- if(yres == 350) yres = 357;
- if(yres == 400) yres = 420;
- if(yres == 480) yres = 525;
- }
- }
- break;
- case Panel_1280x1024:
- if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
- /* BIOS bug - does this regardless of scaling */
- if(yres == 400) yres = 405;
- }
- if(yres == 350) yres = 360;
- if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
- if(yres == 360) yres = 375;
- }
- break;
- case Panel_1600x1200:
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- if(yres == 1024) yres = 1056;
- }
- break;
- }
- }
+void
+SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *PanelIndex,
+ USHORT *ResIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT tempbx,tempal,modeflag;
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
} else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVision)) {
- if(xres == 720) xres = 640;
- }
- } else if(xres == 720) xres = 640;
-
- if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
- yres = 400;
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
- } else {
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
+ tempbx = 0;
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ tempbx = 50;
+ if((SiS_Pr->SiS_VBInfo & SetPALTV) && (!SiS_Pr->SiS_CHPALM)) tempbx += 2;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ /* Nothing special needed for SOverscan */
+ /* PALM uses NTSC data, PALN uses PAL data */
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ tempbx = SiS_Pr->SiS_LCDTypeInfo;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 16;
+ if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ tempbx = 32;
+ if(modeflag & HalfDCLK) tempbx++;
+ }
+ }
+ /* 630/LVDS and 650/LVDS (1.10.07) BIOS */
+ if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ tempal = 0x07;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) tempal++;
}
- if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) yres = 480;
}
-
}
- SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
- SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = yres;
+
+ *PanelIndex = tempbx;
+ *ResIndex = tempal & 0x1F;
}
-/*********************************************/
-/* GET CRT2 TIMING DATA */
-/*********************************************/
+#ifdef SIS315H
+void
+SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+ USHORT tempbx=0,tempal;
-static BOOLEAN
-SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT *ResIndex,
- USHORT *DisplayType)
- {
- USHORT modeflag=0;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 2;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 3;
+ else tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_PanelMinLVDS;
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return FALSE;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 4;
+
+ if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbx = 80;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ }
}
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return FALSE;
- } else
- return FALSE;
+ }
+
+ if(ModeNo <= 0x13)
+ tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ else
+ tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+
+ *PanelIndex = tempbx;
+ *ResIndex = tempal & 0x1F;
+}
+#endif
+
+void
+SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, USHORT BaseAddr, USHORT ModeNo, USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT i,j,modeflag;
+ USHORT tempcl,tempah=0;
+#ifdef SIS300
+ USHORT temp;
+#endif
+#ifdef SIS315H
+ USHORT tempbl;
+#endif
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- (*ResIndex) = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
}
+
+ /* BIOS does not do this (neither 301 nor LVDS) */
+ /* (But it's harmless; see SetCRT2Offset) */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x03,0x00); /* fix write part1 index 0 BTDRAM bit Bug */
- (*ResIndex) &= 0x3F;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+
+ /* 1. for LVDS/302B/302LV **LCDA** */
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xAF,0x40); /* FUNCTION CONTROL */
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2E,0xF7);
- if((SiS_Pr->SiS_IF_DEF_CH70xx) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- (*DisplayType) = 18;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) (*DisplayType)++;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- (*DisplayType) += 2;
- if(SiS_Pr->SiS_ModeType > ModeVGA) {
- if(SiS_Pr->SiS_CHSOverScan) (*DisplayType) = 99;
- }
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- (*DisplayType) = 18; /* PALM uses NTSC data */
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) (*DisplayType)++;
- } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
- (*DisplayType) = 20; /* PALN uses PAL data */
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) (*DisplayType)++;
- }
- }
} else {
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_640x480: (*DisplayType) = 50; break;
- case Panel_640x480_2: (*DisplayType) = 52; break;
- case Panel_640x480_3: (*DisplayType) = 54; break;
- case Panel_800x600: (*DisplayType) = 0; break;
- case Panel_1024x600: (*DisplayType) = 23; break;
- case Panel_1024x768: (*DisplayType) = 4; break;
- case Panel_1152x768: (*DisplayType) = 27; break;
- case Panel_1280x768: (*DisplayType) = 40; break;
- case Panel_1280x1024: (*DisplayType) = 8; break;
- case Panel_1400x1050: (*DisplayType) = 14; break;
- case Panel_1600x1200: (*DisplayType) = 36; break;
- default: return FALSE;
- }
-
- if(modeflag & HalfDCLK) (*DisplayType)++;
-
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_640x480:
- case Panel_640x480_2:
- case Panel_640x480_3:
- break;
- default:
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) (*DisplayType) += 2;
- }
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- (*DisplayType) = 12;
- if(modeflag & HalfDCLK) (*DisplayType)++;
- }
- }
+ for(i=0,j=4; i<3; i++,j++) SiS_SetReg1(SiS_Pr->SiS_Part1Port,j,0);
-#if 0
- if(SiS_Pr->SiS_IF_DEF_FSTN) {
- if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
- (*DisplayType) = 22;
- }
- }
-#endif
+ tempcl = SiS_Pr->SiS_ModeType;
- return TRUE;
-}
+ if(HwDeviceExtension->jChipType < SIS_315H) {
-static void
-SiS_GetCRT2Ptr(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex,
- PSIS_HW_INFO HwInfo)
-{
- USHORT tempbx=0,tempal=0,resinfo=0;
+#ifdef SIS300 /* ---- 300 series ---- */
- if(ModeNo <= 0x13) {
- tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
+ /* For 301BDH: (with LCD via LVDS) */
+ if(SiS_Pr->SiS_VBType & VB_NoLCD) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32);
+ temp &= 0xef;
+ temp |= 0x02;
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) || (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
+ temp |= 0x10;
+ temp &= 0xfd;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
+ }
- if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_IF_DEF_LVDS == 0)) {
+ if(ModeNo > 0x13) {
+ tempcl -= ModeVGA;
+ if((tempcl > 0) || (tempcl == 0)) { /* tempcl is USHORT -> always true! */
+ tempah = ((0x10 >> tempcl) | 0x80);
+ }
+ } else tempah = 0x80;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0xA0;
- tempbx = SiS_Pr->SiS_LCDResInfo;
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 32;
+#endif /* SIS300 */
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) { /* Pass 1:1 only (center-screen handled outside) */
- tempbx = 100;
- if(ModeNo >= 0x13) {
- tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC_NS;
- if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes == 1280) &&
- (SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 768)) {
- /* Special for Fujitsu 7911 (VL-17WDX8), others custom */
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768) tempal = 0x08;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768_2) tempal = 0x0f;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768_3) tempal = 0x10;
- }
- }
- }
+ } else {
-#ifdef SIS315H
- if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
- if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
- tempbx = 200;
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx++;
- }
- }
- }
-#endif
+#ifdef SIS315H /* ------- 315/330 series ------ */
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & CRT2DisplayFlag) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x08);
+ }
+ }
- } else { /* TV */
+ if(ModeNo > 0x13) {
+ tempcl -= ModeVGA;
+ if((tempcl > 0) || (tempcl == 0)) { /* tempcl is USHORT -> always true! */
+ tempah = (0x08 >> tempcl);
+ if (tempah == 0) tempah = 1;
+ tempah |= 0x40;
+ }
+ } else tempah = 0x40;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- /* if(SiS_Pr->SiS_VGAVDE > 480) SiS_Pr->SiS_TVMode &= (~TVSetTVSimuMode); */
- tempbx = 2;
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- tempbx = 13;
- if(!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) tempbx = 14;
- }
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempbx = 7;
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) tempbx = 6;
- else tempbx = 5;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) tempbx += 5;
- } else {
- if(SiS_Pr->SiS_TVMode & TVSetPAL) tempbx = 3;
- else tempbx = 4;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) tempbx += 5;
- }
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempah ^= 0x50;
- }
+#endif /* SIS315H */
- tempal &= 0x3F;
+ }
- if(ModeNo > 0x13) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision) {
- if(tempal == 6) tempal = 7;
- if((resinfo == SIS_RI_720x480) ||
- (resinfo == SIS_RI_720x576) ||
- (resinfo == SIS_RI_768x576)) {
- tempal = 6;
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
- if(resinfo == SIS_RI_1024x768) tempal = 8;
- }
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
- if(resinfo == SIS_RI_1280x720) tempal = 8;
- }
- }
+ if(SiS_Pr->SiS_VBInfo & CRT2DisplayFlag) tempah = 0;
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,tempah); /* FUNCTION CONTROL */
+ } else {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah); /* FUNCTION CONTROL */
+ } else {
+ if(IS_SIS740) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,tempah); /* FUNCTION CONTROL */
+ } else {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x00,0xa0,tempah); /* FUNCTION CONTROL */
+ }
+ }
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+
+ /* 2. for 301 (301B, 302B 301LV, 302LV non-LCDA) */
+
+ tempah = 0x01;
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ tempah |= 0x02;
+ }
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
+ tempah ^= 0x05;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+ tempah ^= 0x01;
+ }
+ }
+
+ if(SiS_Pr->SiS_VBInfo & CRT2DisplayFlag) tempah = 0;
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+
+ /* ---- 300 series ---- */
+
+ tempah = (tempah << 5) & 0xFF;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,tempah);
+ tempah = (tempah >> 5) & 0xFF;
+
+ } else {
+
+ /* ---- 315 series ---- */
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2E,0xF8,tempah);
+
+ }
+
+ if((SiS_Pr->SiS_ModeType == ModeVGA) && (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode))) {
+ tempah |= 0x10;
}
- }
- *CRT2Index = tempbx;
- *ResIndex = tempal;
+ if((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301)) {
+ if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960)) {
+ tempah |= 0x80;
+ }
+ } else {
+ tempah |= 0x80;
+ }
- } else { /* LVDS, 301B-DH (if running on LCD) */
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+ tempah |= 0x20;
+ }
+ }
+ }
- tempbx = 0;
- if((SiS_Pr->SiS_IF_DEF_CH70xx) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- tempbx = 10;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- tempbx += 2;
- if(SiS_Pr->SiS_ModeType > ModeVGA) {
- if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0D,0x40,tempah);
+
+ tempah = 0;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ SiS_Pr->SiS_SetFlag |= RPLLDIV2XO;
+ tempah |= 0x40;
+ } else {
+ if(!(SiS_Pr->SiS_SetFlag & TVSimuMode)) {
+ SiS_Pr->SiS_SetFlag |= RPLLDIV2XO;
+ tempah |= 0x40;
+ }
+ }
+ }
+ } else {
+ SiS_Pr->SiS_SetFlag |= RPLLDIV2XO;
+ tempah |= 0x40;
+ }
}
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- tempbx = 90;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
- } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
- tempbx = 92;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) tempbx += 1;
+ }
+
+ /* For 302LV dual-channel */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr))
+ tempah |= 0x40;
}
- }
- } else {
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_640x480: tempbx = 6; break;
- case Panel_640x480_2: tempbx = 30; break;
- case Panel_640x480_3: tempbx = 30; break;
- case Panel_800x600: tempbx = 0; break;
- case Panel_1024x600: tempbx = 15; break;
- case Panel_1024x768: tempbx = 2; break;
- case Panel_1152x768: tempbx = 17; break;
- case Panel_1280x768: tempbx = 18; break;
- case Panel_1280x1024: tempbx = 4; break;
- case Panel_1400x1050: tempbx = 8; break;
- case Panel_1600x1200: tempbx = 21; break;
- case Panel_Barco1366: tempbx = 80; break;
}
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_640x480:
- case Panel_640x480_2:
- case Panel_640x480_3:
- break;
- default:
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) ||
+ ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) &&
+ (SiS_Pr->CP_MaxX >= 1280) && (SiS_Pr->CP_MaxY >= 960))) {
+ tempah |= 0x80;
}
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) tempbx = 7;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0C,tempah);
- if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
- tempbx = 82;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
- } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
- tempbx = 84;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
- }
+ } else {
- }
+ /* 3. for LVDS */
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+
+ /* Inserted this entire section (BIOS 650/LVDS); added ModeType check
+ * (LVDS can only be slave in 8bpp modes)
+ */
+ tempah = 0x80;
+ if( (modeflag & CRT2Mode) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
+ if (SiS_Pr->SiS_VBInfo & DriverMode) {
+ tempah |= 0x02;
+ }
+ }
+
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ tempah |= 0x02;
+ }
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ tempah ^= 0x01;
+ }
+
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ tempah = 1;
+ }
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2e,0xF0,tempah);
+
+ } else {
+
+ /* (added ModeType check) */
+ tempah = 0;
+ if( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) && (SiS_Pr->SiS_ModeType > ModeVGA) ) {
+ tempah |= 0x02;
+ }
+ tempah <<= 5;
+
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) tempah = 0;
+
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x01,tempah);
- if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_640x480) tempal = 7;
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x80) tempal++;
}
- }
- (*CRT2Index) = tempbx;
- (*ResIndex) = tempal & 0x1F;
+ }
+
}
-}
-static void
-SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,PSIS_HW_INFO HwInfo)
-{
- USHORT tempax=0,tempbx=0;
- USHORT temp1=0,modeflag=0,tempcx=0;
- USHORT index;
+ /* Inserted the entire following section */
- SiS_Pr->SiS_RVBHCMAX = 1;
- SiS_Pr->SiS_RVBHCFACT = 1;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
- if(ModeNo <= 0x13) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- index = SiS_GetModePtr(SiS_Pr,ModeNo,ModeIdIndex);
+#ifdef SIS315H
- tempax = SiS_Pr->SiS_StandTable[index].CRTC[0];
- tempbx = SiS_Pr->SiS_StandTable[index].CRTC[6];
- temp1 = SiS_Pr->SiS_StandTable[index].CRTC[7];
+ unsigned char bridgerev = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);;
- } else {
+ /* The following is nearly unpreditable and varies from machine
+ * to machine. Especially the 301DH seems to be a real trouble
+ * maker. Some BIOSes simply set the registers (like in the
+ * NoLCD-if-statements here), some set them according to the
+ * LCDA stuff. It is very likely that some machines are not
+ * treated correctly in the following, very case-orientated
+ * code. What do I do then...?
+ */
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+ /* 740 variants match for 30xB, 301B-DH, 30xLV */
- tempax = SiS_Pr->SiS_CRT1Table[index].CR[0];
- tempax |= (SiS_Pr->SiS_CRT1Table[index].CR[14] << 8);
- tempax &= 0x03FF;
- tempbx = SiS_Pr->SiS_CRT1Table[index].CR[6];
- tempcx = SiS_Pr->SiS_CRT1Table[index].CR[13] << 8;
- tempcx &= 0x0100;
- tempcx <<= 2;
- tempbx |= tempcx;
- temp1 = SiS_Pr->SiS_CRT1Table[index].CR[7];
+ if(!(IS_SIS740)) {
+ tempah = 0x04; /* For all bridges */
+ tempbl = 0xfb;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ tempah = 0x00;
+ if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbl = 0xff;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+ }
- }
+ /* The following two are responsible for eventually wrong colors
+ * in TV output. The DH (VB_NoLCD) conditions are unknown; the
+ * b0 was found in some 651 machine (Pim); the b1 version in a
+ * 650 box (Jake). What is the criteria?
+ */
- if(temp1 & 0x01) tempbx |= 0x0100;
- if(temp1 & 0x20) tempbx |= 0x0200;
-
- tempax += 5;
+ if(IS_SIS740) {
+ tempah = 0x30;
+ tempbl = 0xcf;
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ tempah = 0x00;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
+ } else if(SiS_Pr->SiS_VBType & VB_SIS301) {
+ /* Fixes "TV-blue-bug" on 315+301 */
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2c,0xCF); /* For 301 */
+ } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30); /* For 30xLV */
+ } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xCF,0x30); /* For 30xB-DH rev b0 (or "DH on 651"?) */
+ } else {
+ tempah = 0x30; /* For 30xB (and 301BDH rev b1) */
+ tempbl = 0xcf;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ tempah = 0x00;
+ if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbl = 0xff;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,tempbl,tempah);
+ }
+
+ if(IS_SIS740) {
+ tempah = 0xc0;
+ tempbl = 0x3f;
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ tempah = 0x00;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
+ } else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0); /* For 30xLV */
+ } else if((SiS_Pr->SiS_VBType & VB_NoLCD) && (bridgerev == 0xb0)) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0x3f,0xc0); /* For 30xB-DH rev b0 (or "DH on 651"? */
+ } else {
+ tempah = 0xc0; /* For 301, 301B (and 301BDH rev b1) */
+ tempbl = 0x3f;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ tempah = 0x00;
+ if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbl = 0xff;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,tempbl,tempah);
+ }
+
+ if(IS_SIS740) {
+ tempah = 0x80;
+ tempbl = 0x7f;
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ tempah = 0x00;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
+ } else {
+ tempah = 0x00; /* For all bridges */
+ tempbl = 0x7f;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ tempbl = 0xff;
+ if(!(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+ tempah |= 0x80;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x23,tempbl,tempah);
+ }
+
+#endif /* SIS315H */
+
+ } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x21,0x3f);
+
+ if((SiS_Pr->SiS_VBInfo & DisableCRT2Display) ||
+ ( (SiS_Pr->SiS_VBType & VB_NoLCD) &&
+ (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) ) ) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x23,0x7F);
+ } else {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x23,0x80);
+ }
+
+ }
+
+ } else { /* LVDS */
+
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+
+ tempah = 0x04;
+ tempbl = 0xfb;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ tempah = 0x00;
+ if(SiS_IsDualEdge(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbl = 0xff;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x00);
+ }
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
+
+ } else if(HwDeviceExtension->jChipType == SIS_550) {
+
+#if 0
+ tempah = 0x00;
+ tempbl = 0xfb;
+ if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
+ tempah = 0x00;
+ tempbl = 0xfb;
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,tempbl,tempah);
+#endif
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2c,0xcf,0x30);
+ }
+
+ }
+#endif
- /* Charx8Dot is no more used (and assumed), so we set it */
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- modeflag |= Charx8Dot;
}
- if(modeflag & Charx8Dot) tempax *= 8;
- else tempax *= 9;
+}
- if(modeflag & HalfDCLK) tempax <<= 1;
+void
+SiS_GetCRT2Data(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
- tempbx++;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
- SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
- SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+
+ SiS_GetCRT2DataLVDS(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+ } else {
+
+ if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+
+ /* Need LVDS Data for LCD on 301B-DH */
+ SiS_GetCRT2DataLVDS(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+
+ } else {
+
+ SiS_GetCRT2Data301(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+ }
+
+ }
+
+ } else {
+
+ SiS_GetCRT2Data301(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+ }
+
+ } else {
+
+ SiS_GetCRT2DataLVDS(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+ }
}
-static void
-SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+/* Checked with 650/LVDS 1.10.07 BIOS */
+void
+SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT CRT2Index, ResIndex;
const SiS_LVDSDataStruct *LVDSData = NULL;
- SiS_GetCRT2ResInfo(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ SiS_GetCRT2ResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
SiS_Pr->SiS_RVBHCMAX = 1;
SiS_Pr->SiS_RVBHCFACT = 1;
SiS_Pr->SiS_NewFlickerMode = 0;
@@ -2938,137 +3411,126 @@ SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
SiS_Pr->SiS_RY4COE = 0;
}
- if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
-#ifdef SIS315H
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- if(SiS_Pr->UseCustomMode) {
- SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = SiS_Pr->CHTotal;
- SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->CVTotal;
- } else {
- if(ModeNo < 0x13) {
- ResIndex = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- ResIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC_NS;
- /* Special for our 3 types, others custom (works with default) */
- if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes == 1280) &&
- (SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 768)) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768) ResIndex = 0x08;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768_2) ResIndex = 0x0f;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x768_3) ResIndex = 0x10;
- }
- /* Special for 1280x720 TMDS <> LVDS */
- if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes == 1280) &&
- (SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].YRes == 720)) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x720) {
- if(SiS_Pr->PanelHT == 1344) ResIndex = 0x12;
- }
- }
- }
- SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_NoScaleData[ResIndex].VGAHT;
- SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_NoScaleData[ResIndex].VGAVT;
- SiS_Pr->SiS_HT = SiS_Pr->SiS_NoScaleData[ResIndex].LCDHT;
- SiS_Pr->SiS_VT = SiS_Pr->SiS_NoScaleData[ResIndex].LCDVT;
- }
- } else {
- SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
- SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
- }
- } else {
- /* This handles custom modes and custom panels */
- SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
- SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
- SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
- SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
- SiS_Pr->SiS_VGAHT = SiS_Pr->PanelHT - (SiS_Pr->PanelXRes - SiS_Pr->SiS_VGAHDE);
- SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT - (SiS_Pr->PanelYRes - SiS_Pr->SiS_VGAVDE);
- }
-
- SiS_CalcLCDACRT1Timing(SiS_Pr,ModeNo,ModeIdIndex);
+#ifdef SIS315H
+ SiS_GetCRT2PtrA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &CRT2Index,&ResIndex);
-#endif
+ switch (CRT2Index) {
+ case 0: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
+ case 1: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_1; break;
+ case 2: LVDSData = SiS_Pr->SiS_LVDS1280x960Data_1; break;
+ case 3: LVDSData = SiS_Pr->SiS_LCDA1400x1050Data_1; break;
+ case 4: LVDSData = SiS_Pr->SiS_LCDA1600x1200Data_1; break;
+ case 5: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_2; break;
+ case 6: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_2; break;
+ case 7: LVDSData = SiS_Pr->SiS_LVDS1280x960Data_2; break;
+ case 8: LVDSData = SiS_Pr->SiS_LCDA1400x1050Data_2; break;
+ case 9: LVDSData = SiS_Pr->SiS_LCDA1600x1200Data_2; break;
+ default: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
+ }
+#endif
} else {
/* 301BDH needs LVDS Data */
- if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- SiS_Pr->SiS_IF_DEF_LVDS = 1;
+ if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+ SiS_Pr->SiS_IF_DEF_LVDS = 1;
}
- SiS_GetCRT2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- &CRT2Index, &ResIndex, HwInfo);
+ SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &CRT2Index,&ResIndex,HwDeviceExtension);
/* 301BDH needs LVDS Data */
- if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- SiS_Pr->SiS_IF_DEF_LVDS = 0;
+ if( (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD) ) {
+ SiS_Pr->SiS_IF_DEF_LVDS = 0;
}
switch (CRT2Index) {
- case 0: LVDSData = SiS_Pr->SiS_LVDS800x600Data_1; break;
- case 1: LVDSData = SiS_Pr->SiS_LVDS800x600Data_2; break;
- case 2: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
- case 3: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_2; break;
- case 4: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_1; break;
- case 5: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_2; break;
- case 6: LVDSData = SiS_Pr->SiS_LVDS640x480Data_1; break;
- case 7: LVDSData = SiS_Pr->SiS_LVDSXXXxXXXData_1; break;
- case 8: LVDSData = SiS_Pr->SiS_LVDS1400x1050Data_1; break;
- case 9: LVDSData = SiS_Pr->SiS_LVDS1400x1050Data_2; break;
- case 10: LVDSData = SiS_Pr->SiS_CHTVUNTSCData; break;
- case 11: LVDSData = SiS_Pr->SiS_CHTVONTSCData; break;
- case 12: LVDSData = SiS_Pr->SiS_CHTVUPALData; break;
- case 13: LVDSData = SiS_Pr->SiS_CHTVOPALData; break;
- case 14: LVDSData = SiS_Pr->SiS_LVDS320x480Data_1; break;
- case 15: LVDSData = SiS_Pr->SiS_LVDS1024x600Data_1; break;
- case 16: LVDSData = SiS_Pr->SiS_LVDS1024x600Data_2; break;
- case 17: LVDSData = SiS_Pr->SiS_LVDS1152x768Data_1; break;
- case 18: LVDSData = SiS_Pr->SiS_LVDS1152x768Data_2; break;
- case 19: LVDSData = SiS_Pr->SiS_LVDS1280x768Data_1; break;
- case 20: LVDSData = SiS_Pr->SiS_LVDS1280x768Data_2; break;
- case 21: LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_1; break;
- case 22: LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_2; break;
- case 30: LVDSData = SiS_Pr->SiS_LVDS640x480Data_2; break;
- case 80: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_1; break;
- case 81: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2; break;
- case 82: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1; break;
- case 83: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_2; break;
- case 84: LVDSData = SiS_Pr->SiS_LVDS848x480Data_1; break;
- case 85: LVDSData = SiS_Pr->SiS_LVDS848x480Data_2; break;
- case 90: LVDSData = SiS_Pr->SiS_CHTVUPALMData; break;
- case 91: LVDSData = SiS_Pr->SiS_CHTVOPALMData; break;
- case 92: LVDSData = SiS_Pr->SiS_CHTVUPALNData; break;
- case 93: LVDSData = SiS_Pr->SiS_CHTVOPALNData; break;
- case 99: LVDSData = SiS_Pr->SiS_CHTVSOPALData; break; /* Super Overscan */
- default: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
- }
-
- SiS_Pr->SiS_VGAHT = (LVDSData+ResIndex)->VGAHT;
- SiS_Pr->SiS_VGAVT = (LVDSData+ResIndex)->VGAVT;
- SiS_Pr->SiS_HT = (LVDSData+ResIndex)->LCDHT;
- SiS_Pr->SiS_VT = (LVDSData+ResIndex)->LCDVT;
-
- if(!(SiS_Pr->SiS_VBType & VB_SISVB)) {
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
- SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
- SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
- if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
- if(ResIndex < 0x08) {
- SiS_Pr->SiS_HDE = 1280;
- SiS_Pr->SiS_VDE = 1024;
- }
- }
- }
- }
- }
+ case 0: LVDSData = SiS_Pr->SiS_LVDS800x600Data_1; break;
+ case 1: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
+ case 2: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_1; break;
+ case 3: LVDSData = SiS_Pr->SiS_LVDS800x600Data_2; break;
+ case 4: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_2; break;
+ case 5: LVDSData = SiS_Pr->SiS_LVDS1280x1024Data_2; break;
+ case 6: LVDSData = SiS_Pr->SiS_LVDS640x480Data_1; break;
+ case 7: LVDSData = SiS_Pr->SiS_LVDSXXXxXXXData_1; break;
+ case 8: LVDSData = SiS_Pr->SiS_LVDS1400x1050Data_1; break;
+ case 9: LVDSData = SiS_Pr->SiS_LVDS1400x1050Data_2; break;
+ case 10: LVDSData = SiS_Pr->SiS_CHTVUNTSCData; break;
+ case 11: LVDSData = SiS_Pr->SiS_CHTVONTSCData; break;
+ case 12: LVDSData = SiS_Pr->SiS_CHTVUPALData; break;
+ case 13: LVDSData = SiS_Pr->SiS_CHTVOPALData; break;
+ case 14: LVDSData = SiS_Pr->SiS_LVDS320x480Data_1; break;
+ case 15: LVDSData = SiS_Pr->SiS_LVDS1024x600Data_1; break;
+ case 16: LVDSData = SiS_Pr->SiS_LVDS1152x768Data_1; break;
+ case 17: LVDSData = SiS_Pr->SiS_LVDS1024x600Data_2; break;
+ case 18: LVDSData = SiS_Pr->SiS_LVDS1152x768Data_2; break;
+ case 19: LVDSData = SiS_Pr->SiS_LVDS1280x768Data_1; break;
+ case 20: LVDSData = SiS_Pr->SiS_LVDS1280x768Data_2; break;
+ case 21: LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_1; break;
+ case 22: LVDSData = SiS_Pr->SiS_LVDS1600x1200Data_2; break;
+ case 30: LVDSData = SiS_Pr->SiS_LVDS640x480Data_2; break;
+ case 80: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_1; break;
+ case 81: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2; break;
+ case 82: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1; break;
+ case 83: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_2; break;
+ case 84: LVDSData = SiS_Pr->SiS_LVDS848x480Data_1; break;
+ case 85: LVDSData = SiS_Pr->SiS_LVDS848x480Data_2; break;
+ case 90: LVDSData = SiS_Pr->SiS_CHTVUPALMData; break;
+ case 91: LVDSData = SiS_Pr->SiS_CHTVOPALMData; break;
+ case 92: LVDSData = SiS_Pr->SiS_CHTVUPALNData; break;
+ case 93: LVDSData = SiS_Pr->SiS_CHTVOPALNData; break;
+ case 99: LVDSData = SiS_Pr->SiS_CHTVSOPALData; break; /* Super Overscan */
+ default: LVDSData = SiS_Pr->SiS_LVDS1024x768Data_1; break;
+ }
}
+
+ SiS_Pr->SiS_VGAHT = (LVDSData+ResIndex)->VGAHT;
+ SiS_Pr->SiS_VGAVT = (LVDSData+ResIndex)->VGAVT;
+ SiS_Pr->SiS_HT = (LVDSData+ResIndex)->LCDHT;
+ SiS_Pr->SiS_VT = (LVDSData+ResIndex)->LCDVT;
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
+ SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
+ }
+
+ } else {
+
+ if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) {
+ if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+ SiS_Pr->SiS_HDE = SiS_Pr->PanelXRes;
+ SiS_Pr->SiS_VDE = SiS_Pr->PanelYRes;
+
+ if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
+ if(ResIndex < 0x08) {
+ SiS_Pr->SiS_HDE = 1280;
+ SiS_Pr->SiS_VDE = 1024;
+ }
+ }
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN) {
+ SiS_Pr->SiS_HDE = 320;
+ SiS_Pr->SiS_VDE = 480;
+ }
+#endif
+ }
+ }
+ }
+ }
+ }
}
-static void
-SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
+void
+SiS_GetCRT2Data301(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
USHORT RefreshRateTableIndex,
- PSIS_HW_INFO HwInfo)
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT tempax,tempbx,modeflag;
USHORT resinfo;
@@ -3079,12 +3541,14 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- resinfo = 0;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ resinfo = 0;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ }
}
SiS_Pr->SiS_NewFlickerMode = 0;
@@ -3094,7 +3558,7 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
SiS_Pr->SiS_RY3COE = 0;
SiS_Pr->SiS_RY4COE = 0;
- SiS_GetCRT2ResInfo(SiS_Pr,ModeNo,ModeIdIndex,HwInfo);
+ SiS_GetCRT2ResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension);
if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC){
@@ -3111,115 +3575,104 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
} else {
- SiS_GetRAMDAC2DATA(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
-
+ SiS_GetRAMDAC2DATA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
}
} else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SiS_GetCRT2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
- &CRT2Index,&ResIndex,HwInfo);
-
- switch(CRT2Index) {
- case 2: TVPtr = SiS_Pr->SiS_ExtHiTVData; break;
- case 3: TVPtr = SiS_Pr->SiS_ExtPALData; break;
- case 4: TVPtr = SiS_Pr->SiS_ExtNTSCData; break;
- case 5: TVPtr = SiS_Pr->SiS_Ext525iData; break;
- case 6: TVPtr = SiS_Pr->SiS_Ext525pData; break;
- case 7: TVPtr = SiS_Pr->SiS_Ext750pData; break;
- case 8: TVPtr = SiS_Pr->SiS_StPALData; break;
- case 9: TVPtr = SiS_Pr->SiS_StNTSCData; break;
- case 10: TVPtr = SiS_Pr->SiS_St525iData; break;
- case 11: TVPtr = SiS_Pr->SiS_St525pData; break;
- case 12: TVPtr = SiS_Pr->SiS_St750pData; break;
- case 13: TVPtr = SiS_Pr->SiS_St1HiTVData; break;
- case 14: TVPtr = SiS_Pr->SiS_St2HiTVData; break;
- default: TVPtr = SiS_Pr->SiS_StPALData; break;
- }
-
- SiS_Pr->SiS_RVBHCMAX = (TVPtr+ResIndex)->RVBHCMAX;
- SiS_Pr->SiS_RVBHCFACT = (TVPtr+ResIndex)->RVBHCFACT;
- SiS_Pr->SiS_VGAHT = (TVPtr+ResIndex)->VGAHT;
- SiS_Pr->SiS_VGAVT = (TVPtr+ResIndex)->VGAVT;
- SiS_Pr->SiS_HDE = (TVPtr+ResIndex)->TVHDE;
- SiS_Pr->SiS_VDE = (TVPtr+ResIndex)->TVVDE;
- SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->RVBHRS;
- SiS_Pr->SiS_NewFlickerMode = (TVPtr+ResIndex)->FlickerMode;
- if(modeflag & HalfDCLK) {
- SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->HALFRVBHRS;
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
-
- if((resinfo == SIS_RI_1024x768) ||
- (resinfo == SIS_RI_1280x1024) ||
- (resinfo == SIS_RI_1280x720)) {
- SiS_Pr->SiS_NewFlickerMode = 0x40;
- }
-
- if(SiS_Pr->SiS_VGAVDE == 350) SiS_Pr->SiS_TVMode |= TVSetTVSimuMode;
-
- SiS_Pr->SiS_HT = ExtHiTVHT;
- SiS_Pr->SiS_VT = ExtHiTVVT;
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- SiS_Pr->SiS_HT = StHiTVHT;
- SiS_Pr->SiS_VT = StHiTVVT;
-#if 0
- if(!(modeflag & Charx8Dot)) {
- SiS_Pr->SiS_HT = StHiTextTVHT;
- SiS_Pr->SiS_VT = StHiTextTVVT;
- }
-#endif
- }
- }
+ SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &CRT2Index,&ResIndex,HwDeviceExtension);
+
+ switch (CRT2Index) {
+ case 2: TVPtr = SiS_Pr->SiS_ExtHiTVData; break;
+/* case 7: TVPtr = SiS_Pr->SiS_St1HiTVData; break; */
+ case 12: TVPtr = SiS_Pr->SiS_St2HiTVData; break;
+ case 3: TVPtr = SiS_Pr->SiS_ExtPALData; break;
+ case 4: TVPtr = SiS_Pr->SiS_ExtNTSCData; break;
+ case 8: TVPtr = SiS_Pr->SiS_StPALData; break;
+ case 9: TVPtr = SiS_Pr->SiS_StNTSCData; break;
+ default: TVPtr = SiS_Pr->SiS_StPALData; break; /* Just to avoid a crash */
+ }
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
+ SiS_Pr->SiS_RVBHCMAX = (TVPtr+ResIndex)->RVBHCMAX;
+ SiS_Pr->SiS_RVBHCFACT = (TVPtr+ResIndex)->RVBHCFACT;
+ SiS_Pr->SiS_VGAHT = (TVPtr+ResIndex)->VGAHT;
+ SiS_Pr->SiS_VGAVT = (TVPtr+ResIndex)->VGAVT;
+ SiS_Pr->SiS_HDE = (TVPtr+ResIndex)->TVHDE;
+ SiS_Pr->SiS_VDE = (TVPtr+ResIndex)->TVVDE;
+ SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->RVBHRS;
+ SiS_Pr->SiS_NewFlickerMode = (TVPtr+ResIndex)->FlickerMode;
+ if(modeflag & HalfDCLK) {
+ SiS_Pr->SiS_RVBHRS = (TVPtr+ResIndex)->HALFRVBHRS;
+ }
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
- SiS_Pr->SiS_HT = 1650;
- SiS_Pr->SiS_VT = 750;
- } else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
- SiS_Pr->SiS_HT = NTSCHT;
- SiS_Pr->SiS_VT = NTSCVT;
- } else {
- SiS_Pr->SiS_HT = NTSCHT;
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) SiS_Pr->SiS_HT = NTSC2HT;
- SiS_Pr->SiS_VT = NTSCVT;
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+
+ if(SiS_Pr->SiS_HiVision != 3) {
+ if(resinfo == SIS_RI_1024x768) SiS_Pr->SiS_NewFlickerMode = 0x40;
+ if(resinfo == SIS_RI_1280x1024) SiS_Pr->SiS_NewFlickerMode = 0x40;
+ if(resinfo == SIS_RI_1280x720) SiS_Pr->SiS_NewFlickerMode = 0x40;
+ }
+
+ switch(SiS_Pr->SiS_HiVision) {
+ case 2:
+ case 1:
+ case 0:
+ SiS_Pr->SiS_HT = 0x6b4;
+ SiS_Pr->SiS_VT = 0x20d;
+ /* Don't care about TVSimuMode */
+ break;
+ default:
+ if(SiS_Pr->SiS_VGAVDE == 350) SiS_Pr->SiS_SetFlag |= TVSimuMode;
+
+ SiS_Pr->SiS_HT = ExtHiTVHT;
+ SiS_Pr->SiS_VT = ExtHiTVVT;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ SiS_Pr->SiS_HT = StHiTVHT;
+ SiS_Pr->SiS_VT = StHiTVVT;
+ if(!(modeflag & Charx8Dot)){
+ SiS_Pr->SiS_HT = StHiTextTVHT;
+ SiS_Pr->SiS_VT = StHiTextTVVT;
+ }
+ }
+ }
+ }
- } else {
+ } else {
- SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
- SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
- SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
- SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
+ SiS_Pr->SiS_RY1COE = (TVPtr+ResIndex)->RY1COE;
+ SiS_Pr->SiS_RY2COE = (TVPtr+ResIndex)->RY2COE;
+ SiS_Pr->SiS_RY3COE = (TVPtr+ResIndex)->RY3COE;
+ SiS_Pr->SiS_RY4COE = (TVPtr+ResIndex)->RY4COE;
- if(modeflag & HalfDCLK) {
- SiS_Pr->SiS_RY1COE = 0x00;
- SiS_Pr->SiS_RY2COE = 0xf4;
- SiS_Pr->SiS_RY3COE = 0x10;
- SiS_Pr->SiS_RY4COE = 0x38;
- }
+ if(modeflag & HalfDCLK) {
+ SiS_Pr->SiS_RY1COE = 0x00;
+ SiS_Pr->SiS_RY2COE = 0xf4;
+ SiS_Pr->SiS_RY3COE = 0x10;
+ SiS_Pr->SiS_RY4COE = 0x38;
+ }
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
- SiS_Pr->SiS_HT = NTSCHT;
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) SiS_Pr->SiS_HT = NTSC2HT;
- SiS_Pr->SiS_VT = NTSCVT;
- } else {
- SiS_Pr->SiS_HT = PALHT;
- SiS_Pr->SiS_VT = PALVT;
- }
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ SiS_Pr->SiS_HT = NTSCHT;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) SiS_Pr->SiS_HT = NTSC2HT;
+ }
+ SiS_Pr->SiS_VT = NTSCVT;
+ } else {
+ SiS_Pr->SiS_HT = PALHT;
+ SiS_Pr->SiS_VT = PALVT;
+ }
- }
+ }
} else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- SiS_Pr->SiS_RVBHCMAX = 1;
- SiS_Pr->SiS_RVBHCFACT = 1;
-
if(SiS_Pr->UseCustomMode) {
+ SiS_Pr->SiS_RVBHCMAX = 1;
+ SiS_Pr->SiS_RVBHCFACT = 1;
SiS_Pr->SiS_VGAHT = SiS_Pr->CHTotal;
SiS_Pr->SiS_VGAVT = SiS_Pr->CVTotal;
SiS_Pr->SiS_HT = SiS_Pr->CHTotal;
@@ -3229,68 +3682,58 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
} else {
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
-
- SiS_Pr->SiS_VGAHT = SiS_Pr->PanelHT;
- SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT;
- SiS_Pr->SiS_HT = SiS_Pr->PanelHT;
- SiS_Pr->SiS_VT = SiS_Pr->PanelVT;
-
- } else {
-
- SiS_GetCRT2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
- &CRT2Index,&ResIndex,HwInfo);
-
- switch(CRT2Index) {
- case Panel_1024x768 : LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break;
- case Panel_1024x768 + 32: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data; break;
- case Panel_1280x720 :
- case Panel_1280x720 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x720Data; break;
- case Panel_1280x768_2 : LCDPtr = SiS_Pr->SiS_ExtLCD1280x768_2Data; break;
- case Panel_1280x768_2+ 32: LCDPtr = SiS_Pr->SiS_StLCD1280x768_2Data; break;
- case Panel_1280x768_3 :
- case Panel_1280x768_3+ 32: LCDPtr = SiS_Pr->SiS_LCD1280x768_3Data; break;
- case Panel_1280x800 :
- case Panel_1280x800 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x800Data; break;
- case Panel_1280x960 :
- case Panel_1280x960 + 32: LCDPtr = SiS_Pr->SiS_LCD1280x960Data; break;
- case Panel_1280x1024 : LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data; break;
- case Panel_1280x1024 + 32: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break;
- case Panel_1400x1050 : LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data; break;
- case Panel_1400x1050 + 32: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data; break;
- case Panel_1600x1200 : LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data; break;
- case Panel_1600x1200 + 32: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data; break;
- case Panel_1680x1050 :
- case Panel_1680x1050 + 32: LCDPtr = SiS_Pr->SiS_LCD1680x1050Data; break;
- case 100 : LCDPtr = SiS_Pr->SiS_NoScaleData; break;
+ SiS_GetCRT2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &CRT2Index,&ResIndex,HwDeviceExtension);
+
+ switch(CRT2Index) {
+ case 0: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break; /* VESA Timing */
+ case 1: LCDPtr = SiS_Pr->SiS_ExtLCD1280x1024Data; break; /* VESA Timing */
+ case 5: LCDPtr = SiS_Pr->SiS_StLCD1024x768Data; break; /* Obviously unused */
+ case 6: LCDPtr = SiS_Pr->SiS_StLCD1280x1024Data; break; /* Obviously unused */
+ case 10: LCDPtr = SiS_Pr->SiS_St2LCD1024x768Data; break; /* Non-VESA Timing */
+ case 11: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break; /* Non-VESA Timing */
+ case 13: LCDPtr = SiS_Pr->SiS_NoScaleData1024x768; break; /* Non-expanding */
+ case 14: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024; break; /* Non-expanding */
+ case 15: LCDPtr = SiS_Pr->SiS_LCD1280x960Data; break; /* 1280x960 */
+ case 20: LCDPtr = SiS_Pr->SiS_ExtLCD1400x1050Data; break; /* VESA Timing */
+ case 21: LCDPtr = SiS_Pr->SiS_NoScaleData1400x1050; break; /* Non-expanding (let panel scale) */
+ case 22: LCDPtr = SiS_Pr->SiS_StLCD1400x1050Data; break; /* Non-VESA Timing (let panel scale) */
+ case 23: LCDPtr = SiS_Pr->SiS_ExtLCD1600x1200Data; break; /* VESA Timing */
+ case 24: LCDPtr = SiS_Pr->SiS_NoScaleData1600x1200; break; /* Non-expanding */
+ case 25: LCDPtr = SiS_Pr->SiS_StLCD1600x1200Data; break; /* Non-VESA Timing */
+ case 26: LCDPtr = SiS_Pr->SiS_ExtLCD1280x768Data; break; /* VESA Timing */
+ case 27: LCDPtr = SiS_Pr->SiS_NoScaleData1280x768; break; /* Non-expanding */
+ case 28: LCDPtr = SiS_Pr->SiS_StLCD1280x768Data; break; /* Non-VESA Timing */
+ case 29: LCDPtr = SiS_Pr->SiS_NoScaleData; break; /* Generic no-scale data */
#ifdef SIS315H
- case 200 : LCDPtr = SiS310_ExtCompaq1280x1024Data; break;
- case 201 : LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break;
+ case 50: LCDPtr = (SiS_LCDDataStruct *)SiS310_ExtCompaq1280x1024Data; break;
+ case 51: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024; break;
+ case 52: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break;
#endif
- default : LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break;
- }
+ default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break; /* Just to avoid a crash */
+ }
+
+ SiS_Pr->SiS_RVBHCMAX = (LCDPtr+ResIndex)->RVBHCMAX;
+ SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
+ SiS_Pr->SiS_VGAHT = (LCDPtr+ResIndex)->VGAHT;
+ SiS_Pr->SiS_VGAVT = (LCDPtr+ResIndex)->VGAVT;
+ SiS_Pr->SiS_HT = (LCDPtr+ResIndex)->LCDHT;
+ SiS_Pr->SiS_VT = (LCDPtr+ResIndex)->LCDVT;
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
+ xf86DrvMsg(0, X_INFO,
+ "GetCRT2Data: Index %d ResIndex %d\n", CRT2Index, ResIndex);
#endif
- SiS_Pr->SiS_RVBHCMAX = (LCDPtr+ResIndex)->RVBHCMAX;
- SiS_Pr->SiS_RVBHCFACT = (LCDPtr+ResIndex)->RVBHCFACT;
- SiS_Pr->SiS_VGAHT = (LCDPtr+ResIndex)->VGAHT;
- SiS_Pr->SiS_VGAVT = (LCDPtr+ResIndex)->VGAVT;
- SiS_Pr->SiS_HT = (LCDPtr+ResIndex)->LCDHT;
- SiS_Pr->SiS_VT = (LCDPtr+ResIndex)->LCDVT;
-
- }
-
- tempax = SiS_Pr->PanelXRes;
- tempbx = SiS_Pr->PanelYRes;
-
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ tempax = 1024;
if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+ else tempbx = 768;
+ } else {
+ tempbx = 768;
}
} else {
if (SiS_Pr->SiS_VGAVDE == 357) tempbx = 527;
@@ -3299,294 +3742,1376 @@ SiS_GetCRT2Data301(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
else if(SiS_Pr->SiS_VGAVDE == 600) tempbx = 775;
else if(SiS_Pr->SiS_VGAVDE == 350) tempbx = 560;
else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 640;
+ else tempbx = 768;
}
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x960) {
- if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 700;
- else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 800;
- else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ tempax = 1280;
if (SiS_Pr->SiS_VGAVDE == 360) tempbx = 768;
else if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 800;
else if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 864;
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) {
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 875;
- else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 1000;
- }
- }
-
+ else tempbx = 1024;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+ tempax = 1280;
+ if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 700;
+ else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 800;
+ else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960;
+ else tempbx = 960;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tempax = 1600;
+ if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 875;
+ else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 1000;
+ else tempbx = 1200;
+ } else {
+ tempax = SiS_Pr->PanelXRes;
+ tempbx = SiS_Pr->PanelYRes;
+ }
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
tempax = SiS_Pr->SiS_VGAHDE;
tempbx = SiS_Pr->SiS_VGAVDE;
}
-
SiS_Pr->SiS_HDE = tempax;
SiS_Pr->SiS_VDE = tempbx;
}
}
}
-static void
-SiS_GetCRT2Data(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+USHORT
+SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
+ USHORT resindex;
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(ModeNo <= 0x13)
+ resindex=SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+ else
+ resindex=SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- } else {
- if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- /* Need LVDS Data for LCD on 301B-DH */
- SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- } else {
- SiS_GetCRT2Data301(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
+ return(resindex);
+}
+
+void
+SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT xres,yres,modeflag=0,resindex;
+
+ if(SiS_Pr->UseCustomMode) {
+ SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = SiS_Pr->CHDisplay;
+ SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = SiS_Pr->CVDisplay;
+ return;
+ }
+
+ resindex = SiS_GetResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+
+ if(ModeNo <= 0x13) {
+ xres = SiS_Pr->SiS_StResInfo[resindex].HTotal;
+ yres = SiS_Pr->SiS_StResInfo[resindex].VTotal;
+ } else {
+ xres = SiS_Pr->SiS_ModeResInfo[resindex].HTotal;
+ yres = SiS_Pr->SiS_ModeResInfo[resindex].VTotal;
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
+
+ if((!SiS_Pr->SiS_IF_DEF_DSTN) && (!SiS_Pr->SiS_IF_DEF_FSTN)) {
+
+ if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1)) {
+ if((ModeNo != 0x03) && (SiS_Pr->SiS_SetFlag & SetDOSMode)) {
+ if(yres == 350) yres = 400;
+ }
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x3a) & 0x01) {
+ if(ModeNo == 0x12) yres = 400;
}
}
- } else {
+ if(ModeNo > 0x13) {
+ if(modeflag & HalfDCLK) xres *= 2;
+ if(modeflag & DoubleScanMode) yres *= 2;
+ }
- SiS_GetCRT2DataLVDS(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ if(xres == 720) xres = 640;
+ } else {
+ if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* 301BDH */
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVisionTV)) {
+ if(xres == 720) xres = 640;
+ }
+ if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+ yres = 400;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
+ } else {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
+ }
+ }
+ } else {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVisionTV)) {
+ if(xres == 720) xres = 640;
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ /* BIOS bug - does this regardless of scaling */
+ if(yres == 400) yres = 405;
+ }
+ if(yres == 350) yres = 360;
+ if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
+ if(yres == 360) yres = 375;
+ }
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ if(yres == 350) yres = 357;
+ if(yres == 400) yres = 420;
+ if(yres == 480) yres = 525;
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ if(xres == 720) xres = 640;
+ if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+ yres = 400;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x80) yres = 480;
+ } else {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) yres = 480;
+ }
+ if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
+ yres = 480;
+ }
+ }
}
+ SiS_Pr->SiS_VGAHDE = SiS_Pr->SiS_HDE = xres;
+ SiS_Pr->SiS_VGAVDE = SiS_Pr->SiS_VDE = yres;
}
-/*********************************************/
-/* GET LVDS DES (SKEW) DATA */
-/*********************************************/
-
-static void
-SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, USHORT *PanelIndex,
- USHORT *ResIndex, PSIS_HW_INFO HwInfo)
+void
+SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT modeflag;
+ USHORT tempbx=0,tempal=0;
+ USHORT Flag,resinfo=0;
if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- (*ResIndex) = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
- (*ResIndex) &= 0x1F;
- (*PanelIndex) = 0;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- (*PanelIndex) = 50;
- if((SiS_Pr->SiS_TVMode & TVSetPAL) && (!(SiS_Pr->SiS_TVMode & TVSetPALM))) (*PanelIndex) += 2;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) (*PanelIndex) += 1;
- /* Nothing special needed for SOverscan */
- /* PALM uses NTSC data, PALN uses PAL data */
- }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
+
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+ tempbx = 15;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ tempbx = 20;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 21;
+ else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 22;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tempbx = 23;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 24;
+ else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 25;
+#if 0
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ tempbx = 26;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 27;
+ else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 28;
+#endif
+ } else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) tempbx = 13;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) tempbx = 14;
+ else tempbx = 29;
+ } else {
+ tempbx = 29;
+ if(ModeNo >= 0x13) {
+ /* 1280x768 and 1280x960 have same CRT2CRTC,
+ * so we change it here if 1280x960 is chosen
+ */
+ if(resinfo == SIS_RI_1280x960) tempal = 10;
+ }
+ }
+ } else {
+ tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_Panel1024x768;
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+ tempbx += 5;
+ /* GetRevisionID(); */
+ /* BIOS only adds 5 once */
+ tempbx += 5;
+ }
+ }
+
+#ifdef SIS315H
+ if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
+ tempbx = 50;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 51;
+ else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 52;
+ }
+#endif
+
+ } else { /* TV */
+
+ if((SiS_Pr->SiS_VBType & VB_SIS301B302B) &&
+ (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+ if(SiS_Pr->SiS_VGAVDE > 480) SiS_Pr->SiS_SetFlag &= (~TVSimuMode);
+ tempbx = 2;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(!(SiS_Pr->SiS_SetFlag & TVSimuMode)) tempbx = 12;
+ }
+ } else {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) tempbx = 3;
+ else tempbx = 4;
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) tempbx += 5;
+ }
+
+ }
+
+ tempal &= 0x3F;
+
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
+ if(ModeNo > 0x13) {
+ if(tempal == 6) tempal = 7;
+ if((resinfo == SIS_RI_720x480) ||
+ (resinfo == SIS_RI_720x576) ||
+ (resinfo == SIS_RI_768x576)) {
+ tempal = 6;
+ }
+ }
+ }
+
+ *CRT2Index = tempbx;
+ *ResIndex = tempal;
+
+ } else { /* LVDS, 301B-DH (if running on LCD) */
+
+ Flag = 1;
+ tempbx = 0;
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+ Flag = 0;
+ tempbx = 10;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ tempbx += 2;
+ if(SiS_Pr->SiS_ModeType > ModeVGA) {
+ if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
+ }
+ if(SiS_Pr->SiS_CHPALM) {
+ tempbx = 90;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ } else if(SiS_Pr->SiS_CHPALN) {
+ tempbx = 92;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ }
+ }
+ }
+ }
+
+ if(Flag) {
+
+ if(SiS_Pr->SiS_LCDResInfo <= SiS_Pr->SiS_Panel1280x1024) {
+ tempbx = SiS_Pr->SiS_LCDResInfo - SiS_Pr->SiS_PanelMinLVDS;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 3;
+ if(SiS_Pr->SiS_CustomT == CUT_BARCO1024) {
+ tempbx = 82;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ }
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ tempbx = 18;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ tempbx = 6;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
+ tempbx = 30;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
+ tempbx = 30;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ tempbx = 15;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ tempbx = 16;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ tempbx = 8;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tempbx = 21;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
+ tempbx = 80;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ }
+
+ if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ tempbx = 7;
+ }
+
+ if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ tempbx = 84;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ }
+
+ }
+
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN){
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+ tempbx = 14;
+ tempal = 6;
+ }
+ }
+#endif
+
+ if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) tempal = 7;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x80) tempal++;
+ }
+
+ }
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(ModeNo > 0x13) {
+ if((resinfo == SIS_RI_720x480) ||
+ (resinfo == SIS_RI_720x576) ||
+ (resinfo == SIS_RI_768x576))
+ tempal = 6;
+ }
+ }
+
+ *CRT2Index = tempbx;
+ *ResIndex = tempal & 0x1F;
}
+}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- *PanelIndex = SiS_Pr->SiS_LCDTypeInfo;
- if(HwInfo->jChipType >= SIS_661) {
- /* As long as we don's use the BIOS tables, we
- * need to convert the TypeInfo as for 315 series
- */
- (*PanelIndex) = SiS_Pr->SiS_LCDResInfo - 1;
+#ifdef SIS315H
+void
+SiS_GetCRT2PtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index,
+ USHORT *ResIndex)
+{
+ USHORT tempbx,tempal;
+
+ tempbx = SiS_Pr->SiS_LCDResInfo;
+
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) tempbx = 4;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) tempbx = 3;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) tempbx = 2;
+ else tempbx -= SiS_Pr->SiS_Panel1024x768;
+
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 5;
+
+ if(ModeNo <= 0x13)
+ tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ else
+ tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+
+ *CRT2Index = tempbx;
+ *ResIndex = tempal & 0x1F;
+}
+#endif
+
+void
+SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index,
+ USHORT *ResIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr)
+{
+ USHORT tempbx,tempal;
+
+ if(ModeNo <= 0x13)
+ tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ else
+ tempal = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+
+ tempbx = SiS_Pr->SiS_LCDResInfo;
+
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 16;
+ else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx += 32;
+
+#ifdef SIS315H
+ if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ tempbx = 100;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 101;
+ else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx = 102;
}
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- (*PanelIndex) += 16;
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- (*PanelIndex) = 32;
- if(modeflag & HalfDCLK) (*PanelIndex)++;
+ } else if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempbx = 103;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 104;
+ else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx = 105;
}
}
}
+#endif
- if(SiS_Pr->SiS_SetFlag & SetDOSMode) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_640x480) {
- (*ResIndex) = 7;
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x80) (*ResIndex)++;
+ *CRT2Index = tempbx;
+ *ResIndex = tempal & 0x3F;
+}
+
+USHORT
+SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00 };
+ USHORT RefreshRateTableIndex,i,backup_i;
+ USHORT modeflag,index,temp,backupindex;
+
+ /* Do NOT check for UseCustomMode here, will skrew up FIFO */
+ if(ModeNo == 0xfe) return 0;
+
+ if(ModeNo <= 0x13)
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ else
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(modeflag & HalfDCLK) return(0);
+ }
+ }
+
+ if(ModeNo < 0x14) return(0xFFFF);
+
+ /* CR33 holds refresh rate index for CRT1 [3:0] and CRT2 [7:4].
+ * On LVDS machines, CRT2 index is always 0 and will be
+ * set to 0 by the following code; this causes the function
+ * to take the first non-interlaced mode in SiS_Ext2Struct
+ */
+
+ index = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x33);
+ index >>= SiS_Pr->SiS_SelectCRT2Rate;
+ index &= 0x0F;
+ backupindex = index;
+
+ if(index > 0) index--;
+
+ if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) index = 0;
+ } else {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_VBType & VB_NoLCD)
+ index = 0;
+ else if(SiS_Pr->SiS_LCDInfo & DontExpandLCD)
+ index = backupindex = 0;
+ }
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ index = 0;
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(!(SiS_Pr->SiS_VBType & VB_NoLCD)) {
+ temp = LCDRefreshIndex[SiS_Pr->SiS_LCDResInfo];
+ if(index > temp) index = temp;
+ }
+ } else {
+ index = 0;
+ }
+ }
+ }
+
+ RefreshRateTableIndex = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
+ ModeNo = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].ModeID;
+
+ /* 650/LVDS 1.10.07, 650/30xLV 1.10.6s */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(!(SiS_Pr->SiS_VBInfo & DriverMode)) {
+ if( (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x105) ||
+ (SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_VESAID == 0x107) ) {
+ if(backupindex <= 1) RefreshRateTableIndex++;
}
}
}
+
+ i = 0;
+ do {
+ if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo) break;
+ temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
+ temp &= ModeInfoFlag;
+ if(temp < SiS_Pr->SiS_ModeType) break;
+ i++;
+ index--;
+ } while(index != 0xFFFF);
+
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ temp = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + i - 1].Ext_InfoFlag;
+ if(temp & InterlaceMode) {
+ i++;
+ }
+ }
+ }
+
+ i--;
+
+ if((SiS_Pr->SiS_SetFlag & ProgrammingCRT2) && (!(SiS_Pr->SiS_VBInfo & DisableCRT2Display))) {
+ backup_i = i;
+ if (!(SiS_AdjustCRT2Rate(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,&i,HwDeviceExtension))) {
+ /* This is for avoiding random data to be used; i is
+ * in an undefined state if no matching CRT2 mode is
+ * found.
+ */
+ i = backup_i;
+ }
+ }
+
+ return(RefreshRateTableIndex + i);
}
-static void
-SiS_GetLVDSDesData(SiS_Private *SiS_Pr, USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+/* Checked against all (incl 650/LVDS (1.10.07), 630/301) BIOSes */
+BOOLEAN
+SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *i,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT modeflag;
- USHORT PanelIndex,ResIndex;
- const SiS_LVDSDesStruct *PanelDesPtr = NULL;
+ USHORT tempax,tempbx,resinfo;
+ USHORT modeflag,infoflag;
- SiS_Pr->SiS_LCDHDES = 0;
- SiS_Pr->SiS_LCDVDES = 0;
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = 0;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ }
- if( (SiS_Pr->UseCustomMode) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_Custom) ||
- (SiS_Pr->SiS_CustomT == CUT_PANEL848) ||
- ((SiS_Pr->SiS_VBType & VB_SISVB) &&
- (SiS_Pr->SiS_LCDInfo & DontExpandLCD) &&
- (SiS_Pr->SiS_LCDInfo & LCDPass11)) ) {
- return;
+ tempbx = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
+
+ tempax = 0;
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
+ tempax |= SupportRAMDAC2;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ tempax |= SupportTV;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(resinfo == SIS_RI_1600x1200) tempax |= SupportTV1024;
+ }
+ }
+ }
+ } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
+ tempax |= SupportLCD;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1600x1200) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1400x1050) {
+ if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ (*i) = 0;
+ return(1);
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) {
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x960) {
+ if((resinfo == SIS_RI_640x480) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ return(0);
+ } else {
+ if((resinfo >= SIS_RI_1280x1024) && (resinfo != SIS_RI_1280x768)) {
+ return(0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ if( (resinfo != SIS_RI_1024x600) &&
+ ((resinfo == SIS_RI_512x384) || (resinfo >= SIS_RI_1024x768))) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+ if((resinfo != SIS_RI_1280x960) && (resinfo > SIS_RI_1024x768)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ if(resinfo > SIS_RI_1280x1024) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(resinfo > SIS_RI_1024x768) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ if((resinfo == SIS_RI_512x384) || (resinfo > SIS_RI_800x600)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ if((resinfo == SIS_RI_512x384) ||
+ (resinfo == SIS_RI_400x300) ||
+ (resinfo > SIS_RI_640x480)) return(0);
+ }
+ }
+ } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_HiVision == 3) {
+ tempax |= SupportHiVisionTV2;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+ if(resinfo == SIS_RI_512x384) return(0);
+ if(resinfo == SIS_RI_400x300) return(0);
+ if(resinfo == SIS_RI_800x600) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+ }
+ if(resinfo > SIS_RI_800x600) return(0);
+ }
+ } else {
+ tempax |= SupportHiVisionTV;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode){
+ if(resinfo == SIS_RI_512x384) return(0);
+ if((resinfo == SIS_RI_400x300) || (resinfo == SIS_RI_800x600)) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) return(0);
+ }
+ if(resinfo > SIS_RI_800x600) return(0);
+ }
+ }
+ } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO|SetCRT2ToSVIDEO|SetCRT2ToSCART)) {
+ tempax |= SupportTV;
+ tempax |= SupportTV1024;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if((SiS_Pr->SiS_VBInfo & SetNotSimuMode) && (SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if(resinfo != SIS_RI_1024x768) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384)) ) {
+ tempax &= ~(SupportTV1024);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else {
+ if( (resinfo != SIS_RI_400x300) ||
+ (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(resinfo == SIS_RI_400x300) return(0);
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+ }
+ }
+ } else return(0);
+ }
+ }
+ }
+ } else {
+ tempax &= ~(SupportTV1024);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else {
+ if( (resinfo != SIS_RI_400x300) ||
+ (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(resinfo == SIS_RI_400x300) return(0);
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else return(0);
+ }
+ }
+ } else { /* slavemode */
+ if(resinfo != SIS_RI_1024x768) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_512x384) ) ) {
+ tempax &= ~(SupportTV1024);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else {
+ if( (resinfo != SIS_RI_400x300) ||
+ (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(resinfo == SIS_RI_400x300) return(0);
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else return(0);
+ }
+ }
+ }
+ }
+ } else { /* 301 */
+ tempax &= ~(SupportTV1024);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if( (!(SiS_Pr->SiS_VBInfo & SetPALTV)) ||
+ ((SiS_Pr->SiS_VBInfo & SetPALTV) && (resinfo != SIS_RI_800x600)) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return(0);
+ }
+ }
+ } else {
+ if( (resinfo != SIS_RI_400x300) ||
+ (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_VBInfo & SetNotSimuMode) ) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((modeflag & NoSupportSimuTV) && (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ if(resinfo == SIS_RI_400x300) return(0);
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) return (0);
+ }
+ }
+ } else return(0);
+ }
+ }
+ }
+
+ } else { /* for LVDS */
+
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ tempax |= SupportCHTV;
+ }
+ }
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ tempax |= SupportLCD;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ if((resinfo != SIS_RI_1280x768) && (resinfo >= SIS_RI_1280x1024)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ if((resinfo != SIS_RI_1024x600) && (resinfo >= SIS_RI_1024x768)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ if((resinfo != SIS_RI_1152x768) && (resinfo > SIS_RI_1024x768)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ if((resinfo != SIS_RI_1400x1050) && (resinfo > SIS_RI_1280x1024)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ if(resinfo > SIS_RI_1600x1200) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ if(resinfo > SIS_RI_1280x1024) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(resinfo > SIS_RI_1024x768) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600){
+ if(resinfo > SIS_RI_800x600) return(0);
+ if(resinfo == SIS_RI_512x384) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) {
+ if((resinfo != SIS_RI_1360x1024) && (resinfo > SIS_RI_1280x1024)) return(0);
+ } else if(SiS_Pr->SiS_LCDResInfo == Panel_848x480) {
+ if((resinfo != SIS_RI_1360x768) &&
+ (resinfo != SIS_RI_848x480) &&
+ (resinfo > SIS_RI_1024x768)) return(0);
+ }
+ }
+ }
+
+ /* Look backwards in table for matching CRT2 mode */
+ for(; SiS_Pr->SiS_RefIndex[RefreshRateTableIndex+(*i)].ModeID == tempbx; (*i)--) {
+ infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
+ if(infoflag & tempax) {
+ return(1);
+ }
+ if ((*i) == 0) break;
}
+ /* Look through the whole mode-section of the table from the beginning
+ * for a matching CRT2 mode if no mode was found yet.
+ */
+ for((*i) = 0; ; (*i)++) {
+ infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag;
+ if(SiS_Pr->SiS_RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) {
+ return(0);
+ }
+ if(infoflag & tempax) {
+ return(1);
+ }
+ }
+ return(1);
+}
- if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+void
+SiS_SaveCRT2Info(SiS_Private *SiS_Pr, USHORT ModeNo)
+{
+ USHORT temp1,temp2;
+
+ /* We store CRT1 ModeNo in CR34 */
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,ModeNo);
+ temp1 = (SiS_Pr->SiS_VBInfo & SetInSlaveMode) >> 8;
+ temp2 = ~(SetInSlaveMode >> 8);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x31,temp2,temp1);
+}
+
+void
+SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ int checkcrt2mode)
+{
+ USHORT tempax,tempbx,temp;
+ USHORT modeflag, resinfo=0;
+ UCHAR OutputSelect = *SiS_Pr->pSiS_OutputSelect;
+
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ } else {
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ }
+ }
+
+ SiS_Pr->SiS_SetFlag = 0;
+
+ SiS_Pr->SiS_ModeType = modeflag & ModeInfoFlag;
+
+ tempbx = 0;
+ if(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension) == 0) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+#if 0
+ /* SiS_HiVision is only used on 315/330+30xLV */
+ if(SiS_Pr->SiS_VBType & (VB_SIS301LV302LV)) {
+ if(SiS_Pr->SiS_HiVision & 0x03) { /* New from 650/30xLV 1.10.6s */
+ temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode); /* 0x83 */
+ temp |= SetCRT2ToHiVisionTV; /* 0x80 */
+ }
+ if(SiS_Pr->SiS_HiVision & 0x04) { /* New from 650/30xLV 1.10.6s */
+ temp &= (SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode); /* 0x83 */
+ temp |= SetCRT2ToSVIDEO; /* 0x08 */
+ }
+ }
+#endif
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN) { /* fstn must set CR30=0x21 */
+ temp = (SetCRT2ToLCD | SetSimuScanMode);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,temp);
+ }
+#endif
+ tempbx |= temp;
+ tempax = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) << 8;
+ tempax &= (LoadDACFlag | DriverMode | SetDispDevSwitch | SetNotSimuMode | SetPALTV);
+ tempbx |= tempax;
+ tempbx &= ~(SetCHTVOverScan | SetInSlaveMode | DisableCRT2Display);;
#ifdef SIS315H
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- /* non-pass 1:1 only, see above */
- if(SiS_Pr->SiS_VGAVDE != SiS_Pr->PanelYRes) {
- SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_HT - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_VGAHDE) / 2);
- SiS_Pr->SiS_LCDVDES = SiS_Pr->SiS_VT - ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VGAVDE) / 2);
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS301LV | VB_SIS302LV)) {
+ /* From 1.10.7w, not in 1.10.8r */
+ if(ModeNo == 0x03) {
+ /* Mode 0x03 is never in driver mode */
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x31,0xbf);
+ }
+ /* From 1.10.7w, not in 1.10.8r */
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8))) {
+ /* Reset LCDA setting */
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0xfc);
+ }
+ if(IS_SIS650) {
+ if(SiS_Pr->SiS_UseLCDA) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {
+ if((ModeNo <= 0x13) || (!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA)); /* 3 */
+ }
+ }
+ }
+#if 0 /* We can't detect it this way; there are machines which do not use LCDA despite
+ * the chip revision
+ */
+ if((tempbx & SetCRT2ToLCD) && (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30) & SetCRT2ToLCD)) {
+ if((SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x36) & 0x0f) == SiS_Pr->SiS_Panel1400x1050) {
+ if((ModeNo <= 0x13) || (!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA)); /* 3 */
+ }
+ }
+ } else {
+ if((ModeNo <= 0x13) || (!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & (DriverMode >> 8)))) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xF0) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x38,(EnableDualEdge | SetToLCDA)); /* 3 */
+ }
+ }
+ }
+ }
+#endif
+ }
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if((temp & (EnableDualEdge | SetToLCDA)) == (EnableDualEdge | SetToLCDA)) {
+ tempbx |= SetCRT2ToLCDA;
+ }
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(temp & SetToLCDA)
+ tempbx |= SetCRT2ToLCDA;
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(temp & EnableLVDSHiVision)
+ tempbx |= SetCRT2ToHiVisionTV;
+ }
+ }
}
- }
- if(SiS_Pr->SiS_VGAVDE == SiS_Pr->PanelYRes) {
- switch(SiS_Pr->SiS_CustomT) {
- case CUT_UNIWILL1024:
- case CUT_UNIWILL10242:
- case CUT_CLEVO1400:
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
+
+#endif /* SIS315H */
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ temp = SetCRT2ToLCDA | SetCRT2ToSCART | SetCRT2ToLCD |
+ SetCRT2ToRAMDAC | SetCRT2ToSVIDEO | SetCRT2ToAVIDEO | /* = 0x807C; */
+ SetCRT2ToHiVisionTV; /* = 0x80FC; */
+ } else {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0)
+ temp = SetCRT2ToLCDA | SetCRT2ToSCART |
+ SetCRT2ToLCD | SetCRT2ToHiVisionTV |
+ SetCRT2ToAVIDEO | SetCRT2ToSVIDEO; /* = 0x80bc */
+ else
+ temp = SetCRT2ToLCDA | SetCRT2ToLCD;
+ } else {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0)
+ temp = SetCRT2ToTV | SetCRT2ToLCD;
+ else
+ temp = SetCRT2ToLCD;
+ }
+ }
+
+ if(!(tempbx & temp)) {
+ tempax = DisableCRT2Display;
+ tempbx = 0;
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(tempbx & SetCRT2ToLCDA) {
+ tempbx &= (0xFF00|SwitchToCRT2|SetSimuScanMode);
+ }
+ if(tempbx & SetCRT2ToRAMDAC) {
+ tempbx &= (0xFF00|SetCRT2ToRAMDAC|SwitchToCRT2|SetSimuScanMode);
+ }
+ if((tempbx & SetCRT2ToLCD) /* && (!(SiS_Pr->SiS_VBType & VB_NoLCD)) */ ) {
+ /* We initialize the Panel Link of the type of bridge is DH */
+ tempbx &= (0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
+ }
+ if(tempbx & SetCRT2ToSCART) {
+ tempbx &= (0xFF00|SetCRT2ToSCART|SwitchToCRT2|SetSimuScanMode);
+ tempbx |= SetPALTV;
+ }
+ if(tempbx & SetCRT2ToHiVisionTV) {
+ tempbx &= (0xFF00|SetCRT2ToHiVisionTV|SwitchToCRT2|SetSimuScanMode);
+ tempbx |= SetPALTV;
+ }
+ } else { /* LVDS */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(tempbx & SetCRT2ToLCDA)
+ tempbx &= (0xFF00|SwitchToCRT2|SetSimuScanMode);
+ }
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(tempbx & SetCRT2ToTV)
+ tempbx &= (0xFF00|SetCRT2ToTV|SwitchToCRT2|SetSimuScanMode);
+ }
+ if(tempbx & SetCRT2ToLCD) {
+ tempbx &= (0xFF00|SetCRT2ToLCD|SwitchToCRT2|SetSimuScanMode);
+ }
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(tempbx & SetCRT2ToLCDA)
+ tempbx |= SetCRT2ToLCD;
+ }
+ }
+
+ if(tempax & DisableCRT2Display) {
+ if(!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
+ tempbx = SetSimuScanMode | DisableCRT2Display;
+ }
+ }
+
+ if(!(tempbx & DriverMode)){
+ tempbx |= SetSimuScanMode;
+ }
+
+ /* LVDS (LCD/TV) and 301BDH (LCD) can only be slave in 8bpp modes */
+ if(SiS_Pr->SiS_ModeType <= ModeVGA) {
+ if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
+ ((tempbx & SetCRT2ToLCD) && (SiS_Pr->SiS_VBType & VB_NoLCD)) ) {
+ modeflag &= (~CRT2Mode);
}
- break;
}
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
- if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) {
- SiS_Pr->SiS_LCDVDES = SiS_Pr->PanelVT - 1;
+
+ if(!(tempbx & SetSimuScanMode)) {
+ if(tempbx & SwitchToCRT2) {
+ if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+ if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+ (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+ if(resinfo != SIS_RI_1600x1200)
+ tempbx |= SetSimuScanMode;
+ } else {
+ tempbx |= SetSimuScanMode;
+ }
+ }
+ } else {
+ if(!(SiS_BridgeIsEnable(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+ if(!(tempbx & DriverMode)) {
+ if(SiS_BridgeInSlave(SiS_Pr)) {
+ tempbx |= SetSimuScanMode;
+ }
+ }
+ }
+ }
+ }
+
+ if(!(tempbx & DisableCRT2Display)) {
+ if(tempbx & DriverMode) {
+ if(tempbx & SetSimuScanMode) {
+ if((!(modeflag & CRT2Mode)) && (checkcrt2mode)) {
+ if( (HwDeviceExtension->jChipType >= SIS_315H) &&
+ (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) ) {
+ if(resinfo != SIS_RI_1600x1200) { /* 650/301 BIOS */
+ tempbx |= SetInSlaveMode;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(tempbx & SetCRT2ToTV) {
+ if(!(tempbx & SetNotSimuMode))
+ SiS_Pr->SiS_SetFlag |= TVSimuMode;
+ }
+ }
+ } /* 650/301 BIOS */
+ } else {
+ tempbx |= SetInSlaveMode;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(tempbx & SetCRT2ToTV) {
+ if(!(tempbx & SetNotSimuMode))
+ SiS_Pr->SiS_SetFlag |= TVSimuMode;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ tempbx |= SetInSlaveMode;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(tempbx & SetCRT2ToTV) {
+ if(!(tempbx & SetNotSimuMode))
+ SiS_Pr->SiS_SetFlag |= TVSimuMode;
+ }
+ }
+ }
+ }
+
+ if(SiS_Pr->SiS_CHOverScan) {
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ if((temp & TVOverScan) || (SiS_Pr->SiS_CHOverScan == 1) )
+ tempbx |= SetCHTVOverScan;
+ }
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x79);
+ if( (temp & 0x80) || (SiS_Pr->SiS_CHOverScan == 1) )
+ tempbx |= SetCHTVOverScan;
+ }
+ if(SiS_Pr->SiS_CHSOverScan) {
+ tempbx |= SetCHTVOverScan;
}
}
- }
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+#ifdef SIS300
+ if((HwDeviceExtension->jChipType==SIS_630) ||
+ (HwDeviceExtension->jChipType==SIS_730)) {
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ OutputSelect = ROMAddr[0xfe];
+ }
+ if(!(OutputSelect & EnablePALMN))
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x35,0x3F);
+ if(tempbx & SetCRT2ToTV) {
+ if(tempbx & SetPALTV) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ if(temp & EnablePALM) tempbx &= (~SetPALTV);
+ }
+ }
+ }
+#endif
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ OutputSelect = ROMAddr[0xf3];
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ OutputSelect = ROMAddr[0x11b];
+ }
+ }
+ if(!(OutputSelect & EnablePALMN))
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x38,0x3F);
+ if(tempbx & SetCRT2ToTV) {
+ if(tempbx & SetPALTV) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(temp & EnablePALM) tempbx &= (~SetPALTV);
+ }
+ }
+ }
+#endif
+ }
+
+ /* PALM/PALN on Chrontel 7019 */
+ SiS_Pr->SiS_CHPALM = SiS_Pr->SiS_CHPALN = FALSE;
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
+ if(tempbx & SetCRT2ToTV) {
+ if(tempbx & SetPALTV) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(temp & EnablePALM) SiS_Pr->SiS_CHPALM = TRUE;
+ else if(temp & EnablePALN) SiS_Pr->SiS_CHPALN = TRUE;
+ }
+ }
+ }
+
+ SiS_Pr->SiS_VBInfo = tempbx;
+
+ if(HwDeviceExtension->jChipType == SIS_630) {
+ SiS_SetChrontelGPIO(SiS_Pr, SiS_Pr->SiS_VBInfo);
+ }
+
+#ifdef TWDEBUG
+#ifdef LINUX_KERNEL
+ printk(KERN_DEBUG "sisfb: (VBInfo= 0x%04x, SetFlag=0x%04x)\n",
+ SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
+#endif
+#ifdef LINUX_XF86
+ xf86DrvMsgVerb(0, X_PROBED, 3, "(init301: VBInfo=0x%04x, SetFlag=0x%04x)\n",
+ SiS_Pr->SiS_VBInfo, SiS_Pr->SiS_SetFlag);
+#endif
#endif
+}
+
+/* Setup general purpose IO for Chrontel communication */
+void
+SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo)
+{
+ unsigned long acpibase;
+ unsigned short temp;
+
+ if(!(SiS_Pr->SiS_ChSW)) return;
+
+#ifndef LINUX_XF86
+ SiS_SetReg4(0xcf8,0x80000874); /* get ACPI base */
+ acpibase = SiS_GetReg3(0xcfc);
+#else
+ acpibase = pciReadLong(0x00000800, 0x74);
+#endif
+ acpibase &= 0xFFFF;
+ temp = SiS_GetReg4((USHORT)(acpibase + 0x3c)); /* ACPI register 0x3c: GP Event 1 I/O mode select */
+ temp &= 0xFEFF;
+ SiS_SetReg5((USHORT)(acpibase + 0x3c), temp);
+ temp = SiS_GetReg4((USHORT)(acpibase + 0x3c));
+ temp = SiS_GetReg4((USHORT)(acpibase + 0x3a)); /* ACPI register 0x3a: GP Pin Level (low/high) */
+ temp &= 0xFEFF;
+ if(!(myvbinfo & SetCRT2ToTV)) {
+ temp |= 0x0100;
+ }
+ SiS_SetReg5((USHORT)(acpibase + 0x3a), temp);
+ temp = SiS_GetReg4((USHORT)(acpibase + 0x3a));
+}
+
+void
+SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT tempax=0,tempbx=0;
+ USHORT temp1=0,modeflag=0,tempcx=0;
+ USHORT StandTableIndex,CRT1Index;
+#ifdef SIS315H
+ USHORT ResIndex,DisplayType,temp=0;
+ const SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr = NULL;
+#endif
+
+ SiS_Pr->SiS_RVBHCMAX = 1;
+ SiS_Pr->SiS_RVBHCFACT = 1;
+
+ if(ModeNo <= 0x13) {
+
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ StandTableIndex = SiS_GetModePtr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex);
+ tempax = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[0];
+ tempbx = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[6];
+ temp1 = SiS_Pr->SiS_StandTable[StandTableIndex].CRTC[7];
+
} else {
- SiS_GetLVDSDesPtr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- &PanelIndex, &ResIndex, HwInfo);
-
- switch(PanelIndex) {
- case 0: PanelDesPtr = SiS_Pr->SiS_PanelType00_1; break; /* --- */
- case 1: PanelDesPtr = SiS_Pr->SiS_PanelType01_1; break;
- case 2: PanelDesPtr = SiS_Pr->SiS_PanelType02_1; break;
- case 3: PanelDesPtr = SiS_Pr->SiS_PanelType03_1; break;
- case 4: PanelDesPtr = SiS_Pr->SiS_PanelType04_1; break;
- case 5: PanelDesPtr = SiS_Pr->SiS_PanelType05_1; break;
- case 6: PanelDesPtr = SiS_Pr->SiS_PanelType06_1; break;
- case 7: PanelDesPtr = SiS_Pr->SiS_PanelType07_1; break;
- case 8: PanelDesPtr = SiS_Pr->SiS_PanelType08_1; break;
- case 9: PanelDesPtr = SiS_Pr->SiS_PanelType09_1; break;
- case 10: PanelDesPtr = SiS_Pr->SiS_PanelType0a_1; break;
- case 11: PanelDesPtr = SiS_Pr->SiS_PanelType0b_1; break;
- case 12: PanelDesPtr = SiS_Pr->SiS_PanelType0c_1; break;
- case 13: PanelDesPtr = SiS_Pr->SiS_PanelType0d_1; break;
- case 14: PanelDesPtr = SiS_Pr->SiS_PanelType0e_1; break;
- case 15: PanelDesPtr = SiS_Pr->SiS_PanelType0f_1; break;
- case 16: PanelDesPtr = SiS_Pr->SiS_PanelType00_2; break; /* --- */
- case 17: PanelDesPtr = SiS_Pr->SiS_PanelType01_2; break;
- case 18: PanelDesPtr = SiS_Pr->SiS_PanelType02_2; break;
- case 19: PanelDesPtr = SiS_Pr->SiS_PanelType03_2; break;
- case 20: PanelDesPtr = SiS_Pr->SiS_PanelType04_2; break;
- case 21: PanelDesPtr = SiS_Pr->SiS_PanelType05_2; break;
- case 22: PanelDesPtr = SiS_Pr->SiS_PanelType06_2; break;
- case 23: PanelDesPtr = SiS_Pr->SiS_PanelType07_2; break;
- case 24: PanelDesPtr = SiS_Pr->SiS_PanelType08_2; break;
- case 25: PanelDesPtr = SiS_Pr->SiS_PanelType09_2; break;
- case 26: PanelDesPtr = SiS_Pr->SiS_PanelType0a_2; break;
- case 27: PanelDesPtr = SiS_Pr->SiS_PanelType0b_2; break;
- case 28: PanelDesPtr = SiS_Pr->SiS_PanelType0c_2; break;
- case 29: PanelDesPtr = SiS_Pr->SiS_PanelType0d_2; break;
- case 30: PanelDesPtr = SiS_Pr->SiS_PanelType0e_2; break;
- case 31: PanelDesPtr = SiS_Pr->SiS_PanelType0f_2; break;
- case 32: PanelDesPtr = SiS_Pr->SiS_PanelTypeNS_1; break; /* pass 1:1 */
- case 33: PanelDesPtr = SiS_Pr->SiS_PanelTypeNS_2; break;
- case 50: PanelDesPtr = SiS_Pr->SiS_CHTVUNTSCDesData; break; /* TV */
- case 51: PanelDesPtr = SiS_Pr->SiS_CHTVONTSCDesData; break;
- case 52: PanelDesPtr = SiS_Pr->SiS_CHTVUPALDesData; break;
- case 53: PanelDesPtr = SiS_Pr->SiS_CHTVOPALDesData; break;
- default: return;
- }
-
- SiS_Pr->SiS_LCDHDES = (PanelDesPtr+ResIndex)->LCDHDES;
- SiS_Pr->SiS_LCDVDES = (PanelDesPtr+ResIndex)->LCDVDES;
-
- if((ModeNo <= 0x13) && (SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- if(!(modeflag & HalfDCLK)) SiS_Pr->SiS_LCDHDES = 632;
- } else if(!(SiS_Pr->SiS_SetFlag & SetDOSMode)) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_1280x1024) {
- if(SiS_Pr->SiS_LCDResInfo >= Panel_1024x768) {
- if(HwInfo->jChipType < SIS_315H) {
- if(!(modeflag & HalfDCLK)) SiS_Pr->SiS_LCDHDES = 320;
- } else {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) SiS_Pr->SiS_LCDHDES = 480;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) SiS_Pr->SiS_LCDHDES = 804;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) SiS_Pr->SiS_LCDHDES = 704;
- if(!(modeflag & HalfDCLK)) {
- SiS_Pr->SiS_LCDHDES = 320;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) SiS_Pr->SiS_LCDHDES = 632;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) SiS_Pr->SiS_LCDHDES = 542;
- }
- }
- }
- }
- }
- }
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ) {
+
+#ifdef SIS315H
+ temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,&ResIndex,&DisplayType);
+
+ if(temp == 0) return;
+
+ switch(DisplayType) {
+ case 0 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1; break;
+ case 1 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1; break;
+ case 2 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1; break;
+ case 3 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1_H; break;
+ case 4 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1_H; break;
+ case 5 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1_H; break;
+ case 6 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2; break;
+ case 7 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2; break;
+ case 8 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2; break;
+ case 9 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2_H; break;
+ case 10: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2_H; break;
+ case 11: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2_H; break;
+ case 12: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1; break;
+ case 13: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H; break;
+ case 14: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_1; break;
+ case 15: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_1_H; break;
+ case 16: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_2; break;
+ case 17: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11400x1050_2_H; break;
+ case 18: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UNTSC; break;
+ case 19: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1ONTSC; break;
+ case 20: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1UPAL; break;
+ case 21: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL; break;
+ case 22: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1320x480_1; break;
+ case 23: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1; break;
+ case 24: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_1_H; break;
+ case 25: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2; break;
+ case 26: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x600_2_H; break;
+ case 27: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_1; break;
+ case 28: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_1_H; break;
+ case 29: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_2; break;
+ case 30: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11152x768_2_H; break;
+ case 36: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_1; break;
+ case 37: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_1_H; break;
+ case 38: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_2; break;
+ case 39: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11600x1200_2_H; break;
+ case 99: LVDSCRT1Ptr = SiS_Pr->SiS_CHTVCRT1OPAL; break;
+ default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1; break;
+ }
+ tempax = (LVDSCRT1Ptr+ResIndex)->CR[0];
+ tempax |= (LVDSCRT1Ptr+ResIndex)->CR[14] << 8;
+ tempax &= 0x03FF;
+ tempbx = (LVDSCRT1Ptr+ResIndex)->CR[6];
+ tempcx = (LVDSCRT1Ptr+ResIndex)->CR[13] << 8;
+ tempcx &= 0x0100;
+ tempcx <<= 2;
+ tempbx |= tempcx;
+ temp1 = (LVDSCRT1Ptr+ResIndex)->CR[7];
+#endif
+
+ } else {
+
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
+#if 0 /* Not any longer */
+ if(HwDeviceExtension->jChipType < SIS_315H) CRT1Index &= 0x3F;
+#endif
+ tempax = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[0];
+ tempax |= SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14] << 8;
+ tempax &= 0x03FF;
+ tempbx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[6];
+ tempcx = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13] << 8;
+ tempcx &= 0x0100;
+ tempcx <<= 2;
+ tempbx |= tempcx;
+ temp1 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
+
+ }
+
}
+
+ if(temp1 & 0x01) tempbx |= 0x0100;
+ if(temp1 & 0x20) tempbx |= 0x0200;
+
+ tempax += 5;
+
+ /* Charx8Dot is no more used (and assumed), so we set it */
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ modeflag |= Charx8Dot;
+ }
+
+ if(modeflag & Charx8Dot) tempax *= 8;
+ else tempax *= 9;
+
+ /* From 650/30xLV 1.10.6s */
+ if(modeflag & HalfDCLK) tempax <<= 1;
+
+ tempbx++;
+
+ SiS_Pr->SiS_VGAHT = SiS_Pr->SiS_HT = tempax;
+ SiS_Pr->SiS_VGAVT = SiS_Pr->SiS_VT = tempbx;
}
-/*********************************************/
-/* DISABLE VIDEO BRIDGE */
-/*********************************************/
+void
+SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+{
+ if(HwDeviceExtension->jChipType >= SIS_315H)
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2f,0x01);
+ else
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x24,0x01);
+}
+
+void
+SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
+{
+ if(HwDeviceExtension->jChipType >= SIS_315H)
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2F,0xFE);
+ else
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x24,0xFE);
+}
-/* NEVER use any variables (VBInfo), this will be called
- * from outside the context of modeswitch!
- * MUST call getVBType before calling this
- */
void
-SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_EnableCRT2(SiS_Private *SiS_Pr)
+{
+ SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
+}
+
+/* NEVER use any variables (VBInfo), this will be called outside the context of modeswitch! */
+/* I MUST call getVBType before calling this */
+void
+SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
{
#ifdef SIS315H
USHORT tempah,pushax=0,modenum;
#endif
USHORT temp=0;
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* ===== For 30xB/LV ===== */
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
- if(HwInfo->jChipType == SIS_300) { /* For 300+301LV (A907) */
+ if(HwDeviceExtension->jChipType == SIS_300) { /* For 300+301LV (A907) */
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
}
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0x3f);
- SiS_ShortDelay(SiS_Pr,1);
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0x3f);
+ SiS_ShortDelay(SiS_Pr,1);
+ }
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
SiS_DisplayOff(SiS_Pr);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if( (!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ||
- (!(SiS_CR36BIOSWord23d(SiS_Pr, HwInfo))) ) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
- }
+ if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
+ (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
}
} else {
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x08);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
- if(SiS_Is301B(SiS_Pr)) {
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0x3f);
SiS_ShortDelay(SiS_Pr,1);
}
@@ -3594,13 +5119,13 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_DisplayOff(SiS_Pr);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
- if( (!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ||
- (!(SiS_CR36BIOSWord23d(SiS_Pr, HwInfo))) ) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x04);
+ if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
+ (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
}
}
@@ -3612,56 +5137,70 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if(IS_SIS550650740660) { /* 550, 650, 740, 660 */
- modenum = SiS_GetReg(SiS_Pr->SiS_P3d4,0x34) & 0x7f;
+ modenum = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* LV */
+
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
}
}
#endif
+
if( (modenum <= 0x13) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (SiS_IsVAMode(SiS_Pr,HwInfo)) ) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
- if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
- (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
- }
+ (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+ (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
+ if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
+ (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+ }
}
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
SiS_DDC2Delay(SiS_Pr,0xff00);
- SiS_DDC2Delay(SiS_Pr,0xe000);
+ SiS_DDC2Delay(SiS_Pr,0x6000);
+ SiS_DDC2Delay(SiS_Pr,0x8000);
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0x00);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
- pushax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x06);
+ pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
if(IS_SIS740) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
}
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
- if(!(SiS_IsNotM650orLater(SiS_Pr, HwInfo))) {
- tempah = 0xef;
- if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
- tempah = 0xf7;
- }
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ if(!(IS_SIS740)) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ tempah = 0xef;
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ tempah = 0xf7;
+ }
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ }
}
}
} else if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* B-DH */
-
- if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,0xef);
- }
-
+ /* This is actually bullshit. The B-DH bridge has cetainly no
+ * Part4 Index 26, since it has no ability to drive LCD panels
+ * at all. But as the BIOS does it, we do it, too...
+ */
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,0xef);
+ }
+ if((!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+ (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
+ }
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 3);
+ }
}
if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
@@ -3673,16 +5212,16 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
tempah = 0x3f;
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
tempah = 0x7f;
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
tempah = 0xbf;
}
}
SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
}
- if((SiS_IsVAMode(SiS_Pr,HwInfo)) ||
+ if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
((SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && (modenum <= 0x13))) {
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
@@ -3693,18 +5232,18 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
} else {
SiS_DisplayOff(SiS_Pr);
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF);
if((SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && (modenum <= 0x13)) {
SiS_DisplayOff(SiS_Pr);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
}
}
@@ -3713,89 +5252,101 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
- if(!(SiS_IsDualEdge(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
SiS_DisplayOff(SiS_Pr);
}
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
} else {
SiS_DisplayOff(SiS_Pr);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
}
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
-
}
if((SiS_Pr->SiS_VBType & VB_SIS301LV302LV) &&
(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10);
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10); /* 1.10.8r, 8m */
tempah = 0x3f;
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
tempah = 0x7f;
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
tempah = 0xbf;
}
}
SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
- if(SiS_IsNotM650orLater(SiS_Pr,HwInfo)) {
+ if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) { /* 1.10.8r, 8m */
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
- }
+ } /* 1.10.8r, 8m */
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf);
- if(!(SiS_CRT2IsLCD(SiS_Pr,HwInfo))) {
- if(!(SiS_IsDualEdge(SiS_Pr,HwInfo))) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
+ }
+
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
}
}
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x06,pushax);
-
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- if( (SiS_IsVAMode(SiS_Pr, HwInfo)) ||
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 20);
- }
- }
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
} else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
- /* NIL */
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) {
+ if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+ (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
+ }
+ }
+ }
} else if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
- if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
- tempah = 0xef;
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
- if(modenum > 0x13) {
- tempah = 0xf7;
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ tempah = 0xef;
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ if(modenum > 0x13) {
+ tempah = 0xf7;
+ }
+ }
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ }
+ if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
+ (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
+ if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) {
+ if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+ (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4);
+ }
}
- }
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah);
- }
- if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
- (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
- if((SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo)))) {
- if((!(SiS_WeHaveBacklightCtrl(SiS_Pr, HwInfo))) ||
- (!(SiS_CRT2IsLCD(SiS_Pr, HwInfo)))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
- SiS_PanelDelay(SiS_Pr, HwInfo, 4);
- }
}
}
@@ -3803,25 +5354,25 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
} else { /* 315, 330 - all bridge types */
- if(SiS_Is301B(SiS_Pr)) {
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
tempah = 0x3f;
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
tempah = 0x7f;
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
tempah = 0xbf;
}
}
SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,tempah);
- if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
SiS_DisplayOff(SiS_Pr);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
}
}
- if( (!(SiS_Is301B(SiS_Pr))) ||
- (!(SiS_IsVAMode(SiS_Pr,HwInfo))) ) {
+ if( (!(SiS_Is301B(SiS_Pr,BaseAddr))) ||
+ (!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) ) {
- if( (!(SiS_Is301B(SiS_Pr))) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ) {
+ if( (!(SiS_Is301B(SiS_Pr,BaseAddr))) ||
+ (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ) {
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF);
SiS_DisplayOff(SiS_Pr);
@@ -3832,10 +5383,10 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
}
@@ -3847,45 +5398,41 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
} else { /* ============ For 301 ================ */
- if(HwInfo->jChipType < SIS_315H) {
-#ifdef SIS300
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x08);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
-#endif
}
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xDF); /* disable VB */
SiS_DisplayOff(SiS_Pr);
- if(HwInfo->jChipType >= SIS_315H) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
}
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF); /* disable lock mode */
- if(HwInfo->jChipType >= SIS_315H) {
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x10);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,temp);
} else {
-#ifdef SIS300
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF); /* disable CRT2 */
- if( (!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ||
- (!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) ) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x04);
+ if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
+ (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
}
-#endif
}
}
} else { /* ============ For LVDS =============*/
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
@@ -3893,24 +5440,29 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetCH700x(SiS_Pr,0x090E);
}
- if(HwInfo->jChipType == SIS_730) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
}
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x08);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
} else {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
- SiS_DisplayOff(SiS_Pr);
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x11) & 0x08)) {
+
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06) & 0x1c)) {
+ SiS_DisplayOff(SiS_Pr);
}
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x08);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
}
}
@@ -3921,14 +5473,14 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension,BaseAddr);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
- if( (!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ||
- (!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) ) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x04);
+ if( (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ||
+ (!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) ) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
}
#endif /* SIS300 */
@@ -3939,212 +5491,244 @@ SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(HwInfo->jChipType == SIS_740) {
- temp = SiS_GetCH701x(SiS_Pr,0x61);
- if(temp < 1) {
- SiS_SetCH701x(SiS_Pr,0xac76);
- SiS_SetCH701x(SiS_Pr,0x0066);
- }
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ temp = SiS_GetCH701x(SiS_Pr,0x61);
+ if(temp < 1) {
+ SiS_SetCH701x(SiS_Pr,0xac76);
+ SiS_SetCH701x(SiS_Pr,0x0066);
+ }
- if( (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwInfo)) ) {
- SiS_SetCH701x(SiS_Pr,0x3e49);
- }
- }
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetCH701x(SiS_Pr,0x3e49);
+ } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetCH701x(SiS_Pr,0x3e49);
+ }
+ }
- if( (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (SiS_IsVAMode(SiS_Pr,HwInfo)) ) {
- SiS_Chrontel701xBLOff(SiS_Pr);
- SiS_Chrontel701xOff(SiS_Pr,HwInfo);
- }
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_Chrontel701xBLOff(SiS_Pr);
+ SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+ } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_Chrontel701xBLOff(SiS_Pr);
+ SiS_Chrontel701xOff(SiS_Pr,HwDeviceExtension);
+ }
- if(HwInfo->jChipType != SIS_740) {
- if( (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwInfo)) ) {
- SiS_SetCH701x(SiS_Pr,0x0149);
- }
- }
+ if(HwDeviceExtension->jChipType != SIS_740) {
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetCH701x(SiS_Pr,0x0149);
+ } else if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetCH701x(SiS_Pr,0x0149);
+ }
+ }
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x08);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x08);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
}
- if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (!(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwInfo))) ) {
- SiS_DisplayOff(SiS_Pr);
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ SiS_DisplayOff(SiS_Pr);
+ } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_DisplayOff(SiS_Pr);
+ } else if(!(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_DisplayOff(SiS_Pr);
}
- if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (!(SiS_IsVAMode(SiS_Pr,HwInfo))) ) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+ } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
+ } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x00,0x80);
}
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
}
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF);
- if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (!(SiS_IsVAMode(SiS_Pr,HwInfo))) ) {
- SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+ } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
+ } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x1E,0xDF);
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
- if(HwInfo->jChipType == SIS_550) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xbf);
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xef);
- }
- }
+ if(SiS_CRT2IsLCD(SiS_Pr, BaseAddr,HwDeviceExtension)) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+ if(HwDeviceExtension->jChipType == SIS_550) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xbf);
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xef);
+ }
+ }
} else {
- if(HwInfo->jChipType == SIS_740) {
- if(SiS_IsLCDOrLCDA(SiS_Pr,HwInfo)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
- }
- } else if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+ }
+ } else {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1e,0xdf);
+ }
}
}
if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
- /* SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff); */
- } else {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
- }
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ /* SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xff); */
+ } else {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x13,0xfb);
+ }
}
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
- if(HwInfo->jChipType == SIS_550) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80); /* DirectDVD PAL?*/
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40); /* VB clock / 4 ? */
- } else if( (SiS_Pr->SiS_IF_DEF_CH70xx == 0) ||
- (!(SiS_IsDualEdge(SiS_Pr,HwInfo))) ||
- (!(SiS_IsVAMode(SiS_Pr,HwInfo))) ) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+ if(HwDeviceExtension->jChipType == SIS_550) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x80);
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
+ } else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+ } else if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
+ } else if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
}
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x04);
- }
- }
- }
+#if 0 /* BIOS code makes no sense */
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ /* Nothing there! */
+ }
+ }
+ }
+#endif
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ if(SiS_CRT2IsLCD(SiS_Pr, BaseAddr,HwDeviceExtension)) {
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xFB,0x04);
+ }
+ }
+ }
#endif /* SIS315H */
- } /* 315 series */
+ } /* 310 series */
} /* LVDS */
}
-/*********************************************/
-/* ENABLE VIDEO BRIDGE */
-/*********************************************/
-
-/* NEVER use any variables (VBInfo), this will be called
- * from outside the context of a mode switch!
- * MUST call getVBType before calling this
- */
+/* NEVER use any variables (VBInfo), this will be called outside the context of modeswitch! */
+/* I MUST call getVBType before calling this */
void
-SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
{
USHORT temp=0,tempah;
#ifdef SIS315H
USHORT temp1,pushax=0;
BOOLEAN delaylong = FALSE;
#endif
+ UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase;
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* ====== For 301B et al ====== */
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
- if(HwInfo->jChipType == SIS_300) {
+ if(HwDeviceExtension->jChipType == SIS_300) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
- if(!(SiS_CR36BIOSWord23d(SiS_Pr, HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
+ if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
}
}
}
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
- SiS_DisplayOn(SiS_Pr);
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+ SiS_DisplayOn(SiS_Pr);
+ } else {
+ SiS_VBLongWait(SiS_Pr);
+ SiS_DisplayOn(SiS_Pr);
+ SiS_VBLongWait(SiS_Pr);
+ }
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
}
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
- }
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
+ }
+ }
+ }
}
} else {
if((SiS_Pr->SiS_VBType & VB_NoLCD) &&
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo))) {
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
/* This is only for LCD output on 301B-DH via LVDS */
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x00);
- if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+ if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
}
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* Enable CRT2 */
+/* DoSomeThingPCI_On(SiS_Pr) */
SiS_DisplayOn(SiS_Pr);
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
if(SiS_BridgeInSlave(SiS_Pr)) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
} else {
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
}
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
}
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x00);
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x11,0xF7,0x00);
}
}
} else {
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
- SiS_DisplayOn(SiS_Pr);
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0);
+ SiS_DisplayOn(SiS_Pr);
+ } else {
+ SiS_VBLongWait(SiS_Pr);
+ SiS_DisplayOn(SiS_Pr);
+ SiS_VBLongWait(SiS_Pr);
+ }
}
}
@@ -4156,93 +5740,116 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if(IS_SIS550650740660) { /* 550, 650, 740, 660 */
- UCHAR r30=0, r31=0, r32=0, r33=0, cr36=0;
+#if 0
+ if(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00) != 1) return; /* From 1.10.7w */
+#endif
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef);
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef); /* 1.10.7u */
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); /* 1.10.7u */
}
#endif
}
- if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
- tempah = 0x10;
- if(SiS_LCDAEnabled(SiS_Pr, HwInfo)) {
- if(SiS_TVEnabled(SiS_Pr, HwInfo)) tempah = 0x18;
- else tempah = 0x08;
- }
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ if(!(IS_SIS740)) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ tempah = 0x10;
+ if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
+ (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
+ if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
+ tempah = 0x08;
+ } else {
+ tempah = 0x18;
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ } else {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ tempah = 0x08;
+ }
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
+ }
+ }
}
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0x00);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00);
SiS_DisplayOff(SiS_Pr);
- pushax = SiS_GetReg(SiS_Pr->SiS_P3c4,0x06);
+ pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06);
if(IS_SIS740) {
SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3);
}
}
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
- if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 2);
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_GenericDelay(SiS_Pr, 0x4500);
- }
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 2);
- } else {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
+ SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2);
}
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
+ SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2);
}
}
if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
(SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40)) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40)) {
+ SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
delaylong = TRUE;
}
}
} else if(SiS_Pr->SiS_VBType & VB_NoLCD) {
- if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10);
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10);
+ }
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
+ }
}
} else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- if(!(SiS_IsNotM650orLater(SiS_Pr,HwInfo))) {
- tempah = 0x10;
- if(SiS_LCDAEnabled(SiS_Pr, HwInfo)) {
- if(SiS_TVEnabled(SiS_Pr, HwInfo)) tempah = 0x18;
- else tempah = 0x08;
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ tempah = 0x10;
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) {
+ tempah = 0x18;
+ if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) {
+ tempah = 0x08;
+ }
+ }
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah);
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x4c,tempah);
}
}
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
if(SiS_BridgeInSlave(SiS_Pr)) {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) {
- if(!(SiS_LCDAEnabled(SiS_Pr, HwInfo))) temp |= 0x20;
+ if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
+ (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04)) temp |= 0x20;
+ } else temp |= 0x20;
}
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
@@ -4250,14 +5857,16 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2e);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2e);
if(!(temp & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
}
} else {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
}
- } else {
+ }
+
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20);
}
@@ -4266,16 +5875,16 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) {
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2e);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2e);
if(!(temp & 0x80)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
}
}
tempah = 0xc0;
- if(SiS_IsDualEdge(SiS_Pr, HwInfo)) {
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
tempah = 0x80;
- if(!(SiS_IsVAMode(SiS_Pr, HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
tempah = 0x40;
}
}
@@ -4284,246 +5893,173 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
if((SiS_Pr->SiS_VBType & VB_SIS301B302B) ||
(((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
(SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) &&
- (!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))))) {
+ (!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))))) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
- (SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- }
-#ifdef COMPAQ_HACK
- if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 2);
- }
-#endif
-
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1f,0x10);
-
if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); /* All this from 1.10.7u */
}
#endif
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c);
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
-
- cr36 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36);
-
- /* (P4_30|0x40) */
- /* Compal 1400x1050: 0x05, 0x60, 0x00 YES (1.10.7w; CR36=69) */
- /* Compal 1400x1050: 0x0d, 0x70, 0x40 YES (1.10.7x; CR36=69) */
- /* Acer 1280x1024: 0x12, 0xd0, 0x6b NO (1.10.9k; CR36=73) */
- /* Compaq 1280x1024: 0x0d, 0x70, 0x6b YES (1.12.04b; CR36=03) */
- /* Clevo 1024x768: 0x05, 0x60, 0x33 NO (1.10.8e; CR36=12, DL!) */
- /* Clevo 1024x768: 0x0d, 0x70, 0x40 (if type == 3) YES (1.10.8y; CR36=?2) */
- /* Clevo 1024x768: 0x05, 0x60, 0x33 (if type != 3) YES (1.10.8y; CR36=?2) */
- /* Asus 1024x768: ? ? (1.10.8o; CR36=?2) */
- /* Asus 1024x768: 0x08, 0x10, 0x3c (problematic) YES (1.10.8q; CR36=22) */
-
- if(SiS_Pr->HaveEMI) {
- r30 = SiS_Pr->EMI_30;
- r31 = SiS_Pr->EMI_31;
- r32 = SiS_Pr->EMI_32;
- r33 = SiS_Pr->EMI_33;
- } else {
- r30 = 0;
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
+ }
+#endif
+ }
- /* EMI_30 is read at driver start; however, the BIOS sets this
- * (if it is used) only if the LCD is in use. In case we caught
- * the machine while on TV output, this bit is not set and we
- * don't know if it should be set - hence our detection is wrong.
- * Work-around this here:
- */
-
- if((!SiS_Pr->HaveEMI) || (!SiS_Pr->HaveEMILCD)) {
- if((cr36 & 0x0f) == 0x02) { /* 1024x768 */
- r30 |= 0x40;
- if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
- r30 &= ~0x40;
- }
- } else if((cr36 & 0x0f) == 0x03) { /* 1280x1024 */
- r30 |= 0x40;
- if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) {
- r30 &= ~0x40;
- }
- } else if((cr36 & 0x0f) == 0x09) { /* 1400x1050 */
- r30 |= 0x40;
- } else if((cr36 & 0x0f) == 0x0b) { /* 1600x1200 - unknown */
- r30 |= 0x40;
- }
- }
+ if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- if(!SiS_Pr->HaveEMI) {
- if((cr36 & 0x0f) == 0x02) {
- if((cr36 & 0xf0) == 0x30) {
- r31 = 0x0d; r32 = 0x70; r33 = 0x40;
- } else {
- r31 = 0x05; r32 = 0x60; r33 = 0x33;
- }
- } else if((cr36 & 0x0f) == 0x03) {
- if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- r31 = 0x0d; r32 = 0x70; r33 = 0x6b;
- } else {
- r31 = 0x12; r32 = 0xd0; r33 = 0x6b;
- }
- } else if((cr36 & 0x0f) == 0x09) {
- if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
- r31 = 0x0d; r32 = 0x70; r33 = 0x40; /* BIOS values */
- } else {
- r31 = 0x05; r32 = 0x60; r33 = 0x00;
- }
- } else {
- r31 = 0x05; r32 = 0x60; r33 = 0x00;
- }
+#ifdef SET_EMI
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x08);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x10);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x4d);
+ if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x02) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b);
}
-
- /* BIOS values don't work so well sometimes */
- if(!SiS_Pr->OverruleEMI) {
-#ifdef COMPAL_HACK
- if(SiS_Pr->SiS_CustomT == CUT_COMPAL1400_2) {
- if((cr36 & 0x0f) == 0x09) {
- r30 = 0x60; r31 = 0x05; r32 = 0x60; r33 = 0x00;
- }
- }
-#endif
-#ifdef COMPAQ_HACK
- if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- if((cr36 & 0x0f) == 0x03) {
- r30 = 0x20; r31 = 0x12; r32 = 0xd0; r33 = 0x6b; /* rev 1 */
- }
- }
-#endif
-#ifdef ASUS_HACK
- if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
- if((cr36 & 0x0f) == 0x02) {
- /* r30 = 0x60; r31 = 0x05; r32 = 0x60; r33 = 0x33; */ /* rev 2 */
- /* r30 = 0x20; r31 = 0x05; r32 = 0x60; r33 = 0x33; */ /* rev 3 */
- /* r30 = 0x60; r31 = 0x0d; r32 = 0x70; r33 = 0x40; */ /* rev 4 */
- /* r30 = 0x20; r31 = 0x0d; r32 = 0x70; r33 = 0x40; */ /* rev 5 */
- }
- }
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+ }
#endif
- }
- if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20);
- }
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x31,r31);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x32,r32);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x33,r33);
- if(!(SiS_Pr->OverruleEMI && (!r30) && (!r31) && (!r32) && (!r33))) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x00);
- }
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
- if(r30 & 0x40) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 5);
- if(delaylong) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 5);
- delaylong = FALSE;
- }
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
- SiS_GenericDelay(SiS_Pr, 0x500);
- }
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
- }
- }
+
+ } else if(SiS_Pr->SiS_CustomT != CUT_CLEVO1400) {
+
+#ifdef SET_EMI
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x12);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0xd0);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b);
+ if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) == 0x02) { /* Acer */
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x40);
+ if(((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) != 0x30)) { /* Acer */
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x33); /* 00 */
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+ if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x03) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
+ }
}
#endif
}
+ if((SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) &&
+ (SiS_Pr->SiS_CustomT != CUT_CLEVO1400)) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2);
+ }
+
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1f,0x10);
+
if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) {
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
SiS_DisplayOn(SiS_Pr);
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_WaitVBRetrace(SiS_Pr, HwInfo);
- SiS_PanelDelay(SiS_Pr, HwInfo, 3);
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3);
+#ifdef SET_EMI
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40);
+ }
+#endif
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
}
}
} else if(SiS_Pr->SiS_CustomT == CUT_CLEVO1400) {
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- if( (SiS_IsVAMode(SiS_Pr, HwInfo)) ||
- (SiS_CRT2IsLCD(SiS_Pr, HwInfo)) ) {
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
SiS_DisplayOn(SiS_Pr);
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
}
}
} else {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80);
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- ((SiS_CRT2IsLCD(SiS_Pr, HwInfo))) ) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
+
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ) {
+ SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
if(delaylong) {
- SiS_PanelDelayLoop(SiS_Pr, HwInfo, 3, 10);
+ SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10);
}
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_GenericDelay(SiS_Pr, 0x500);
- }
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01);
}
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x06,pushax);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax);
SiS_DisplayOn(SiS_Pr);
- SiS_SetRegByte(SiS_Pr->SiS_P3c6,0xff);
+ SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff);
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
}
- }
+ } if(SiS_Pr->SiS_VBType & VB_NoLCD) {
+
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
+ }
+ }
+ }
+
+ }
} else { /* 315, 330 */
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF;
if(SiS_BridgeInSlave(SiS_Pr)) {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp & 0x80))
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20);
- if(SiS_Is301B(SiS_Pr)) {
+ if(SiS_Is301B(SiS_Pr,BaseAddr)) {
- temp=SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
+ temp=SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
if(!(temp & 0x80))
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
tempah = 0xc0;
- if(SiS_IsDualEdge(SiS_Pr,HwInfo)) {
+ if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) {
tempah = 0x80;
- if(!(SiS_IsVAMode(SiS_Pr,HwInfo))) {
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
tempah = 0x40;
}
}
@@ -4548,94 +6084,93 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
} else { /* ============ For 301 ================ */
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x00);
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
- }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
+ }
}
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; /* lock mode */
if(SiS_BridgeInSlave(SiS_Pr)) {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
- if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
+ tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20;
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x32,temp);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp);
SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */
- if(HwInfo->jChipType >= SIS_315H) {
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
- if(!(temp & 0x80)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); /* BVBDOENABLE=1 */
- }
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+ if(!(temp & 0x80))
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); /* BVBDOENABLE=1 */
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1F,0x20); /* enable VB processor */
SiS_VBLongWait(SiS_Pr);
SiS_DisplayOn(SiS_Pr);
- if(HwInfo->jChipType >= SIS_315H) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
SiS_VBLongWait(SiS_Pr);
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x00);
- }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
+ }
}
}
} else { /* =================== For LVDS ================== */
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300 /* 300 series */
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- if(HwInfo->jChipType == SIS_730) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- }
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x00);
- if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
- }
- }
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ }
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+ if(!(SiS_CR36BIOSWord23d(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0);
+ }
+ }
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
- SiS_DisplayOn(SiS_Pr);
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
- if(SiS_BridgeInSlave(SiS_Pr)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
- }
+ SiS_EnableCRT2(SiS_Pr);
+ SiS_DisplayOn(SiS_Pr);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF);
+ if(SiS_BridgeInSlave(SiS_Pr)) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F);
+ } else {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40);
+ }
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
- if(!(SiS_CRT2IsLCD(SiS_Pr, HwInfo))) {
- SiS_WaitVBRetrace(SiS_Pr, HwInfo);
- SiS_SetCH700x(SiS_Pr,0x0B0E);
- }
- }
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
+ if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetCH700x(SiS_Pr,0x0B0E);
+ }
+ }
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
- if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwInfo))) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- }
- SiS_WaitVBRetrace(SiS_Pr, HwInfo);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x00);
- }
- }
- }
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) {
+ if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) {
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1);
+ }
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
+ }
+ }
+ }
#endif /* SIS300 */
@@ -4643,15 +6178,22 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
#ifdef SIS315H /* 315 series */
+#if 0 /* BIOS code makes no sense */
+ if(SiS_IsVAMode()) {
+ if(SiS_IsLCDOrLCDA()) {
+ }
+ }
+#endif
+
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFB,0x00);
- SiS_PanelDelay(SiS_Pr, HwInfo, 0);
- }
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xFB);
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 0);
+ }
}
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
- SiS_UnLockCRT2(SiS_Pr,HwInfo);
+ SiS_EnableCRT2(SiS_Pr);
+ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr);
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0xf7);
@@ -4661,72 +6203,77 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_Chrontel701xBLOff(SiS_Pr);
}
- if(HwInfo->jChipType != SIS_550) {
+ if(HwDeviceExtension->jChipType != SIS_550) {
SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f);
}
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(SiS_IsLCDOrLCDA(SiS_Pr, HwInfo)) {
+ if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension,BaseAddr)) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
}
}
}
- temp1 = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x2E);
- if(!(temp1 & 0x80)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
- }
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E);
+ if(!(temp1 & 0x80))
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80);
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(temp) {
- SiS_Chrontel701xBLOn(SiS_Pr, HwInfo);
- }
+ if(temp) {
+ SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+ }
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
- if(HwInfo->jChipType == SIS_550) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
- }
- }
- } else if(SiS_IsVAMode(SiS_Pr,HwInfo)) {
- if(HwInfo->jChipType != SIS_740) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
- }
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+ if(HwDeviceExtension->jChipType == SIS_550) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x40);
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x10);
+ }
+ }
+ } else if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ if(HwDeviceExtension->jChipType != SIS_740) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1E,0x20);
+ }
}
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f);
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwInfo)) {
- SiS_Chrontel701xOn(SiS_Pr,HwInfo);
- }
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (SiS_IsLCDOrLCDA(SiS_Pr,HwInfo)) ) {
- SiS_ChrontelDoSomething1(SiS_Pr,HwInfo);
- }
+
+ if(SiS_IsTVOrYPbPrOrScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_Chrontel701xOn(SiS_Pr,HwDeviceExtension, BaseAddr);
+ }
+
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_ChrontelDoSomething1(SiS_Pr,HwDeviceExtension, BaseAddr);
+ } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_ChrontelDoSomething1(SiS_Pr,HwDeviceExtension, BaseAddr);
+ }
+
}
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- if( (SiS_IsVAMode(SiS_Pr,HwInfo)) ||
- (SiS_IsLCDOrLCDA(SiS_Pr,HwInfo)) ) {
- SiS_Chrontel701xBLOn(SiS_Pr, HwInfo);
- SiS_ChrontelInitTVVSync(SiS_Pr,HwInfo);
- }
- }
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+ SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+ } else if(SiS_IsLCDOrLCDA(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_Chrontel701xBLOn(SiS_Pr, HwDeviceExtension);
+ SiS_ChrontelDoSomething4(SiS_Pr,HwDeviceExtension, BaseAddr);
+ }
+ }
} else if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
- if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo))) {
- if(SiS_CRT2IsLCD(SiS_Pr, HwInfo)) {
- SiS_PanelDelay(SiS_Pr, HwInfo, 1);
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xF7,0x00);
- }
- }
+ if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 1);
+ SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7);
+ }
+ }
}
#endif /* SIS315H */
@@ -4737,2328 +6284,1297 @@ SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
-/*********************************************/
-/* SET PART 1 REGISTER GROUP */
-/*********************************************/
-
-/* Set CRT2 OFFSET / PITCH */
-static void
-SiS_SetCRT2Offset(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RRTI, PSIS_HW_INFO HwInfo)
+void
+SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT offset;
- UCHAR temp;
-
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) return;
-
- offset = SiS_GetOffset(SiS_Pr,ModeNo,ModeIdIndex,RRTI,HwInfo);
+ USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
- if((SiS_Pr->SiS_LCDResInfo == Panel_640x480_2) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_640x480_3)) {
- offset >>= 1;
+ /* Switch on LCD backlight on SiS30xLV */
+ if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ||
+ (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
+ SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension);
+ }
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x01)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
+ }
}
-
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x07,(offset & 0xFF));
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x09,(offset >> 8));
- temp = (UCHAR)(((offset >> 3) & 0xFF) + 1);
- if(offset % 8) temp++;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,temp);
}
-/* Set CRT2 sync and PanelLink mode */
-static void
-SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT RefreshRateTableIndex,
- PSIS_HW_INFO HwInfo)
+void
+SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT tempah=0,tempbl,infoflag;
-
- tempbl = 0xC0;
+ USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress;
- if(SiS_Pr->UseCustomMode) {
- infoflag = SiS_Pr->CInfoFlag;
- } else {
- infoflag = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
+ /* Switch off LCD backlight on SiS30xLV */
+ if( (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) ||
+ (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00);
}
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* LVDS */
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- tempah = 0;
- } else if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDInfo & LCDSync)) {
- tempah = SiS_Pr->SiS_LCDInfo;
- } else tempah = infoflag >> 8;
- tempah &= 0xC0;
- tempah |= 0x20;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
- (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
- tempah |= 0xf0;
- }
- if( (SiS_Pr->SiS_IF_DEF_FSTN) ||
- (SiS_Pr->SiS_IF_DEF_DSTN) ||
- (SiS_Pr->SiS_IF_DEF_TRUMPION) ||
- (SiS_Pr->SiS_CustomT == CUT_PANEL848) ) {
- tempah |= 0x30;
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(HwInfo->jChipType >= SIS_315H) {
- tempah >>= 3;
- tempah &= 0x18;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xE7,tempah);
- /* Don't care about 12/18/24 bit mode - TV is via VGA, not PL */
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,0xe0);
- }
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- }
-
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(HwInfo->jChipType < SIS_315H) {
-
-#ifdef SIS300 /* ---- 300 series --- */
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* 630 - 301B(-DH) */
-
- tempah = infoflag >> 8;
- tempbl = 0;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->SiS_LCDInfo & LCDSync) {
- tempah = SiS_Pr->SiS_LCDInfo;
- tempbl = (tempah >> 6) & 0x03;
- }
- }
- tempah &= 0xC0;
- tempah |= 0x20;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- tempah |= 0xc0;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
- }
-
- } else { /* 630 - 301 */
-
- tempah = infoflag >> 8;
- tempah &= 0xC0;
- tempah |= 0x20;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
-
- }
-
-#endif /* SIS300 */
-
- } else {
-
-#ifdef SIS315H /* ------- 315 series ------ */
-
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* 315 - LVDS */
-
- tempbl = 0;
- if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) &&
- (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
- tempah = infoflag >> 8;
- if(SiS_Pr->SiS_LCDInfo & LCDSync) {
- tempbl = ((SiS_Pr->SiS_LCDInfo & 0xc0) >> 6);
- }
- } else if((SiS_Pr->SiS_CustomT == CUT_CLEVO1400) &&
- (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050)) {
- tempah = infoflag >> 8;
- tempbl = 0x03;
- } else {
- tempah = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
- tempbl = (tempah >> 6) & 0x03;
- tempbl |= 0x08;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempbl |= 0x04;
- }
- tempah &= 0xC0;
- tempah |= 0x20;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) tempah |= 0xc0;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
- }
- }
-
- } else { /* 315 - TMDS */
-
- tempah = tempbl = infoflag >> 8;
- if(!SiS_Pr->UseCustomMode) {
- tempbl = 0;
- if((SiS_Pr->SiS_VBType & VB_SIS301C) && (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
- if(ModeNo <= 0x13) {
- tempah = SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02));
- }
- }
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(SiS_Pr->SiS_LCDInfo & LCDSync) {
- tempah = SiS_Pr->SiS_LCDInfo;
- tempbl = (tempah >> 6) & 0x03;
- }
- }
- }
- tempah &= 0xC0;
- tempah |= 0x20;
- if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10;
- if(SiS_Pr->SiS_VBType & VB_NoLCD) {
- /* Imitate BIOS bug */
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempah |= 0xc0;
- }
- if((SiS_Pr->SiS_VBType & VB_SIS301C) && (SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC)) {
- tempah >>= 3;
- tempah &= 0x18;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xe7,tempah);
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah);
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xf0,tempbl);
- }
- }
- }
-
- }
-#endif /* SIS315H */
+ if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+ if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00);
+ }
}
- }
+ }
}
-/* Set CRT2 FIFO on 300/630/730 */
-#ifdef SIS300
-static void
-SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr,USHORT ModeNo,
- PSIS_HW_INFO HwInfo)
+BOOLEAN
+SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT temp,index;
- USHORT modeidindex,refreshratetableindex;
- USHORT VCLK=0,MCLK,colorth=0,data2=0;
- USHORT tempal, tempah, tempbx, tempcl, tempax;
- USHORT CRT1ModeNo,CRT2ModeNo;
- USHORT SelectRate_backup;
- ULONG data,eax;
- const UCHAR LatencyFactor[] = {
- 97, 88, 86, 79, 77, 00, /*; 64 bit BQ=2 */
- 00, 87, 85, 78, 76, 54, /*; 64 bit BQ=1 */
- 97, 88, 86, 79, 77, 00, /*; 128 bit BQ=2 */
- 00, 79, 77, 70, 68, 48, /*; 128 bit BQ=1 */
- 80, 72, 69, 63, 61, 00, /*; 64 bit BQ=2 */
- 00, 70, 68, 61, 59, 37, /*; 64 bit BQ=1 */
- 86, 77, 75, 68, 66, 00, /*; 128 bit BQ=2 */
- 00, 68, 66, 59, 57, 37 /*; 128 bit BQ=1 */
- };
- const UCHAR LatencyFactor730[] = {
- 69, 63, 61,
- 86, 79, 77,
- 103, 96, 94,
- 120,113,111,
- 137,130,128, /* <-- last entry, data below */
- 137,130,128, /* to avoid using illegal values */
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- 137,130,128,
- };
- const UCHAR ThLowB[] = {
- 81, 4, 72, 6, 88, 8,120,12,
- 55, 4, 54, 6, 66, 8, 90,12,
- 42, 4, 45, 6, 55, 8, 75,12
- };
- const UCHAR ThTiming[] = {
- 1, 2, 2, 3, 0, 1, 1, 2
- };
-
- SelectRate_backup = SiS_Pr->SiS_SelectCRT2Rate;
-
- if(!SiS_Pr->CRT1UsesCustomMode) {
-
- CRT1ModeNo = SiS_Pr->SiS_CRT1Mode; /* get CRT1 ModeNo */
- SiS_SearchModeID(SiS_Pr, &CRT1ModeNo, &modeidindex);
- SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
- SiS_Pr->SiS_SelectCRT2Rate = 0;
- refreshratetableindex = SiS_GetRatePtr(SiS_Pr, CRT1ModeNo, modeidindex, HwInfo);
-
- if(CRT1ModeNo >= 0x13) {
- index = SiS_Pr->SiS_RefIndex[refreshratetableindex].Ext_CRTVCLK;
- index &= 0x3F;
- VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
-
- colorth = SiS_GetColorDepth(SiS_Pr,CRT1ModeNo,modeidindex); /* Get colordepth */
- colorth >>= 1;
- if(!colorth) colorth++;
- }
+ USHORT temp,temp1;
+ UCHAR *ROMAddr;
+ if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+ if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+ temp >>= 4;
+ temp = 1 << temp;
+ temp1 = (ROMAddr[0x23c] << 8) | ROMAddr[0x23b];
+ if(temp1 & temp) return(1);
+ else return(0);
+ } else return(0);
} else {
-
- CRT1ModeNo = 0xfe;
- VCLK = SiS_Pr->CSRClock_CRT1; /* Get VCLK */
- data2 = (SiS_Pr->CModeFlag_CRT1 & ModeInfoFlag) - 2;
- switch(data2) { /* Get color depth */
- case 0 : colorth = 1; break;
- case 1 : colorth = 1; break;
- case 2 : colorth = 2; break;
- case 3 : colorth = 2; break;
- case 4 : colorth = 3; break;
- case 5 : colorth = 4; break;
- default: colorth = 2;
- }
-
+ return(0);
}
+}
- if(CRT1ModeNo >= 0x13) {
- if(HwInfo->jChipType == SIS_300) {
- index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x3A);
- } else {
- index = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1A);
- }
- index &= 0x07;
- MCLK = SiS_Pr->SiS_MCLKData_0[index].CLOCK; /* Get MCLK */
-
- data2 = (colorth * VCLK) / MCLK;
-
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- temp = ((temp & 0x00FF) >> 6) << 1;
- if(temp == 0) temp = 1;
- temp <<= 2;
- temp &= 0xff;
-
- data2 = temp - data2;
-
- if((28 * 16) % data2) {
- data2 = (28 * 16) / data2;
- data2++;
- } else {
- data2 = (28 * 16) / data2;
- }
-
- if(HwInfo->jChipType == SIS_300) {
+BOOLEAN
+SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT temp,temp1;
+ UCHAR *ROMAddr;
- tempah = SiS_GetReg(SiS_Pr->SiS_P3c4,0x18);
- tempah &= 0x62;
- tempah >>= 1;
- tempal = tempah;
- tempah >>= 3;
- tempal |= tempah;
- tempal &= 0x07;
- tempcl = ThTiming[tempal];
- tempbx = SiS_GetReg(SiS_Pr->SiS_P3c4,0x16);
- tempbx >>= 6;
- tempah = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- tempah >>= 4;
- tempah &= 0x0c;
- tempbx |= tempah;
- tempbx <<= 1;
- tempal = ThLowB[tempbx + 1];
- tempal *= tempcl;
- tempal += ThLowB[tempbx];
- data = tempal;
+ if((ROMAddr = (UCHAR *)HwDeviceExtension->pjVirtualRomBase) && SiS_Pr->SiS_UseROM) {
+ if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xff;
+ temp >>= 4;
+ temp = 1 << temp;
+ temp1 = (ROMAddr[0x23e] << 8) | ROMAddr[0x23d];
+ if(temp1 & temp) return(1);
+ else return(0);
+ } else return(0);
+ } else {
+ return(0);
+ }
+}
- } else if(HwInfo->jChipType == SIS_730) {
+void
+SiS_SetPanelDelayLoop(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT DelayTime, USHORT DelayLoop)
+{
+ int i;
+ for(i=0; i<DelayLoop; i++) {
+ SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, DelayTime);
+ }
+}
-#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x80000050);
- eax = SiS_GetRegLong(0xcfc);
-#else
- eax = pciReadLong(0x00000000, 0x50);
+void
+SiS_SetPanelDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT DelayTime)
+{
+ USHORT PanelID, DelayIndex, Delay;
+#ifdef SIS300
+ USHORT temp;
#endif
- tempal = (USHORT)(eax >> 8);
- tempal &= 0x06;
- tempal <<= 5;
-#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x800000A0);
- eax = SiS_GetRegLong(0xcfc);
-#else
- eax = pciReadLong(0x00000000, 0xA0);
-#endif
- temp = (USHORT)(eax >> 28);
- temp &= 0x0F;
- tempal |= temp;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
- tempbx = tempal; /* BIOS BUG (2.04.5d, 2.04.6a use ah here, which is unset!) */
- tempbx = 0; /* -- do it like the BIOS anyway... */
- tempax = tempbx;
- tempbx &= 0xc0;
- tempbx >>= 6;
- tempax &= 0x0f;
- tempax *= 3;
- tempbx += tempax;
+#ifdef SIS300
- data = LatencyFactor730[tempbx];
- data += 15;
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- if(!(temp & 0x80)) data += 5;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 300 series, LVDS */
- } else {
+ PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
- index = 0;
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- if(temp & 0x0080) index += 12;
+ DelayIndex = PanelID >> 4;
-#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x800000A0);
- eax = SiS_GetRegLong(0xcfc);
-#else
- /* We use pci functions X offers. We use tag 0, because
- * we want to read/write to the host bridge (which is always
- * 00:00.0 on 630, 730 and 540), not the VGA device.
- */
- eax = pciReadLong(0x00000000, 0xA0);
-#endif
- temp = (USHORT)(eax >> 24);
- if(!(temp&0x01)) index += 24;
+ if((DelayTime >= 2) && ((PanelID & 0x0f) == 1)) {
+ Delay = 3;
+ } else {
+ if(DelayTime >= 2) DelayTime -= 2;
-#ifndef LINUX_XF86
- SiS_SetRegLong(0xcf8,0x80000050);
- eax = SiS_GetRegLong(0xcfc);
-#else
- eax = pciReadLong(0x00000000, 0x50);
-#endif
- temp=(USHORT)(eax >> 24);
- if(temp & 0x01) index += 6;
+ if(!(DelayTime & 0x01)) {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
+ } else {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
+ }
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(ROMAddr[0x220] & 0x40) {
+ if(!(DelayTime & 0x01)) {
+ Delay = (USHORT)ROMAddr[0x225];
+ } else {
+ Delay = (USHORT)ROMAddr[0x226];
+ }
+ }
+ }
+ }
+ SiS_ShortDelay(SiS_Pr,Delay);
- temp = (temp & 0x0F) >> 1;
- index += temp;
+ } else { /* 300 series, 301(B) */
- data = LatencyFactor[index];
- data += 15;
- temp = SiS_GetReg(SiS_Pr->SiS_P3c4,0x14);
- if(!(temp & 0x80)) data += 5;
- }
+ PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18);
+ if(!(temp & 0x10)) PanelID = 0x12;
- data += data2; /* CRT1 Request Period */
+ DelayIndex = PanelID >> 4;
- SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
- SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+ if((DelayTime >= 2) && ((PanelID & 0x0f) == 1)) {
+ Delay = 3;
+ } else {
+ if(DelayTime >= 2) DelayTime -= 2;
- if(!SiS_Pr->UseCustomMode) {
+ if(!(DelayTime & 0x01)) {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
+ } else {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
+ }
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(ROMAddr[0x220] & 0x40) {
+ if(!(DelayTime & 0x01)) {
+ Delay = (USHORT)ROMAddr[0x225];
+ } else {
+ Delay = (USHORT)ROMAddr[0x226];
+ }
+ }
+ }
+ }
+ SiS_ShortDelay(SiS_Pr,Delay);
- CRT2ModeNo = ModeNo;
- SiS_SearchModeID(SiS_Pr, &CRT2ModeNo, &modeidindex);
+ }
- refreshratetableindex = SiS_GetRatePtr(SiS_Pr, CRT2ModeNo, modeidindex, HwInfo);
+#endif /* SIS300 */
- index = SiS_GetVCLK2Ptr(SiS_Pr,CRT2ModeNo,modeidindex,
- refreshratetableindex,HwInfo);
- VCLK = SiS_Pr->SiS_VCLKData[index].CLOCK; /* Get VCLK */
+ } else {
- if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
- if(SiS_Pr->SiS_UseROM) {
- if(ROMAddr[0x220] & 0x01) {
- VCLK = ROMAddr[0x229] | (ROMAddr[0x22a] << 8);
- }
- }
- }
+ if(HwDeviceExtension->jChipType == SIS_330) return;
- } else {
+#ifdef SIS315H
- CRT2ModeNo = 0xfe;
- VCLK = SiS_Pr->CSRClock; /* Get VCLK */
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 315 series, LVDS */
- }
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) {
+ PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ DelayIndex = PanelID >> 4;
+ if((DelayTime >= 2) && ((PanelID & 0x0f) == 1)) {
+ Delay = 3;
+ } else {
+ if(DelayTime >= 2) DelayTime -= 2;
- colorth = SiS_GetColorDepth(SiS_Pr,CRT2ModeNo,modeidindex); /* Get colordepth */
- colorth >>= 1;
- if(!colorth) colorth++;
+ if(!(DelayTime & 0x01)) {
+ Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[0];
+ } else {
+ Delay = SiS_Pr->SiS_PanelDelayTblLVDS[DelayIndex].timer[1];
+ }
+ if((ROMAddr) && (SiS_Pr->SiS_UseROM)) {
+ if(ROMAddr[0x13c] & 0x40) {
+ if(!(DelayTime & 0x01)) {
+ Delay = (USHORT)ROMAddr[0x17e];
+ } else {
+ Delay = (USHORT)ROMAddr[0x17f];
+ }
+ }
+ }
+ }
+ SiS_ShortDelay(SiS_Pr,Delay);
+ }
- data = data * VCLK * colorth;
- if(data % (MCLK << 4)) {
- data = data / (MCLK << 4);
- data++;
- } else {
- data = data / (MCLK << 4);
- }
+ } else { /* 315 series, 301(B) */
- if(data <= 6) data = 6;
- if(data > 0x14) data = 0x14;
+ PanelID = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ DelayIndex = PanelID >> 4;
+ if(!(DelayTime & 0x01)) {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[0];
+ } else {
+ Delay = SiS_Pr->SiS_PanelDelayTbl[DelayIndex].timer[1];
+ }
+ SiS_DDC2Delay(SiS_Pr, Delay * 4);
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x01);
- if(HwInfo->jChipType == SIS_300) {
- if(data <= 0x0f) temp = (temp & (~0x1F)) | 0x13;
- else temp = (temp & (~0x1F)) | 0x16;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
- temp = (temp & (~0x1F)) | 0x13;
- }
- } else {
- if( ( (HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730) ) &&
- (HwInfo->jChipRevision >= 0x30) ) /* 630s or 730(s?) */
- {
- temp = (temp & (~0x1F)) | 0x1b;
- } else {
- temp = (temp & (~0x1F)) | 0x16;
}
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0xe0,temp);
- if( (HwInfo->jChipType == SIS_630) &&
- (HwInfo->jChipRevision >= 0x30) ) /* 630s, NOT 730 */
- {
- if(data > 0x13) data = 0x13;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,0xe0,data);
+#endif /* SIS315H */
- } else { /* If mode <= 0x13, we just restore everything */
+ }
- SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
- SiS_Pr->SiS_SelectCRT2Rate = SelectRate_backup;
+}
+void
+SiS_LongDelay(SiS_Private *SiS_Pr, USHORT delay)
+{
+ while(delay--) {
+ SiS_GenericDelay(SiS_Pr,0x19df);
}
}
-#endif
-/* Set CRT2 FIFO on 315/330 series */
-#ifdef SIS315H
-static void
-SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_ShortDelay(SiS_Private *SiS_Pr, USHORT delay)
{
- USHORT temp;
-
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x01,0x3B);
- temp = 0x04;
- if(HwInfo->jChipType >= SIS_661) {
- if((SiS_GetReg(SiS_Pr->SiS_P3d4,0x5c) & 0xf8) == 0x80) temp = 0x44;
+ while(delay--) {
+ SiS_GenericDelay(SiS_Pr,0x42);
}
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x02,~0x3f,temp);
}
-#endif
-static USHORT
-SiS_GetVGAHT2(SiS_Private *SiS_Pr)
+void
+SiS_GenericDelay(SiS_Private *SiS_Pr, USHORT delay)
{
- ULONG tempax,tempbx;
+ USHORT temp,flag;
- tempbx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) * SiS_Pr->SiS_RVBHCMAX) & 0xFFFF;
- tempax = (SiS_Pr->SiS_VT - SiS_Pr->SiS_VDE) * SiS_Pr->SiS_RVBHCFACT;
- tempax = (tempax * SiS_Pr->SiS_HT) / tempbx;
- return((USHORT) tempax);
+ flag = SiS_GetReg3(0x61) & 0x10;
+
+ while(delay) {
+ temp = SiS_GetReg3(0x61) & 0x10;
+ if(temp == flag) continue;
+ flag = temp;
+ delay--;
+ }
}
-/* Set Part 1 / SiS bridge slave mode */
-static void
-SiS_SetGroup1_301(SiS_Private *SiS_Pr, USHORT ModeNo,USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo,USHORT RefreshRateTableIndex)
+BOOLEAN
+SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr)
{
- USHORT push1,push2;
- USHORT tempax,tempbx,tempcx,temp;
- USHORT resinfo,modeflag,xres=0;
- unsigned char p1_7, p1_8;
+ USHORT flag;
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- resinfo = 0;
- xres = SiS_Pr->CHDisplay;
- } else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- xres = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].XRes;
- }
+ flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01);
+ if(flag >= 0x0B0) return(1);
+ else return(0);
+}
- /* The following is only done if bridge is in slave mode: */
+BOOLEAN
+SiS_CRT2IsLCD(SiS_Private *SiS_Pr, USHORT BaseAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT flag;
- if((HwInfo->jChipType >= SIS_661) && (ModeNo > 0x13)) {
- if(xres >= 1600) {
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x31,0x04);
- }
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13);
+ if(flag & 0x20) return(1);
}
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(flag & 0x20) return(1);
+ else return(0);
+}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,0xff); /* set MAX HT */
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) modeflag |= Charx8Dot;
+BOOLEAN
+SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- if(modeflag & Charx8Dot) tempcx = 0x08;
- else tempcx = 0x09;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((HwDeviceExtension->jChipType != SIS_650) || (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f) & 0xf0)) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(flag & EnableDualEdge) return(1);
+ else return(0);
+ } else return(0);
+ } else
+#endif
+ return(0);
+}
- tempax = SiS_Pr->SiS_VGAHDE; /* 0x04 Horizontal Display End */
- if(modeflag & HalfDCLK) tempax >>= 1;
- tempax = ((tempax / tempcx) - 1) & 0xff;
- tempbx = tempax;
+BOOLEAN
+SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- temp = tempax;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x04,temp);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if((flag & EnableDualEdge) && (flag & SetToLCDA)) return(1);
+ else return(0);
+ } else
+#endif
+ return(0);
+}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
- temp += 2;
+BOOLEAN
+SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((SiS_CRT2IsLCD(SiS_Pr, BaseAddr, HwDeviceExtension)) ||
+ (SiS_IsVAMode(SiS_Pr, HwDeviceExtension, BaseAddr))) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) return(1);
}
}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- if(resinfo == SIS_RI_800x600) temp -= 2;
- }
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x05,temp); /* 0x05 Horizontal Display Start */
+#endif
+ return(0);
+ }
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x06,0x03); /* 0x06 Horizontal Blank end */
+BOOLEAN
+SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- tempax = 0xFFFF;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempax = SiS_GetVGAHT2(SiS_Pr);
- if(tempax >= SiS_Pr->SiS_VGAHT) tempax = SiS_Pr->SiS_VGAHT;
- if(modeflag & HalfDCLK) tempax >>= 1;
- tempax = (tempax / tempcx) - 5;
- tempcx = tempax;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x79);
+ if(flag & 0x10) return(1);
+ else return(0);
+ } else
+#endif
+ return(0);
+ }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- temp = tempcx - 1;
- if(!(modeflag & HalfDCLK)) {
- temp -= 6;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- temp -= 2;
- if(ModeNo > 0x13) temp -= 10;
- }
- }
- } else {
- tempcx = (tempcx + tempbx) >> 1;
- temp = (tempcx & 0x00FF) + 2;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- temp--;
- if(!(modeflag & HalfDCLK)) {
- if((modeflag & Charx8Dot)) {
- temp += 4;
- if(SiS_Pr->SiS_VGAHDE >= 800) temp -= 6;
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VGAHDE == 800) temp += 2;
- }
- }
- }
- } else {
- if(!(modeflag & HalfDCLK)) {
- temp -= 4;
- if((SiS_Pr->SiS_LCDResInfo != Panel_1280x960) &&
- (SiS_Pr->SiS_LCDResInfo != Panel_1600x1200)) {
- if(SiS_Pr->SiS_VGAHDE >= 800) {
- temp -= 7;
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_ModeType == ModeEGA) {
- if(SiS_Pr->SiS_VGAVDE == 1024) {
- temp += 15;
- if(SiS_Pr->SiS_LCDResInfo != Panel_1280x1024)
- temp += 7;
- }
- }
- }
- if(SiS_Pr->SiS_LCDResInfo != Panel_1400x1050) {
- if(SiS_Pr->SiS_VGAHDE >= 1280) {
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) temp += 28;
- }
- }
- }
- }
- }
- }
- }
+#if 0
+BOOLEAN
+SiS_Is315E(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- p1_7 = temp;
- p1_8 = 0x00;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
+ if(flag & 0x10) return(1);
+ else return(0);
+ } else
+#endif
+ return(0);
+}
+#endif
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- if(ModeNo <= 0x01) {
- p1_7 = 0x2a;
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) p1_8 = 0x61;
- else p1_8 = 0x41;
- } else if(SiS_Pr->SiS_ModeType == ModeText) {
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) p1_7 = 0x54;
- else p1_7 = 0x55;
- p1_8 = 0x00;
- } else if(ModeNo <= 0x13) {
- if(modeflag & HalfDCLK) {
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
- p1_7 = 0x30;
- p1_8 = 0x03;
- } else {
- p1_7 = 0x2f;
- p1_8 = 0x02;
- }
- } else {
- p1_7 = 0x5b;
- p1_8 = 0x03;
- }
- } else if( ((HwInfo->jChipType >= SIS_315H) &&
- ((ModeNo == 0x50) || (ModeNo == 0x56) || (ModeNo == 0x53))) ||
- ((HwInfo->jChipType < SIS_315H) &&
- (resinfo == SIS_RI_320x200 || resinfo == SIS_RI_320x240)) ) {
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
- p1_7 = 0x30,
- p1_8 = 0x03;
- } else {
- p1_7 = 0x2f;
- p1_8 = 0x03;
- }
- }
- }
- }
+BOOLEAN
+SiS_IsNotM650or651(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p|TVSetYPbPr750p)) {
- p1_7 = 0x63;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) p1_7 = 0x55;
- }
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- if(!(modeflag & HalfDCLK)) {
- p1_7 = 0xb2;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
- p1_7 = 0xab;
- }
- }
- } else {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
- if(modeflag & HalfDCLK) p1_7 = 0x30;
- }
- }
- }
+ if(HwDeviceExtension->jChipType == SIS_650) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5f);
+ flag &= 0xF0;
+ /* Check for revision != A0 only */
+ if((flag == 0xe0) || (flag == 0xc0) ||
+ (flag == 0xb0) || (flag == 0x90)) return 0;
+ else return 1;
+ } else
+#endif
+ return 1;
+}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x07,p1_7); /* 0x07 Horizontal Retrace Start */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x08,p1_8); /* 0x08 Horizontal Retrace End */
+BOOLEAN
+SiS_IsYPbPr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x03); /* 0x18 SR08 (FIFO Threshold?) */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(flag & EnableLVDSHiVision) return(1); /* = YPrPb = 0x08 */
+ else return(0);
+ } else
+#endif
+ return(0);
+}
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x19,0xF0);
+BOOLEAN
+SiS_IsChScart(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+#ifdef SIS315H
+ USHORT flag;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x09,0xFF); /* 0x09 Set Max VT */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(flag & EnableLVDSScart) return(1); /* = Scart = 0x04 */
+ else return(0);
+ } else
+#endif
+ return(0);
+}
- tempcx = 0x121;
- tempbx = SiS_Pr->SiS_VGAVDE; /* 0x0E Vertical Display End */
- if (tempbx == 357) tempbx = 350;
- else if(tempbx == 360) tempbx = 350;
- else if(tempbx == 375) tempbx = 350;
- else if(tempbx == 405) tempbx = 400;
- else if(tempbx == 420) tempbx = 400;
- else if(tempbx == 525) tempbx = 480;
- push2 = tempbx;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- if (tempbx == 350) tempbx += 5;
- else if(tempbx == 480) tempbx += 5;
- }
- }
- }
- tempbx -= 2;
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x10,temp); /* 0x10 vertical Blank Start */
+BOOLEAN
+SiS_IsTVOrYPbPrOrScart(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+ USHORT flag;
- tempbx = push2;
- tempbx--;
- temp = tempbx & 0x00FF;
-#if 0
- /* Missing code from 630/301B 2.04.5a and 650/302LV 1.10.6s (calles int 2f) */
- if(xxx()) {
- if(temp == 0xdf) temp = 0xda;
- }
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(flag & SetCRT2ToTV) return(1);
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(flag & EnableLVDSHiVision) return(1); /* = YPrPb = 0x08 */
+ if(flag & EnableLVDSScart) return(1); /* = Scart = 0x04- TW inserted */
+ else return(0);
+ } else
#endif
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0E,temp);
-
- temp = 0;
- if(modeflag & DoubleScanMode) temp |= 0x80;
- if(HwInfo->jChipType >= SIS_661) {
- if(tempbx & 0x0200) temp |= 0x20;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x0B,0x5F,temp);
- if(tempbx & 0x0100) tempcx |= 0x000a;
- if(tempbx & 0x0400) tempcx |= 0x1200;
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0B,temp);
- if(tempbx & 0x0100) tempcx |= 0x0002;
- if(tempbx & 0x0400) tempcx |= 0x0600;
+ {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(flag & SetCRT2ToTV) return(1);
}
+ return(0);
+}
- if(tempbx & 0x0200) tempcx |= 0x0040;
+BOOLEAN
+SiS_IsLCDOrLCDA(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+ USHORT flag;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x11,0x00); /* 0x11 Vertical Blank End */
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(flag & SetCRT2ToLCD) return(1);
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ if(flag & SetToLCDA) return(1);
+ else return(0);
+ } else
+#endif
+ {
+ flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30);
+ if(flag & SetCRT2ToLCD) return(1);
+ }
+ return(0);
- tempax = (SiS_Pr->SiS_VGAVT - tempbx) >> 2;
+}
- if((ModeNo > 0x13) || (HwInfo->jChipType < SIS_315H)) {
- if(resinfo != SIS_RI_1280x1024) {
- tempbx += (tempax << 1);
- }
- } else if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_1400x1050) {
- tempbx += (tempax << 1);
- }
- }
+BOOLEAN
+SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT flag;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- tempbx -= 10;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ return(0);
} else {
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- tempbx += 40;
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VGAHDE == 800) tempbx += 10;
- }
- }
- }
+ flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00);
+ if((flag == 1) || (flag == 2)) return(0);
+ else return(1);
}
- tempax >>= 2;
- tempax++;
- tempax += tempbx;
- push1 = tempax;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- if(tempbx <= 513) {
- if(tempax >= 513) tempbx = 513;
- }
- }
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0C,temp); /* 0x0C Vertical Retrace Start */
-
- tempbx--;
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x10,temp);
-
- if(tempbx & 0x0100) tempcx |= 0x0008;
+}
- if(tempbx & 0x0200) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x0B,0x20);
- }
- tempbx++;
+BOOLEAN
+SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT flag;
- if(tempbx & 0x0100) tempcx |= 0x0004;
- if(tempbx & 0x0200) tempcx |= 0x0080;
- if(tempbx & 0x0400) {
- if(HwInfo->jChipType >= SIS_661) tempcx |= 0x0800;
- else if(SiS_Pr->SiS_VBType & VB_SIS301) tempcx |= 0x0800;
- else tempcx |= 0x0C00;
+ if(!(SiS_BridgeIsOn(SiS_Pr,BaseAddr,HwDeviceExtension))) {
+ flag = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ /* 300 series (630/301B 2.04.5a) */
+ flag &= 0xa0;
+ if((flag == 0x80) || (flag == 0x20)) return 0;
+ else return 1;
+ } else {
+ /* 315 series (650/30xLV 1.10.6s) */
+ flag &= 0x50;
+ if((flag == 0x40) || (flag == 0x10)) return 0;
+ else return 1;
+ }
}
+ return 1;
+}
- tempbx = push1;
- temp = tempbx & 0x000F;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0D,temp); /* 0x0D vertical Retrace End */
-
- if(tempbx & 0x0010) tempcx |= 0x2000;
-
- temp = tempcx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0A,temp); /* 0x0A CR07 */
-
- temp = (tempcx & 0xFF00) >> 8;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,temp); /* 0x17 SR0A */
+BOOLEAN
+SiS_BridgeInSlave(SiS_Private *SiS_Pr)
+{
+ USHORT flag1;
- tempax = modeflag;
- temp = (tempax & 0xFF00) >> 8;
- temp = (temp >> 1) & 0x09;
- if(!(SiS_Pr->SiS_VBType & VB_SIS301)) temp |= 0x01; /* Always 8 dotclock */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,temp); /* 0x16 SR01 */
+ flag1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31);
+ if(flag1 & (SetInSlaveMode >> 8)) return 1;
+ else return 0;
+}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0F,0x00); /* 0x0F CR14 */
+void
+SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+#ifdef SIS315H
+ USHORT temp;
+#endif
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x12,0x00); /* 0x12 CR17 */
+ /* Note: This variable is only used on 30xLV systems.
+ CR38 has a different meaning on LVDS/CH7019 systems.
+ */
- temp = 0x00;
- if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
- if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
- temp = 0x80;
+ SiS_Pr->SiS_HiVision = 0;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+#ifdef SIS315H
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ temp &= 0x38;
+ SiS_Pr->SiS_HiVision = (temp >> 3);
+ }
}
+#endif /* SIS315H */
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1A,temp); /* 0x1A SR0E */
-
- temp = SiS_GetRegByte((SiS_Pr->SiS_P3ca+0x02));
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,temp);
}
-/* Setup panel link
- * This is used for LVDS, LCDA and Chrontel TV output
- * 300/LVDS+TV, 300/301B-DH, 315/LVDS+TV, 315/LCDA
- */
-static void
-SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo, USHORT RefreshRateTableIndex)
+void
+SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT modeflag,resinfo;
- USHORT push2,tempax,tempbx,tempcx,temp;
- ULONG tempeax=0,tempebx,tempecx,tempvcfact=0;
- BOOLEAN islvds = FALSE, issis = FALSE, chkdclkfirst = FALSE;
-#ifdef SIS300
- USHORT crt2crtc;
-#endif
-#ifdef SIS315H
- USHORT pushcx;
-#endif
+ USHORT temp,modeflag,resinfo=0;
+ const unsigned char SiS300SeriesLCDRes[] =
+ { 0, 1, 2, 3, 7, 4, 5, 8,
+ 0, 0, 10, 0, 0, 0, 0, 15 };
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
-#ifdef SIS300
- crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-#endif
- } else if(SiS_Pr->UseCustomMode) {
+ SiS_Pr->SiS_LCDResInfo = 0;
+ SiS_Pr->SiS_LCDTypeInfo = 0;
+ SiS_Pr->SiS_LCDInfo = 0;
+
+ if(SiS_Pr->UseCustomMode) {
modeflag = SiS_Pr->CModeFlag;
- resinfo = 0;
-#ifdef SIS300
- crt2crtc = 0;
-#endif
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
-#ifdef SIS300
- crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
-#endif
- }
-
- /* is lvds if really LVDS, or SiS 301B-DH with external LVDS transmitter */
- if((SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- ((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_VBType & VB_NoLCD))) {
- islvds = TRUE;
- }
-
- /* is really sis if sis bridge, but not 301B-DH */
- if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
- issis = TRUE;
- }
-
- if((HwInfo->jChipType >= SIS_315H) && (islvds) && (!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA))) {
- if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
- chkdclkfirst = TRUE;
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
}
}
#ifdef SIS315H
- if((HwInfo->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
- if(IS_SIS330) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);
- } else if(IS_SIS740) {
- if(islvds) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x03);
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x10);
- }
- } else {
- if(islvds) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,0xfb,0x04);
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x00);
- } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2D,0x0f);
- if(SiS_Pr->SiS_VBType & VB_SIS301C) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_1024x768) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2D,0x20);
- }
- }
- }
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04);
}
}
#endif
- /* Horizontal */
+ if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return;
- tempax = SiS_Pr->SiS_LCDHDES;
- if(islvds) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_640x480) &&
- (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode))) {
- tempax -= 8;
- }
- }
- }
- }
-
- temp = (tempax & 0x0007);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1A,temp); /* BPLHDESKEW[2:0] */
- temp = (tempax >> 3) & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,temp); /* BPLHDESKEW[10:3] */
-
- tempbx = SiS_Pr->SiS_HDE;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_640x480_2) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_640x480_3)) {
- tempbx >>= 1;
- }
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- tempbx = SiS_Pr->PanelXRes;
- }
- }
+ if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2))) return;
- tempax += tempbx;
- if(tempax >= SiS_Pr->SiS_HT) tempax -= SiS_Pr->SiS_HT;
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
- temp = tempax;
#if 0
- /* TEST 2 */
- if((HwInfo->jChipType >= SIS_315H) && (islvds) && (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050)) {
- } else
- /* /TEST2 */
+ /* FSTN: Fake CR36 (TypeInfo 2, ResInfo SiS_Panel320x480) */
+ if(SiS_Pr->SiS_IF_DEF_FSTN) {
+ temp = 0x20 | SiS_Pr->SiS_Panel320x480;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp);
+ }
#endif
- if(temp & 0x07) temp += 8;
- temp >>= 3;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,temp); /* BPLHDEE */
- tempcx = (SiS_Pr->SiS_HT - tempbx) >> 2;
-
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- if(SiS_Pr->PanelHRS != 999) tempcx = SiS_Pr->PanelHRS;
- }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ SiS_Pr->SiS_LCDTypeInfo = temp >> 4;
+ } else {
+ SiS_Pr->SiS_LCDTypeInfo = (temp & 0x0F) - 1;
}
-
- tempcx += tempax;
- if(tempcx >= SiS_Pr->SiS_HT) tempcx -= SiS_Pr->SiS_HT;
-
- temp = (tempcx >> 3) & 0x00FF;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- switch(ModeNo) {
- case 0x04:
- case 0x05:
- case 0x0d: temp = 0x56; break;
- case 0x10: temp = 0x60; break;
- case 0x13: temp = 0x5f; break;
- case 0x40:
- case 0x41:
- case 0x4f:
- case 0x43:
- case 0x44:
- case 0x62:
- case 0x56:
- case 0x53:
- case 0x5d:
- case 0x5e: temp = 0x54; break;
- }
- }
- }
+ temp &= 0x0f;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ /* Translate 300 series LCDRes to 315 series for unified usage */
+ temp = SiS300SeriesLCDRes[temp];
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,temp); /* BPLHRS */
+ SiS_Pr->SiS_LCDResInfo = temp;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- temp += 2;
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- temp += 8;
#if 0
- /* TEST 1 */
- if((HwInfo->jChipType >= SIS_315H) && (islvds) && (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050)) {
- temp -= 16;
- } else
- /* /test1 */
-#endif
- if(SiS_Pr->PanelHRE != 999) {
- temp = tempcx + SiS_Pr->PanelHRE;
- if(temp >= SiS_Pr->SiS_HT) temp -= SiS_Pr->SiS_HT;
- temp >>= 3;
- }
- }
- } else {
- temp += 10;
+ if(SiS_Pr->SiS_IF_DEF_FSTN){
+ SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel320x480;
}
-
- temp &= 0x1F;
- temp |= ((tempcx & 0x07) << 5);
-#if 0
- if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0x20; /* WRONG? BIOS loads cl, not ah */
#endif
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,temp); /* BPLHRE */
-
- /* Vertical */
- tempax = SiS_Pr->SiS_VGAVDE;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- tempax = SiS_Pr->PanelYRes;
- }
- }
-
- tempbx = SiS_Pr->SiS_LCDVDES + tempax;
- if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT;
-
- push2 = tempbx;
-
- tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE;
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- tempcx = SiS_Pr->SiS_VGAVT - SiS_Pr->PanelYRes;
- }
- }
- }
- if(islvds) tempcx >>= 1;
- else tempcx >>= 2;
-
- if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
- (!(SiS_Pr->SiS_LCDInfo & LCDPass11)) &&
- (SiS_Pr->PanelVRS != 999) ) {
- tempcx = SiS_Pr->PanelVRS;
- tempbx += tempcx;
- if(issis) tempbx++;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMin301)
+ SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMin301;
} else {
- tempbx += tempcx;
- if(HwInfo->jChipType < SIS_315H) tempbx++;
- else if(issis) tempbx++;
+ if(SiS_Pr->SiS_LCDResInfo < SiS_Pr->SiS_PanelMinLVDS)
+ SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_PanelMinLVDS;
}
- if(tempbx >= SiS_Pr->SiS_VT) tempbx -= SiS_Pr->SiS_VT; /* BPLVRS */
-
- temp = tempbx & 0x00FF;
- if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(ModeNo == 0x10) temp = 0xa9;
- }
+ if((!SiS_Pr->CP_HaveCustomData) || (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_PanelCustom)) {
+ if(SiS_Pr->SiS_LCDResInfo > SiS_Pr->SiS_PanelMax)
+ SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel1024x768;
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp);
-
- tempcx >>= 3;
- tempcx++;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- if(SiS_Pr->PanelVRE != 999) tempcx = SiS_Pr->PanelVRE;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
+ SiS_Pr->SiS_LCDResInfo = Panel_Barco1366;
+ } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ SiS_Pr->SiS_LCDResInfo = Panel_848x480;
}
}
- tempcx += tempbx;
- temp = tempcx & 0x000F;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xF0,temp); /* BPLVRE */
+ switch(SiS_Pr->SiS_LCDResInfo) {
+ case Panel_800x600: SiS_Pr->PanelXRes = 800; SiS_Pr->PanelYRes = 600; break;
+ case Panel_1024x768: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768; break;
+ case Panel_1280x1024: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 1024; break;
+ case Panel_640x480_3:
+ case Panel_640x480_2:
+ case Panel_640x480: SiS_Pr->PanelXRes = 640; SiS_Pr->PanelYRes = 480; break;
+ case Panel_1024x600: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 600; break;
+ case Panel_1152x864: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 864; break;
+ case Panel_1280x960: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 960; break;
+ case Panel_1152x768: SiS_Pr->PanelXRes = 1152; SiS_Pr->PanelYRes = 768; break;
+ case Panel_1400x1050: SiS_Pr->PanelXRes = 1400; SiS_Pr->PanelYRes = 1050; break;
+ case Panel_1280x768: SiS_Pr->PanelXRes = 1280; SiS_Pr->PanelYRes = 768; break;
+ case Panel_1600x1200: SiS_Pr->PanelXRes = 1600; SiS_Pr->PanelYRes = 1200; break;
+ case Panel_320x480: SiS_Pr->PanelXRes = 320; SiS_Pr->PanelYRes = 480; break;
+ case Panel_Custom: SiS_Pr->PanelXRes = SiS_Pr->CP_MaxX;
+ SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY;
+ break;
+ case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024; break;
+ case Panel_848x480: SiS_Pr->PanelXRes = 848; SiS_Pr->PanelYRes = 480; break;
+ default: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768; break;
+ }
+
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37);
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN){
+ /* Fake LVDS bridge for FSTN */
+ temp = 0x04;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,temp);
+ }
+#endif
+ SiS_Pr->SiS_LCDInfo = temp;
- temp = ((tempbx >> 8) & 0x07) << 3;
- if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
- if(SiS_Pr->SiS_HDE != 640) {
- if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
- }
- } else if(SiS_Pr->SiS_VGAVDE != SiS_Pr->SiS_VDE) temp |= 0x40;
- if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) temp |= 0x40;
- tempbx = 0x87;
- if((HwInfo->jChipType >= SIS_315H) ||
- (HwInfo->jChipRevision >= 0x30)) {
- tempbx = 0x07;
- if((SiS_Pr->SiS_IF_DEF_CH70xx == 1) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x03) temp |= 0x80;
- }
- /* Chrontel 701x operates in 24bit mode (8-8-8, 2x12bit mutliplexed) via VGA2 */
- if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x06) & 0x10) temp |= 0x80;
- } else {
- if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) temp |= 0x80;
- }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ SiS_Pr->SiS_LCDInfo = 0x80 | 0x40 | 0x20; /* neg sync, RGB24 */
}
}
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1A,tempbx,temp);
-
- tempbx = push2; /* BPLVDEE */
- tempcx = SiS_Pr->SiS_LCDVDES; /* BPLVDES */
+ if(!(SiS_Pr->UsePanelScaler)) SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+ else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- switch(SiS_Pr->SiS_LCDResInfo) {
- case Panel_640x480:
- tempbx = SiS_Pr->SiS_VGAVDE - 1;
- tempcx = SiS_Pr->SiS_VGAVDE;
- break;
- case Panel_800x600:
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- if(resinfo == SIS_RI_800x600) tempcx++;
- }
- break;
- case Panel_1024x600:
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- if(resinfo == SIS_RI_1024x600) tempcx++;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(resinfo == SIS_RI_800x600) tempcx++;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) {
+ /* For non-standard LCD resolution, we let the panel scale */
+ SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) {
+ /* Bridge does not scale to 1280x960 */
+ SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
}
- }
- break;
- case Panel_1024x768:
- if(HwInfo->jChipType < SIS_315H) {
- if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- if(resinfo == SIS_RI_1024x768) tempcx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ /* TEMP - no idea about the timing and zoom factors */
+ SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ if(ModeNo == 0x3a || ModeNo == 0x4d || ModeNo == 0x65) {
+ /* Bridge does not scale to 1280x1024 */
+ SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
}
- }
- break;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ /* TEMP - no idea about the timing and zoom factors */
+ SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
+ }
+ if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
+ }
+ }
}
}
- temp = ((tempbx >> 8) & 0x07) << 3;
- temp = temp | ((tempcx >> 8) & 0x07);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1D,temp);
- /* if(SiS_Pr->SiS_IF_DEF_FSTN) tempbx++; */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1C,tempbx);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1B,tempcx);
-
- /* Vertical scaling */
-
- if(HwInfo->jChipType < SIS_315H) {
-
-#ifdef SIS300 /* 300 series */
- tempeax = SiS_Pr->SiS_VGAVDE << 6;
- temp = (tempeax % (ULONG)SiS_Pr->SiS_VDE);
- tempeax = tempeax / (ULONG)SiS_Pr->SiS_VDE;
- if(temp) tempeax++;
-
- if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) tempeax = 0x3F;
-
- temp = (USHORT)(tempeax & 0x00FF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1E,temp); /* BPLVCFACT */
- tempvcfact = temp;
-#endif /* SIS300 */
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+#ifdef SIS315H
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x01) {
+ SiS_Pr->SiS_LCDInfo &= 0xFFEF;
+ SiS_Pr->SiS_LCDInfo |= LCDPass11;
+ }
+#endif
} else {
-
-#ifdef SIS315H /* 315 series */
- tempeax = SiS_Pr->SiS_VGAVDE << 18;
- tempebx = SiS_Pr->SiS_VDE;
- temp = (tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if(temp) tempeax++;
- tempvcfact = tempeax;
-
- temp = (USHORT)(tempeax & 0x00FF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,temp);
- temp = (USHORT)((tempeax & 0x00FF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,temp);
- temp = (USHORT)((tempeax & 0x00030000) >> 16);
- if(SiS_Pr->SiS_VDE == SiS_Pr->SiS_VGAVDE) temp |= 0x04;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,temp);
-
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302ELV)) {
- temp = (USHORT)(tempeax & 0x00FF);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x3c,temp);
- temp = (USHORT)((tempeax & 0x00FF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x3b,temp);
- temp = (USHORT)(((tempeax & 0x00030000) >> 16) << 6);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x3a,0x3f,temp);
- temp = 0;
- if(SiS_Pr->SiS_VDE != SiS_Pr->SiS_VGAVDE) temp |= 0x08;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x30,0xf3,temp);
+#ifdef SIS300
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
+ if(!(ROMAddr[0x235] & 0x02)) {
+ SiS_Pr->SiS_LCDInfo &= 0xEF;
+ }
+ }
+ }
+ } else if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10))) {
+ SiS_Pr->SiS_LCDInfo &= 0xEF;
+ }
}
#endif
+ }
+ /* Trumpion: Assume non-expanding */
+ if(SiS_Pr->SiS_IF_DEF_TRUMPION != 0) {
+ SiS_Pr->SiS_LCDInfo &= (~DontExpandLCD);
}
- /* Horizontal scaling */
+ if(!((HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_SetFlag & SetDOSMode))) {
- tempeax = SiS_Pr->SiS_VGAHDE; /* 1f = ( (VGAHDE * 65536) / ( (VGAHDE * 65536) / HDE ) ) - 1*/
- if(chkdclkfirst) {
- if(modeflag & HalfDCLK) tempeax >>= 1;
- }
- tempebx = tempeax << 16;
- if(SiS_Pr->SiS_HDE == tempeax) {
- tempecx = 0xFFFF;
- } else {
- tempecx = tempebx / SiS_Pr->SiS_HDE;
- if(HwInfo->jChipType >= SIS_315H) {
- if(tempebx % SiS_Pr->SiS_HDE) tempecx++;
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ if(ModeNo > 0x13) {
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ if((resinfo == SIS_RI_800x600) || (resinfo == SIS_RI_400x300)) {
+ SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ }
+ }
+ }
+ }
+ if(ModeNo == 0x12) {
+ if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ }
+ }
}
- }
- if(HwInfo->jChipType >= SIS_315H) {
- tempeax = (tempebx / tempecx) - 1;
- } else {
- tempeax = ((SiS_Pr->SiS_VGAHT << 16) / tempecx) - 1;
- }
- tempecx = (tempecx << 16) | (tempeax & 0xFFFF);
- temp = (USHORT)(tempecx & 0x00FF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1F,temp);
+ if(modeflag & HalfDCLK) {
+ if(SiS_Pr->SiS_IF_DEF_TRUMPION == 0) {
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ if(!(((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (HwDeviceExtension->jChipType < SIS_315H)) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480))) {
+ if(ModeNo > 0x13) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ if(resinfo == SIS_RI_512x384) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ if(resinfo == SIS_RI_400x300) SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ }
+ }
+ } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ } else SiS_Pr->SiS_SetFlag |= EnableLVDSDDA;
+ }
- if(HwInfo->jChipType >= SIS_315H) {
- tempeax = (SiS_Pr->SiS_VGAVDE << 18) / tempvcfact;
- tempbx = (USHORT)(tempeax & 0xFFFF);
- } else {
- tempeax = SiS_Pr->SiS_VGAVDE << 6;
- tempbx = tempvcfact & 0x3f;
- if(tempbx == 0) tempbx = 64;
- tempeax /= tempbx;
- tempbx = (USHORT)(tempeax & 0xFFFF);
- }
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tempbx--;
- if(SiS_Pr->SiS_SetFlag & EnableLVDSDDA) {
- if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) tempbx = 1;
- else if(SiS_Pr->SiS_LCDResInfo != Panel_640x480) tempbx = 1;
}
- temp = ((tempbx >> 8) & 0x07) << 3;
- temp = temp | ((tempecx >> 8) & 0x07);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x20,temp);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x21,tempbx);
-
- tempecx >>= 16; /* BPLHCFACT */
- if(!chkdclkfirst) {
- if(modeflag & HalfDCLK) tempecx >>= 1;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(SiS_Pr->SiS_VBInfo & SetNotSimuMode) {
+ SiS_Pr->SiS_SetFlag |= LCDVESATiming;
+ }
+ } else {
+ SiS_Pr->SiS_SetFlag |= LCDVESATiming;
}
- temp = (USHORT)((tempecx & 0xFF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x22,temp);
- temp = (USHORT)(tempecx & 0x00FF);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x23,temp);
#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- if((islvds) || (SiS_Pr->SiS_VBInfo & VB_SIS301LV302LV)) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1e,0x20);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) {
+ /* Enable 302B/302LV dual link mode.
+ * (302B is a theory - not in any BIOS)
+ */
+ if((SiS_Pr->SiS_CustomT == CUT_CLEVO1024) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)) {
+ /* (Sets this in SenseLCD; new paneltypes) */
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04);
}
- } else {
- if(islvds) {
- if(HwInfo->jChipType == SIS_740) {
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03);
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1e,0x23);
- }
- }
- }
- }
-#endif
-
-#ifdef SIS300
- if(SiS_Pr->SiS_IF_DEF_TRUMPION) {
- int i;
- UCHAR TrumpMode13[4] = { 0x01, 0x10, 0x2c, 0x00 };
- UCHAR TrumpMode10_1[4] = { 0x01, 0x10, 0x27, 0x00 };
- UCHAR TrumpMode10_2[4] = { 0x01, 0x16, 0x10, 0x00 };
-
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xbf);
- for(i=0; i<5; i++) {
- SiS_SetTrumpionBlock(SiS_Pr, &SiS300_TrumpionData[crt2crtc][0]);
- }
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(ModeNo == 0x13) {
- for(i=0; i<4; i++) {
- SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode13[0]);
- }
- } else if(ModeNo == 0x10) {
- for(i=0; i<4; i++) {
- SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode10_1[0]);
- SiS_SetTrumpionBlock(SiS_Pr, &TrumpMode10_2[0]);
- }
+ if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04);
}
}
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x02,0x40);
}
#endif
-#ifdef SIS315H
- if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x25,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x26,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x27,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x28,0x87);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x29,0x5A);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2A,0x4B);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x07,0x03);
- tempax = SiS_Pr->SiS_HDE; /* Blps = lcdhdee(lcdhdes+HDE) + 64 */
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480_2 ||
- SiS_Pr->SiS_LCDResInfo == Panel_640x480_3) tempax >>= 1;
- tempax += 64;
- temp = tempax & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,temp);
- temp = ((tempax & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,~0x078,temp);
- tempax += 32; /* Blpe=lBlps+32 */
- temp = tempax & 0x00FF;
- if(SiS_Pr->SiS_IF_DEF_FSTN) temp = 0;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,temp);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3A,0x00); /* Bflml=0 */
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x007,0x00);
-
- tempax = SiS_Pr->SiS_VDE;
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480_2 ||
- SiS_Pr->SiS_LCDResInfo == Panel_640x480_3) tempax >>= 1;
- tempax >>= 1;
- temp = tempax & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3B,temp);
- temp = ((tempax & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x038,temp);
-
- tempeax = SiS_Pr->SiS_HDE;
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480_2 ||
- SiS_Pr->SiS_LCDResInfo == Panel_640x480_3) tempeax >>= 1;
- tempeax <<= 2; /* BDxFIFOSTOP = (HDE*4)/128 */
- tempebx = 128;
- temp = (USHORT)(tempeax % tempebx);
- tempeax = tempeax / tempebx;
- if(temp) tempeax++;
- temp = (USHORT)(tempeax & 0x003F);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x45,~0x0FF,temp);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3F,0x00); /* BDxWadrst0 */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3E,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3D,0x10);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x040,0x00);
+#ifdef LINUX_KERNEL
+#ifdef TWDEBUG
+ printk(KERN_DEBUG "sisfb: (LCDInfo=0x%04x LCDResInfo=0x%02x LCDTypeInfo=0x%02x)\n",
+ SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo);
+#endif
+#endif
+#ifdef LINUX_XF86
+ xf86DrvMsgVerb(0, X_PROBED, 3,
+ "(init301: LCDInfo=0x%04x LCDResInfo=0x%02x LCDTypeInfo=0x%02x SetFlag=0x%04x)\n",
+ SiS_Pr->SiS_LCDInfo, SiS_Pr->SiS_LCDResInfo, SiS_Pr->SiS_LCDTypeInfo, SiS_Pr->SiS_SetFlag);
+#endif
- tempax = SiS_Pr->SiS_HDE;
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480_2 ||
- SiS_Pr->SiS_LCDResInfo == Panel_640x480_3) tempax >>= 1;
- tempax >>= 4; /* BDxWadroff = HDE*4/8/8 */
- pushcx = tempax;
- temp = tempax & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,temp);
- temp = ((tempax & 0xFF00) >> 8) << 3;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x44,~0x0F8,temp);
+}
- tempax = SiS_Pr->SiS_VDE; /* BDxWadrst1 = BDxWadrst0 + BDxWadroff * VDE */
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480_2 ||
- SiS_Pr->SiS_LCDResInfo == Panel_640x480_3) tempax >>= 1;
- tempeax = (tempax * pushcx);
- tempebx = 0x00100000 + tempeax;
- temp = (USHORT)tempebx & 0x000000FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,temp);
- temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,temp);
- temp = (USHORT)((tempebx & 0x00FF0000) >> 16);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,temp);
- temp = (USHORT)(((tempebx & 0x01000000) >> 24) << 7);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x3C,~0x080,temp);
+void
+SiS_LongWait(SiS_Private *SiS_Pr)
+{
+ USHORT i;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x03);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x03,0x50);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x04,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2F,0x01);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0x38);
+ i = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1F);
- if(SiS_Pr->SiS_IF_DEF_FSTN) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2b,0x02);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2c,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x35,0x0c);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x36,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x37,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x38,0x80);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x39,0xA0);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3a,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3b,0xf0);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3c,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3d,0x10);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3e,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x3f,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x40,0x10);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x41,0x25);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x42,0x80);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x43,0x14);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x44,0x03);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x45,0x0a);
- }
+ if(!(i & 0xC0)) {
+ for(i=0; i<0xFFFF; i++) {
+ if(!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08))
+ break;
+ }
+ for(i=0; i<0xFFFF; i++) {
+ if((SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08))
+ break;
+ }
}
-#endif /* SIS315H */
}
-/* Set Part 1 */
-static void
-SiS_SetGroup1(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo, USHORT RefreshRateTableIndex)
+void
+SiS_VBLongWait(SiS_Private *SiS_Pr)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT temp=0, tempax=0, tempbx=0, tempcx=0;
- USHORT pushbx=0, CRT1Index=0, modeflag, resinfo=0;
-#ifdef SIS315H
- USHORT tempbl=0;
-#endif
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
- return;
- }
-
- if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
+ SiS_VBWait(SiS_Pr);
} else {
- CRT1Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ SiS_LongWait(SiS_Pr);
}
+}
- SiS_SetCRT2Offset(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
+void
+SiS_VBWait(SiS_Private *SiS_Pr)
+{
+ USHORT tempal,temp,i,j;
- if( ! ((HwInfo->jChipType >= SIS_315H) &&
- (SiS_Pr->SiS_IF_DEF_LVDS == 1) &&
- (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ) {
+ temp = 0;
+ for(i=0; i<3; i++) {
+ for(j=0; j<100; j++) {
+ tempal = SiS_GetReg2(SiS_Pr->SiS_P3da);
+ if(temp & 0x01) {
+ if((tempal & 0x08)) continue;
+ if(!(tempal & 0x08)) break;
+ } else {
+ if(!(tempal & 0x08)) continue;
+ if((tempal & 0x08)) break;
+ }
+ }
+ temp ^= 0x01;
+ }
+}
- if(HwInfo->jChipType < SIS_315H ) {
+void
+SiS_WaitVBRetrace(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ if(HwDeviceExtension->jChipType < SIS_315H) {
#ifdef SIS300
- SiS_SetCRT2FIFO_300(SiS_Pr, ModeNo, HwInfo);
-#endif
- } else {
-#ifdef SIS315H
- SiS_SetCRT2FIFO_310(SiS_Pr, HwInfo);
-#endif
- }
-
- /* 1. Horizontal setup */
-
- if(HwInfo->jChipType < SIS_315H ) {
-
-#ifdef SIS300 /* ------------- 300 series --------------*/
-
- temp = (SiS_Pr->SiS_VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x08,temp); /* CRT2 Horizontal Total */
-
- temp = (((SiS_Pr->SiS_VGAHT - 1) & 0xFF00) >> 8) << 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0f,temp); /* CRT2 Horizontal Total Overflow [7:4] */
-
- temp = (SiS_Pr->SiS_VGAHDE + 12) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0A,temp); /* CRT2 Horizontal Display Enable End */
-
- pushbx = SiS_Pr->SiS_VGAHDE + 12; /* bx BTVGA2HRS 0x0B,0x0C */
- tempcx = (SiS_Pr->SiS_VGAHT - SiS_Pr->SiS_VGAHDE) >> 2;
- tempbx = pushbx + tempcx;
- tempcx <<= 1;
- tempcx += tempbx;
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(SiS_Pr->UseCustomMode) {
- tempbx = SiS_Pr->CHSyncStart + 12;
- tempcx = SiS_Pr->CHSyncEnd + 12;
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
- unsigned char cr4, cr14, cr5, cr15;
- if(SiS_Pr->UseCustomMode) {
- cr4 = SiS_Pr->CCRT1CRTC[4];
- cr14 = SiS_Pr->CCRT1CRTC[14];
- cr5 = SiS_Pr->CCRT1CRTC[5];
- cr15 = SiS_Pr->CCRT1CRTC[15];
- } else {
- cr4 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
- cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
- cr5 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
- cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
- }
- tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 1) << 3;
- tempcx = (((cr5 & 0x1F) | ((cr15 & 0x04) << (6-2))) - 1) << 3;
- }
-
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- tempbx = 1040;
- tempcx = 1044;
- }
-
- }
-
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0B,temp); /* CRT2 Horizontal Retrace Start */
-
-#endif /* SIS300 */
-
- } else {
-
-#ifdef SIS315H /* ------------------- 315/330 series --------------- */
-
- tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HT 0x08,0x09 */
- if(modeflag & HalfDCLK) {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- tempcx >>= 1;
- } else {
- tempax = SiS_Pr->SiS_VGAHDE >> 1;
- tempcx = SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE + tempax;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- tempcx = SiS_Pr->SiS_HT - tempax;
- }
- }
- }
- tempcx--;
-
- temp = tempcx & 0xff;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x08,temp); /* CRT2 Horizontal Total */
-
- temp = ((tempcx & 0xff00) >> 8) << 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x09,0x0F,temp); /* CRT2 Horizontal Total Overflow [7:4] */
-
- tempcx = SiS_Pr->SiS_VGAHT; /* BTVGA2HDEE 0x0A,0x0C */
- tempbx = SiS_Pr->SiS_VGAHDE;
- tempcx -= tempbx;
- tempcx >>= 2;
- if(modeflag & HalfDCLK) {
- tempbx >>= 1;
- tempcx >>= 1;
- }
- tempbx += 16;
-
- temp = tempbx & 0xff;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0A,temp); /* CRT2 Horizontal Display Enable End */
-
- pushbx = tempbx;
- tempcx >>= 1;
- tempbx += tempcx;
- tempcx += tempbx;
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(HwInfo->jChipType >= SIS_661) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)) {
- if(resinfo == SIS_RI_1280x1024) {
- tempcx = 0x30;
- } else if(resinfo == SIS_RI_1600x1200) {
- tempcx = 0xff;
- }
- }
- }
-
- if(SiS_Pr->UseCustomMode) {
- tempbx = SiS_Pr->CHSyncStart + 16;
- tempcx = SiS_Pr->CHSyncEnd + 16;
- tempax = SiS_Pr->SiS_VGAHT;
- if(modeflag & HalfDCLK) tempax >>= 1;
- tempax--;
- if(tempcx > tempax) tempcx = tempax;
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
- unsigned char cr4, cr14, cr5, cr15;
- if(SiS_Pr->UseCustomMode) {
- cr4 = SiS_Pr->CCRT1CRTC[4];
- cr14 = SiS_Pr->CCRT1CRTC[14];
- cr5 = SiS_Pr->CCRT1CRTC[5];
- cr15 = SiS_Pr->CCRT1CRTC[15];
- } else {
- cr4 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[4];
- cr14 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[14];
- cr5 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[5];
- cr15 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[15];
- }
- tempbx = ((cr4 | ((cr14 & 0xC0) << 2)) - 3) << 3; /* (VGAHRS-3)*8 */
- tempcx = (((cr5 & 0x1f) | ((cr15 & 0x04) << (5-2))) - 3) << 3; /* (VGAHRE-3)*8 */
- tempcx &= 0x00FF;
- tempcx |= (tempbx & 0xFF00);
- tempbx += 16;
- tempcx += 16;
- tempax = SiS_Pr->SiS_VGAHT;
- if(modeflag & HalfDCLK) tempax >>= 1;
- tempax--;
- if(tempcx > tempax) tempcx = tempax;
- }
-
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- tempbx = 1040;
- tempcx = 1044; /* HWCursor bug! */
- }
-
- }
-
- temp = tempbx & 0xff;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0B,temp); /* CRT2 Horizontal Retrace Start */
-#endif /* SIS315H */
-
- } /* 315/330 series */
-
- tempax = tempbx & 0xFF00;
- tempbx = pushbx;
- tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
- tempax |= (tempbx & 0xFF00);
- temp = (tempax & 0xFF00) >> 8;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0C,temp);
-
- temp = tempcx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0D,temp); /* CRT2 Horizontal Retrace End */
-
- /* 2. Vertical setup */
-
- tempcx = SiS_Pr->SiS_VGAVT - 1;
- temp = tempcx & 0x00FF;
-
- if(HwInfo->jChipType < SIS_661) {
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
- temp--;
- }
- }
- } else {
- temp--;
- }
- } else if(HwInfo->jChipType >= SIS_315H) {
- temp--;
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x20)) return;
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0E,temp); /* CRT2 Vertical Total */
-
- tempbx = SiS_Pr->SiS_VGAVDE - 1;
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x0F,temp); /* CRT2 Vertical Display Enable End */
-
- temp = ((tempbx & 0xFF00) << 3) >> 8;
- temp |= ((tempcx & 0xFF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x12,temp); /* Overflow (and HWCursor Test Mode) */
-
- if((HwInfo->jChipType >= SIS_315H) && (HwInfo->jChipType < SIS_661)) {
- tempbx++;
- tempax = tempbx;
- tempcx++;
- tempcx -= tempax;
- tempcx >>= 2;
- tempbx += tempcx;
- if(tempcx < 4) tempcx = 4;
- tempcx >>= 2;
- tempcx += tempbx;
- tempcx++;
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x80)) {
+ SiS_WaitRetrace1(SiS_Pr,HwDeviceExtension);
} else {
- tempbx = (SiS_Pr->SiS_VGAVT + SiS_Pr->SiS_VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */
- tempcx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */
- }
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(SiS_Pr->UseCustomMode) {
- tempbx = SiS_Pr->CVSyncStart;
- tempcx = (tempcx & 0xFF00) | (SiS_Pr->CVSyncEnd & 0x00FF);
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) {
- unsigned char cr8, cr7, cr13, cr9;
- if(SiS_Pr->UseCustomMode) {
- cr8 = SiS_Pr->CCRT1CRTC[8];
- cr7 = SiS_Pr->CCRT1CRTC[7];
- cr13 = SiS_Pr->CCRT1CRTC[13];
- cr9 = SiS_Pr->CCRT1CRTC[9];
- } else {
- cr8 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[8];
- cr7 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[7];
- cr13 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[13];
- cr9 = SiS_Pr->SiS_CRT1Table[CRT1Index].CR[9];
- }
- tempbx = cr8;
- if(cr7 & 0x04) tempbx |= 0x0100;
- if(cr7 & 0x80) tempbx |= 0x0200;
- if(cr13 & 0x08) tempbx |= 0x0400;
- tempcx = (tempcx & 0xFF00) | (cr9 & 0x00FF);
- }
- }
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x10,tempbx); /* CRT2 Vertical Retrace Start */
-
- temp = ((tempbx & 0xFF00) >> 8) << 4;
- temp |= (tempcx & 0x000F);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x11,temp); /* CRT2 Vert. Retrace End; Overflow; "Enable CRTC Check" */
-
- /* 3. Panel delay compensation */
-
- if(HwInfo->jChipType < SIS_315H) {
-
-#ifdef SIS300 /* ---------- 300 series -------------- */
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- temp = 0x20;
-
- if(HwInfo->jChipType == SIS_300) {
- temp = 0x10;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) temp = 0x2c;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) temp = 0x20;
- }
- if(SiS_Pr->SiS_VBType & VB_SIS301) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) temp = 0x20;
- }
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x960) temp = 0x24;
- if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) temp = 0x2c;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x08;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) temp = 0x2c;
- else temp = 0x20;
- }
- if(SiS_Pr->SiS_UseROM) {
- if(ROMAddr[0x220] & 0x80) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoYPbPrHiVision)
- temp = ROMAddr[0x221];
- else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision)
- temp = ROMAddr[0x222];
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024)
- temp = ROMAddr[0x223];
- else
- temp = ROMAddr[0x224];
- temp &= 0x3c;
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->PDC != -1) temp = SiS_Pr->PDC & 0x3c;
- }
-
- } else {
- temp = 0x20;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_640x480) temp = 0x04;
- }
- if(SiS_Pr->SiS_UseROM) {
- if(ROMAddr[0x220] & 0x80) {
- temp = ROMAddr[0x220] & 0x3c;
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->PDC != -1) temp = SiS_Pr->PDC & 0x3c;
- }
- }
-
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp); /* Panel Link Delay Compensation; (Software Command Reset; Power Saving) */
-
-#endif /* SIS300 */
-
- } else {
-
-#ifdef SIS315H /* --------------- 315/330 series ---------------*/
-
- if(HwInfo->jChipType < SIS_661) {
-
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
-
- if(HwInfo->jChipType == SIS_740) temp = 0x03;
- else temp = 0x00;
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp = 0x0a;
- tempbl = 0xF0;
- if(HwInfo->jChipType == SIS_650) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempbl = 0x0F;
- }
- }
-
- if(SiS_Pr->SiS_IF_DEF_DSTN || SiS_Pr->SiS_IF_DEF_FSTN) {
- temp = 0x08;
- tempbl = 0;
- if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
- if(ROMAddr[0x13c] & 0x80) tempbl = 0xf0;
- }
- }
-
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,tempbl,temp); /* Panel Link Delay Compensation */
- }
-
- } /* < 661 */
-
- tempax = 0;
- if (modeflag & DoubleScanMode) tempax |= 0x80;
- if (modeflag & HalfDCLK) tempax |= 0x40;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2C,0x3f,tempax);
-
-#endif /* SIS315H */
-
- }
-
- } /* Slavemode */
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- /* For 301BDH with LCD, we set up the Panel Link */
- SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
- } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SiS_SetGroup1_301(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
+ SiS_WaitRetrace2(SiS_Pr,HwDeviceExtension);
}
+#endif
} else {
- if(HwInfo->jChipType < SIS_315H) {
- SiS_SetGroup1_LVDS(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
+#ifdef SIS315H
+ if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x40)) {
+ SiS_WaitRetrace1(SiS_Pr,HwDeviceExtension);
} else {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- SiS_SetGroup1_LVDS(SiS_Pr, ModeNo,ModeIdIndex, HwInfo,RefreshRateTableIndex);
- }
- } else {
- SiS_SetGroup1_LVDS(SiS_Pr, ModeNo,ModeIdIndex, HwInfo,RefreshRateTableIndex);
- }
+ SiS_WaitRetrace2(SiS_Pr,HwDeviceExtension);
}
+#endif
}
}
-/*********************************************/
-/* SET PART 2 REGISTER GROUP */
-/*********************************************/
-
-#ifdef SIS315H
-static UCHAR *
-SiS_GetGroup2CLVXPtr(SiS_Private *SiS_Pr, int tabletype, PSIS_HW_INFO HwInfo)
+void
+SiS_WaitRetrace1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- const UCHAR *tableptr = NULL;
- USHORT a, b, p = 0;
-
- a = SiS_Pr->SiS_VGAHDE;
- b = SiS_Pr->SiS_HDE;
- if(tabletype) {
- a = SiS_Pr->SiS_VGAVDE;
- b = SiS_Pr->SiS_VDE;
- }
-
- if(a < b) {
- tableptr = SiS_Part2CLVX_1;
- } else if(a == b) {
- tableptr = SiS_Part2CLVX_2;
- } else {
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- tableptr = SiS_Part2CLVX_4;
- } else {
- tableptr = SiS_Part2CLVX_3;
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) tableptr = SiS_Part2CLVX_3;
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) tableptr = SiS_Part2CLVX_3;
- else tableptr = SiS_Part2CLVX_5;
+ USHORT watchdog;
+#ifdef SIS300
+ USHORT i;
+#endif
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
- tableptr = SiS_Part2CLVX_6;
- }
- do {
- if((tableptr[p] | tableptr[p+1] << 8) == a) break;
- p += 0x42;
- } while((tableptr[p] | tableptr[p+1] << 8) != 0xffff);
- if((tableptr[p] | tableptr[p+1] << 8) == 0xffff) p -= 0x42;
- }
- p += 2;
- return((UCHAR *)&tableptr[p]);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+#ifdef SIS315H
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+ watchdog = 65535;
+ while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
+ watchdog = 65535;
+ while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
+#endif
+ } else {
+#ifdef SIS300
+#if 0 /* Not done in A901 BIOS */
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+ }
+#endif
+ for(i=0; i<10; i++) {
+ watchdog = 65535;
+ while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
+ if(watchdog) break;
+ }
+ for(i=0; i<10; i++) {
+ watchdog = 65535;
+ while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
+ if(watchdog) break;
+ }
+#endif
+ }
}
-static void
-SiS_SetGroup2_C_ELV(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+void
+SiS_WaitRetraceDDC(SiS_Private *SiS_Pr)
{
- UCHAR *tableptr;
- int i, j;
- UCHAR temp;
-
- if(!(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302ELV))) return;
+ USHORT watchdog;
- tableptr = SiS_GetGroup2CLVXPtr(SiS_Pr, 0, HwInfo);
- for(i = 0x80, j = 0; i <= 0xbf; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port, i, tableptr[j]);
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- tableptr = SiS_GetGroup2CLVXPtr(SiS_Pr, 1, HwInfo);
- for(i = 0xc0, j = 0; i <= 0xff; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port, i, tableptr[j]);
- }
- }
- temp = 0x10;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) temp |= 0x04;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4e,0xeb,temp);
+ if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1f) & 0xc0) return;
+ watchdog = 65535;
+ while( (SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08) && --watchdog);
+ watchdog = 65535;
+ while( (!(SiS_GetReg2(SiS_Pr->SiS_P3da) & 0x08)) && --watchdog);
}
-static BOOLEAN
-SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,USHORT *CRT2Index,
- USHORT *ResIndex,PSIS_HW_INFO HwInfo)
+void
+SiS_WaitRetrace2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
-
- if(HwInfo->jChipType < SIS_315H) return FALSE;
-
- if(ModeNo <= 0x13)
- (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- else
- (*ResIndex) = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
-
- (*ResIndex) &= 0x3f;
- (*CRT2Index) = 0;
+ USHORT watchdog;
+#ifdef SIS300
+ USHORT i;
+#endif
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- (*CRT2Index) = 200;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+#ifdef SIS315H
+ watchdog = 65535;
+ while( (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x30) & 0x02) && --watchdog);
+ watchdog = 65535;
+ while( (!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x30) & 0x02)) && --watchdog);
+#endif
+ } else {
+#ifdef SIS300
+ for(i=0; i<10; i++) {
+ watchdog = 65535;
+ while( (SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x25) & 0x02) && --watchdog);
+ if(watchdog) break;
}
- }
-
- if(SiS_Pr->SiS_CustomT == CUT_ASUSA2H_2) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(SiS_Pr->SiS_SetFlag & LCDVESATiming) (*CRT2Index) = 206;
+ for(i=0; i<10; i++) {
+ watchdog = 65535;
+ while( (!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x25) & 0x02)) && --watchdog);
+ if(watchdog) break;
}
+#endif
}
- return(((*CRT2Index) != 0));
}
-#endif
-#ifdef SIS300
-static void
-SiS_Group2LCDSpecial(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo, USHORT crt2crtc)
-{
- USHORT tempcx;
- const UCHAR atable[] = {
- 0xc3,0x9e,0xc3,0x9e,0x02,0x02,0x02,
- 0xab,0x87,0xab,0x9e,0xe7,0x02,0x02
- };
-
- if(!SiS_Pr->UseCustomMode) {
- if( ( ( (HwInfo->jChipType == SIS_630) ||
- (HwInfo->jChipType == SIS_730) ) &&
- (HwInfo->jChipRevision > 2) ) &&
- (SiS_Pr->SiS_LCDResInfo == Panel_1024x768) &&
- (!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) &&
- (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
- if(ModeNo == 0x13) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,0xB9);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,0xCC);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xA6);
- } else {
- if((crt2crtc & 0x3F) == 4) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x2B);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x13);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,0xE5);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,0x08);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xE2);
- }
- }
- }
+/* =========== Set and Get register routines ========== */
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
- crt2crtc &= 0x1f;
- tempcx = 0;
- if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- tempcx += 7;
- }
- }
- tempcx += crt2crtc;
- if(crt2crtc >= 4) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,0xff);
- }
+void
+SiS_SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR)
+{
+ USHORT temp;
- if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(crt2crtc == 4) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x28);
- }
- }
- }
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x18);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
- }
- }
- }
+ temp = SiS_GetReg1(Port,Index);
+ temp = (temp & (DataAND)) | DataOR;
+ SiS_SetReg1(Port,Index,temp);
}
-/* For ECS A907. Highly preliminary. */
-static void
-SiS_Set300Part2Regs(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
- USHORT ModeNo)
+void
+SiS_SetRegAND(USHORT Port,USHORT Index,USHORT DataAND)
{
- USHORT crt2crtc, resindex;
- int i,j;
- const SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
-
- if(HwInfo->jChipType != SIS_300) return;
- if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
- if(SiS_Pr->UseCustomMode) return;
-
- if(ModeNo <= 0x13) {
- crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else {
- crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
- }
-
- resindex = crt2crtc & 0x3F;
- if(SiS_Pr->SiS_SetFlag & LCDVESATiming) CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
- else CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2;
-
- /* The BIOS code (1.16.51,56) is obviously a fragment! */
- if(ModeNo > 0x13) {
- CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
- resindex = 4;
- }
+ USHORT temp;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,(CRT2Part2Ptr+resindex)->CR[0]);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x02,0x80,(CRT2Part2Ptr+resindex)->CR[1]);
- for(i = 2, j = 0x04; j <= 0x06; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
- }
- for(j = 0x1c; j <= 0x1d; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
- }
- for(j = 0x1f; j <= 0x21; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
- }
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
+ temp = SiS_GetReg1(Port,Index);
+ temp &= DataAND;
+ SiS_SetReg1(Port,Index,temp);
}
-#endif
-static void
-SiS_SetTVSpecial(SiS_Private *SiS_Pr, USHORT ModeNo)
+void SiS_SetRegOR(USHORT Port,USHORT Index,USHORT DataOR)
{
- if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision)) return;
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr750p)) return;
-
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- const UCHAR specialtv[] = {
- 0xa7,0x07,0xf2,0x6e,0x17,0x8b,0x73,0x53,
- 0x13,0x40,0x34,0xf4,0x63,0xbb,0xcc,0x7a,
- 0x58,0xe4,0x73,0xda,0x13
- };
- int i, j;
- for(i = 0x1c, j = 0; i <= 0x30; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,specialtv[j]);
- }
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,0x72);
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750)) {
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x14);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1b);
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x14); /* 15 */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1a); /* 1b */
- }
- }
- }
- } else {
- if((ModeNo == 0x38) || (ModeNo == 0x4a) || (ModeNo == 0x64) ||
- (ModeNo == 0x52) || (ModeNo == 0x58) || (ModeNo == 0x5c)) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1b); /* 21 */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x54); /* 5a */
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1a); /* 21 */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x53); /* 5a */
- }
- }
+ USHORT temp;
+
+ temp = SiS_GetReg1(Port,Index);
+ temp |= DataOR;
+ SiS_SetReg1(Port,Index,temp);
}
+/* ========================================================= */
+
static void
-SiS_SetGroup2_Tail(SiS_Private *SiS_Pr, USHORT ModeNo)
+SiS_SetTVSpecial(SiS_Private *SiS_Pr, USHORT ModeNo)
{
- USHORT temp;
-
- if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
- if(SiS_Pr->SiS_VGAVDE == 525) {
- temp = 0xc3;
- if(SiS_Pr->SiS_ModeType <= ModeVGA) {
- temp++;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp += 2;
- }
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2f,temp);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x30,0xb3);
- } else if(SiS_Pr->SiS_VGAVDE == 420) {
- temp = 0x4d;
- if(SiS_Pr->SiS_ModeType <= ModeVGA) {
- temp++;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp++;
- }
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2f,temp);
- }
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) {
- if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x1a,0x03);
- /* Not always for LV, see SetGrp2 */
- }
- temp = 1;
- if(ModeNo <= 0x13) temp = 3;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0b,temp);
- }
-#if 0
- /* 651+301C, for 1280x768 - do I really need that? */
- if((SiS_Pr->SiS_PanelXRes == 1280) && (SiS_Pr->SiS_PanelYRes == 768)) {
- if(SiS_Pr->SiS_VBInfo & SetSimuScanMode) {
- if(((SiS_Pr->SiS_HDE == 640) && (SiS_Pr->SiS_VDE == 480)) ||
- ((SiS_Pr->SiS_HDE == 320) && (SiS_Pr->SiS_VDE == 240))) {
- SiS_SetReg(SiS_Part2Port,0x01,0x2b);
- SiS_SetReg(SiS_Part2Port,0x02,0x13);
- SiS_SetReg(SiS_Part2Port,0x04,0xe5);
- SiS_SetReg(SiS_Part2Port,0x05,0x08);
- SiS_SetReg(SiS_Part2Port,0x06,0xe2);
- SiS_SetReg(SiS_Part2Port,0x1c,0x21);
- SiS_SetReg(SiS_Part2Port,0x1d,0x45);
- SiS_SetReg(SiS_Part2Port,0x1f,0x0b);
- SiS_SetReg(SiS_Part2Port,0x20,0x00);
- SiS_SetReg(SiS_Part2Port,0x21,0xa9);
- SiS_SetReg(SiS_Part2Port,0x23,0x0b);
- SiS_SetReg(SiS_Part2Port,0x25,0x04);
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1c,0xa7);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1d,0x07);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1e,0xf2);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1f,0x6e);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x20,0x17);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,0x8b);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x22,0x73);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,0x53);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,0x13);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x25,0x40);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x26,0x34);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,0xf4);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x28,0x63);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x29,0xbb);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2a,0xcc);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2b,0x7a);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2c,0x58); /* 48 */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2d,0xe4);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2e,0x73);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,0xda); /* de */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0x13);
+ if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38)) & 0x40) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x14);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x15);
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1b);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,0x72);
+ }
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x21);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x5a);
}
}
-#endif
}
}
-static void
-SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
- PSIS_HW_INFO HwInfo)
+/* Set 301 TV Encoder (and some LCD relevant) registers */
+void
+SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr, USHORT ModeNo,
+ USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT i, j, tempax, tempbx, tempcx, temp;
- USHORT push1, push2, modeflag, crt2crtc, bridgeoffset;
- ULONG longtemp, tempeax;
+ USHORT i, j, tempax, tempbx, tempcx, temp, temp1;
+ USHORT push1, push2;
const UCHAR *PhasePoint;
const UCHAR *TimingPoint;
-#ifdef SIS315H
- USHORT resindex, CRT2Index;
+#ifdef SIS315H
const SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
+ USHORT resindex, CRT2Index;
+#endif
+ USHORT modeflag, resinfo, crt2crtc;
+ ULONG longtemp, tempeax;
+#ifdef SIS300
+ const UCHAR atable[] = {
+ 0xc3,0x9e,0xc3,0x9e,0x02,0x02,0x02,
+ 0xab,0x87,0xab,0x9e,0xe7,0x02,0x02
+ };
+#endif
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
+#ifdef SIS315H
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
+ /* 650/30xLV 1.10.6s: (Is at end of SetGroup2!) */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xfc,0x03);
+ temp = 0x01;
+ if(ModeNo <= 0x13) temp = 0x03;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0b,temp);
+ }
+ }
+ SiS_SetTVSpecial(SiS_Pr, ModeNo);
+ return;
+ }
#endif
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- crt2crtc = 0;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ resinfo = 0;
+ crt2crtc = 0;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
}
- temp = 0;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToAVIDEO)) temp |= 0x08;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO)) temp |= 0x04;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) temp |= 0x02;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) temp |= 0x01;
-
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) temp |= 0x10;
+ tempcx = SiS_Pr->SiS_VBInfo;
+ tempax = (tempcx & 0x00FF) << 8;
+ tempbx = (tempcx & 0x00FF) | ((tempcx & 0x00FF) << 8);
+ tempbx &= 0x0410;
+ temp = (tempax & 0x0800) >> 8;
+ temp >>= 1;
+ temp |= (((tempbx & 0xFF00) >> 8) << 1);
+ temp |= ((tempbx & 0x00FF) >> 3);
+ temp ^= 0x0C;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x00,temp);
+ /* From 1.10.7w (no vb check there; don't care - this only disables SVIDEO and CVBS signal) */
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ temp |= 0x0c;
+ }
PhasePoint = SiS_Pr->SiS_PALPhase;
TimingPoint = SiS_Pr->SiS_PALTiming;
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
-
- TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+
+ temp ^= 0x01;
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
TimingPoint = SiS_Pr->SiS_HiTVSt2Timing;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
- TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
-#if 0
- if(!(modeflag & Charx8Dot)) TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
-#endif
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ if(modeflag & Charx8Dot) TimingPoint = SiS_Pr->SiS_HiTVSt1Timing;
+ else TimingPoint = SiS_Pr->SiS_HiTVTextTiming;
}
- }
+ } else TimingPoint = SiS_Pr->SiS_HiTVExtTiming;
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
+ if(SiS_Pr->SiS_HiVision & 0x03) temp &= 0xfe;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) TimingPoint = &SiS_YPbPrTable[2][0];
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) TimingPoint = &SiS_YPbPrTable[1][0];
- else TimingPoint = &SiS_YPbPrTable[0][0];
+ } else {
- PhasePoint = SiS_Pr->SiS_NTSCPhase;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV){
- } else if(SiS_Pr->SiS_TVMode & TVSetPAL) {
+ TimingPoint = SiS_Pr->SiS_PALTiming;
+ PhasePoint = SiS_Pr->SiS_PALPhase;
- if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
- ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
- PhasePoint = SiS_Pr->SiS_PALPhase2;
- }
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+ ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+ PhasePoint = SiS_Pr->SiS_PALPhase2;
+ }
- } else {
+ } else {
- TimingPoint = SiS_Pr->SiS_NTSCTiming;
- PhasePoint = SiS_Pr->SiS_NTSCPhase;
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
- PhasePoint = SiS_Pr->SiS_PALPhase;
- }
+ temp |= 0x10;
+ TimingPoint = SiS_Pr->SiS_NTSCTiming;
+ PhasePoint = SiS_Pr->SiS_NTSCPhase;
+
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+ ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+ PhasePoint = SiS_Pr->SiS_NTSCPhase2;
+ }
- if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
- ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
- PhasePoint = SiS_Pr->SiS_NTSCPhase2;
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
- PhasePoint = SiS_Pr->SiS_PALPhase2;
- }
}
}
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,temp);
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- PhasePoint = SiS_Pr->SiS_PALMPhase;
- if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
- ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
- PhasePoint = SiS_Pr->SiS_PALMPhase2;
- }
+ temp = 0;
+ if((HwDeviceExtension->jChipType == SIS_630)||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ temp = 0x35;
}
-
- if(SiS_Pr->SiS_TVMode & TVSetPALN) {
- PhasePoint = SiS_Pr->SiS_PALNPhase;
- if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
- ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
- PhasePoint = SiS_Pr->SiS_PALNPhase2;
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ temp = 0x38;
+ }
+ if(temp) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp);
+ if(temp1 & EnablePALM) { /* 0x40 */
+ PhasePoint = SiS_Pr->SiS_PALMPhase;
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+ ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+ PhasePoint = SiS_Pr->SiS_PALMPhase2;
+ }
+ }
+ if(temp1 & EnablePALN) { /* 0x80 */
+ PhasePoint = SiS_Pr->SiS_PALNPhase;
+ if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) &&
+ ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
+ (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) {
+ PhasePoint = SiS_Pr->SiS_PALNPhase2;
+ }
+ }
+ }
}
}
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- PhasePoint = SiS_Pr->SiS_SpecialPhase;
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- PhasePoint = SiS_Pr->SiS_SpecialPhaseM;
- } else if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
- PhasePoint = SiS_Pr->SiS_SpecialPhaseJ;
+#ifdef SIS315H
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+ PhasePoint = SiS_Pr->SiS_SpecialPhase;
+ }
+ }
+ }
}
}
+#endif
for(i=0x31, j=0; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,PhasePoint[j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,PhasePoint[j]);
}
for(i=0x01, j=0; i<=0x2D; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
}
for(i=0x39; i<=0x45; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,TimingPoint[j]);
}
if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_ModeType != ModeText) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(!(SiS_Pr->SiS_ModeType & 0x07))
+ SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
+ } else {
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x3A,0x1F);
}
}
SiS_SetRegOR(SiS_Pr->SiS_Part2Port,0x0A,SiS_Pr->SiS_NewFlickerMode);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x35,SiS_Pr->SiS_RY1COE);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x36,SiS_Pr->SiS_RY2COE);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x37,SiS_Pr->SiS_RY3COE);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x35,SiS_Pr->SiS_RY1COE);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x36,SiS_Pr->SiS_RY2COE);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x37,SiS_Pr->SiS_RY3COE);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x38,SiS_Pr->SiS_RY4COE);
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempax = 950;
- else if(SiS_Pr->SiS_TVMode & TVSetPAL) tempax = 520;
- else tempax = 440;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_HiVision == 3) tempax = 950;
+ else tempax = 440;
+ } else {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) tempax = 520;
+ else tempax = 440;
+ }
- if( ( (!(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision)) && (SiS_Pr->SiS_VDE <= tempax) ) ||
- ( (SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision) &&
- ((SiS_Pr->SiS_VGAHDE == 1024) || (SiS_Pr->SiS_VDE <= tempax)) ) ) {
+ if( ( ( (!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) || (SiS_Pr->SiS_HiVision == 3) ) && (SiS_Pr->SiS_VDE <= tempax) ) ||
+ ( (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (SiS_Pr->SiS_HiVision != 3) &&
+ ( (SiS_Pr->SiS_VGAHDE == 1024) || ((SiS_Pr->SiS_VGAHDE != 1024) && (SiS_Pr->SiS_VDE <= tempax)) ) ) ) {
tempax -= SiS_Pr->SiS_VDE;
tempax >>= 2;
- tempax &= 0x00ff;
+ tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
- temp = tempax + (USHORT)TimingPoint[0];
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,temp);
-
- temp = tempax + (USHORT)TimingPoint[1];
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,temp);
+ temp = (tempax & 0xFF00) >> 8;
+ temp += (USHORT)TimingPoint[0];
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp);
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoHiVision) && (SiS_Pr->SiS_VGAHDE >= 1024)) {
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x1b); /* 19 */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x54); /* 52 */
+ temp = (tempax & 0xFF00) >> 8;
+ temp += (USHORT)TimingPoint[1];
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
+
+ if( (SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+ (SiS_Pr->SiS_HiVision != 3) &&
+ (SiS_Pr->SiS_VGAHDE >= 1024) ) {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x19);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x52);
} else {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,0x17);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,0x1d);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x17);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x1d);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x0b);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x11);
+ }
}
}
}
tempcx = SiS_Pr->SiS_HT;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempcx >>= 1;
+
+ /* 650/30xLV 1.10.6s */
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ tempcx >>= 1;
+ }
+
tempcx--;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) tempcx--;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1B,(tempcx & 0xff));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0xF0,((tempcx >> 8) & 0x0f));
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ tempcx--;
+ }
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1B,temp);
+ temp = (tempcx & 0xFF00) >> 8;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0xF0,temp);
tempcx++;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) tempcx++;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ tempcx++;
+ }
tempcx >>= 1;
push1 = tempcx;
tempcx += 7;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempcx -= 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,((tempcx << 4) & 0xf0));
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
+ tempcx -= 4;
+ }
+ temp = (tempcx & 0x00FF) << 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x22,0x0F,temp);
- tempbx = TimingPoint[j] | (TimingPoint[j+1] << 8);
+ tempbx = TimingPoint[j] | ((TimingPoint[j+1]) << 8);
tempbx += tempcx;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x24,tempbx);
+ push2 = tempbx;
+
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x24,temp);
temp = ((tempbx & 0xFF00) >> 8) << 4;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0F,temp);
+ tempbx = push2;
+
tempbx += 8;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
tempbx -= 4;
tempcx = tempbx;
}
@@ -7066,124 +7582,163 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x29,0x0F,temp);
j += 2;
- tempcx += (TimingPoint[j] | (TimingPoint[j+1] << 8));
+ tempcx += ((TimingPoint[j] | ((TimingPoint[j+1]) << 8)));
temp = tempcx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x27,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x27,temp);
temp = ((tempcx & 0xFF00) >> 8) << 4;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x28,0x0F,temp);
tempcx += 8;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) tempcx -= 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2A,0x0F,((tempcx << 4) & 0xf0));
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
+ tempcx -= 4;
+ }
+ temp = (tempcx & 0x00FF) << 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2A,0x0F,temp);
tempcx = push1;
j += 2;
tempcx -= (TimingPoint[j] | ((TimingPoint[j+1]) << 8));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2D,0x0F,((tempcx << 4) & 0xf0));
+ temp = (tempcx & 0x00FF) << 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2D,0x0F,temp);
tempcx -= 11;
if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- tempcx = SiS_GetVGAHT2(SiS_Pr) - 1;
+ tempax = SiS_GetVGAHT2(SiS_Pr) - 1;
+ tempcx = tempax;
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2E,tempcx);
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2E,temp);
tempbx = SiS_Pr->SiS_VDE;
if(SiS_Pr->SiS_VGAVDE == 360) tempbx = 746;
if(SiS_Pr->SiS_VGAVDE == 375) tempbx = 746;
if(SiS_Pr->SiS_VGAVDE == 405) tempbx = 853;
- if(HwInfo->jChipType < SIS_315H) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) tempbx >>= 1;
} else {
- if( (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) &&
- (!(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p|TVSetYPbPr750p))) ) {
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
tempbx >>= 1;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
if(ModeNo <= 0x13) {
- if(crt2crtc == 1) tempbx++;
+ if(crt2crtc == 1) {
+ tempbx++;
+ }
}
- } else if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(crt2crtc == 4) {
- if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
+ } else {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(crt2crtc == 4) /* BIOS calls GetRatePtrCRT2 here - does not make sense */
+ if(SiS_Pr->SiS_ModeType <= 3) tempbx++;
}
}
}
}
tempbx -= 2;
temp = tempbx & 0x00FF;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (SiS_Pr->SiS_HiVision == 3)) {
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
if((ModeNo == 0x2f) || (ModeNo == 0x5d) || (ModeNo == 0x5e)) temp++;
}
}
-
- if(HwInfo->jChipType < SIS_661) {
- /* From 1.10.7w - doesn't make sense */
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) {
+ /* From 1.10.7w - doesn't make sense */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) { /* SetFlag?? */
if(ModeNo == 0x03) temp++;
}
+ }
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2F,temp);
+
+ tempax = (tempcx & 0xFF00) | (tempax & 0x00FF);
+ tempbx = ((tempbx & 0xFF00) << 6) | (tempbx & 0x00FF);
+ tempax |= (tempbx & 0xFF00);
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV)) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART)) { /* New from 630/301B (II) BIOS */
+ tempax |= 0x1000;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO)) tempax |= 0x2000;
}
}
+ } else {
+ /* TODO Check this with other BIOSes */
+ if((!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV))
+ /* && (SiS_Pr->SiS_HiVision == 3) */ ) {
+ tempax |= 0x1000;
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToSVIDEO)) tempax |= 0x2000;
+ }
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2F,temp);
+ temp = (tempax & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,temp);
- temp = (tempcx >> 8) & 0x0F;
- temp |= (((tempbx >> 8) << 6) & 0xC0);
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)) {
- temp |= 0x10;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToAVIDEO) temp |= 0x20;
+ if(HwDeviceExtension->jChipType > SIS_315H) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if( (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) ) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
+ }
+ }
+ }
+
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
+ if(SiS_Pr->SiS_HiVision != 3) {
+ for(i=0, j=0; i<=0x2d; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS_HiVisionTable[SiS_Pr->SiS_HiVision][j]);
+ }
+ for(i=0x39; i<=0x45; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS_HiVisionTable[SiS_Pr->SiS_HiVision][j]);
+ }
+ }
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x30,temp);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
tempbx = SiS_Pr->SiS_VDE;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(!(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr750p))) {
- tempbx >>= 1;
- }
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToTV) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+ tempbx >>= 1;
}
tempbx -= 3;
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302LV | VB_SIS302ELV)) { /* Why not 301B/LV? */
- if(HwInfo->jChipType >= SIS_661) {
- temp = 0;
- if(tempcx & 0x0400) temp |= 0x20;
- if(tempbx & 0x0400) temp |= 0x40;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x10,temp);
- } else {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if((SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1680x1050)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x10,0x60);
- }
- }
- }
- }
tempbx &= 0x03ff;
temp = ((tempbx & 0xFF00) >> 8) << 5;
temp |= 0x18;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x46,temp);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x47,tempbx);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp);
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ tempax = 0;
+ if(SiS_Pr->SiS_HiVision & 0x03) {
+ tempax = 0x3000;
+ if(SiS_Pr->SiS_HiVision & 0x01) tempax = 0x5000;
+ }
+ temp = (tempax & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4d,temp);
+ }
+ }
}
- tempbx = 0;
+ tempbx &= 0x00FF;
if(!(modeflag & HalfDCLK)) {
if(SiS_Pr->SiS_VGAHDE >= SiS_Pr->SiS_HDE) {
- tempax = 0;
tempbx |= 0x2000;
+ tempax &= 0x00FF;
}
}
tempcx = 0x0101;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(SiS_Pr->SiS_VGAHDE >= 1024) {
- if((!(modeflag & HalfDCLK)) || (HwInfo->jChipType < SIS_315H)) {
- tempcx = 0x1920;
- if(SiS_Pr->SiS_VGAHDE >= 1280) {
- tempcx = 0x1420;
- tempbx &= ~0x2000;
+/*if(SiS_Pr->SiS_VBInfo & (SetPALTV | SetCRT2ToTV)) { */ /* BIOS BUG? */
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) {
+ if(!(SiS_Pr->SiS_HiVision & 0x03)) {
+ if(SiS_Pr->SiS_VGAHDE >= 1024) {
+ if((!(modeflag & HalfDCLK)) || (HwDeviceExtension->jChipType < SIS_315H)) {
+ tempcx = 0x1920;
+ if(SiS_Pr->SiS_VGAHDE >= 1280) {
+ tempcx = 0x1420;
+ tempbx &= 0xDFFF;
+ }
}
}
}
@@ -7201,84 +7756,111 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
tempeax = longtemp / SiS_Pr->SiS_HDE;
if(longtemp % SiS_Pr->SiS_HDE) tempeax++;
tempax = (USHORT)tempeax;
+ tempcx = (tempcx & 0xFF00) | ((tempax & 0xFF00) >> (8 + 5));
tempbx |= (tempax & 0x1F00);
- tempcx = (tempax & 0xFF00) >> (8 + 5);
+ tempax = ((tempax & 0x00FF) << 8) | (tempax & 0x00FF);
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x44,tempax);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,(tempbx >> 8));
+ temp = (tempax & 0xFF00) >> 8;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x44,temp);
+ temp = (tempbx & 0xFF00) >> 8;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x45,0xC0,temp);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
-
- temp = tempcx & 0x0007;
+ temp = tempcx & 0x00FF;
if(tempbx & 0x2000) temp = 0;
- if((HwInfo->jChipType < SIS_661) || (!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD))) {
- temp |= 0x18;
- }
+ temp |= 0x18;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x46,0xE0,temp);
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
tempbx = 0x0382;
tempcx = 0x007e;
} else {
tempbx = 0x0369;
tempcx = 0x0061;
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4B,tempbx);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4C,tempcx);
+ temp = (tempbx & 0x00FF) ;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4B,temp);
+ temp = (tempcx & 0x00FF) ;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4C,temp);
temp = (tempcx & 0x0300) >> (8 - 2);
temp |= ((tempbx >> 8) & 0x03);
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- temp |= 0x10;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) temp |= 0x20;
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) temp |= 0x40;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x4D,temp);
+ } else {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4D,0xF0,temp);
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x4D,temp);
-
- temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x43);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
- SiS_SetTVSpecial(SiS_Pr, ModeNo);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x43);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x43,(USHORT)(temp - 3));
+ }
- if(SiS_Pr->SiS_VBType & VB_SIS301C) {
- temp = 0;
- if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 8;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4e,0xf7,temp);
+ temp = 0;
+ if((HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ temp = 0x35;
+ } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+ temp = 0x38;
+ }
+ if(temp) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM) { /* 0x40 */
+ SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
+ }
+ }
}
-
}
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- if(!(SiS_Pr->SiS_TVMode & TVSetNTSC1024)) {
- temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x01);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,temp - 1);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
+ }
}
- SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xEF);
}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+#if 0 /* Old: Why HiVision? */
+ if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) ) {
if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0B,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,0x00);
}
}
+#endif
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) return;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ SiS_Set300Part2Regs(SiS_Pr, HwDeviceExtension, ModeIdIndex,
+ RefreshRateTableIndex, BaseAddr, ModeNo);
+ return;
+ }
+ } else {
+ /* !!! The following is a duplicate, done for LCDA as well (see above) */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ SiS_SetTVSpecial(SiS_Pr, ModeNo);
+ return;
+ }
+ }
/* From here: Part2 LCD setup */
tempbx = SiS_Pr->SiS_HDE;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempbx >>= 1;
- tempbx--; /* RHACTE = HDE - 1 */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x2C,tempbx);
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1;
+ tempbx--; /* RHACTE=HDE-1 */
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2C,temp);
temp = (tempbx & 0xFF00) >> 4;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2B,0x0F,temp);
temp = 0x01;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
if(SiS_Pr->SiS_ModeType == ModeEGA) {
if(SiS_Pr->SiS_VGAHDE >= 1024) {
temp = 0x02;
- if(HwInfo->jChipType >= SIS_315H) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
temp = 0x01;
}
@@ -7286,26 +7868,66 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
}
}
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x0B,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0B,temp);
- tempbx = SiS_Pr->SiS_VDE - 1;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x03,tempbx);
+ tempbx = SiS_Pr->SiS_VDE; /* RTVACTEO = VDE - 1 */
+ /* push1 = tempbx; */
+ tempbx--;
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x03,temp);
temp = ((tempbx & 0xFF00) >> 8) & 0x07;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0C,0xF8,temp);
- tempcx = SiS_Pr->SiS_VT - 1;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x19,tempcx);
-
- temp = ((tempcx & 0xFF00) >> 8) << 5;
+ tempcx = SiS_Pr->SiS_VT;
+ /* push2 = tempcx; */
+ tempcx--;
+ temp = tempcx & 0x00FF; /* RVTVT = VT - 1 */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x19,temp);
- /* Enable dithering; only do this for 32bpp mode */
- if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
- if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x01) {
+ temp = (tempcx & 0xFF00) >> 8;
+ temp <<= 5;
+
+ /* Enable dithering; newer versions only do this for 32bpp mode */
+ if((HwDeviceExtension->jChipType == SIS_300) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) temp |= 0x10;
+ } else if(HwDeviceExtension->jChipType < SIS_315H) {
+ temp |= 0x10;
+ } else {
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit) {
+ if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00) & 0x01) { /* 32bpp mode? */
+ temp |= 0x10;
+ }
+ }
+ } else {
temp |= 0x10;
}
}
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1A,0x0f,temp);
+ /* 630/301 does not do all this */
+ if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+ if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+ if(((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)) ||
+ ((SiS_Pr->SiS_CustomT == CUT_CLEVO1400) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050))) {
+#ifdef SIS315H
+ if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+ temp |= (SiS_Pr->SiS_LCDInfo >> 6);
+ }
+#endif
+ } else {
+ temp |= (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37) >> 6);
+ temp |= 0x08; /* From 1.10.7w */
+ if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) temp |= 0x04; /* From 1.10.7w */
+ }
+ } else {
+ if(SiS_Pr->SiS_LCDInfo & LCDSync) {
+ temp |= (SiS_Pr->SiS_LCDInfo >> 6);
+ }
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1A,temp);
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x09,0xF0);
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x0A,0xF0);
@@ -7313,57 +7935,115 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x17,0xFB);
SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x18,0xDF);
-#ifdef SIS315H
- if(SiS_GetCRT2Part2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- &CRT2Index, &resindex, HwInfo)) {
+ if((HwDeviceExtension->jChipType >= SIS_315H) &&
+ (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) &&
+ ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) ) {
+
+#ifdef SIS315H /* ------------- 315/330 series ------------ */
+
+ /* Using this on the 301B with an auto-expanding 1024 panel (CR37=1) results
+ * in a black bar in modes < 1024; if the panel is non-expanding, the bridge
+ * scales all modes to 1024. All modes in both variants (exp/non-exp) work.
+ */
+
+ SiS_GetCRT2Part2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &CRT2Index,&resindex,HwDeviceExtension,BaseAddr);
+
switch(CRT2Index) {
- case 200: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1; break;
- case 206: CRT2Part2Ptr = SiS310_CRT2Part2_Asus1024x768_3; break;
- default: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_3; break;
+ case Panel_1024x768 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1; break; /* "Normal" */
+ case Panel_1280x1024 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1280x1024_1; break;
+ case Panel_1400x1050 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1400x1050_1; break;
+ case Panel_1600x1200 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1600x1200_1; break;
+ case Panel_1024x768 + 16: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2; break; /* Non-Expanding */
+ case Panel_1280x1024 + 16: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1280x1024_2; break;
+ case Panel_1400x1050 + 16: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1400x1050_2; break;
+ case Panel_1600x1200 + 16: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1600x1200_2; break;
+ case Panel_1024x768 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_3; break; /* VESA Timing */
+ case Panel_1280x1024 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1280x1024_3; break;
+ case Panel_1400x1050 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1400x1050_3; break;
+ case Panel_1600x1200 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1600x1200_3; break;
+ case 100: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_1; break; /* Custom */
+ case 101: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_2; break;
+ case 102: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_3; break;
+ case 103: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_1; break; /* Custom */
+ case 104: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_2; break;
+ case 105: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_3; break;
+ default: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_3; break;
}
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,(CRT2Part2Ptr+resindex)->CR[0]);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x02,0x80,(CRT2Part2Ptr+resindex)->CR[1]);
for(i = 2, j = 0x04; j <= 0x06; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
}
for(j = 0x1c; j <= 0x1d; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
}
for(j = 0x1f; j <= 0x21; i++, j++ ) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
}
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
- SiS_SetGroup2_Tail(SiS_Pr, ModeNo);
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+ if(SiS_Pr->SiS_VGAVDE == 525) {
+ temp = 0xc3;
+ if(SiS_Pr->SiS_ModeType <= ModeVGA) {
+ temp++;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp += 2;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xb3);
+ } else if(SiS_Pr->SiS_VGAVDE == 420) {
+ temp = 0x4d;
+ if(SiS_Pr->SiS_ModeType <= ModeVGA) {
+ temp++;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) temp++;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+ }
+ }
-
- } else {
+ /* !!! This is a duplicate, done for LCDA as well - see above */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xfc,0x03); /* Not done in 1.10.7w */
+ temp = 1;
+ if(ModeNo <= 0x13) temp = 3;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x0b,temp);
+ }
+ }
#endif
-
- /* Checked for 1024x768, 1280x1024, 1400x1050, 1600x1200 */
- /* Clevo dual-link 1024x768 */
- /* Compaq 1280x1024 has HT 1696 sometimes (calculation OK, if given HT is correct) */
- /* Acer: OK, but uses different setting for VESA timing at 640/800/1024 and 640x400 */
+
+ } else { /* ------ 300 series and other bridges, other LCD resolutions ------ */
+
+ /* Using this on the 301B with an auto-expanding 1024 panel (CR37=1) makes
+ * the panel scale at modes < 1024 (no black bars); if the panel is non-expanding,
+ * the bridge scales all modes to 1024.
+ * !!! Malfunction at 640x480 and 640x400 when panel is auto-expanding - black screen !!!
+ */
+
+ /* cx = VT - 1 */
+
+ tempcx++;
+
+ tempbx = SiS_Pr->PanelYRes;
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if((SiS_Pr->SiS_LCDInfo & LCDPass11) || (SiS_Pr->PanelYRes == SiS_Pr->SiS_VDE)) {
- tempbx = SiS_Pr->SiS_VDE - 1;
- tempcx = SiS_Pr->SiS_VT - 1;
- } else {
- tempbx = SiS_Pr->SiS_VDE + ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VDE) / 2);
- tempcx = SiS_Pr->SiS_VT - ((SiS_Pr->PanelYRes - SiS_Pr->SiS_VDE) / 2);
- }
- } else {
- tempbx = SiS_Pr->PanelYRes;
- tempcx = SiS_Pr->SiS_VT;
- tempax = 1;
- if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
- tempax = SiS_Pr->PanelYRes;
- /* if(SiS_Pr->SiS_VGAVDE == 525) tempax += 0x3c; */ /* 651+301C */
- if(SiS_Pr->PanelYRes < SiS_Pr->SiS_VDE) {
- tempax = tempcx = 0;
+ tempbx = SiS_Pr->SiS_VDE - 1;
+ tempcx--;
+ }
+
+ tempax = 1;
+ if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) {
+ if(tempbx != SiS_Pr->SiS_VDE) {
+ tempax = tempbx;
+ if(tempax < SiS_Pr->SiS_VDE) {
+ tempax = 0;
+ tempcx = 0;
} else {
tempax -= SiS_Pr->SiS_VDE;
}
@@ -7372,6 +8052,13 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
tempcx -= tempax; /* lcdvdes */
tempbx -= tempax; /* lcdvdee */
}
+#if 0 /* meaningless: 1 / 2 = 0... */
+ else {
+ tempax >>= 1;
+ tempcx -= tempax; /* lcdvdes */
+ tempbx -= tempax; /* lcdvdee */
+ }
+#endif
/* Non-expanding: lcdvdees = tempcx = VT-1; lcdvdee = tempbx = VDE-1 */
@@ -7379,46 +8066,23 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
xf86DrvMsg(0, X_INFO, "lcdvdes 0x%x lcdvdee 0x%x\n", tempcx, tempbx);
#endif
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x05,tempcx); /* lcdvdes */
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x06,tempbx); /* lcdvdee */
+ temp = tempcx & 0x00FF; /* RVEQ1EQ=lcdvdes */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,temp);
+ temp = tempbx & 0x00FF; /* RVEQ2EQ=lcdvdee */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,temp);
temp = ((tempbx & 0xFF00) >> 8) << 3;
temp |= ((tempcx & 0xFF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x02,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,temp);
- tempax = SiS_Pr->SiS_VDE;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- tempax = SiS_Pr->PanelYRes;
- }
- tempcx = (SiS_Pr->SiS_VT - tempax) >> 4;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
- tempcx = (SiS_Pr->SiS_VT - tempax) / 10;
- }
- }
-
- tempbx = ((SiS_Pr->SiS_VT + SiS_Pr->SiS_VDE) >> 1) - 1;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(SiS_Pr->PanelYRes != SiS_Pr->SiS_VDE) {
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) { /* ? */
- tempax = SiS_Pr->SiS_VT - SiS_Pr->PanelYRes;
- if(tempax % 4) { tempax >>= 2; tempax++; }
- else { tempax >>= 2; }
- tempbx -= (tempax - 1);
- } else tempbx -= 10;
- }
- }
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- tempbx++;
- if((!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) || (crt2crtc == 6)) {
- if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
- tempbx = 770;
- tempcx = 3;
- }
- }
- }
+ tempbx = SiS_Pr->SiS_VT; /* push2; */
+ tempax = SiS_Pr->SiS_VDE; /* push1; */
+ tempcx = (tempbx - tempax) >> 4;
+ tempbx += tempax;
+ tempbx >>= 1;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx -= 10;
- /* non-expanding: lcdvrs = ((VT + VDE) / 2) - 10 */
+ /* non-expanding: lcdvrs = tempbx = ((VT + VDE) / 2) - 10 */
if(SiS_Pr->UseCustomMode) {
tempbx = SiS_Pr->CVSyncStart;
@@ -7428,7 +8092,8 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
xf86DrvMsg(0, X_INFO, "lcdvrs 0x%x\n", tempbx);
#endif
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,tempbx); /* lcdvrs */
+ temp = tempbx & 0x00FF; /* RTVACTEE = lcdvrs */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,temp);
temp = ((tempbx & 0xFF00) >> 8) << 4;
tempbx += (tempcx + 1);
@@ -7443,307 +8108,297 @@ SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,USHORT Refr
xf86DrvMsg(0, X_INFO, "lcdvre[3:0] 0x%x\n", (temp & 0x0f));
#endif
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x01,temp);
-
-#ifdef SIS300
- SiS_Group2LCDSpecial(SiS_Pr, HwInfo, ModeNo, crt2crtc);
-#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,temp);
- bridgeoffset = 7;
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) bridgeoffset += 2;
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302ELV)) bridgeoffset++;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) bridgeoffset++;
+ /* Code from 630/301B (I+II) BIOS */
- temp = 0;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) {
- temp = SiS_Pr->SiS_HT - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_HDE) / 2);
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) temp >>= 1;
+ if(!SiS_Pr->UseCustomMode) {
+ if( ( ( (HwDeviceExtension->jChipType == SIS_630) ||
+ (HwDeviceExtension->jChipType == SIS_730) ) &&
+ (HwDeviceExtension->jChipRevision > 2) ) &&
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) &&
+ (!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) &&
+ (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+ if(ModeNo == 0x13) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xB9);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0xCC);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xA6);
+ } else {
+ if((crt2crtc & 0x3F) == 4) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x2B);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x13);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,0xE5);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x05,0x08);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xE2);
+ }
+ }
}
}
- temp += bridgeoffset;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1F,temp); /* lcdhdes[7:0] */
- temp = (temp >> 4) & 0xf0;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0F,temp); /* lcdhdes [11:8] */
-
- tempcx = SiS_Pr->SiS_HT;
- tempax = tempbx = SiS_Pr->SiS_HDE;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) {
- tempax = SiS_Pr->PanelXRes;
- tempbx = SiS_Pr->PanelXRes - ((SiS_Pr->PanelXRes - SiS_Pr->SiS_HDE) / 2);
+
+#ifdef SIS300
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(!SiS_Pr->UseCustomMode) {
+ if(SiS_Pr->SiS_LCDTypeInfo == 0x0c) {
+ crt2crtc &= 0x1f;
+ tempcx = 0;
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ tempcx += 7;
+ }
+ }
+ tempcx += crt2crtc;
+ if(crt2crtc >= 4) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x06,0xff);
+ }
+
+ if(!(SiS_Pr->SiS_VBInfo & SetNotSimuMode)) {
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(crt2crtc == 4) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x01,0x28);
+ }
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x02,0x18);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,atable[tempcx]);
+ }
}
}
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) {
- tempcx >>= 1;
- tempbx >>= 1;
- tempax >>= 1;
+#endif
+
+ tempcx = (SiS_Pr->SiS_HT - SiS_Pr->SiS_HDE) >> 2; /* (HT - HDE) >> 2 */
+ tempbx = SiS_Pr->SiS_HDE + 7; /* lcdhdee */
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ tempbx += 2;
}
+ push1 = tempbx;
#ifdef TWDEBUG
xf86DrvMsg(0, X_INFO, "lcdhdee 0x%x\n", tempbx);
#endif
- tempbx += bridgeoffset;
-
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x23,tempbx); /* lcdhdee */
- temp = (tempbx >> 8) & 0x0f;
+ temp = tempbx & 0x00FF; /* RHEQPLE = lcdhdee */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,temp);
+ temp = (tempbx & 0xFF00) >> 8;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0xF0,temp);
- tempcx = (tempcx - tempax) >> 2;
+ temp = 7;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ temp += 2;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1F,temp); /* RHBLKE = lcdhdes[7:0] */
+ SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x20,0x0F); /* lcdhdes [11:8] */
tempbx += tempcx;
push2 = tempbx;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- if(SiS_Pr->SiS_HDE == 1280) tempbx = (tempbx & 0xff00) | 0x47;
- }
- }
- }
-
if(SiS_Pr->UseCustomMode) {
- tempbx = SiS_Pr->CHSyncStart;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempbx >>= 1;
- tempbx += bridgeoffset;
+ tempbx = SiS_Pr->CHSyncStart + 7;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ tempbx += 2;
+ }
}
#ifdef TWDEBUG
xf86DrvMsg(0, X_INFO, "lcdhrs 0x%x\n", tempbx);
#endif
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1C,tempbx); /* lcdhrs */
+ temp = tempbx & 0x00FF; /* RHBURSTS = lcdhrs */
+ if(!SiS_Pr->UseCustomMode) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) {
+ if(SiS_Pr->SiS_HDE == 1280) temp = 0x47;
+ }
+ }
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1C,temp);
temp = (tempbx & 0x0F00) >> 4;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1D,0x0F,temp);
tempbx = push2;
-
tempcx <<= 1;
- if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- if(SiS_Pr->PanelXRes != SiS_Pr->SiS_HDE) tempcx >>= 2;
- }
tempbx += tempcx;
if(SiS_Pr->UseCustomMode) {
- tempbx = SiS_Pr->CHSyncEnd;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempbx >>= 1;
- tempbx += bridgeoffset;
+ tempbx = SiS_Pr->CHSyncEnd + 7;
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ tempbx += 2;
+ }
}
#ifdef TWDEBUG
xf86DrvMsg(0, X_INFO, "lcdhre 0x%x\n", tempbx);
#endif
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x21,tempbx); /* lcdhre */
+ temp = tempbx & 0x00FF; /* RHSYEXP2S = lcdhre */
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x21,temp);
+
+ if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) {
+ if(SiS_Pr->SiS_VGAVDE == 525) {
+ if(SiS_Pr->SiS_ModeType <= ModeVGA)
+ temp=0xC6;
+ else
+ temp=0xC3;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x30,0xB3);
+ } else if(SiS_Pr->SiS_VGAVDE == 420) {
+ if(SiS_Pr->SiS_ModeType <= ModeVGA)
+ temp=0x4F;
+ else
+ temp=0x4D;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2f,temp);
+ }
+ }
+ SiS_Set300Part2Regs(SiS_Pr, HwDeviceExtension, ModeIdIndex,
+ RefreshRateTableIndex, BaseAddr, ModeNo);
- SiS_SetGroup2_Tail(SiS_Pr, ModeNo);
+ } /* HwDeviceExtension */
+}
-#ifdef SIS300
- SiS_Set300Part2Regs(SiS_Pr, HwInfo, ModeIdIndex, RefreshRateTableIndex, ModeNo);
-#endif
-#ifdef SIS315H
- } /* CRT2-LCD from table */
-#endif
+USHORT
+SiS_GetVGAHT2(SiS_Private *SiS_Pr)
+{
+ ULONG tempax,tempbx;
+
+ tempbx = ((SiS_Pr->SiS_VGAVT - SiS_Pr->SiS_VGAVDE) * SiS_Pr->SiS_RVBHCMAX) & 0xFFFF;
+ tempax = (SiS_Pr->SiS_VT - SiS_Pr->SiS_VDE) * SiS_Pr->SiS_RVBHCFACT;
+ tempax = (tempax * SiS_Pr->SiS_HT) / tempbx;
+ return((USHORT) tempax);
}
-/*********************************************/
-/* SET PART 3 REGISTER GROUP */
-/*********************************************/
+/* New from 300/301LV BIOS 1.16.51 for ECS A907. Seems highly preliminary. */
+void
+SiS_Set300Part2Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
+ USHORT BaseAddr, USHORT ModeNo)
+{
+ USHORT crt2crtc, resindex;
+ int i,j;
+ const SiS_Part2PortTblStruct *CRT2Part2Ptr = NULL;
-static void
-SiS_SetGroup3(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+ if(HwDeviceExtension->jChipType != SIS_300) return;
+ if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) return;
+ if(SiS_Pr->UseCustomMode) return;
+
+ if(ModeNo <= 0x13) {
+ crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ } else {
+ crt2crtc = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
+
+ resindex = crt2crtc & 0x3F;
+ if(SiS_Pr->SiS_SetFlag & LCDVESATiming) CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+ else CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_2;
+
+ /* The BIOS code (1.16.51) is obviously a fragment! */
+ if(ModeNo > 0x13) {
+ CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1;
+ resindex = 4;
+ }
+
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,(CRT2Part2Ptr+resindex)->CR[0]);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x02,0x80,(CRT2Part2Ptr+resindex)->CR[1]);
+ for(i = 2, j = 0x04; j <= 0x06; i++, j++ ) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ }
+ for(j = 0x1c; j <= 0x1d; i++, j++ ) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ }
+ for(j = 0x1f; j <= 0x21; i++, j++ ) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,j,(CRT2Part2Ptr+resindex)->CR[i]);
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x23,(CRT2Part2Ptr+resindex)->CR[10]);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x25,0x0f,(CRT2Part2Ptr+resindex)->CR[11]);
+}
+
+void
+SiS_SetGroup3(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT modeflag, i;
+ USHORT temp;
+ USHORT i;
const UCHAR *tempdi;
+ USHORT modeflag;
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
if(ModeNo<=0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
}
#ifndef SIS_CP
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x00,0x00);
-#endif
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x00,0x00);
+#endif
#ifdef SIS_CP
SIS_CP_INIT301_CP
#endif
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xFA);
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
} else {
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xF5);
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xB7);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF5);
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xB7);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xF6);
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xBf);
+ }
}
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x13,0xFA);
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x14,0xC8);
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
+ temp = 0;
+ if((HwDeviceExtension->jChipType == SIS_630)||
+ (HwDeviceExtension->jChipType == SIS_730)) {
+ temp = 0x35;
+ } else if(HwDeviceExtension->jChipType >= SIS_315H) {
+ temp = 0x38;
+ }
+ if(temp) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,temp) & EnablePALM){ /* 0x40 */
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x13,0xFA);
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x14,0xC8);
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,0x3D,0xA8);
+ }
+ }
+ }
}
- tempdi = NULL;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
tempdi = SiS_Pr->SiS_HiTVGroup3Data;
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) {
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
tempdi = SiS_Pr->SiS_HiTVGroup3Simu;
-#if 0
if(!(modeflag & Charx8Dot)) {
tempdi = SiS_Pr->SiS_HiTVGroup3Text;
}
-#endif
}
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) {
- if(!(SiS_Pr->SiS_TVMode & TVSetYPbPr525i)) {
+ if(SiS_Pr->SiS_HiVision & 0x03) {
tempdi = SiS_HiTVGroup3_1;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) tempdi = SiS_HiTVGroup3_2;
+ if(SiS_Pr->SiS_HiVision & 0x02) tempdi = SiS_HiTVGroup3_2;
}
- }
- if(tempdi) {
- for(i=0; i<=0x3E; i++) {
- SiS_SetReg(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
- }
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302ELV)) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) {
- SiS_SetReg(SiS_Pr->SiS_Part3Port,0x28,0x3f);
- }
+ for(i=0; i<=0x3E; i++){
+ SiS_SetReg1(SiS_Pr->SiS_Part3Port,i,tempdi[i]);
}
}
#ifdef SIS_CP
SIS_CP_INIT301_CP2
#endif
-}
-
-/*********************************************/
-/* SET PART 4 REGISTER GROUP */
-/*********************************************/
-#ifdef SIS315H
-static void
-SiS_ShiftXPos(SiS_Private *SiS_Pr, int shift)
-{
- USHORT temp, temp1, temp2;
-
- temp1 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x1f);
- temp2 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x20);
- temp = (USHORT)((int)((temp1 | ((temp2 & 0xf0) << 4))) + shift);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x1f,temp);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x20,0x0f,((temp >> 4) & 0xf0));
- temp = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x2b) & 0x0f;
- temp = (USHORT)((int)(temp) + shift);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x2b,0xf0,(temp & 0x0f));
- temp1 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x43);
- temp2 = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x42);
- temp = (USHORT)((int)((temp1 | ((temp2 & 0xf0) << 4))) + shift);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x43,temp);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x42,0x0f,((temp >> 4) & 0xf0));
}
-static void
-SiS_SetGroup4_C_ELV(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex)
-{
- USHORT temp, temp1, resinfo = 0;
-
- if(!(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302ELV))) return;
-
- if(ModeNo > 0x13) {
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- }
-
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x3a,0x08);
- temp = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x3a);
- if(!(temp & 0x01)) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x3a,0xdf);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x25,0xfc);
- if(HwInfo->jChipType < SIS_661) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x25,0xf8);
- }
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x0f,0xfb);
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) temp = 0x0000;
- else if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) temp = 0x0002;
- else if(SiS_Pr->SiS_TVMode & TVSetHiVision) temp = 0x0400;
- else temp = 0x0402;
- if(HwInfo->jChipType >= SIS_661) {
- temp1 = 0;
- if(SiS_Pr->SiS_TVMode & TVAspect43) temp1 = 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0f,0xfb,temp1);
- if(SiS_Pr->SiS_TVMode & TVAspect43LB) temp |= 0x01;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0x7c,(temp & 0xff));
- } else {
- temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x3b) & 0x03;
- if(temp1 == 0x01) temp |= 0x01;
- if(temp1 == 0x03) temp |= 0x04; /* ? why not 0x10? */
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xf8,(temp & 0xff));
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x3a,0xfb,(temp >> 8));
-
- if(HwInfo->jChipType >= SIS_661) { /* ? */
- if(SiS_Pr->SiS_TVMode & TVAspect43) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) {
- if(resinfo == SIS_RI_1024x768) {
- SiS_ShiftXPos(SiS_Pr, 97);
- } else {
- SiS_ShiftXPos(SiS_Pr, 111);
- }
- } else if(SiS_Pr->SiS_TVMode & TVSetHiVision) {
- SiS_ShiftXPos(SiS_Pr, 136);
- }
- }
- }
- }
-}
-#endif
-
-static void
-SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
-{
- USHORT vclkindex;
- USHORT temp, reg1, reg2;
-
- if(SiS_Pr->UseCustomMode) {
- reg1 = SiS_Pr->CSR2B;
- reg2 = SiS_Pr->CSR2C;
- } else {
- vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- HwInfo);
- reg1 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
- reg2 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
- }
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,0x57);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,0x46);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1f,0xf6);
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,reg1);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,reg2);
- }
- } else {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,0x01);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0b,reg2);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x0a,reg1);
- }
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x12,0x00);
- temp = 0x08;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) temp |= 0x20;
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,temp);
-}
-
-static void
-SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+/* Set 301 VGA2 registers */
+void
+SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex,USHORT RefreshRateTableIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT tempax,tempcx,tempbx,modeflag,temp,temp2,resinfo;
ULONG tempebx,tempeax,templong;
@@ -7751,39 +8406,43 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if(ModeNo <= 0x13) {
modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- } else if(SiS_Pr->UseCustomMode) {
- modeflag = SiS_Pr->CModeFlag;
- resinfo = 0;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ if(SiS_Pr->UseCustomMode) {
+ modeflag = SiS_Pr->CModeFlag;
+ resinfo = 0;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ }
}
- if(HwInfo->jChipType >= SIS_315H) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
}
}
}
- if(SiS_Pr->SiS_VBType & (VB_SIS301C | VB_SIS302LV)) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x10,0x9f);
- }
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x10,0x9f);
+ }
}
- if(HwInfo->jChipType >= SIS_315H) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) {
+ /* From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */
+ /* This is a duplicate; done at the end, too */
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) {
SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
}
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
}
#endif
}
@@ -7792,33 +8451,35 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
temp = SiS_Pr->SiS_RVBHCFACT;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x13,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x13,temp);
tempbx = SiS_Pr->SiS_RVBHCMAX;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x14,tempbx);
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x14,temp);
- temp2 = (tempbx >> 1) & 0x0080;
+ temp2 = (((tempbx & 0xFF00) >> 8) << 7) & 0x00ff;
tempcx = SiS_Pr->SiS_VGAHT - 1;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x16,tempcx);
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x16,temp);
- temp2 |= (((tempcx & 0xFF00) >> 8) << 3) & 0x00ff;
+ temp = (((tempcx & 0xFF00) >> 8) << 3) & 0x00ff;
+ temp2 |= temp;
tempcx = SiS_Pr->SiS_VGAVT - 1;
- if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempcx -= 5;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x17,tempcx);
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) tempcx -= 5;
- temp = temp2 | (tempcx >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x15,temp);
+ temp = tempcx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x17,temp);
+
+ temp = temp2 | ((tempcx & 0xFF00) >> 8);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x15,temp);
tempbx = SiS_Pr->SiS_VGAHDE;
- if(modeflag & HalfDCLK) tempbx >>= 1;
- if(HwInfo->jChipType >= SIS_661) {
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempbx >>= 1;
- }
+ if(modeflag & HalfDCLK) tempbx >>= 1;
temp = 0xA0;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
temp = 0;
if(tempbx > 800) {
temp = 0xA0;
@@ -7838,18 +8499,15 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if(tempbx > 800) temp = 0x60;
}
}
-
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr525p | TVSetYPbPr750p)) {
- temp = 0;
- if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20;
+ if(SiS_Pr->SiS_HiVision & 0x03) {
+ temp = 0;
+ if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20;
}
- if(HwInfo->jChipType < SIS_661) {
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) temp = 0;
- }
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) temp = 0;
if(SiS_Pr->SiS_VBType & VB_SIS301) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_1280x1024)
+ if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)
temp |= 0x0A;
}
@@ -7857,13 +8515,13 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
tempebx = SiS_Pr->SiS_VDE;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) {
if(!(temp & 0xE0)) tempebx >>=1;
}
tempcx = SiS_Pr->SiS_RVBHRS;
temp = tempcx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x18,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x18,temp);
tempeax = SiS_Pr->SiS_VGAVDE;
tempcx |= 0x4000;
@@ -7879,164 +8537,500 @@ SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if(templong != 0) tempebx++;
temp = (USHORT)(tempebx & 0x000000FF);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1B,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1B,temp);
temp = (USHORT)((tempebx & 0x0000FF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1A,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1A,temp);
tempbx = (USHORT)(tempebx >> 16);
temp = tempbx & 0x00FF;
temp <<= 4;
temp |= ((tempcx & 0xFF00) >> 8);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x19,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x19,temp);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1C,0x28);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1C,0x28);
+ tempbx = 0;
+ tempax = SiS_Pr->SiS_VGAHDE;
+ if(modeflag & HalfDCLK) tempax >>= 1;
+ if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) || (SiS_Pr->SiS_HiVision & 0x03)) {
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempax >>= 1;
+ else if(tempax > 800) tempax -= 800;
+ } else {
+ if(tempax > 800) tempax -= 800;
+ }
+ }
- tempbx = 0;
- tempax = SiS_Pr->SiS_VGAHDE;
- if(modeflag & HalfDCLK) tempax >>= 1;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempax >>= 1;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(tempax > 800) tempax -= 800;
- } else /* if(SiS_Pr->SiS_VBInfo & TvNoHiviNoYPbPr) */ { /* 651+301C */
- if(tempax > 800) {
- tempbx = 8;
- if(tempax == 1024) tempax *= 25;
- else tempax *= 20;
- temp = tempax % 32;
- tempax /= 32;
- tempax--;
- if (temp!=0) tempax++;
- }
- }
- tempax--;
- temp = ((tempax & 0xFF00) >> 8) & 0x03;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTVNoYPbPrHiVision) { /* From 1.10.7w */
- if(ModeNo > 0x13) { /* From 1.10.7w */
- if(resinfo == SIS_RI_1024x768) tempax = 0x1f; /* From 1.10.7w */
- /* ax normally 0x1e */ /* From 1.10.7w */
- } /* From 1.10.7w */
- } /* From 1.10.7w */
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1D,tempax & 0x00FF);
- temp <<= 4;
- temp |= tempbx;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x1E,temp);
+/* if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetPALTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) { */
+ if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) && (!(SiS_Pr->SiS_HiVision & 0x03))) {
+ if(tempax > 800) {
+ tempbx = 8;
+ if(tempax == 1024)
+ tempax *= 25;
+ else
+ tempax *= 20;
+
+ temp = tempax % 32;
+ tempax /= 32;
+ tempax--;
+ if (temp!=0) tempax++;
+ }
+ }
+ tempax--;
+ temp = (tempax & 0xFF00) >> 8;
+ temp &= 0x03;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* From 1.10.7w */
+ if(ModeNo > 0x13) { /* From 1.10.7w */
+ if(resinfo == SIS_RI_1024x768) tempax = 0x1f; /* From 1.10.7w */
+ } /* From 1.10.7w */
+ } /* From 1.10.7w */
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1D,tempax & 0x00FF);
+ temp <<= 4;
+ temp |= tempbx;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1E,temp);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(IS_SIS550650740660) {
+ temp = 0x0026; /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
+ } else {
+ temp = 0x0036;
+ }
+ } else {
+ temp = 0x0036;
+ }
+ if((SiS_Pr->SiS_VBInfo & (SetCRT2ToTV - SetCRT2ToHiVisionTV)) &&
+ (!(SiS_Pr->SiS_HiVision & 0x03))) {
+ temp |= 0x01;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
+ if(!(SiS_Pr->SiS_SetFlag & TVSimuMode))
+ temp &= 0xFE;
+ }
+ }
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp);
+
+ tempbx = SiS_Pr->SiS_HT;
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1;
+ tempbx >>= 1;
+ tempbx -= 2;
+ temp = ((tempbx & 0x0700) >> 8) << 3;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0xC0,temp);
+ temp = tempbx & 0x00FF;
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x22,temp);
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e);
+ /* LCD-too-dark-error-source, see FinalizeLCD() */
+ }
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) {
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+ }
+ }
+#ifdef SET_EMI
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
+ }
+#endif
+ }
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(IS_SIS550650740660) {
- temp = 0x0026; /* 1.10.7w; 1.10.8r; needs corresponding code in Dis/EnableBridge! */
- } else {
- temp = 0x0036;
+ } /* 301B */
+
+ SiS_SetCRT2VCLK(SiS_Pr,BaseAddr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
+}
+
+
+void
+SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT vclkindex;
+ USHORT temp, reg1, reg2;
+
+ if(SiS_Pr->UseCustomMode) {
+ reg1 = SiS_Pr->CSR2B;
+ reg2 = SiS_Pr->CSR2C;
+ } else {
+ vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ HwDeviceExtension);
+ reg1 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_A;
+ reg2 = SiS_Pr->SiS_VBVCLKData[vclkindex].Part4_B;
+ }
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) {
+ if((ModeNo == 0x64) || (ModeNo == 0x4a) || (ModeNo == 0x38)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0a,0x57);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0b,0x46);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x1f,0xf6);
+ }
+ }
+ }
}
- } else {
- temp = 0x0036;
}
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- if(!(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 | TVSetHiVision | TVSetYPbPr750p | TVSetYPbPr525p))) {
- temp |= 0x01;
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- if(!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
- temp &= 0xFE;
- }
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,0x01);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0B,reg2);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0A,reg1);
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x12,0x00);
+ temp = 0x08;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) temp |= 0x20;
+ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x12,temp);
+}
+
+USHORT
+SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ USHORT tempbx;
+ const USHORT LCDXlat0VCLK[4] = {VCLK40, VCLK40, VCLK40, VCLK40};
+ const USHORT LVDSXlat1VCLK[4] = {VCLK40, VCLK40, VCLK40, VCLK40};
+ const USHORT LVDSXlat4VCLK[4] = {VCLK28, VCLK28, VCLK28, VCLK28};
+#ifdef SIS300
+ const USHORT LCDXlat1VCLK300[4] = {VCLK65_300, VCLK65_300, VCLK65_300, VCLK65_300};
+ const USHORT LCDXlat2VCLK300[4] = {VCLK108_2_300,VCLK108_2_300,VCLK108_2_300,VCLK108_2_300};
+ const USHORT LVDSXlat2VCLK300[4]= {VCLK65_300, VCLK65_300, VCLK65_300, VCLK65_300};
+ const USHORT LVDSXlat3VCLK300[4]= {VCLK65_300, VCLK65_300, VCLK65_300, VCLK65_300};
+#endif
+#ifdef SIS315H
+ const USHORT LCDXlat1VCLK310[4] = {VCLK65_315, VCLK65_315, VCLK65_315, VCLK65_315};
+ const USHORT LCDXlat2VCLK310[4] = {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
+ const USHORT LVDSXlat2VCLK310[4]= {VCLK65_315, VCLK65_315, VCLK65_315, VCLK65_315};
+ const USHORT LVDSXlat3VCLK310[4]= {VCLK108_2_315,VCLK108_2_315,VCLK108_2_315,VCLK108_2_315};
+#endif
+ USHORT CRT2Index,VCLKIndex=0;
+ USHORT modeflag,resinfo;
+ const UCHAR *CHTVVCLKPtr = NULL;
+ const USHORT *LCDXlatVCLK1 = NULL;
+ const USHORT *LCDXlatVCLK2 = NULL;
+ const USHORT *LVDSXlatVCLK2 = NULL;
+ const USHORT *LVDSXlatVCLK3 = NULL;
+
+ if(HwDeviceExtension->jChipType >= SIS_315H) {
+#ifdef SIS315H
+ LCDXlatVCLK1 = LCDXlat1VCLK310;
+ LCDXlatVCLK2 = LCDXlat2VCLK310;
+ LVDSXlatVCLK2 = LVDSXlat2VCLK310;
+ LVDSXlatVCLK3 = LVDSXlat3VCLK310;
+#endif
+ } else {
+#ifdef SIS300
+ LCDXlatVCLK1 = LCDXlat1VCLK300;
+ LCDXlatVCLK2 = LCDXlat2VCLK300;
+ LVDSXlatVCLK2 = LVDSXlat2VCLK300;
+ LVDSXlatVCLK3 = LVDSXlat3VCLK300;
+#endif
+ }
+
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+ CRT2Index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ CRT2Index = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { /* 30x/B/LV */
+
+ if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) {
+
+ CRT2Index >>= 6;
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /* LCD */
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) {
+ VCLKIndex = LCDXlat0VCLK[CRT2Index];
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ VCLKIndex = LCDXlatVCLK1[CRT2Index];
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ VCLKIndex = LCDXlatVCLK1[CRT2Index];
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ VCLKIndex = LCDXlatVCLK1[CRT2Index];
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ VCLKIndex = VCLK81_300; /* guessed */
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+ VCLKIndex = VCLK108_3_300;
+ if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_300;
+ } else {
+ VCLKIndex = LCDXlatVCLK2[CRT2Index];
+ }
+ } else {
+ if( (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) ||
+ (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) ) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ VCLKIndex = VCLK108_2_315;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ VCLKIndex = VCLK81_315; /* guessed */
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ VCLKIndex = VCLK108_2_315;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ VCLKIndex = VCLK162_315;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x960) {
+ VCLKIndex = VCLK108_3_315;
+ if(resinfo == SIS_RI_1280x1024) VCLKIndex = VCLK100_315;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ VCLKIndex = LCDXlatVCLK1[CRT2Index];
+ } else {
+ VCLKIndex = LCDXlatVCLK2[CRT2Index];
+ }
+ } else {
+ VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02)); /* Port 3cch */
+ VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+ if(ModeNo > 0x13) {
+ VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ }
+ if(ModeNo <= 0x13) {
+ if(HwDeviceExtension->jChipType <= SIS_315PRO) {
+ if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x42;
+ } else {
+ if(SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC == 1) VCLKIndex = 0x00;
+ }
+ }
+ if(HwDeviceExtension->jChipType <= SIS_315PRO) {
+ if(VCLKIndex == 0) VCLKIndex = 0x41;
+ if(VCLKIndex == 1) VCLKIndex = 0x43;
+ if(VCLKIndex == 4) VCLKIndex = 0x44;
+ }
+ }
+ }
+ } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* TV */
+ if( (SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) &&
+ (!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) ) {
+ if(SiS_Pr->SiS_SetFlag & RPLLDIV2XO) VCLKIndex = HiTVVCLKDIV2;
+ else VCLKIndex = HiTVVCLK;
+ if(SiS_Pr->SiS_SetFlag & TVSimuMode) {
+ if(modeflag & Charx8Dot) VCLKIndex = HiTVSimuVCLK;
+ else VCLKIndex = HiTVTextVCLK;
+ }
+ } else {
+ if(SiS_Pr->SiS_SetFlag & RPLLDIV2XO) VCLKIndex = TVVCLKDIV2;
+ else VCLKIndex = TVVCLK;
+ }
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex += TVCLKBASE_300;
+ } else {
+ VCLKIndex += TVCLKBASE_315;
+ }
+ } else { /* RAMDAC2 */
+ VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+ VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+ if(ModeNo > 0x13) {
+ VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex &= 0x3f;
+ if( (HwDeviceExtension->jChipType == SIS_630) &&
+ (HwDeviceExtension->jChipRevision >= 0x30)) {
+ /* This is certainly wrong: It replaces clock
+ * 108 by 47...
+ */
+ /* if(VCLKIndex == 0x14) VCLKIndex = 0x2e; */
+ if(VCLKIndex == 0x14) VCLKIndex = 0x34;
+ }
+ }
+ }
+ }
+
+ } else { /* If not programming CRT2 */
+
+ VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+ VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+ if(ModeNo > 0x13) {
+ VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex &= 0x3f;
+ if( (HwDeviceExtension->jChipType != SIS_630) &&
+ (HwDeviceExtension->jChipType != SIS_300) ) {
+ if(VCLKIndex == 0x1b) VCLKIndex = 0x35;
+ }
+ }
+ }
+ }
+
+ } else { /* LVDS */
+
+ VCLKIndex = CRT2Index;
+
+ if(SiS_Pr->SiS_SetFlag & ProgrammingCRT2) { /* programming CRT2 */
+
+ if( (SiS_Pr->SiS_IF_DEF_CH70xx != 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
+
+ VCLKIndex &= 0x1f;
+ tempbx = 0;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ tempbx += 2;
+ if(SiS_Pr->SiS_ModeType > ModeVGA) {
+ if(SiS_Pr->SiS_CHSOverScan) tempbx = 8;
+ }
+ if(SiS_Pr->SiS_CHPALM) {
+ tempbx = 4;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ } else if(SiS_Pr->SiS_CHPALN) {
+ tempbx = 6;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1;
+ }
+ }
+ switch(tempbx) {
+ case 0: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUNTSC; break;
+ case 1: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKONTSC; break;
+ case 2: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPAL; break;
+ case 3: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
+ case 4: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALM; break;
+ case 5: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALM; break;
+ case 6: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKUPALN; break;
+ case 7: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPALN; break;
+ case 8: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKSOPAL; break;
+ default: CHTVVCLKPtr = SiS_Pr->SiS_CHTVVCLKOPAL; break;
+ }
+ VCLKIndex = CHTVVCLKPtr[VCLKIndex];
+
+ } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
+
+ VCLKIndex >>= 6;
+ if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel800x600) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480))
+ VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 ||
+ SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3)
+ VCLKIndex = LVDSXlat4VCLK[VCLKIndex];
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768)
+ VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600)
+ VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768)
+ VCLKIndex = LVDSXlatVCLK2[VCLKIndex];
+ else VCLKIndex = LVDSXlatVCLK3[VCLKIndex];
+
+ if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
+ /* Special Timing: Barco iQ Pro R300/400/... */
+ VCLKIndex = 0x44;
+ }
+
+ if(SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex = VCLK34_300;
+ /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */
+ } else {
+ VCLKIndex = VCLK34_315;
+ /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */
+ }
+ }
+
+ } else {
+
+ VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+ VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+ if(ModeNo > 0x13) {
+ VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex &= 0x3F;
+ }
+ if( (HwDeviceExtension->jChipType == SIS_630) &&
+ (HwDeviceExtension->jChipRevision >= 0x30) ) {
+ if(VCLKIndex == 0x14) VCLKIndex = 0x2e;
+ }
+ }
}
- }
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp);
- tempbx = SiS_Pr->SiS_HT;
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) tempbx >>= 1;
- tempbx >>= 1;
- tempbx -= 2;
- temp = ((tempbx & 0x0700) >> 8) << 3;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x21,0xC0,temp);
- temp = tempbx & 0x00FF;
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x22,temp);
+ } else { /* if not programming CRT2 */
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x24,0x0e);
- /* LCD-too-dark-error-source, see FinalizeLCD() */
- }
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_IsDualLink(SiS_Pr, HwInfo)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c);
+ VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02));
+ VCLKIndex = ((VCLKIndex >> 2) & 0x03);
+ if(ModeNo > 0x13) {
+ VCLKIndex = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
+ if(HwDeviceExtension->jChipType < SIS_315H) {
+ VCLKIndex &= 0x3F;
+ if( (HwDeviceExtension->jChipType != SIS_630) &&
+ (HwDeviceExtension->jChipType != SIS_300) ) {
+ if(VCLKIndex == 0x1b) VCLKIndex = 0x35;
+ }
+#if 0
+ if(HwDeviceExtension->jChipType == SIS_730) {
+ if(VCLKIndex == 0x0b) VCLKIndex = 0x40; /* 1024x768-70 */
+ if(VCLKIndex == 0x0d) VCLKIndex = 0x41; /* 1024x768-75 */
+ }
+#endif
+ }
}
- }
-#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
- }
-#endif
- }
- } /* 301B */
+ }
- SiS_SetCRT2VCLK(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
+ }
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "VCLKIndex %d (0x%x)\n", VCLKIndex, VCLKIndex);
+#endif
+ return(VCLKIndex);
}
-/*********************************************/
-/* SET PART 5 REGISTER GROUP */
-/*********************************************/
-
-static void
-SiS_SetGroup5(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+/* Set 301 Palette address port registers */
+/* Checked against 650/301LV BIOS */
+void
+SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr,
+ UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex)
{
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) return;
if(SiS_Pr->SiS_ModeType == ModeVGA) {
- if(!(SiS_Pr->SiS_VBInfo & (SetInSlaveMode | LoadDACFlag))) {
- SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20);
- SiS_LoadDAC(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
+ if(!(SiS_Pr->SiS_VBInfo & (SetInSlaveMode | LoadDACFlag))){
+ SiS_EnableCRT2(SiS_Pr);
+ SiS_LoadDAC(SiS_Pr,HwDeviceExtension,ROMAddr,ModeNo,ModeIdIndex);
}
}
}
-/*********************************************/
-/* MODIFY CRT1 GROUP FOR SLAVE MODE */
-/*********************************************/
-
-static void
-SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+void
+SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- USHORT tempah,i,modeflag,j;
+ USHORT temp,tempah,i,modeflag,j;
USHORT ResIndex,DisplayType;
const SiS_LVDSCRT1DataStruct *LVDSCRT1Ptr=NULL;
- if(ModeNo <= 0x13) modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- else modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ }
if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
(SiS_Pr->SiS_CustomT == CUT_BARCO1024) ||
(SiS_Pr->SiS_CustomT == CUT_PANEL848))
return;
- if(!(SiS_GetLVDSCRT1Ptr(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex,
- &ResIndex, &DisplayType))) {
- return;
- }
+ temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex,
+ &ResIndex,&DisplayType);
- if(HwInfo->jChipType < SIS_315H) {
+ if(temp == 0) return;
+
+ if(HwDeviceExtension->jChipType < SIS_315H) {
if(SiS_Pr->SiS_SetFlag & SetDOSMode) return;
}
switch(DisplayType) {
case 0 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1; break;
- case 1 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1_H; break;
- case 2 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2; break;
- case 3 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2_H; break;
- case 4 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1; break;
- case 5 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1_H; break;
- case 6 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2; break;
- case 7 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2_H; break;
- case 8 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1; break;
- case 9 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1_H; break;
- case 10: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2; break;
+ case 1 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1; break;
+ case 2 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1; break;
+ case 3 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_1_H; break;
+ case 4 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1_H; break;
+ case 5 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_1_H; break;
+ case 6 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2; break;
+ case 7 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2; break;
+ case 8 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2; break;
+ case 9 : LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1800x600_2_H; break;
+ case 10: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_2_H; break;
case 11: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11280x1024_2_H; break;
case 12: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1; break;
case 13: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT1XXXxXXX_1_H; break;
@@ -8075,30 +9069,30 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
default: LVDSCRT1Ptr = SiS_Pr->SiS_LVDSCRT11024x768_1; break;
}
- SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f); /*unlock cr0-7 */
tempah = (LVDSCRT1Ptr + ResIndex)->CR[0];
- SiS_SetReg(SiS_Pr->SiS_P3d4,0x00,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x00,tempah);
for(i=0x02,j=1;i<=0x05;i++,j++){
tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
for(i=0x06,j=5;i<=0x07;i++,j++){
tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
for(i=0x10,j=7;i<=0x11;i++,j++){
tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
for(i=0x15,j=9;i<=0x16;i++,j++){
tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
- SiS_SetReg(SiS_Pr->SiS_P3d4,i,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,i,tempah);
}
for(i=0x0A,j=11;i<=0x0C;i++,j++){
tempah = (LVDSCRT1Ptr + ResIndex)->CR[j];
- SiS_SetReg(SiS_Pr->SiS_P3c4,i,tempah);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,i,tempah);
}
tempah = (LVDSCRT1Ptr + ResIndex)->CR[14];
@@ -8110,38 +9104,143 @@ SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
tempah <<= 5;
if(modeflag & DoubleScanMode) tempah |= 0x080;
SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x09,~0x020,tempah);
+
+ /* 650/LVDS BIOS - doesn't make sense */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ if(modeflag & HalfDCLK)
+ SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x11,0x7f);
+ }
}
-/*********************************************/
-/* SET CRT2 ECLK */
-/*********************************************/
+BOOLEAN
+SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *ResIndex,
+ USHORT *DisplayType)
+ {
+ USHORT tempbx,modeflag=0;
+ USHORT Flag,CRT2CRTC;
+
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) {
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return 0;
+ }
+ } else {
+ if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) return 0;
+ }
-static void
-SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo)
+ if(ModeNo <= 0x13) {
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ CRT2CRTC = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ } else {
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ CRT2CRTC = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ }
+
+ Flag = 1;
+ tempbx = 0;
+ if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
+ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
+ Flag = 0;
+ tempbx = 18;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx++;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
+ tempbx += 2;
+ if(SiS_Pr->SiS_ModeType > ModeVGA) {
+ if(SiS_Pr->SiS_CHSOverScan) tempbx = 99;
+ }
+ if(SiS_Pr->SiS_CHPALM) {
+ tempbx = 18; /* PALM uses NTSC data */
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx++;
+ } else if(SiS_Pr->SiS_CHPALN) {
+ tempbx = 20; /* PALN uses PAL data */
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx++;
+ }
+ }
+ }
+ }
+ if(Flag) {
+ tempbx = SiS_Pr->SiS_LCDResInfo;
+ tempbx -= SiS_Pr->SiS_PanelMinLVDS;
+ if(SiS_Pr->SiS_LCDResInfo <= SiS_Pr->SiS_Panel1280x1024) {
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 6;
+ if(modeflag & HalfDCLK) tempbx += 3;
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ tempbx = 14;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x600) {
+ tempbx = 23;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1152x768) {
+ tempbx = 27;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tempbx = 36;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) {
+ tempbx = 40;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 2;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) {
+ tempbx = 54;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2) {
+ tempbx = 52;
+ if(modeflag & HalfDCLK) tempbx++;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) {
+ tempbx = 50;
+ if(modeflag & HalfDCLK) tempbx++;
+ }
+
+ }
+ if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
+ tempbx = 12;
+ if(modeflag & HalfDCLK) tempbx++;
+ }
+ }
+
+#if 0
+ if(SiS_Pr->SiS_IF_DEF_FSTN) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel320x480){
+ tempbx = 22;
+ }
+ }
+#endif
+
+ *ResIndex = CRT2CRTC & 0x3F;
+ *DisplayType = tempbx;
+ return 1;
+}
+
+void
+SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT clkbase, vclkindex=0;
UCHAR sr2b, sr2c;
- if((SiS_Pr->SiS_LCDResInfo == Panel_640x480) || (SiS_Pr->SiS_LCDInfo & LCDPass11)) {
+ if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) || (SiS_Pr->SiS_IF_DEF_TRUMPION == 1)) {
SiS_Pr->SiS_SetFlag &= (~ProgrammingCRT2);
if((SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK & 0x3f) == 2) {
RefreshRateTableIndex--;
}
- vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwInfo);
+ vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
} else {
- vclkindex = SiS_GetVCLK2Ptr(SiS_Pr, ModeNo, ModeIdIndex,
- RefreshRateTableIndex, HwInfo);
+ vclkindex = SiS_GetVCLK2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,
+ RefreshRateTableIndex,HwDeviceExtension);
}
sr2b = SiS_Pr->SiS_VCLKData[vclkindex].SR2B;
sr2c = SiS_Pr->SiS_VCLKData[vclkindex].SR2C;
if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(ROMAddr[0x220] & 0x01) {
sr2b = ROMAddr[0x227];
sr2c = ROMAddr[0x228];
@@ -8156,23 +9255,42 @@ SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
}
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x20);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x10);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x31,0x00);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase,sr2b);
- SiS_SetReg(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x20);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x10);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase,sr2b);
+ SiS_SetReg1(SiS_Pr->SiS_P3c4,clkbase+1,sr2c);
}
-/*********************************************/
-/* SET UP CHRONTEL CHIPS */
-/*********************************************/
+#if 0 /* Not used */
+void
+SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr)
+{
+ USHORT temp;
-static void
-SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
+ if(SiS_Pr->SiS_IF_DEF_LVDS==0) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x02,0x40);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x10,0x80);
+ temp=(UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16);
+ temp &= 0xC3;
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x35,temp);
+ } else {
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x32,0x02);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x02,0x00);
+ }
+}
+#endif
+
+/* Start of Chrontel 70xx functions ---------------------- */
+
+/* Set-up the Chrontel Registers */
+void
+SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
USHORT RefreshRateTableIndex)
{
USHORT temp, tempbx, tempcl;
@@ -8180,36 +9298,36 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
const SiS_CHTVRegDataStruct *CHTVRegData = NULL;
if(ModeNo <= 0x13)
- tempcl = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ tempcl = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
else
- tempcl = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
+ tempcl = SiS_Pr->SiS_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
TVType = 0;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) TVType += 1;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
TVType += 2;
if(SiS_Pr->SiS_ModeType > ModeVGA) {
if(SiS_Pr->SiS_CHSOverScan) TVType = 8;
}
- if(SiS_Pr->SiS_TVMode & TVSetPALM) {
+ if(SiS_Pr->SiS_CHPALM) {
TVType = 4;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
- } else if(SiS_Pr->SiS_TVMode & TVSetPALN) {
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) TVType += 1;
+ } else if(SiS_Pr->SiS_CHPALN) {
TVType = 6;
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) TVType += 1;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) TVType += 1;
}
}
switch(TVType) {
- case 0: CHTVRegData = SiS_Pr->SiS_CHTVReg_UNTSC; break;
- case 1: CHTVRegData = SiS_Pr->SiS_CHTVReg_ONTSC; break;
- case 2: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPAL; break;
- case 3: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
- case 4: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALM; break;
- case 5: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALM; break;
- case 6: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALN; break;
- case 7: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALN; break;
- case 8: CHTVRegData = SiS_Pr->SiS_CHTVReg_SOPAL; break;
- default: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
+ case 0: CHTVRegData = SiS_Pr->SiS_CHTVReg_UNTSC; break;
+ case 1: CHTVRegData = SiS_Pr->SiS_CHTVReg_ONTSC; break;
+ case 2: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPAL; break;
+ case 3: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
+ case 4: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALM; break;
+ case 5: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALM; break;
+ case 6: CHTVRegData = SiS_Pr->SiS_CHTVReg_UPALN; break;
+ case 7: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPALN; break;
+ case 8: CHTVRegData = SiS_Pr->SiS_CHTVReg_SOPAL; break;
+ default: CHTVRegData = SiS_Pr->SiS_CHTVReg_OPAL; break;
}
resindex = tempcl & 0x3F;
@@ -8222,7 +9340,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
/* We don't support modes >800x600 */
if (resindex > 5) return;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) {
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) {
SiS_SetCH700x(SiS_Pr,0x4304); /* 0x40=76uA (PAL); 0x03=15bit non-multi RGB*/
SiS_SetCH700x(SiS_Pr,0x6909); /* Black level for PAL (105)*/
} else {
@@ -8267,7 +9385,7 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
*/
#ifndef SIS_CP
SiS_SetCH70xx(SiS_Pr,0x003D);
-#endif
+#endif
/* Register 0x10 only contains 1 writable bit (S0) for sensing,
all other bits a read-only. Macrovision?
@@ -8283,12 +9401,12 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
*/
SiS_SetCH70xxANDOR(SiS_Pr,0x001C,0xEF);
- if(!(SiS_Pr->SiS_TVMode & TVSetPAL)) { /* ---- NTSC ---- */
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) {
+ if(!(SiS_Pr->SiS_VBInfo & SetPALTV)) { /* ---- NTSC ---- */
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) {
if(resindex == 0x04) { /* 640x480 overscan: Mode 16 */
SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off */
SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE); /* ACIV on, no need to set FSCI */
- } else if(resindex == 0x05) { /* 800x600 overscan: Mode 23 */
+ } else if(resindex == 0x05) { /* 800x600 overscan: Mode 23 */
SiS_SetCH70xxANDOR(SiS_Pr,0x0118,0xF0); /* 0x18-0x1f: FSCI 469,762,048 */
SiS_SetCH70xxANDOR(SiS_Pr,0x0C19,0xF0);
SiS_SetCH70xxANDOR(SiS_Pr,0x001A,0xF0);
@@ -8321,9 +9439,9 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE);
}
}
- } else { /* ---- PAL ---- */
+ } else { /* ---- PAL ---- */
/* We don't play around with FSCI in PAL mode */
- if(resindex == 0x04) {
+ if (resindex == 0x04) {
SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off */
SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE); /* ACIV on */
} else {
@@ -8344,85 +9462,69 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if (resindex > 6) return;
temp = CHTVRegData[resindex].Reg[0];
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
- temp |= 0x10;
- }
- tempbx=((temp & 0x00FF) << 8) | 0x00;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x00;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[1];
- tempbx=((temp & 0x00FF) << 8) | 0x01;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x01;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[2];
- tempbx=((temp & 0x00FF) << 8) | 0x02;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x02;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[3];
- tempbx=((temp & 0x00FF) << 8) | 0x04;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x04;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[4];
- tempbx=((temp & 0x00FF) << 8) | 0x03;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x03;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[5];
- tempbx=((temp & 0x00FF) << 8) | 0x05;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x05;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[6];
- tempbx=((temp & 0x00FF) << 8) | 0x06;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x06;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[7];
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) {
- temp = 0x66;
- }
- tempbx=((temp & 0x00FF) << 8) | 0x07;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x07;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[8];
- tempbx=((temp & 0x00FF) << 8) | 0x08;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x08;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[9];
- tempbx=((temp & 0x00FF) << 8) | 0x15;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x15;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[10];
- tempbx=((temp & 0x00FF) << 8) | 0x1f;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x1f;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[11];
- tempbx=((temp & 0x00FF) << 8) | 0x0c;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x0c;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[12];
- tempbx=((temp & 0x00FF) << 8) | 0x0d;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x0d;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[13];
- tempbx=((temp & 0x00FF) << 8) | 0x0e;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x0e;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[14];
- tempbx=((temp & 0x00FF) << 8) | 0x0f;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x0f;
SiS_SetCH701x(SiS_Pr,tempbx);
temp = CHTVRegData[resindex].Reg[15];
- tempbx=((temp & 0x00FF) << 8) | 0x10;
+ tempbx=((temp & 0x00FF) <<8 ) | 0x10;
SiS_SetCH701x(SiS_Pr,tempbx);
-
- temp = SiS_GetCH701x(SiS_Pr,0x21) & ~0x02;
- /* D1 should be set for PAL, PAL-N and NTSC-J,
- but I won't do that for PAL unless somebody
- tells me to do so. Since the BIOS uses
- non-default CIV values and blacklevels,
- this might be compensated anyway.
- */
- if(SiS_Pr->SiS_TVMode & (TVSetPALN | TVSetNTSCJ)) temp |= 0x02;
- SiS_SetCH701x(SiS_Pr,((temp << 8) | 0x21));
-
+
#endif /* 315 */
}
@@ -8433,14 +9535,16 @@ SiS_SetCHTVReg(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
+/* Chrontel 701x functions ================================= */
+
void
-SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT temp;
/* Enable Chrontel 7019 LCD panel backlight */
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
SiS_SetCH701x(SiS_Pr,0x6566);
} else {
temp = SiS_GetCH701x(SiS_Pr,0x66);
@@ -8457,56 +9561,16 @@ SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr)
/* Disable Chrontel 7019 LCD panel backlight */
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- temp = SiS_GetCH701x(SiS_Pr,0x66);
- temp &= 0xDF;
- SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
+ temp = SiS_GetCH701x(SiS_Pr,0x66);
+ temp &= 0xDF;
+ SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
}
}
#ifdef SIS315H /* ----------- 315 series only ---------- */
-static void
-SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR regtable[] = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
- UCHAR table1024_740[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
- UCHAR table1400_740[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
- UCHAR asus1024_740[] = { 0x19, 0x6e, 0x01, 0x19, 0x09 };
- UCHAR asus1400_740[] = { 0x19, 0x6e, 0x01, 0x19, 0x09 };
- UCHAR table1024_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
- UCHAR table1400_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
- UCHAR *tableptr = NULL;
- int i;
-
- /* Set up Power up/down timing */
-
- if(HwInfo->jChipType == SIS_740) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) tableptr = asus1024_740;
- else tableptr = table1024_740;
- } else if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200)) {
- if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) tableptr = asus1400_740;
- else tableptr = table1400_740;
- } else return;
- } else {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- tableptr = table1024_650;
- } else if((SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) ||
- (SiS_Pr->SiS_LCDResInfo == Panel_1600x1200)) {
- tableptr = table1400_650;
- } else return;
- }
-
- for(i=0; i<5; i++) {
- SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
- }
-}
-
-static void
-SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
{
UCHAR regtable[] = { 0x1c, 0x5f, 0x64, 0x6f, 0x70, 0x71,
0x72, 0x73, 0x74, 0x76, 0x78, 0x7d, 0x66 };
@@ -8530,49 +9594,59 @@ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
USHORT tempbh;
int i;
- if(HwInfo->jChipType == SIS_740) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tableptr = table1024_740;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) tableptr = table1280_740;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) tableptr = table1400_740;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) tableptr = table1600_740;
- else return;
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ tableptr = table1024_740;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ tableptr = table1280_740;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ tableptr = table1400_740;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tableptr = table1600_740;
+ } else return;
} else {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) tableptr = table1024_650;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) tableptr = table1280_650;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) tableptr = table1400_650;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) tableptr = table1600_650;
- else return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ tableptr = table1024_650;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
+ tableptr = table1280_650;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ tableptr = table1400_650;
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) {
+ tableptr = table1600_650;
+ } else return;
}
tempbh = SiS_GetCH701x(SiS_Pr,0x74);
if((tempbh == 0xf6) || (tempbh == 0xc7)) {
tempbh = SiS_GetCH701x(SiS_Pr,0x73);
if(tempbh == 0xc8) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) return;
} else if(tempbh == 0xdb) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) return;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) return;
} else if(tempbh == 0xde) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) return;
}
}
- if(HwInfo->jChipType == SIS_740) tempbh = 0x0d;
- else tempbh = 0x0c;
-
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ tempbh = 0x0d;
+ } else {
+ tempbh = 0x0c;
+ }
for(i = 0; i < tempbh; i++) {
SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
}
- SiS_ChrontelPowerSequencing(SiS_Pr,HwInfo);
+ SiS_ChrontelPowerSequencing(SiS_Pr,HwDeviceExtension);
tempbh = SiS_GetCH701x(SiS_Pr,0x1e);
tempbh |= 0xc0;
SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1e);
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
tempbh = SiS_GetCH701x(SiS_Pr,0x1c);
tempbh &= 0xfb;
SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x1c);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x03);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
tempbh = SiS_GetCH701x(SiS_Pr,0x64);
tempbh |= 0x40;
SiS_SetCH701x(SiS_Pr,(tempbh << 8) | 0x64);
@@ -8582,53 +9656,72 @@ SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
-static void
-SiS_ChrontelResetVSync(SiS_Private *SiS_Pr)
+void
+SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
- unsigned char temp, temp1;
+ UCHAR regtable[] = { 0x67, 0x68, 0x69, 0x6a, 0x6b };
+ UCHAR table1024_740[] = { 0x01, 0x02, 0x01, 0x01, 0x01 };
+ UCHAR table1400_740[] = { 0x01, 0x6e, 0x01, 0x01, 0x01 };
+ UCHAR table1024_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+ UCHAR table1400_650[] = { 0x01, 0x02, 0x01, 0x01, 0x02 };
+ UCHAR *tableptr = NULL;
+ int i;
- temp1 = SiS_GetCH701x(SiS_Pr,0x49);
- SiS_SetCH701x(SiS_Pr,0x3e49);
- temp = SiS_GetCH701x(SiS_Pr,0x47);
- temp &= 0x7f; /* Use external VSYNC */
- SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
- SiS_LongDelay(SiS_Pr,3);
- temp = SiS_GetCH701x(SiS_Pr,0x47);
- temp |= 0x80; /* Use internal VSYNC */
- SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
- SiS_SetCH701x(SiS_Pr,(temp1 << 8) | 0x49);
+ /* Set up Power up/down timing */
+
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ tableptr = table1024_740;
+ } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
+ tableptr = table1400_740;
+ } else return;
+ } else {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
+ tableptr = table1024_650;
+ } else if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) ||
+ (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) {
+ tableptr = table1400_650;
+ } else return;
+ }
+
+ for(i=0; i<5; i++) {
+ SiS_SetCH701x(SiS_Pr,(tableptr[i] << 8) | regtable[i]);
+ }
}
void
-SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr)
{
USHORT temp;
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
temp = SiS_GetCH701x(SiS_Pr,0x1c);
- temp |= 0x04; /* Invert XCLK phase */
+ temp |= 0x04;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
}
- if(SiS_IsYPbPr(SiS_Pr, HwInfo)) {
+ if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
temp = SiS_GetCH701x(SiS_Pr,0x01);
temp &= 0x3f;
temp |= 0x80; /* Enable YPrPb (HDTV) */
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
}
- if(SiS_IsChScart(SiS_Pr, HwInfo)) {
+ if(SiS_IsChScart(SiS_Pr,HwDeviceExtension, BaseAddr)) {
temp = SiS_GetCH701x(SiS_Pr,0x01);
temp &= 0x3f;
temp |= 0xc0; /* Enable SCART + CVBS */
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x01);
}
- if(HwInfo->jChipType == SIS_740) {
- SiS_ChrontelResetVSync(SiS_Pr);
- SiS_SetCH701x(SiS_Pr,0x2049); /* Enable TV path */
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ SiS_ChrontelDoSomething5(SiS_Pr);
+ SiS_SetCH701x(SiS_Pr,0x2049); /* Enable TV path */
} else {
- SiS_SetCH701x(SiS_Pr,0x2049); /* Enable TV path */
+ SiS_SetCH701x(SiS_Pr,0x2049); /* Enable TV path */
temp = SiS_GetCH701x(SiS_Pr,0x49);
- if(SiS_IsYPbPr(SiS_Pr,HwInfo)) {
+ if(SiS_IsYPbPr(SiS_Pr,HwDeviceExtension, BaseAddr)) {
temp = SiS_GetCH701x(SiS_Pr,0x73);
temp |= 0x60;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x73);
@@ -8645,13 +9738,13 @@ SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
void
-SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT temp;
/* Complete power down of LVDS */
if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
SiS_LongDelay(SiS_Pr,1);
SiS_GenericDelay(SiS_Pr,0x16ff);
SiS_SetCH701x(SiS_Pr,0xac76);
@@ -8666,18 +9759,34 @@ SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
-static void
-SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr)
{
- USHORT temp;
+ unsigned char temp, temp1;
+
+ temp1 = SiS_GetCH701x(SiS_Pr,0x49);
+ SiS_SetCH701x(SiS_Pr,0x3e49);
+ temp = SiS_GetCH701x(SiS_Pr,0x47);
+ temp &= 0x7f;
+ SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+ SiS_LongDelay(SiS_Pr,3);
+ temp = SiS_GetCH701x(SiS_Pr,0x47);
+ temp |= 0x80;
+ SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x47);
+ SiS_SetCH701x(SiS_Pr,(temp1 << 8) | 0x49);
+}
- if(HwInfo->jChipType == SIS_740) {
+void
+SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
+{
+ USHORT temp;
- temp = SiS_GetCH701x(SiS_Pr,0x4a); /* Version ID */
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ temp = SiS_GetCH701x(SiS_Pr,0x4a);
temp &= 0x01;
- if(!temp) {
+ if(!(temp)) {
- if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo)) {
+ if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
temp = SiS_GetCH701x(SiS_Pr,0x49);
SiS_SetCH701x(SiS_Pr,0x3e49);
}
@@ -8686,14 +9795,13 @@ SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_LongDelay(SiS_Pr,1);
SiS_SetCH701x(SiS_Pr,0x1848);
- if(SiS_WeHaveBacklightCtrl(SiS_Pr, HwInfo)) {
- SiS_ChrontelResetVSync(SiS_Pr);
+ if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_ChrontelDoSomething5(SiS_Pr);
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x49);
}
} else {
- /* Clear/set/clear GPIO */
temp = SiS_GetCH701x(SiS_Pr,0x5c);
temp &= 0xef;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
@@ -8705,10 +9813,9 @@ SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x5c);
temp = SiS_GetCH701x(SiS_Pr,0x61);
if(!temp) {
- SiS_SetCH701xForLCD(SiS_Pr, HwInfo);
+ SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
}
}
-
} else { /* 650 */
/* Reset Chrontel 7019 datapath */
SiS_SetCH701x(SiS_Pr,0x1048);
@@ -8718,14 +9825,14 @@ SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
void
-SiS_ChrontelInitTVVSync(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
{
USHORT temp;
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
- if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwInfo)) {
- SiS_ChrontelResetVSync(SiS_Pr);
+ if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ SiS_ChrontelDoSomething5(SiS_Pr);
}
} else {
@@ -8746,20 +9853,21 @@ SiS_ChrontelInitTVVSync(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
-static void
-SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo)
+void
+SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr)
{
USHORT temp,temp1;
- if(HwInfo->jChipType == SIS_740) {
+ if(HwDeviceExtension->jChipType == SIS_740) {
temp = SiS_GetCH701x(SiS_Pr,0x61);
if(temp < 1) {
temp++;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x61);
}
- SiS_SetCH701x(SiS_Pr,0x4566); /* Panel power on */
- SiS_SetCH701x(SiS_Pr,0xaf76); /* All power on */
+ SiS_SetCH701x(SiS_Pr,0x4566);
+ SiS_SetCH701x(SiS_Pr,0xaf76);
SiS_LongDelay(SiS_Pr,1);
SiS_GenericDelay(SiS_Pr,0x16ff);
@@ -8777,7 +9885,7 @@ SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo
temp |= 0x5f;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x66);
if(ModeNo > 0x13) {
- if(SiS_WeHaveBacklightCtrl(SiS_Pr, HwInfo)) {
+ if(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr)) {
SiS_GenericDelay(SiS_Pr,0x3ff);
} else {
SiS_GenericDelay(SiS_Pr,0x2ff);
@@ -8797,8 +9905,8 @@ SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_INFO HwInfo
}
}
-static void
-SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+void
+SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
{
USHORT temp,tempcl,tempch;
@@ -8808,43 +9916,43 @@ SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
do {
temp = SiS_GetCH701x(SiS_Pr,0x66);
- temp &= 0x04; /* PLL stable? -> bail out */
+ temp &= 0x04;
if(temp == 0x04) break;
-
- if(HwInfo->jChipType == SIS_740) {
- /* Power down LVDS output, PLL normal operation */
+
+ if(HwDeviceExtension->jChipType == SIS_740) {
SiS_SetCH701x(SiS_Pr,0xac76);
}
- SiS_SetCH701xForLCD(SiS_Pr,HwInfo);
+ SiS_SetCH701xForLCD(SiS_Pr,HwDeviceExtension,BaseAddr);
if(tempcl == 0) {
if(tempch == 3) break;
- SiS_ChrontelResetDB(SiS_Pr,HwInfo);
+ SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
tempcl = 3;
tempch++;
}
tempcl--;
temp = SiS_GetCH701x(SiS_Pr,0x76);
- temp &= 0xfb; /* Reset PLL */
+ temp &= 0xfb;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
SiS_LongDelay(SiS_Pr,2);
temp = SiS_GetCH701x(SiS_Pr,0x76);
- temp |= 0x04; /* PLL normal operation */
+ temp |= 0x04;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x76);
- if(HwInfo->jChipType == SIS_740) {
- SiS_SetCH701x(SiS_Pr,0xe078); /* PLL loop filter */
+ if(HwDeviceExtension->jChipType == SIS_740) {
+ SiS_SetCH701x(SiS_Pr,0xe078);
} else {
SiS_SetCH701x(SiS_Pr,0x6078);
}
SiS_LongDelay(SiS_Pr,2);
} while(0);
- SiS_SetCH701x(SiS_Pr,0x0077); /* MV? */
+ SiS_SetCH701x(SiS_Pr,0x0077);
}
void
-SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr)
{
USHORT temp;
@@ -8852,421 +9960,126 @@ SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
temp |= 0x80; /* Set datapath 1 to TV */
temp &= 0xbf; /* Set datapath 2 to LVDS */
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
-
- if(HwInfo->jChipType == SIS_740) {
+
+ if(HwDeviceExtension->jChipType == SIS_740) {
temp = SiS_GetCH701x(SiS_Pr,0x1c);
- temp &= 0xfb; /* Normal XCLK phase */
+ temp &= 0xfb;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x1c);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2d,0x03);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2d,0x03);
temp = SiS_GetCH701x(SiS_Pr,0x64);
- temp |= 0x40; /* ? Bit not defined */
+ temp |= 0x40;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x64);
temp = SiS_GetCH701x(SiS_Pr,0x03);
- temp &= 0x3f; /* D1 input to both LVDS and TV */
+ temp &= 0x3f;
SiS_SetCH701x(SiS_Pr,(temp << 8) | 0x03);
- if(SiS_Pr->SiS_CustomT == CUT_ASUSL3000D) {
- SiS_SetCH701x(SiS_Pr,0x4063); /* LVDS off */
- SiS_LongDelay(SiS_Pr, 1);
- SiS_SetCH701x(SiS_Pr,0x0063); /* LVDS on */
- SiS_ChrontelResetDB(SiS_Pr, HwInfo);
- SiS_ChrontelDoSomething2(SiS_Pr, HwInfo);
- SiS_ChrontelDoSomething3(SiS_Pr, 0, HwInfo);
- } else {
- temp = SiS_GetCH701x(SiS_Pr,0x66);
- if(temp != 0x45) {
- SiS_ChrontelResetDB(SiS_Pr, HwInfo);
- SiS_ChrontelDoSomething2(SiS_Pr, HwInfo);
- SiS_ChrontelDoSomething3(SiS_Pr, 0, HwInfo);
- }
- }
-
- } else { /* 650 */
-
- SiS_ChrontelResetDB(SiS_Pr,HwInfo);
- SiS_ChrontelDoSomething2(SiS_Pr,HwInfo);
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x34);
- SiS_ChrontelDoSomething3(SiS_Pr,temp,HwInfo);
- SiS_SetCH701x(SiS_Pr,0xaf76); /* All power on, LVDS normal operation */
-
- }
-
-}
-#endif /* 315 series */
-
-/*********************************************/
-/* MAIN: SET CRT2 REGISTER GROUP */
-/*********************************************/
-
-BOOLEAN
-SiS_SetCRT2Group(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
-{
-#ifdef SIS300
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
-#endif
- USHORT ModeIdIndex, RefreshRateTableIndex;
-#if 0
- USHORT temp;
-#endif
-
- SiS_Pr->SiS_SetFlag |= ProgrammingCRT2;
-
- if(!SiS_Pr->UseCustomMode) {
- SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex);
- } else {
- ModeIdIndex = 0;
- }
-
- /* Used for shifting CR33 */
- SiS_Pr->SiS_SelectCRT2Rate = 4;
-
- SiS_UnLockCRT2(SiS_Pr, HwInfo);
-
- RefreshRateTableIndex = SiS_GetRatePtr(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
-
- SiS_SaveCRT2Info(SiS_Pr,ModeNo);
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- SiS_DisableBridge(SiS_Pr,HwInfo);
- if((SiS_Pr->SiS_IF_DEF_LVDS == 1) && (HwInfo->jChipType == SIS_730)) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x00,0x80);
- }
- SiS_SetCRT2ModeRegs(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- }
-
- if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
- SiS_LockCRT2(SiS_Pr, HwInfo);
- SiS_DisplayOn(SiS_Pr);
- return TRUE;
- }
-
- SiS_GetCRT2Data(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
-
- /* Set up Panel Link for LVDS and LCDA */
- SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0;
- if( (SiS_Pr->SiS_IF_DEF_LVDS == 1) ||
- ((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) ||
- ((HwInfo->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) {
- SiS_GetLVDSDesData(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
- }
-
-#ifdef LINUX_XF86
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "(init301: LCDHDES 0x%03x LCDVDES 0x%03x)\n", SiS_Pr->SiS_LCDHDES, SiS_Pr->SiS_LCDVDES);
- xf86DrvMsg(0, X_INFO, "(init301: HDE 0x%03x VDE 0x%03x)\n", SiS_Pr->SiS_HDE, SiS_Pr->SiS_VDE);
- xf86DrvMsg(0, X_INFO, "(init301: VGAHDE 0x%03x VGAVDE 0x%03x)\n", SiS_Pr->SiS_VGAHDE, SiS_Pr->SiS_VGAVDE);
- xf86DrvMsg(0, X_INFO, "(init301: HT 0x%03x VT 0x%03x)\n", SiS_Pr->SiS_HT, SiS_Pr->SiS_VT);
- xf86DrvMsg(0, X_INFO, "(init301: VGAHT 0x%03x VGAVT 0x%03x)\n", SiS_Pr->SiS_VGAHT, SiS_Pr->SiS_VGAVT);
-#endif
-#endif
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- SiS_SetGroup1(SiS_Pr, ModeNo, ModeIdIndex, HwInfo, RefreshRateTableIndex);
- }
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
-
- SiS_SetGroup2(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
-#ifdef SIS315H
- SiS_SetGroup2_C_ELV(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
-#endif
- SiS_SetGroup3(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_SetGroup4(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex, HwInfo);
-#ifdef SIS315H
- SiS_SetGroup4_C_ELV(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
-#endif
- SiS_SetGroup5(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
-
- SiS_SetCRT2Sync(SiS_Pr, ModeNo, RefreshRateTableIndex, HwInfo);
-
- /* For 301BDH (Panel link initialization): */
- if((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) {
- if(SiS_Pr->SiS_LCDResInfo != Panel_640x480) {
- if(!((SiS_Pr->SiS_SetFlag & SetDOSMode) && ((ModeNo == 0x03) || (ModeNo == 0x10)))) {
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) {
- SiS_ModCRT1CRTC(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
- }
- }
- }
- SiS_SetCRT2ECLK(SiS_Pr,ModeNo,ModeIdIndex,
- RefreshRateTableIndex,HwInfo);
- }
+ temp = SiS_GetCH701x(SiS_Pr,0x66);
+ if(temp != 0x45) {
+ SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
+ SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+ SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
}
- } else {
-
- SiS_SetCRT2Sync(SiS_Pr, ModeNo, RefreshRateTableIndex, HwInfo);
-
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- SiS_ModCRT1CRTC(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwInfo);
- }
-
- SiS_SetCRT2ECLK(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex,HwInfo);
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx != 0) {
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 2) {
-#ifdef SIS315H
- SiS_SetCH701xForLCD(SiS_Pr,HwInfo);
-#endif
- }
- }
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SiS_SetCHTVReg(SiS_Pr,ModeNo,ModeIdIndex,RefreshRateTableIndex);
- }
- }
- }
-
- }
-
-#ifdef SIS300
- if(HwInfo->jChipType < SIS_315H) {
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- if(SiS_Pr->SiS_UseOEM) {
- if((SiS_Pr->SiS_UseROM) && (SiS_Pr->SiS_UseOEM == -1)) {
- if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
- SiS_OEM300Setting(SiS_Pr,HwInfo,ModeNo,ModeIdIndex,
- RefreshRateTableIndex);
- }
- } else {
- SiS_OEM300Setting(SiS_Pr,HwInfo,ModeNo,ModeIdIndex,
- RefreshRateTableIndex);
- }
- }
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) ||
- (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) {
- SetOEMLCDData2(SiS_Pr, HwInfo, ModeNo, ModeIdIndex,RefreshRateTableIndex);
- }
- if(HwInfo->jChipType == SIS_730) {
- SiS_DisplayOn(SiS_Pr);
- }
- }
- }
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- if(HwInfo->jChipType != SIS_730) {
- SiS_DisplayOn(SiS_Pr);
- }
- }
- }
-#endif
-
-#ifdef SIS315H
- if(HwInfo->jChipType >= SIS_315H) {
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- if(HwInfo->jChipType < SIS_661) {
- SiS_FinalizeLCD(SiS_Pr, ModeNo, ModeIdIndex, HwInfo);
- SiS_OEM310Setting(SiS_Pr, HwInfo, ModeNo, ModeIdIndex);
- } else {
- SiS_OEM661Setting(SiS_Pr, HwInfo, ModeNo, ModeIdIndex, RefreshRateTableIndex);
- }
- SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x01,0x40);
- }
- }
-#endif
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- SiS_EnableBridge(SiS_Pr, HwInfo);
- }
-
- SiS_DisplayOn(SiS_Pr);
-
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- /* Disable LCD panel when using TV */
- SiS_SetRegSR11ANDOR(SiS_Pr,HwInfo,0xFF,0x0C);
- } else {
- /* Disable TV when using LCD */
- SiS_SetCH70xxANDOR(SiS_Pr,0x010E,0xF8);
- }
- }
-
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
- SiS_LockCRT2(SiS_Pr,HwInfo);
- }
-
- return TRUE;
-}
+ } else { /* 650 */
+ SiS_ChrontelResetDB(SiS_Pr,HwDeviceExtension,BaseAddr);
-/*********************************************/
-/* ENABLE/DISABLE LCD BACKLIGHT (SIS) */
-/*********************************************/
+ SiS_ChrontelDoSomething2(SiS_Pr,HwDeviceExtension,BaseAddr);
-void
-SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- /* Switch on LCD backlight on SiS30xLV */
- SiS_DDC2Delay(SiS_Pr,0xff00);
- if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02);
- SiS_WaitVBRetrace(SiS_Pr,HwInfo);
- }
- if(!(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x26) & 0x01)) {
- SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x01);
- }
-}
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34);
+ SiS_ChrontelDoSomething3(SiS_Pr,temp,HwDeviceExtension,BaseAddr);
-void
-SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- /* Switch off LCD backlight on SiS30xLV */
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD);
- SiS_DDC2Delay(SiS_Pr,0xe000);
-}
+ SiS_SetCH701x(SiS_Pr,0xaf76);
-/*********************************************/
-/* DDC RELATED FUNCTIONS */
-/*********************************************/
+ }
-static void
-SiS_SetupDDCN(SiS_Private *SiS_Pr)
-{
- SiS_Pr->SiS_DDC_NData = ~SiS_Pr->SiS_DDC_Data;
- SiS_Pr->SiS_DDC_NClk = ~SiS_Pr->SiS_DDC_Clk;
- if((SiS_Pr->SiS_DDC_Index == 0x11) && (SiS_Pr->SiS_SensibleSR11)) {
- SiS_Pr->SiS_DDC_NData &= 0x0f;
- SiS_Pr->SiS_DDC_NClk &= 0x0f;
- }
}
-#ifdef SIS300
-static UCHAR *
-SiS_SetTrumpBlockLoop(SiS_Private *SiS_Pr, UCHAR *dataptr)
-{
- int i, j, num;
- USHORT tempah,temp;
- UCHAR *mydataptr;
-
- for(i=0; i<20; i++) { /* Do 20 attempts to write */
- mydataptr = dataptr;
- num = *mydataptr++;
- if(!num) return mydataptr;
- if(i) {
- SiS_SetStop(SiS_Pr);
- SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT*2);
- }
- if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
- tempah = SiS_Pr->SiS_DDC_DeviceAddr;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
- if(temp) continue; /* (ERROR: no ack) */
- tempah = *mydataptr++;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write register number */
- if(temp) continue; /* (ERROR: no ack) */
- for(j=0; j<num; j++) {
- tempah = *mydataptr++;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah);/* Write DAB (S0=0=write) */
- if(temp) break;
- }
- if(temp) continue;
- if(SiS_SetStop(SiS_Pr)) continue;
- return mydataptr;
- }
- return NULL;
-}
-
-static BOOLEAN
-SiS_SetTrumpionBlock(SiS_Private *SiS_Pr, UCHAR *dataptr)
-{
- SiS_Pr->SiS_DDC_DeviceAddr = 0xF0; /* DAB (Device Address Byte) */
- SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
- SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
- SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
+#endif /* 315 series ------------------------------------ */
- SiS_SetSwitchDDC2(SiS_Pr);
+/* End of Chrontel 701x functions ==================================== */
- while(*dataptr) {
- dataptr = SiS_SetTrumpBlockLoop(SiS_Pr, dataptr);
- if(!dataptr) return FALSE;
- }
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Trumpion block success\n");
-#endif
- return TRUE;
-}
-#endif
+/* Generic Read/write routines for Chrontel ========================== */
-/* The Chrontel 700x is connected to the 630/730 via
+/* The Chrontel is connected to the 630/730 via
* the 630/730's DDC/I2C port.
*
- * On 630(S)T chipset, the index changed from 0x11 to
- * 0x0a, possibly for working around the DDC problems
+ * On 630(S)T chipset, the index changed from 0x11 to 0x0a,
+ * possibly for working around the DDC problems
*/
-static BOOLEAN
-SiS_SetChReg(SiS_Private *SiS_Pr, USHORT tempbx, USHORT myor)
-{
- USHORT tempah,temp,i;
-
- for(i=0; i<20; i++) { /* Do 20 attempts to write */
- if(i) {
- SiS_SetStop(SiS_Pr);
- SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
- }
- if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
- tempah = SiS_Pr->SiS_DDC_DeviceAddr;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
- if(temp) continue; /* (ERROR: no ack) */
- tempah = tempbx & 0x00FF; /* Write RAB */
- tempah |= myor; /* (700x: set bit 7, see datasheet) */
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
- if(temp) continue; /* (ERROR: no ack) */
- tempah = (tempbx & 0xFF00) >> 8;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write data */
- if(temp) continue; /* (ERROR: no ack) */
- if(SiS_SetStop(SiS_Pr)) continue; /* Set stop condition */
- SiS_Pr->SiS_ChrontelInit = 1;
- return TRUE;
- }
- return FALSE;
-}
-
-#ifdef SIS300
-/* Write Trumpion register */
void
-SiS_SetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx)
+SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
{
- SiS_Pr->SiS_DDC_DeviceAddr = 0xF0; /* DAB (Device Address Byte) */
- SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
- SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
- SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
- SiS_SetChReg(SiS_Pr, tempbx, 0);
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+ SiS_SetCH700x(SiS_Pr,tempbx);
+ else
+ SiS_SetCH701x(SiS_Pr,tempbx);
}
-#endif
/* Write to Chrontel 700x */
/* Parameter is [Data (S15-S8) | Register no (S7-S0)] */
void
SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
{
- SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
+ USHORT tempah,temp,i;
if(!(SiS_Pr->SiS_ChrontelInit)) {
- SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
- SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
- SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
- }
-
- if( (!(SiS_SetChReg(SiS_Pr, tempbx, 0x80))) &&
- (!(SiS_Pr->SiS_ChrontelInit)) ) {
+ SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
+ SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
+ SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
+ SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
+ }
+
+ for(i=0;i<10;i++) { /* Do only 10 attempts to write */
+ /* SiS_SetSwitchDDC2(SiS_Pr); */
+ if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = tempbx & 0x00FF; /* Write RAB */
+ tempah |= 0x80; /* (set bit 7, see datasheet) */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = (tempbx & 0xFF00) >> 8;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write data */
+ if(temp) continue; /* (ERROR: no ack) */
+ if(SiS_SetStop(SiS_Pr)) continue; /* Set stop condition */
+ SiS_Pr->SiS_ChrontelInit = 1;
+ return;
+ }
+
+ /* For 630ST */
+ if(!(SiS_Pr->SiS_ChrontelInit)) {
SiS_Pr->SiS_DDC_Index = 0x0a; /* Bit 7 = SC; Bit 6 = SD */
SiS_Pr->SiS_DDC_Data = 0x80; /* Bitmask in IndexReg for Data */
SiS_Pr->SiS_DDC_Clk = 0x40; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
-
- SiS_SetChReg(SiS_Pr, tempbx, 0x80);
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
+ SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
+
+ for(i=0;i<10;i++) { /* Do only 10 attempts to write */
+ /* SiS_SetSwitchDDC2(SiS_Pr); */
+ if (SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = tempbx & 0x00FF; /* Write RAB */
+ tempah |= 0x80; /* (set bit 7, see datasheet) */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = (tempbx & 0xFF00) >> 8;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write data */
+ if(temp) continue; /* (ERROR: no ack) */
+ if(SiS_SetStop(SiS_Pr)) continue; /* Set stop condition */
+ SiS_Pr->SiS_ChrontelInit = 1;
+ return;
+ }
}
}
@@ -9275,96 +10088,105 @@ SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
void
SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
{
+ USHORT tempah,temp,i;
+
SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
SiS_Pr->SiS_DDC_Data = 0x08; /* Bitmask in IndexReg for Data */
SiS_Pr->SiS_DDC_Clk = 0x04; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
- SiS_SetChReg(SiS_Pr, tempbx, 0);
-}
-void
-SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
-{
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
- SiS_SetCH700x(SiS_Pr,tempbx);
- else
- SiS_SetCH701x(SiS_Pr,tempbx);
-}
-
-static USHORT
-SiS_GetChReg(SiS_Private *SiS_Pr, USHORT myor)
-{
- USHORT tempah,temp,i;
-
- for(i=0; i<20; i++) { /* Do 20 attempts to read */
- if(i) {
- SiS_SetStop(SiS_Pr);
- SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
- }
- if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
- tempah = SiS_Pr->SiS_DDC_DeviceAddr;
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
- if(temp) continue; /* (ERROR: no ack) */
- tempah = SiS_Pr->SiS_DDC_ReadAddr | myor; /* Write RAB (700x: | 0x80) */
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
- if(temp) continue; /* (ERROR: no ack) */
- if (SiS_SetStart(SiS_Pr)) continue; /* Re-start */
- tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01;/* DAB | 0x01 = Read */
- temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* DAB (S0=1=read) */
- if(temp) continue; /* (ERROR: no ack) */
- tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
- if(SiS_SetStop(SiS_Pr)) continue; /* Stop condition */
- SiS_Pr->SiS_ChrontelInit = 1;
- return(tempah);
+ for(i=0;i<10;i++) { /* Do only 10 attempts to write */
+ if (SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = tempbx & 0x00FF;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write RAB */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = (tempbx & 0xFF00) >> 8;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write data */
+ if(temp) continue; /* (ERROR: no ack) */
+ if(SiS_SetStop(SiS_Pr)) continue; /* Set stop condition */
+ return;
}
- return 0xFFFF;
}
-#ifdef SIS300
-/* Read from Trumpion */
+/* Read from Chrontel 70xx */
+/* Parameter is [Register no (S7-S0)] */
USHORT
-SiS_GetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx)
+SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
{
- SiS_Pr->SiS_DDC_DeviceAddr = 0xF0; /* DAB */
- SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
- SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
- SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
- SiS_Pr->SiS_DDC_ReadAddr = tempbx;
- return(SiS_GetChReg(SiS_Pr,0));
+ if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
+ return(SiS_GetCH700x(SiS_Pr,tempbx));
+ else
+ return(SiS_GetCH701x(SiS_Pr,tempbx));
}
-#endif
/* Read from Chrontel 700x */
/* Parameter is [Register no (S7-S0)] */
USHORT
SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
{
- USHORT result;
-
- SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB */
+ USHORT tempah,temp,i;
if(!(SiS_Pr->SiS_ChrontelInit)) {
SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
SiS_Pr->SiS_DDC_Data = 0x02; /* Bitmask in IndexReg for Data */
SiS_Pr->SiS_DDC_Clk = 0x01; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
+ SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB */
}
SiS_Pr->SiS_DDC_ReadAddr = tempbx;
- if( ((result = SiS_GetChReg(SiS_Pr,0x80)) == 0xFFFF) &&
- (!SiS_Pr->SiS_ChrontelInit) ) {
-
- SiS_Pr->SiS_DDC_Index = 0x0a;
- SiS_Pr->SiS_DDC_Data = 0x80;
- SiS_Pr->SiS_DDC_Clk = 0x40;
- SiS_SetupDDCN(SiS_Pr);
-
- result = SiS_GetChReg(SiS_Pr,0x80);
- }
- return(result);
+ for(i=0;i<20;i++) { /* Do only 20 attempts to read */
+ /* SiS_SetSwitchDDC2(SiS_Pr); */
+ if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80; /* Write RAB | 0x80 */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+ if(temp) continue; /* (ERROR: no ack) */
+ if (SiS_SetStart(SiS_Pr)) continue; /* Re-start */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* DAB (S0=1=read) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
+ if (SiS_SetStop(SiS_Pr)) continue; /* Stop condition */
+ SiS_Pr->SiS_ChrontelInit = 1;
+ return(tempah);
+ }
+
+ /* For 630ST */
+ if(!SiS_Pr->SiS_ChrontelInit) {
+ SiS_Pr->SiS_DDC_Index = 0x0a; /* Bit 0 = SC; Bit 1 = SD */
+ SiS_Pr->SiS_DDC_Data = 0x80; /* Bitmask in IndexReg for Data */
+ SiS_Pr->SiS_DDC_Clk = 0x40; /* Bitmask in IndexReg for Clk */
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
+ SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB (Device Address Byte) */
+
+ for(i=0;i<20;i++) { /* Do only 20 attempts to read */
+ /* SiS_SetSwitchDDC2(SiS_Pr); */
+ if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_Pr->SiS_DDC_ReadAddr | 0x80; /* Write RAB | 0x80 */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+ if(temp) continue; /* (ERROR: no ack) */
+ if (SiS_SetStart(SiS_Pr)) continue; /* Re-start */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* DAB (S0=1=read) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
+ if (SiS_SetStop(SiS_Pr)) continue; /* Stop condition */
+ SiS_Pr->SiS_ChrontelInit = 1;
+ return(tempah);
+ }
+ }
+ return(0xFFFF);
}
/* Read from Chrontel 701x */
@@ -9372,26 +10194,32 @@ SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx)
USHORT
SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx)
{
+ USHORT tempah,temp,i;
+
SiS_Pr->SiS_DDC_Index = 0x11; /* Bit 0 = SC; Bit 1 = SD */
SiS_Pr->SiS_DDC_Data = 0x08; /* Bitmask in IndexReg for Data */
SiS_Pr->SiS_DDC_Clk = 0x04; /* Bitmask in IndexReg for Clk */
- SiS_SetupDDCN(SiS_Pr);
+ SiS_Pr->SiS_DDC_DataShift = 0x00;
SiS_Pr->SiS_DDC_DeviceAddr = 0xEA; /* DAB */
-
SiS_Pr->SiS_DDC_ReadAddr = tempbx;
- return(SiS_GetChReg(SiS_Pr,0));
-}
-
-/* Read from Chrontel 70xx */
-/* Parameter is [Register no (S7-S0)] */
-USHORT
-SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx)
-{
- if(SiS_Pr->SiS_IF_DEF_CH70xx == 1)
- return(SiS_GetCH700x(SiS_Pr, tempbx));
- else
- return(SiS_GetCH701x(SiS_Pr, tempbx));
+ for(i=0;i<20;i++) { /* Do only 20 attempts to read */
+ if(SiS_SetStart(SiS_Pr)) continue; /* Set start condition */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr;
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* Write DAB (S0=0=write) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_Pr->SiS_DDC_ReadAddr; /* Write RAB */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah);
+ if(temp) continue; /* (ERROR: no ack) */
+ if (SiS_SetStart(SiS_Pr)) continue; /* Re-start */
+ tempah = SiS_Pr->SiS_DDC_DeviceAddr | 0x01; /* DAB | 0x01 = Read */
+ temp = SiS_WriteDDC2Data(SiS_Pr,tempah); /* DAB (S0=1=read) */
+ if(temp) continue; /* (ERROR: no ack) */
+ tempah = SiS_ReadDDC2Data(SiS_Pr,tempah); /* Read byte */
+ SiS_SetStop(SiS_Pr); /* Stop condition */
+ return(tempah);
+ }
+ return 0xFFFF;
}
/* Our own DDC functions */
@@ -9418,7 +10246,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
SiS_Pr->SiS_DDC_Index = 0x11;
flag = 0xff;
- cr32 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x32);
+ cr32 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x32);
#if 0
if(VBFlags & VB_SISBRIDGE) {
@@ -9463,7 +10291,7 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
} else { /* 315/330 series */
/* here we simplify: 0 = CRT1, 1 = CRT2 (VGA, LCD) */
-
+
if(VBFlags & VB_SISBRIDGE) {
if(myadaptnum == 2) {
myadaptnum = 1;
@@ -9499,8 +10327,6 @@ SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
SiS_Pr->SiS_DDC_Data = 0x02 << temp;
SiS_Pr->SiS_DDC_Clk = 0x01 << temp;
- SiS_SetupDDCN(SiS_Pr);
-
#ifdef TWDEBUG
xf86DrvMsg(0, X_INFO, "DDC Port %x Index %x Shift %d\n",
SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index, temp);
@@ -9545,15 +10371,11 @@ SiS_SendACK(SiS_Private *SiS_Pr, USHORT yesno)
{
SiS_SetSCLKLow(SiS_Pr);
if(yesno) {
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data);
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data, SiS_Pr->SiS_DDC_Data);
} else {
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- 0);
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port, SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data, 0);
}
SiS_SetSCLKHigh(SiS_Pr);
}
@@ -9568,9 +10390,6 @@ SiS_DoProbeDDC(SiS_Private *SiS_Pr)
SiS_SetSwitchDDC2(SiS_Pr);
if(SiS_PrepareDDC(SiS_Pr)) {
SiS_SetStop(SiS_Pr);
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Probe: Prepare failed\n");
-#endif
return(0xFFFF);
}
mask = 0xf0;
@@ -9584,9 +10403,6 @@ SiS_DoProbeDDC(SiS_Private *SiS_Pr)
} else {
failed = TRUE;
ret = 0xFFFF;
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Probe: Read 1 failed\n");
-#endif
}
}
if(failed == FALSE) {
@@ -9596,9 +10412,6 @@ SiS_DoProbeDDC(SiS_Private *SiS_Pr)
if(temp == value) ret = 0;
else {
ret = 0xFFFF;
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Probe: Read 2 failed\n");
-#endif
if(SiS_Pr->SiS_DDC_DeviceAddr == 0xa0) {
if(temp == 0x30) ret = 0;
}
@@ -9681,88 +10494,18 @@ USHORT
SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer)
{
- unsigned char sr1f,cr17=1;
- USHORT result;
-
if(adaptnum > 2) return 0xFFFF;
if(DDCdatatype > 4) return 0xFFFF;
if((!(VBFlags & VB_VIDEOBRIDGE)) && (adaptnum > 0)) return 0xFFFF;
- if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, FALSE) == 0xFFFF) return 0xFFFF;
-
- sr1f = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1f);
- SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1f,0x3f,0x04);
- if(VGAEngine == SIS_300_VGA) {
- cr17 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x17) & 0x80;
- if(!cr17) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x17,0x80);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x01);
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x00,0x03);
- }
- }
- if((sr1f) || (!cr17)) {
- SiS_WaitRetrace1(SiS_Pr);
- SiS_WaitRetrace1(SiS_Pr);
- SiS_WaitRetrace1(SiS_Pr);
- SiS_WaitRetrace1(SiS_Pr);
- }
-
+ if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, TRUE) == 0xFFFF) return 0xFFFF;
if(DDCdatatype == 0) {
- result = SiS_ProbeDDC(SiS_Pr);
+ return(SiS_ProbeDDC(SiS_Pr));
} else {
- result = SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer);
- }
- SiS_SetReg(SiS_Pr->SiS_P3c4,0x1f,sr1f);
- if(VGAEngine == SIS_300_VGA) {
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x17,0x7f,cr17);
+ return(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer));
}
- return result;
}
#ifdef LINUX_XF86
-
-static BOOLEAN
-checkedid1(unsigned char *buffer)
-{
- /* Check header */
- if((buffer[0] != 0x00) ||
- (buffer[1] != 0xff) ||
- (buffer[2] != 0xff) ||
- (buffer[3] != 0xff) ||
- (buffer[4] != 0xff) ||
- (buffer[5] != 0xff) ||
- (buffer[6] != 0xff) ||
- (buffer[7] != 0x00))
- return FALSE;
-
- /* Check EDID version and revision */
- if((buffer[0x12] != 1) || (buffer[0x13] > 4)) return FALSE;
-
- /* Check week of manufacture for sanity */
- if(buffer[0x10] > 53) return FALSE;
-
- /* Check year of manufacture for sanity */
- if(buffer[0x11] > 40) return FALSE;
-
- return TRUE;
-}
-
-static BOOLEAN
-checkedid2(unsigned char *buffer)
-{
- USHORT year = buffer[6] | (buffer[7] << 8);
-
- /* Check EDID version */
- if((buffer[0] & 0xf0) != 0x20) return FALSE;
-
- /* Check week of manufacture for sanity */
- if(buffer[5] > 53) return FALSE;
-
- /* Check year of manufacture for sanity */
- if((year != 0) && ((year < 1990) || (year > 2030))) return FALSE;
-
- return TRUE;
-}
-
/* Sense the LCD parameters (CR36, CR37) via DDC */
/* SiS30x(B) only */
USHORT
@@ -9778,8 +10521,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
for(i=0; i<7; i++) SiS_Pr->CP_DataValid[i] = FALSE;
SiS_Pr->CP_HaveCustomData = FALSE;
SiS_Pr->CP_MaxX = SiS_Pr->CP_MaxY = SiS_Pr->CP_MaxClock = 0;
- SiS_Pr->CP_PreferredX = SiS_Pr->CP_PreferredY = 0;
- SiS_Pr->CP_PreferredIndex = -1;
if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0;
if(pSiS->VBFlags & VB_30xBDH) return 0;
@@ -9790,7 +10531,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
/* Probe supported DA's */
flag = SiS_ProbeDDC(SiS_Pr);
-#ifdef TWDEBUG
+#ifdef TWDEBUG
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
"CRT2 DDC capabilities 0x%x\n", flag);
#endif
@@ -9809,17 +10550,17 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
retry = 2;
do {
if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
- "CRT2: DDC read failed (attempt %d), %s\n",
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
+ "CRT2: DDC read failed (attempt %d), %s\n",
(3-retry), (retry == 1) ? "giving up" : "retrying");
retry--;
if(retry == 0) return 0xFFFF;
} else break;
} while(1);
-
-#ifdef TWDEBUG
+
+#ifdef TWDEBUG
for(i=0; i<256; i+=16) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
buffer[i], buffer[i+1], buffer[i+2], buffer[i+3],
buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7],
@@ -9833,14 +10574,8 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
switch(DDCdatatype) {
case 1: /* Analyze EDID V1 */
/* Catch a few clear cases: */
- if(!(checkedid1(buffer))) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
- "CRT2: EDID corrupt\n");
- return 0;
- }
-
if(!(buffer[0x14] & 0x80)) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
"CRT2: Attached display expects analog input (0x%02x)\n",
buffer[0x14]);
return 0;
@@ -9874,14 +10609,12 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->CP_PreferredY = yres;
switch(xres) {
-#if 0 /* Treat as custom */
case 800:
if(yres == 600) {
paneltype = Panel_800x600;
checkexpand = TRUE;
}
break;
-#endif
case 1024:
if(yres == 768) {
paneltype = Panel_1024x768;
@@ -9899,13 +10632,9 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
paneltype = Panel310_1280x960;
}
} else if(yres == 768) {
- if( ((buffer[0x36] | (buffer[0x37] << 8)) == 8100) &&
- ((buffer[0x39] | ((buffer[0x3a] & 0x0f) << 8)) == (1688 - 1280)) &&
- ((buffer[0x3c] | ((buffer[0x3d] & 0x0f) << 8)) == (802 - 768)) ) {
- paneltype = Panel_1280x768;
- checkexpand = FALSE;
- cr37 |= 0x10;
- }
+ paneltype = Panel_1280x768;
+ checkexpand = FALSE;
+ cr37 |= 0x10;
}
break;
case 1400:
@@ -9919,11 +10648,9 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
#if 0 /* Treat this as custom, as we have no valid timing data yet */
case 1600:
if(pSiS->VGAEngine == SIS_315_VGA) {
- if(pSiS->VBFlags & VB_301C) {
- if(yres == 1200) {
- paneltype = Panel310_1600x1200;
- checkexpand = TRUE;
- }
+ if(yres == 1200) {
+ paneltype = Panel310_1600x1200;
+ checkexpand = TRUE;
}
}
break;
@@ -9937,7 +10664,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
/* What now? There is no digital separate output timing... */
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_WARNING,
"CRT2: Unable to retrieve Sync polarity information\n");
- cr37 |= 0xc0; /* Default */
}
}
@@ -9964,7 +10690,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
};
paneltype = 0;
- SiS_Pr->CP_Supports64048075 = TRUE;
/* Find the maximum resolution */
@@ -10020,21 +10745,20 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->CP_DataValid[i] = TRUE;
/* Sort out invalid timings, interlace and too high clocks */
- if((SiS_Pr->CP_HDisplay[i] & 7) ||
- (SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i]) ||
- (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
- (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
- (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i]) ||
- (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i]) ||
- (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i]) ||
- (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) ||
- (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) ||
- (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
- (((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162500)) ||
- ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108200))) ||
+ if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i]) ||
+ (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
+ (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
+ (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i]) ||
+ (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i]) ||
+ (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i]) ||
+ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) ||
+ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) ||
+ (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
+ ( ((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162000)) ||
+ ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108000)) ) ||
(buffer[base+17] & 0x80)) {
SiS_Pr->CP_DataValid[i] = FALSE;
@@ -10049,18 +10773,9 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
if(yres > SiS_Pr->CP_MaxY) SiS_Pr->CP_MaxY = yres;
if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
- if((SiS_Pr->CP_PreferredX == xres) && (SiS_Pr->CP_PreferredY == yres)) {
- SiS_Pr->CP_PreferredIndex = i;
- }
-
SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
- /* By default we drive the LCD at 75Hz in 640x480 mode; if
- * the panel does not provide this mode, use 60hz
- */
- if(!(buffer[0x23] & 0x04)) SiS_Pr->CP_Supports64048075 = FALSE;
-
/* We must assume the panel can scale, since we have
* no scaling data
*/
@@ -10107,13 +10822,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
case 3: /* Analyze EDID V2 */
case 4:
index = 0;
-
- if(!(checkedid2(buffer))) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
- "CRT2: EDID corrupt\n");
- return 0;
- }
-
if((buffer[0x41] & 0x0f) == 0x03) {
index = 0x42 + 3;
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
@@ -10133,20 +10841,28 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->CP_MaxX = xres = buffer[0x76] | (buffer[0x77] << 8);
SiS_Pr->CP_MaxY = yres = buffer[0x78] | (buffer[0x79] << 8);
switch(xres) {
-#if 0
case 800:
if(yres == 600) {
paneltype = Panel_800x600;
checkexpand = TRUE;
}
break;
-#endif
case 1024:
if(yres == 768) {
paneltype = Panel_1024x768;
checkexpand = TRUE;
}
break;
+ case 1152:
+ if(yres == 768) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ paneltype = Panel300_1152x768;
+ } else {
+ paneltype = Panel310_1152x768;
+ }
+ checkexpand = TRUE;
+ }
+ break;
case 1280:
if(yres == 960) {
if(pSiS->VGAEngine == SIS_315_VGA) {
@@ -10157,8 +10873,11 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
} else if(yres == 1024) {
paneltype = Panel_1280x1024;
checkexpand = TRUE;
+ } else if(yres == 768) {
+ paneltype = Panel_1280x768;
+ checkexpand = FALSE;
+ cr37 |= 0x10;
}
- /* 1280x768 treated as custom here */
break;
case 1400:
if(pSiS->VGAEngine == SIS_315_VGA) {
@@ -10171,11 +10890,9 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
#if 0 /* Treat this one as custom since we have no timing data yet */
case 1600:
if(pSiS->VGAEngine == SIS_315_VGA) {
- if(pSiS->VBFlags & VB_301C) {
- if(yres == 1200) {
- paneltype = Panel310_1600x1200;
- checkexpand = TRUE;
- }
+ if(yres == 1200) {
+ paneltype = Panel310_1600x1200;
+ checkexpand = TRUE;
}
}
break;
@@ -10199,7 +10916,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
if(buffer[0x7e] & 0x20) { /* skip Luminance Table (if provided) */
lumsize = buffer[0x80] & 0x1f;
if(buffer[0x80] & 0x80) lumsize *= 3;
- lumsize++; /* luminance header byte */
+ lumsize++;
index += lumsize;
}
index += (((buffer[0x7e] & 0x1c) >> 2) * 8); /* skip Frequency Ranges */
@@ -10225,12 +10942,9 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
/* Now seek the detailed timing descriptions for custom panels */
if(paneltype == Panel_Custom) {
-
- SiS_Pr->CP_Supports64048075 = TRUE;
-
index += (numcodes * 4);
numcodes = buffer[0x7f] & 0x07;
- for(i=0; i<numcodes; i++, index += 18) {
+ for(i=0; i<numcodes; i++) {
xres = buffer[index+2] | ((buffer[index+4] & 0xf0) << 4);
yres = buffer[index+5] | ((buffer[index+7] & 0xf0) << 4);
@@ -10252,21 +10966,20 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->CP_DataValid[i] = TRUE;
- if((SiS_Pr->CP_HDisplay[i] & 7) ||
- (SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i]) ||
- (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
- (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
- (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i]) ||
- (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i]) ||
- (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i]) ||
- (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i]) ||
- (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) ||
- (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) ||
- (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
- (((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162500)) ||
- ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108200))) ||
+ if((SiS_Pr->CP_HDisplay[i] > SiS_Pr->CP_HSyncStart[i]) ||
+ (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
+ (SiS_Pr->CP_HDisplay[i] >= SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_HSyncStart[i] >= SiS_Pr->CP_HSyncEnd[i]) ||
+ (SiS_Pr->CP_HSyncStart[i] > SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_HSyncEnd[i] > SiS_Pr->CP_HTotal[i]) ||
+ (SiS_Pr->CP_VDisplay[i] > SiS_Pr->CP_VSyncStart[i]) ||
+ (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VSyncEnd[i]) ||
+ (SiS_Pr->CP_VDisplay[i] >= SiS_Pr->CP_VTotal[i]) ||
+ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) ||
+ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) ||
+ (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) ||
+ ( ((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162000)) ||
+ ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108000)) ) ||
(buffer[index + 17] & 0x80)) {
SiS_Pr->CP_DataValid[i] = FALSE;
@@ -10277,10 +10990,6 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
if(SiS_Pr->CP_Clock[i] > SiS_Pr->CP_MaxClock) SiS_Pr->CP_MaxClock = SiS_Pr->CP_Clock[i];
- if((SiS_Pr->CP_MaxX == xres) && (SiS_Pr->CP_MaxY == yres)) {
- SiS_Pr->CP_PreferredIndex = i;
- }
-
SiS_Pr->CP_HSync_P[i] = (buffer[index + 17] & 0x02) ? TRUE : FALSE;
SiS_Pr->CP_VSync_P[i] = (buffer[index + 17] & 0x04) ? TRUE : FALSE;
SiS_Pr->CP_SyncValid[i] = TRUE;
@@ -10326,7 +11035,7 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
" Pixel clock: %3.3fMhz\n", (float)SiS_Pr->CP_Clock[i] / 1000);
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
- " To use this, add \"%dx%d\" to the list of Modes in the Screen section\n",
+ " To use this, add \"%dx%d\" to the list of Modes in the Display section\n",
SiS_Pr->CP_HDisplay[i],
SiS_Pr->CP_VDisplay[i]);
}
@@ -10335,12 +11044,12 @@ SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS)
if(paneltype) {
if(!SiS_Pr->CP_PreferredX) SiS_Pr->CP_PreferredX = SiS_Pr->CP_MaxX;
if(!SiS_Pr->CP_PreferredY) SiS_Pr->CP_PreferredY = SiS_Pr->CP_MaxY;
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x08);
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x36,0xf0,paneltype);
cr37 &= 0xf1;
- SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,0xf3,cr37);
- SiS_Pr->PanelSelfDetected = TRUE;
-#ifdef TWDEBUG
+ cr37 |= 0x02; /* SiS301 */
+ SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x36,0xf0,paneltype);
+ SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,cr37);
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x08);
+#ifdef TWDEBUG
xf86DrvMsgVerb(pSiS->pScrn->scrnIndex, X_PROBED, 3,
"CRT2: [DDC LCD results: 0x%02x, 0x%02x]\n", paneltype, cr37);
#endif
@@ -10357,7 +11066,8 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS)
unsigned char buffer[256];
if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0;
-
+/* if(pSiS->VBFlags & VB_30xBDH) return 0; */
+
if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 2, 0, FALSE) == 0xFFFF) return 0;
SiS_Pr->SiS_DDC_SecAddr = 0x00;
@@ -10374,16 +11084,16 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS)
SiS_Pr->SiS_DDC_DeviceAddr = 0xa0; /* EDID V1 */
DDCdatatype = 1;
} else {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
"Do DDC answer\n");
return 0; /* no DDC support (or no device attached) */
}
-
+
/* Read the entire EDID */
retry = 2;
do {
if(SiS_ReadDDC(SiS_Pr, DDCdatatype, buffer)) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
"CRT2: DDC read failed (attempt %d), %s\n",
(3-retry), (retry == 1) ? "giving up" : "retrying");
retry--;
@@ -10396,15 +11106,10 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS)
*/
switch(DDCdatatype) {
case 1:
- if(!(checkedid1(buffer))) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
- "CRT2: EDID corrupt\n");
- return 0;
- }
if(buffer[0x14] & 0x80) { /* Display uses digital input */
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
"CRT2: Attached display expects digital input\n");
- return 0;
+ return 0;
}
SiS_Pr->CP_Vendor = buffer[9] | (buffer[8] << 8);
SiS_Pr->CP_Product = buffer[10] | (buffer[11] << 8);
@@ -10412,11 +11117,6 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS)
break;
case 3:
case 4:
- if(!(checkedid2(buffer))) {
- xf86DrvMsg(pSiS->pScrn->scrnIndex, X_PROBED,
- "CRT2: EDID corrupt\n");
- return 0;
- }
if( ((buffer[0x41] & 0x0f) != 0x01) && /* Display does not support analog input */
((buffer[0x41] & 0x0f) != 0x02) &&
((buffer[0x41] & 0xf0) != 0x10) &&
@@ -10433,11 +11133,42 @@ SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS)
}
if(foundcrt) {
- SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x10);
+ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x32,0x10);
}
return(0);
}
+/* Generic I2C functions (compliant to i2c library) */
+
+#if 0
+USHORT
+SiS_I2C_GetByte(SiS_Private *SiS_Pr)
+{
+ return(SiS_ReadDDC2Data(SiS_Pr,0));
+}
+
+Bool
+SiS_I2C_PutByte(SiS_Private *SiS_Pr, USHORT data)
+{
+ if(SiS_WriteDDC2Data(SiS_Pr,data)) return FALSE;
+ return TRUE;
+}
+
+Bool
+SiS_I2C_Address(SiS_Private *SiS_Pr, USHORT addr)
+{
+ if(SiS_SetStart(SiS_Pr)) return FALSE;
+ if(SiS_WriteDDC2Data(SiS_Pr,addr)) return FALSE;
+ return TRUE;
+}
+
+void
+SiS_I2C_Stop(SiS_Private *SiS_Pr)
+{
+ SiS_SetStop(SiS_Pr);
+}
+#endif
+
#endif
void
@@ -10450,23 +11181,18 @@ SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh)
SiS_SetCH70xx(SiS_Pr,tempbl);
}
-/* Generic I2C functions for Chrontel & DDC --------- */
+/* Generic I2C functions for Chrontel --------- */
void
SiS_SetSwitchDDC2(SiS_Private *SiS_Pr)
{
SiS_SetSCLKHigh(SiS_Pr);
- SiS_WaitRetrace1(SiS_Pr);
+ /* SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAY); */
+ SiS_WaitRetraceDDC(SiS_Pr);
SiS_SetSCLKLow(SiS_Pr);
- SiS_WaitRetrace1(SiS_Pr);
-}
-
-USHORT
-SiS_ReadDDC1Bit(SiS_Private *SiS_Pr)
-{
- SiS_WaitRetrace1(SiS_Pr);
- return((SiS_GetReg(SiS_Pr->SiS_P3c4,0x11) & 0x02) >> 1);
+ /* SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAY); */
+ SiS_WaitRetraceDDC(SiS_Pr);
}
/* Set I2C start condition */
@@ -10475,15 +11201,11 @@ USHORT
SiS_SetStart(SiS_Private *SiS_Pr)
{
if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF; /* (SC->low) */
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data); /* SD->high */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data); /* SD->high */
if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* SC->high */
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- 0x00); /* SD->low = start condition */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,0x00); /* SD->low = start condition */
if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* (SC->low) */
return 0;
}
@@ -10494,15 +11216,11 @@ USHORT
SiS_SetStop(SiS_Private *SiS_Pr)
{
if(SiS_SetSCLKLow(SiS_Pr)) return 0xFFFF; /* (SC->low) */
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- 0x00); /* SD->low */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,0x00); /* SD->low */
if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* SC->high */
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data); /* SD->high = stop condition */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data); /* SD->high = stop condition */
if(SiS_SetSCLKHigh(SiS_Pr)) return 0xFFFF; /* (SC->high) */
return 0;
}
@@ -10513,19 +11231,15 @@ SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax)
{
USHORT i,flag,temp;
- flag = 0x80;
- for(i=0; i<8; i++) {
+ flag=0x80;
+ for(i=0;i<8;i++) {
SiS_SetSCLKLow(SiS_Pr); /* SC->low */
if(tempax & flag) {
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data); /* Write bit (1) to SD */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data); /* Write bit (1) to SD */
} else {
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- 0x00); /* Write bit (0) to SD */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,0x00); /* Write bit (0) to SD */
}
SiS_SetSCLKHigh(SiS_Pr); /* SC->high */
flag >>= 1;
@@ -10543,12 +11257,10 @@ SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax)
for(i=0; i<8; i++) {
getdata <<= 1;
SiS_SetSCLKLow(SiS_Pr);
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data);
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data);
SiS_SetSCLKHigh(SiS_Pr);
- temp = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
+ temp = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
if(temp & SiS_Pr->SiS_DDC_Data) getdata |= 0x01;
}
return(getdata);
@@ -10557,10 +11269,8 @@ SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax)
USHORT
SiS_SetSCLKLow(SiS_Private *SiS_Pr)
{
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NClk,
- 0x00); /* SetSCLKLow() */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Clk,0x00); /* SetSCLKLow() */
SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
return 0;
}
@@ -10568,25 +11278,33 @@ SiS_SetSCLKLow(SiS_Private *SiS_Pr)
USHORT
SiS_SetSCLKHigh(SiS_Private *SiS_Pr)
{
- USHORT temp, watchdog=1000;
+ USHORT temp,watchdog=1000;
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NClk,
- SiS_Pr->SiS_DDC_Clk); /* SetSCLKHigh() */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Clk,SiS_Pr->SiS_DDC_Clk); /* SetSCLKHigh() */
do {
- temp = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
+ temp = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);
} while((!(temp & SiS_Pr->SiS_DDC_Clk)) && --watchdog);
if (!watchdog) {
#ifdef TWDEBUG
xf86DrvMsg(0, X_INFO, "SetClkHigh failed\n");
-#endif
+#endif
return 0xFFFF;
}
SiS_DDC2Delay(SiS_Pr,SiS_I2CDELAYSHORT);
return 0;
}
+void
+SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime)
+{
+ USHORT i;
+
+ for(i=0; i<delaytime; i++) {
+ SiS_GetReg1(SiS_Pr->SiS_P3c4,0x05);
+ }
+}
+
/* Check I2C acknowledge */
/* Returns 0 if ack ok, non-0 if ack not ok */
USHORT
@@ -10595,12 +11313,10 @@ SiS_CheckACK(SiS_Private *SiS_Pr)
USHORT tempah;
SiS_SetSCLKLow(SiS_Pr); /* (SC->low) */
- SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,
- SiS_Pr->SiS_DDC_Index,
- SiS_Pr->SiS_DDC_NData,
- SiS_Pr->SiS_DDC_Data); /* (SD->high) */
+ SiS_SetRegANDOR(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index,
+ ~SiS_Pr->SiS_DDC_Data,SiS_Pr->SiS_DDC_Data); /* (SD->high) */
SiS_SetSCLKHigh(SiS_Pr); /* SC->high = clock impulse for ack */
- tempah = SiS_GetReg(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index); /* Read SD */
+ tempah = SiS_GetReg1(SiS_Pr->SiS_DDC_Port,SiS_Pr->SiS_DDC_Index);/* Read SD */
SiS_SetSCLKLow(SiS_Pr); /* SC->low = end of clock impulse */
if(tempah & SiS_Pr->SiS_DDC_Data) return(1); /* Ack OK if bit = 0 */
else return(0);
@@ -10614,67 +11330,64 @@ SiS_CheckACK(SiS_Private *SiS_Pr)
#ifdef SIS315H
static USHORT
-GetRAMDACromptr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+GetRAMDACromptr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT romptr;
- if(HwInfo->jChipType < SIS_330) {
- romptr = SISGETROMW(0x128);
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ romptr = ROMAddr[0x128] | (ROMAddr[0x129] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
- romptr = SISGETROMW(0x12a);
+ romptr = ROMAddr[0x12a] | (ROMAddr[0x12b] << 8);
} else {
- romptr = SISGETROMW(0x1a8);
+ romptr = ROMAddr[0x1a8] | (ROMAddr[0x1a9] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301B302B)
- romptr = SISGETROMW(0x1aa);
+ romptr = ROMAddr[0x1aa] | (ROMAddr[0x1ab] << 8);
}
return(romptr);
}
static USHORT
-GetLCDromptr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+GetLCDromptr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT romptr;
- if(HwInfo->jChipType < SIS_330) {
- romptr = SISGETROMW(0x120);
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
- romptr = SISGETROMW(0x122);
+ romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
} else {
- romptr = SISGETROMW(0x1a0);
+ romptr = ROMAddr[0x1a0] | (ROMAddr[0x1a1] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
- romptr = SISGETROMW(0x1a2);
+ romptr = ROMAddr[0x1a2] | (ROMAddr[0x1a3] << 8);
}
return(romptr);
}
static USHORT
-GetTVromptr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+GetTVromptr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT romptr;
- if(HwInfo->jChipType < SIS_330) {
- romptr = SISGETROMW(0x114);
+ if(HwDeviceExtension->jChipType < SIS_330) {
+ romptr = ROMAddr[0x114] | (ROMAddr[0x115] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
- romptr = SISGETROMW(0x11a);
+ romptr = ROMAddr[0x11a] | (ROMAddr[0x11b] << 8);
} else {
- romptr = SISGETROMW(0x194);
+ romptr = ROMAddr[0x194] | (ROMAddr[0x195] << 8);
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)
- romptr = SISGETROMW(0x19a);
+ romptr = ROMAddr[0x19a] | (ROMAddr[0x19b] << 8);
}
return(romptr);
}
static USHORT
-GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
+GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr)
{
USHORT index;
if((IS_SIS650) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
- if(!(SiS_IsNotM650orLater(SiS_Pr, HwInfo))) {
- if((index = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xf0)) {
+ if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) {
+ if((index = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0)) {
index >>= 4;
index *= 3;
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
@@ -10684,9 +11397,9 @@ GetLCDPtrIndexBIOS(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
}
}
- index = SiS_GetBIOSLCDResInfo(SiS_Pr) & 0x0F;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) index -= 5;
- else if(SiS_Pr->SiS_LCDResInfo == Panel_1600x1200) index -= 6;
+ index = SiS_Pr->SiS_LCDResInfo & 0x0F;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) index -= 5;
+ else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) index -= 6;
index--;
index *= 3;
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
@@ -10699,184 +11412,90 @@ GetLCDPtrIndex(SiS_Private *SiS_Pr)
{
USHORT index;
- index = ((SiS_GetBIOSLCDResInfo(SiS_Pr) & 0x0F) - 1) * 3;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
+ index = SiS_Pr->SiS_LCDResInfo & 0x0F;
+ index--;
+ index *= 3;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) index += 2;
else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) index++;
+
return index;
}
+/*
+---------------------------------------------------------
+ GetTVPtrIndex()
+ return 0 : NTSC Enhanced/Standard
+ 1 : NTSC Standard TVSimuMode
+ 2 : PAL Enhanced/Standard
+ 3 : PAL Standard TVSimuMode
+ 4 : HiVision Enhanced/Standard
+ 5 : HiVision Standard TVSimuMode
+---------------------------------------------------------
+*/
static USHORT
GetTVPtrIndex(SiS_Private *SiS_Pr)
{
USHORT index;
index = 0;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) index = 1;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) index = 2;
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToYPbPr525750) index = 0;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) index++;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) index++; /* Hivision TV use PAL */
index <<= 1;
- if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) &&
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
- index++;
- }
+ if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (SiS_Pr->SiS_SetFlag & TVSimuMode))
+ index++;
return index;
}
-static ULONG
-GetOEMTVPtr661_2_GEN(SiS_Private *SiS_Pr, int addme)
-{
- USHORT index = 0, temp = 0;
-
- if(SiS_Pr->SiS_TVMode & TVSetPAL) index = 1;
- if(SiS_Pr->SiS_TVMode & TVSetPALM) index = 2;
- if(SiS_Pr->SiS_TVMode & TVSetPALN) index = 3;
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) index = 6;
- if(SiS_Pr->SiS_TVMode & TVSetNTSC1024) {
- index = 4;
- if(SiS_Pr->SiS_TVMode & TVSetPALM) index++;
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) index = 7;
- }
-
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if((!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
- (SiS_Pr->SiS_TVMode & TVSetTVSimuMode)) {
- index += addme;
- temp++;
- }
- temp += 0x0100;
- }
- return(ULONG)(index | (temp << 16));
-}
-
-static ULONG
-GetOEMTVPtr661_2_OLD(SiS_Private *SiS_Pr)
-{
- return(GetOEMTVPtr661_2_GEN(SiS_Pr, 8));
-}
-
-#if 0
-static ULONG
-GetOEMTVPtr661_2_NEW(SiS_Private *SiS_Pr)
-{
- return(GetOEMTVPtr661_2_GEN(SiS_Pr, 6));
-}
-#endif
-
-static int
-GetOEMTVPtr661(SiS_Private *SiS_Pr)
-{
- int index = 0;
-
- if(SiS_Pr->SiS_TVMode & TVSetPAL) index = 2;
- if(SiS_Pr->SiS_ROMNew) {
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) index = 4;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) index = 6;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) index = 8;
- if(SiS_Pr->SiS_TVMode & TVSetHiVision) index = 10;
- } else {
- if(SiS_Pr->SiS_TVMode & TVSetHiVision) index = 4;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525i) index = 6;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr525p) index = 8;
- if(SiS_Pr->SiS_TVMode & TVSetYPbPr750p) index = 10;
- }
-
- if(SiS_Pr->SiS_TVMode & TVSetTVSimuMode) index++;
-
- return index;
-}
-
static void
-SetDelayComp(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
+SetDelayComp(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr, USHORT ModeNo)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT delay=0,index,myindex,temp,romptr=0;
BOOLEAN dochiptest = TRUE;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x20,0xbf);
- } else {
- SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x35,0x7f);
- }
-
- /* Find delay (from ROM, internal tables, PCI subsystem) */
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) { /* ------------ VGA */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) { /* VGA */
- if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
- romptr = GetRAMDACromptr(SiS_Pr, HwInfo);
- }
- if(romptr) delay = ROMAddr[romptr];
- else {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ romptr = GetRAMDACromptr(SiS_Pr, HwDeviceExtension, ROMAddr);
+ if(!romptr) return;
+ delay = ROMAddr[romptr];
+ } else {
delay = 0x04;
if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
if(IS_SIS650) {
delay = 0x0a;
} else if(IS_SIS740) {
delay = 0x00;
- } else if(HwInfo->jChipType < SIS_330) {
+ } else if(HwDeviceExtension->jChipType < SIS_330) {
delay = 0x0c;
} else {
delay = 0x0c;
}
- } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- delay = 0x00;
}
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1)
+ delay = 0x00;
}
- } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD|SetCRT2ToLCDA)) { /* ---------- LCD/LCDA */
+ } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { /* LCD */
BOOLEAN gotitfrompci = FALSE;
- /* Could we detect a PDC for LCD or did we get a user-defined? If yes, use it */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- if(SiS_Pr->PDC != -1) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((SiS_Pr->PDC >> 1) & 0x0f));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((SiS_Pr->PDC & 0x01) << 7));
- return;
- }
- } else {
- if(SiS_Pr->PDCA != -1) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((SiS_Pr->PDCA << 3) & 0xf0));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((SiS_Pr->PDCA & 0x01) << 6));
- return;
- }
- }
-
- /* Custom Panel? */
-
- if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) {
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- delay = 0x00;
- if((SiS_Pr->PanelXRes <= 1280) && (SiS_Pr->PanelYRes <= 1024)) {
- delay = 0x20;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,delay);
- } else {
- delay = 0x0c;
- if(SiS_Pr->SiS_VBType & VB_SIS301C) delay = 0x03;
- else if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(IS_SIS740) delay = 0x01;
- else delay = 0x03;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,delay);
- }
- return;
- }
+ if(HwDeviceExtension->pdc) return;
/* This is a piece of typical SiS crap: They code the OEM LCD
- * delay into the code, at no defined place in the BIOS.
+ * delay into the code, at none defined place in the BIOS.
* We now have to start doing a PCI subsystem check here.
*/
switch(SiS_Pr->SiS_CustomT) {
case CUT_COMPAQ1280:
case CUT_COMPAQ12802:
- if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) {
gotitfrompci = TRUE;
dochiptest = FALSE;
delay = 0x03;
@@ -10884,178 +11503,159 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
break;
case CUT_CLEVO1400:
case CUT_CLEVO14002:
- gotitfrompci = TRUE;
- dochiptest = FALSE;
- delay = 0x02;
+ /* if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) { */
+ gotitfrompci = TRUE;
+ dochiptest = FALSE;
+ delay = 0x02;
+ /* } */
break;
case CUT_CLEVO1024:
case CUT_CLEVO10242:
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
gotitfrompci = TRUE;
dochiptest = FALSE;
delay = 0x33;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2D,delay);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);
delay &= 0x0f;
}
break;
}
- /* Could we find it through the PCI ID? If no, use ROM or table */
-
if(!gotitfrompci) {
- index = GetLCDPtrIndexBIOS(SiS_Pr, HwInfo);
+ index = GetLCDPtrIndexBIOS(SiS_Pr, HwDeviceExtension, BaseAddr);
myindex = GetLCDPtrIndex(SiS_Pr);
- if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
-
- if(SiS_IsNotM650orLater(SiS_Pr, HwInfo)) {
-
- if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
- /* Always use the second pointer on 650; some BIOSes */
- /* still carry old 301 data at the first location */
- /* romptr = SISGETROMW(0x120); */
- /* if(SiS_Pr->SiS_VBType & VB_SIS302LV) */
- romptr = SISGETROMW(0x122);
- if(!romptr) return;
- delay = ROMAddr[(romptr + index)];
- } else {
- delay = SiS310_LCDDelayCompensation_650301LV[myindex];
- }
-
+ if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { /* 650+30xLV */
+ if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+#if 0 /* Always use the second pointer on 650; some BIOSes */
+ /* still carry old 301 data at the first location */
+ romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+#endif
+ romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8);
+ if(!romptr) return;
+ delay = ROMAddr[(romptr + index)];
+ } else {
+ delay = SiS310_LCDDelayCompensation_650301B[myindex];
+#if 0
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+ delay = SiS310_LCDDelayCompensation_650301B[myindex];
+#endif
+ }
} else {
-
delay = SiS310_LCDDelayCompensation_651301LV[myindex];
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV))
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
delay = SiS310_LCDDelayCompensation_651302LV[myindex];
-
}
-
- } else if(SiS_Pr->SiS_UseROM &&
- (!(SiS_Pr->SiS_ROMNew)) &&
- (SiS_Pr->SiS_LCDResInfo != Panel_1280x1024) &&
- (SiS_Pr->SiS_LCDResInfo != Panel_1280x768) &&
- (SiS_Pr->SiS_LCDResInfo != Panel_1280x960)) {
-
- /* Data for 1280x1024 wrong in 301B BIOS */
- romptr = GetLCDromptr(SiS_Pr, HwInfo);
- if(!romptr) return;
- delay = ROMAddr[(romptr + index)];
-
- } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
-
- if(IS_SIS740) delay = 0x03;
- else delay = 0x00;
-
- } else {
-
- delay = SiS310_LCDDelayCompensation_301[myindex];
- if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) {
- if(IS_SIS740) delay = 0x01;
- else delay = SiS310_LCDDelayCompensation_650301LV[myindex];
- } else if(SiS_Pr->SiS_VBType & VB_SIS301C) {
- if(IS_SIS740) delay = 0x01; /* ? */
- else delay = 0x03;
- } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) {
- if(IS_SIS740) delay = 0x01;
- else delay = SiS310_LCDDelayCompensation_3xx301B[myindex];
- }
-
+ } else {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM && /* 315, 330, 740, 650+301B */
+ (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) {
+ romptr = GetLCDromptr(SiS_Pr, HwDeviceExtension, ROMAddr);
+ if(!romptr) return;
+ delay = ROMAddr[(romptr + index)];
+ } else {
+ delay = SiS310_LCDDelayCompensation_301[myindex];
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+#if 0 /* This data is (like the one in the BIOS) wrong. */
+ if(IS_SIS550650740660) {
+ delay = SiS310_LCDDelayCompensation_650301B[myindex];
+ } else {
+#endif
+ delay = SiS310_LCDDelayCompensation_3xx301B[myindex];
+#if 0
+ }
+#endif
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(IS_SIS650) {
+ delay = SiS310_LCDDelayCompensation_LVDS650[myindex];
+ } else {
+ delay = SiS310_LCDDelayCompensation_LVDS740[myindex];
+ }
+ }
+ }
}
-
- } /* got it from PCI */
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,((delay << 4) & 0xf0));
- dochiptest = FALSE;
}
- } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) { /* ------------ TV */
+ } else { /* TV */
index = GetTVPtrIndex(SiS_Pr);
if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
-
- if(SiS_IsNotM650orLater(SiS_Pr,HwInfo)) {
-
- if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
- /* Always use the second pointer on 650; some BIOSes */
- /* still carry old 301 data at the first location */
- /* romptr = SISGETROMW(0x114); */
- /* if(SiS_Pr->SiS_VBType & VB_SIS302LV) */
- romptr = SISGETROMW(0x11a);
- if(!romptr) return;
- delay = ROMAddr[romptr + index];
-
- } else {
-
- delay = SiS310_TVDelayCompensation_301B[index];
-
- }
-
- } else {
-
- switch(SiS_Pr->SiS_CustomT) {
- case CUT_COMPAQ1280:
- case CUT_COMPAQ12802:
- case CUT_CLEVO1400:
- case CUT_CLEVO14002:
- delay = 0x02;
- dochiptest = FALSE;
- break;
- case CUT_CLEVO1024:
- case CUT_CLEVO10242:
- delay = 0x03;
- dochiptest = FALSE;
- break;
- default:
- delay = SiS310_TVDelayCompensation_651301LV[index];
- if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
- delay = SiS310_TVDelayCompensation_651302LV[index];
- }
- }
- }
-
- } else if((SiS_Pr->SiS_UseROM) && (!(SiS_Pr->SiS_ROMNew))) {
-
- romptr = GetTVromptr(SiS_Pr, HwInfo);
- if(!romptr) return;
- delay = ROMAddr[romptr + index];
-
- } else if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
-
- delay = SiS310_TVDelayCompensation_LVDS[index];
-
+ if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+#if 0 /* Always use the second pointer on 650; some BIOSes */
+ /* still carry old 301 data at the first location */
+ romptr = ROMAddr[0x114] | (ROMAddr[0x115] << 8);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+#endif
+ romptr = ROMAddr[0x11a] | (ROMAddr[0x11b] << 8);
+ if(!romptr) return;
+ delay = ROMAddr[romptr + index];
+ } else {
+ delay = SiS310_TVDelayCompensation_301B[index];
+#if 0
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+ delay = SiS310_TVDelayCompensation_301B[index];
+#endif
+ }
+ } else {
+ switch(SiS_Pr->SiS_CustomT) {
+ case CUT_COMPAQ1280:
+ case CUT_COMPAQ12802:
+ case CUT_CLEVO1400:
+ case CUT_CLEVO14002:
+ delay = 0x02;
+ dochiptest = FALSE;
+ break;
+ case CUT_CLEVO1024:
+ case CUT_CLEVO10242:
+ delay = 0x03;
+ dochiptest = FALSE;
+ break;
+ default:
+ delay = SiS310_TVDelayCompensation_651301LV[index];
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV)
+ delay = SiS310_TVDelayCompensation_651302LV[index];
+ }
+ }
} else {
-
- delay = SiS310_TVDelayCompensation_301[index];
- if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- if(IS_SIS740) {
- delay = SiS310_TVDelayCompensation_740301B[index];
- /* LV: use 301 data? BIOS bug? */
- } else {
- delay = SiS310_TVDelayCompensation_301B[index];
- if(SiS_Pr->SiS_VBType & VB_SIS301C) delay = 0x02;
- }
- }
-
- }
-
- if(SiS_LCDAEnabled(SiS_Pr, HwInfo)) {
- delay &= 0x0f;
- dochiptest = FALSE;
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ romptr = GetTVromptr(SiS_Pr, HwDeviceExtension, ROMAddr);
+ if(!romptr) return;
+ delay = ROMAddr[romptr + index];
+ } else {
+ delay = SiS310_TVDelayCompensation_301[index];
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ if(IS_SIS740)
+ delay = SiS310_TVDelayCompensation_740301B[index];
+ else
+ delay = SiS310_TVDelayCompensation_301B[index];
+ }
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1)
+ delay = SiS310_TVDelayCompensation_LVDS[index];
+ }
}
- } else return;
-
- /* Write delay */
-
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && dochiptest) {
+ }
- temp = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4;
- if(temp == 8) { /* 1400x1050 BIOS (COMPAL) */
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
+ } else {
+ if(IS_SIS650 && (SiS_Pr->SiS_IF_DEF_CH70xx != 0)) {
+ delay <<= 4;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,delay);
+ } else {
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
+ }
+ }
+ } else {
+ if(dochiptest && IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) {
+ temp = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4;
+ if(temp == 8) { /* 1400x1050 BIOS (ECS) */
delay &= 0x0f;
delay |= 0xb0;
} else if(temp == 6) {
@@ -11064,67 +11664,37 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo)
} else if(temp > 7) { /* 1280x1024 BIOS (which one?) */
delay = 0x35;
}
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2D,delay);
-
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay);
} else {
-
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
-
- }
-
- } else { /* LVDS */
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
- } else {
- if(IS_SIS650 && (SiS_Pr->SiS_IF_DEF_CH70xx != 0)) {
- delay <<= 4;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,delay);
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0xF0,delay);
- }
}
-
}
-
}
static void
-SetAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT index,temp,temp1,romptr=0;
+ USHORT index,temp,romptr=0;
- if(SiS_Pr->SiS_TVMode & (TVSetYPbPr750p|TVSetYPbPr525p)) return;
+ temp = GetTVPtrIndex(SiS_Pr);
+ temp >>= 1; /* 0: NTSC, 1: PAL, 2: HiTV */
if(ModeNo<=0x13)
index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
else
index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
- temp = GetTVPtrIndex(SiS_Pr);
- temp >>= 1; /* 0: NTSC/YPbPr, 1: PAL, 2: HiTV */
- temp1 = temp;
-
- if(SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
- if(HwInfo->jChipType >= SIS_661) {
- temp1 = GetOEMTVPtr661(SiS_Pr);
- temp1 >>= 1;
- romptr = SISGETROMW(0x260);
- if(HwInfo->jChipType >= SIS_760) {
- romptr = SISGETROMW(0x360);
- }
- } else if(HwInfo->jChipType >= SIS_330) {
- romptr = SISGETROMW(0x192);
- } else {
- romptr = SISGETROMW(0x112);
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ romptr = ROMAddr[0x112] | (ROMAddr[0x113] << 8);
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ romptr = ROMAddr[0x192] | (ROMAddr[0x193] << 8);
}
}
if(romptr) {
- temp1 <<= 1;
- temp = ROMAddr[romptr + temp1 + index];
+ temp <<= 1;
+ temp = ROMAddr[romptr + temp + index];
} else {
temp = SiS310_TVAntiFlick1[temp][index];
}
@@ -11134,37 +11704,29 @@ SetAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
}
static void
-SetEdgeEnhance(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetEdgeEnhance(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT index,temp,temp1,romptr=0;
+ USHORT index,temp,romptr=0;
- temp = temp1 = GetTVPtrIndex(SiS_Pr) >> 1; /* 0: NTSC/YPbPr, 1: PAL, 2: HiTV */
+ temp = GetTVPtrIndex(SiS_Pr);
+ temp >>= 1; /* 0: NTSC, 1: PAL, 2: HiTV */
- if(ModeNo <= 0x13)
+ if(ModeNo<=0x13)
index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
else
index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
- if(SiS_Pr->SiS_UseROM && (!(SiS_Pr->SiS_ROMNew))) {
- if(HwInfo->jChipType >= SIS_661) {
- romptr = SISGETROMW(0x26c);
- if(HwInfo->jChipType >= SIS_760) {
- romptr = SISGETROMW(0x36c);
- }
- temp1 = GetOEMTVPtr661(SiS_Pr);
- temp1 >>= 1;
- } else if(HwInfo->jChipType >= SIS_330) {
- romptr = SISGETROMW(0x1a4);
- } else {
- romptr = SISGETROMW(0x124);
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ romptr = ROMAddr[0x124] | (ROMAddr[0x125] << 8);
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ romptr = ROMAddr[0x1a4] | (ROMAddr[0x1a5] << 8);
}
}
if(romptr) {
- temp1 <<= 1;
- temp = ROMAddr[romptr + temp1 + index];
+ temp <<= 1;
+ temp = ROMAddr[romptr + temp + index];
} else {
temp = SiS310_TVEdge1[temp][index];
}
@@ -11173,62 +11735,90 @@ SetEdgeEnhance(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
}
static void
-SetYFilter(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetYFilter(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
USHORT index, temp, i, j;
+ UCHAR OutputSelect = *SiS_Pr->pSiS_OutputSelect;
- if(ModeNo <= 0x13) {
- index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
+ temp = GetTVPtrIndex(SiS_Pr);
+ temp >>= 1; /* 0: NTSC, 1: PAL, 2: HiTV */
+
+ if (ModeNo<=0x13) {
+ index = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex;
} else {
- index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
+ index = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
}
- temp = GetTVPtrIndex(SiS_Pr) >> 1; /* 0: NTSC/YPbPr, 1: PAL, 2: HiTV */
-
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) temp = 1; /* NTSC-J uses PAL */
- else if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 3; /* PAL-M */
- else if(SiS_Pr->SiS_TVMode & TVSetPALN) temp = 4; /* PAL-N */
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) temp = 1; /* HiVision uses PAL */
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) temp = 1; /* Hivision TV uses PAL */
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- for(i=0x35, j=0; i<=0x38; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
- }
- for(i=0x48; i<=0x4A; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
- }
+ for(i=0x35, j=0; i<=0x38; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
+ }
+ for(i=0x48; i<=0x4A; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter2[temp][index][j]);
+ }
} else {
- for(i=0x35, j=0; i<=0x38; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter1[temp][index][j]);
- }
+ for(i=0x35, j=0; i<=0x38; i++, j++){
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVYFilter1[temp][index][j]);
+ }
+ }
+
+ if(ROMAddr && SiS_Pr->SiS_UseROM) {
+ OutputSelect = ROMAddr[0xf3];
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ OutputSelect = ROMAddr[0x11b];
+ }
+ }
+ if(OutputSelect & EnablePALMN) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+ temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38);
+ temp &= (EnablePALM | EnablePALN);
+ if(temp == EnablePALM) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ for(i=0x35, j=0; i<=0x38; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALMFilter2[index][j]);
+ }
+ for(i=0x48; i<=0x4A; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALMFilter2[index][j]);
+ }
+ } else {
+ for(i=0x35, j=0; i<=0x38; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALMFilter[index][j]);
+ }
+ }
+ }
+ /* PALN : Is this data correct? */
+ if(temp == EnablePALN) {
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
+ for(i=0x35, j=0; i<=0x38; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALNFilter2[index][j]);
+ }
+ for(i=0x48, j=0; i<=0x4A; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALNFilter2[index][j]);
+ }
+ } else {
+ for(i=0x35, j=0; i<=0x38; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_PALNFilter[index][j]);
+ }
+ }
+ }
+ }
}
}
static void
-SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT index,temp,i,j,resinfo,romptr=0;
- ULONG lindex;
+ USHORT index,temp,temp1,i,j,resinfo,romptr=0;
if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return;
- /* NTSC-J data not in BIOS, and already set in SetGroup2 */
- if(SiS_Pr->SiS_TVMode & TVSetNTSCJ) return;
-
- if((HwInfo->jChipType >= SIS_661) || SiS_Pr->SiS_ROMNew) {
- lindex = GetOEMTVPtr661_2_OLD(SiS_Pr) & 0xffff;
- lindex <<= 2;
- for(j=0, i=0x31; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS661_TVPhase[lindex + j]);
- }
- return;
- }
-
- /* PAL-M, PAL-N not in BIOS, and already set in SetGroup2 */
- if(SiS_Pr->SiS_TVMode & (TVSetPALM | TVSetPALN)) return;
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38); /* if PALM/N not set */
+ temp1 &= (EnablePALM | EnablePALN);
+ if(temp1) return;
if(ModeNo<=0x13) {
resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
@@ -11240,20 +11830,20 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
/* 0: NTSC Graphics, 1: NTSC Text, 2: PAL Graphics,
* 3: PAL Text, 4: HiTV Graphics 5: HiTV Text
*/
- if(SiS_Pr->SiS_UseROM) {
- romptr = SISGETROMW(0x116);
- if(HwInfo->jChipType >= SIS_330) {
- romptr = SISGETROMW(0x196);
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
}
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- romptr = SISGETROMW(0x11c);
- if(HwInfo->jChipType >= SIS_330) {
- romptr = SISGETROMW(0x19c);
- }
- if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (!(SiS_Pr->SiS_TVMode & TVSetTVSimuMode))) {
- romptr = SISGETROMW(0x116);
- if(HwInfo->jChipType >= SIS_330) {
- romptr = SISGETROMW(0x196);
+ romptr = ROMAddr[0x11c] | (ROMAddr[0x11d] << 8);
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ romptr = ROMAddr[0x19c] | (ROMAddr[0x19d] << 8);
+ }
+ if((SiS_Pr->SiS_VBInfo & SetInSlaveMode) && (!(SiS_Pr->SiS_SetFlag & TVSimuMode))) {
+ romptr = ROMAddr[0x116] | (ROMAddr[0x117] << 8);
+ if(HwDeviceExtension->jChipType >= SIS_330) {
+ romptr = ROMAddr[0x196] | (ROMAddr[0x197] << 8);
}
}
}
@@ -11261,258 +11851,58 @@ SetPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
if(romptr) {
romptr += (temp << 2);
for(j=0, i=0x31; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
}
} else {
index = temp % 2;
temp >>= 1; /* 0:NTSC, 1:PAL, 2:HiTV */
for(j=0, i=0x31; i<=0x34; i++, j++) {
if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV))
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
- else if((!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_TVMode & TVSetTVSimuMode))
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr2[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
+ else if((!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_SetFlag & TVSimuMode))
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr2[temp][index][j]);
else
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
- }
- }
-
- if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (!(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision))) {
- if((!(SiS_Pr->SiS_TVMode & (TVSetPAL | TVSetYPbPr525p | TVSetYPbPr750p))) && (ModeNo > 0x13)) {
- if((resinfo == SIS_RI_640x480) ||
- (resinfo == SIS_RI_800x600)) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x31,0x21);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x32,0xf0);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x33,0xf5);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x34,0x7f);
- } else if(resinfo == SIS_RI_1024x768) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x31,0x1e);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x32,0x8b);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x33,0xfb);
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x34,0x7b);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS310_TVPhaseIncr1[temp][index][j]);
+ }
+ }
+
+ if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { /* 650/301LV: (VB_SIS301LV | VB_SIS302LV)) */
+ if((!(SiS_Pr->SiS_VBInfo & SetPALTV)) && (ModeNo > 0x13)) {
+ if(resinfo == SIS_RI_640x480) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+ } else if (resinfo == SIS_RI_800x600) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x21);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0xf0);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xf5);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7f);
+ } else if (resinfo == SIS_RI_1024x768) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x31,0x1e);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x32,0x8b);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x33,0xfb);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x34,0x7b);
}
}
}
}
void
-SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- SetDelayComp(SiS_Pr,HwInfo,ModeNo);
+ SetDelayComp(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo);
if(SiS_Pr->UseCustomMode) return;
- if((SiS_Pr->SiS_VBType & VB_SISVB) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) {
- SetAntiFlicker(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- SetPhaseIncr(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- SetYFilter(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- if(SiS_Pr->SiS_VBType & VB_SIS301) {
- SetEdgeEnhance(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- }
- }
-}
-
-static void
-SetDelayComp661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo,
- USHORT ModeIdIndex, USHORT RTI)
-{
- USHORT delay = 0, romptr = 0, index;
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
-
- if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToRAMDAC)))
- return;
-
- /* 1. New ROM: VGA2 and LCD/LCDA-Pass1:1 */
-
- if(SiS_Pr->SiS_ROMNew) {
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) ||
- ((SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
- (SiS_Pr->SiS_LCDInfo & LCDPass11))) {
- index = 25;
- if(SiS_Pr->UseCustomMode) {
- index = SiS_Pr->CSRClock;
- } else if(ModeNo > 0x13) {
- index = SiS_GetVCLK2Ptr(SiS_Pr,ModeNo,ModeIdIndex,RTI,HwInfo);
- index = SiS_Pr->SiS_VCLKData[index].CLOCK;
- }
- if(index < 25) index = 25;
- index = ((index / 25) - 1) << 1;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD)) index++;
- romptr = SISGETROMW(0x104); /* 0x4ae */
- delay = ROMAddr[romptr + index];
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD)) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((delay >> 1) & 0x0f));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((delay & 0x01) << 7));
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((delay << 3) & 0xf0));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((delay & 0x01) << 6));
- }
- return;
- }
- }
-
- /* 2. Old ROM: VGA2 and LCD/LCDA-Pass 1:1 */
-
- if(SiS_Pr->UseCustomMode) delay = 0x04;
- else if(ModeNo <= 0x13) delay = 0x04;
- else delay = (SiS_Pr->SiS_RefIndex[RTI].Ext_PDC >> 4);
- delay |= (delay << 8);
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
-
- /* 3. TV */
-
- index = GetOEMTVPtr661(SiS_Pr);
- if(SiS_Pr->SiS_ROMNew) {
- romptr = SISGETROMW(0x106); /* 0x4ba */
- delay = ROMAddr[romptr + index];
- } else {
- delay = 0x04;
- }
-
- } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
-
- /* 4. LCD, LCDA (for new ROM only LV and non-Pass 1:1) */
-
- if( (SiS_Pr->SiS_LCDResInfo != Panel_Custom) &&
- ((romptr = GetLCDStructPtr661_2(SiS_Pr, HwInfo))) ) {
-
- /* For LV, the BIOS must know about the correct value */
- delay = ROMAddr[romptr + 0x0d]; /* LCD */
- delay |= (ROMAddr[romptr + 0x0c] << 8); /* LCDA */
-
- } else {
-
- /* TMDS: Set our own, since BIOS has no idea - TODO: Find out about values */
- if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) {
- if((SiS_Pr->PanelXRes <= 1024) && (SiS_Pr->PanelYRes <= 768)) {
- delay = 0x0404;
- } else if((SiS_Pr->PanelXRes <= 1280) && (SiS_Pr->PanelYRes <= 1024)) {
- delay = 0x0404;
- } else if((SiS_Pr->PanelXRes <= 1400) && (SiS_Pr->PanelYRes <= 1050)) {
- delay = 0x1004;
- } else
- delay = 0x0000;
- }
-
- }
-
- /* Override by detected or user-set values */
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->PDC != -1)) {
- delay = SiS_Pr->PDC & 0x1f;
- }
- if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) && (SiS_Pr->PDCA != -1)) {
- delay = (SiS_Pr->PDCA & 0x1f) << 8;
- }
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- delay >>= 8;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0x0f,((delay << 3) & 0xf0));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x20,0xbf,((delay & 0x01) << 6));
- } else {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2d,0xf0,((delay >> 1) & 0x0f));
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x35,0x7f,((delay & 0x01) << 7));
- }
-}
-
-static void
-SetCRT2SyncDither661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo, USHORT RTI)
-{
- USHORT infoflag;
- UCHAR temp;
-
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
-
- if(ModeNo <= 0x13) {
- infoflag = SiS_GetRegByte(SiS_Pr->SiS_P3ca+2);
- } else if(SiS_Pr->UseCustomMode) {
- infoflag = SiS_Pr->CInfoFlag;
- } else {
- infoflag = SiS_Pr->SiS_RefIndex[RTI].Ext_InfoFlag;
- }
- infoflag &= 0xc0;
-
- temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x37);
- if(SiS_Pr->SiS_LCDInfo & LCDPass11) {
- temp &= 0x3f;
- temp |= infoflag;
- } else {
- if(temp & 0x20) infoflag = temp;
- }
- if(temp & 0x01) infoflag |= 0x01;
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- temp = 0x0c;
- if(infoflag & 0x01) temp ^= 0x14; /* BIOS: 18, wrong */
- temp |= (infoflag >> 6);
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x1a,0xe0,temp);
- } else {
- temp = 0;
- if(infoflag & 0x01) temp |= 0x80;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1a,0x7f,temp);
- temp = 0x30;
- if(infoflag & 0x01) temp = 0x20;
- infoflag &= 0xc0;
- temp |= infoflag;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0f,temp);
- }
-
- }
-}
-
-static void
-SetPanelParms661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo)
-{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT romptr, temp1, temp2;
-
- if(SiS_Pr->SiS_VBType & (VB_SIS301LV | VB_SIS302LV | VB_SIS302ELV)) {
- if(SiS_Pr->LVDSHL != -1) {
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,SiS_Pr->LVDSHL);
- }
- }
-
- if(SiS_Pr->SiS_ROMNew) {
-
- if((romptr = GetLCDStructPtr661_2(SiS_Pr, HwInfo))) {
- if(SiS_Pr->SiS_VBType & (VB_SIS301LV | VB_SIS302LV | VB_SIS302ELV)) {
- temp1 = (ROMAddr[romptr] & 0x03) | 0x0c;
- temp2 = 0xfc;
- if(SiS_Pr->LVDSHL != -1) {
- temp1 &= 0xfc;
- temp2 = 0xf3;
- }
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,temp2,temp1);
- }
- temp1 = (ROMAddr[romptr + 1] & 0x80) >> 1;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x0d,0xbf,temp1);
- }
-
- }
-}
-
-void
-SiS_OEM661Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex, USHORT RRTI)
-{
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
-
- SetDelayComp661(SiS_Pr,HwInfo,ModeNo,ModeIdIndex,RRTI);
-
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- SetCRT2SyncDither661(SiS_Pr,HwInfo,ModeNo,RRTI);
- SetPanelParms661(SiS_Pr,HwInfo);
- }
-
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SetPhaseIncr(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- SetYFilter(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- SetAntiFlicker(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- if(SiS_Pr->SiS_VBType & VB_SIS301) {
- SetEdgeEnhance(SiS_Pr,HwInfo,ModeNo,ModeIdIndex);
- }
- }
+ if( (SiS_Pr->SiS_IF_DEF_LVDS == 0) && (SiS_Pr->SiS_VBInfo & SetCRT2ToTV) ) {
+ SetAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+ SetPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+ SetYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+ if(!(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) {
+ SetEdgeEnhance(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,ModeIdIndex);
+ }
}
}
@@ -11524,8 +11914,8 @@ SiS_OEM661Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
* pray that we have a backup...
*/
void
-SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- PSIS_HW_INFO HwInfo)
+SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension)
{
USHORT tempcl,tempch,tempbl,tempbh,tempbx,tempax,temp;
USHORT resinfo,modeflag;
@@ -11538,7 +11928,7 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
}
- if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
if(SiS_Pr->UseCustomMode) return;
switch(SiS_Pr->SiS_CustomT) {
@@ -11550,15 +11940,15 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
if(ModeNo <= 0x13) {
- resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo;
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
} else {
- resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO;
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
}
if(IS_SIS650) {
- if(!(SiS_GetReg(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) {
+ if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) {
if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x02);
} else {
@@ -11568,8 +11958,7 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- /* Maybe all panels? */
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { /* Maybe all panels? */
if(SiS_Pr->LVDSHL == -1) {
SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
}
@@ -11579,18 +11968,17 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
if(SiS_Pr->SiS_CustomT == CUT_CLEVO10242) {
if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { /* Maybe all panels? */
if(SiS_Pr->LVDSHL == -1) {
- /* Maybe all panels? */
SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
}
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- tempch = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
+ tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) >> 4;
if(tempch == 3) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x25);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
}
}
return;
@@ -11599,123 +11987,133 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
}
if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
#ifdef SET_EMI
- if(SiS_Pr->SiS_VBType & (VB_SIS302LV | VB_SIS302ELV)) {
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x2a,0x00);
- SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x30,0x0c);
- SiS_SetReg(SiS_Pr->SiS_Part4Port,0x34,0x10);
+ if(SiS_Pr->SiS_VBType & VB_SIS302LV) {
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10);
}
#endif
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { /* Maybe all panels? */
if(SiS_Pr->LVDSHL == -1) {
/* Maybe ACER only? */
SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01);
}
}
- tempch = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4;
+ tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36);
+ tempch &= 0xf0;
+ tempch >>= 4;
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
- if(SiS_Pr->SiS_LCDResInfo == Panel_1400x1050) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1f,0x76);
- } else if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
- if(tempch == 0x03) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x25);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
- }
+ if(tempch == 0x03) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
+ }
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1f,0x76);
+ } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
if((SiS_Pr->Backup == TRUE) && (SiS_Pr->Backup_Mode == ModeNo)) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,SiS_Pr->Backup_16);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,SiS_Pr->Backup_17);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,SiS_Pr->Backup_18);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,SiS_Pr->Backup_19);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1a,SiS_Pr->Backup_1a);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,SiS_Pr->Backup_1b);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,SiS_Pr->Backup_1c);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,SiS_Pr->Backup_1d);
- } else if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) { /* 1.10.8w */
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,0x90);
- if(ModeNo <= 0x13) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x11);
- if((resinfo == 0) || (resinfo == 2)) return;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x18);
- if((resinfo == 1) || (resinfo == 3)) return;
- }
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02);
- if((ModeNo > 0x13) && (resinfo == SIS_RI_1024x768)) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x02); /* 1.10.7u */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,SiS_Pr->Backup_16);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,SiS_Pr->Backup_17);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,SiS_Pr->Backup_18);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,SiS_Pr->Backup_19);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1a,SiS_Pr->Backup_1a);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,SiS_Pr->Backup_1b);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,SiS_Pr->Backup_1c);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,SiS_Pr->Backup_1d);
+ } else if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) { /* From 1.10.8w */
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,0x90);
+ if(ModeNo <= 0x13) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x11);
+ if((resinfo == 0) || (resinfo == 2)) return;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x18);
+ if((resinfo == 1) || (resinfo == 3)) return;
+ }
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02);
+ if((ModeNo > 0x13) && (resinfo == SIS_RI_1024x768)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02); /* 1.10.7u */
#if 0
- tempbx = 806; /* 0x326 */ /* other older BIOSes */
- tempbx--;
- temp = tempbx & 0xff;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,temp);
- temp = (tempbx >> 8) & 0x03;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1d,0xf8,temp);
-#endif
- }
- } else if(ModeNo <= 0x13) {
- if(ModeNo <= 1) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x70);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xff);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x48);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x12);
- }
- if(!(modeflag & HalfDCLK)) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,0x20);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,0x1a);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,0x28);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x17,0x00);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x4c);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xdc);
- if(ModeNo == 0x12) {
- switch(tempch) {
- case 0:
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x95);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x19,0xdc);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1a,0x10);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x95);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x48);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x12);
- break;
- case 2:
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,0x95);
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x48);
- break;
- case 3:
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1b,0x95);
- break;
- }
- }
- }
+ tempbx = 806; /* 0x326 */ /* other older BIOSes */
+ tempbx--;
+ temp = tempbx & 0xff;
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,temp);
+ temp = (tempbx >> 8) & 0x03;
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x1d,0xf8,temp);
+#endif
+ }
+ } else {
+ if(ModeNo <= 0x13) {
+ if(ModeNo <= 1) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x70);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0xff);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x48);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x12);
+ }
+ if(!(modeflag & HalfDCLK)) {
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x14,0x20);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x15,0x1a);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x16,0x28);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x17,0x00);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x4c);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0xdc);
+ if(ModeNo == 0x12) {
+ switch(tempch) {
+ case 0:
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x95);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x19,0xdc);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1a,0x10);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x95);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x48);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x12);
+ break;
+ case 2:
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x95);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x48);
+ break;
+ case 3:
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x95);
+ break;
+ }
+ }
+ }
+ }
}
}
} else {
- tempcl = tempbh = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x01);
+ tempcl = tempbh = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x01);
tempcl &= 0x0f;
tempbh &= 0x70;
tempbh >>= 4;
- tempbl = SiS_GetReg(SiS_Pr->SiS_Part2Port,0x04);
+ tempbl = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x04);
tempbx = (tempbh << 8) | tempbl;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
if((resinfo == SIS_RI_1024x768) || (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD))) {
if(SiS_Pr->SiS_SetFlag & LCDVESATiming) {
- tempbx = 770;
+ tempbx = 770;
} else {
- if(tempbx > 770) tempbx = 770;
- if(SiS_Pr->SiS_VGAVDE < 600) {
- tempax = 768 - SiS_Pr->SiS_VGAVDE;
- tempax >>= 4; /* 1.10.7w; 1.10.6s: 3; */
- if(SiS_Pr->SiS_VGAVDE <= 480) tempax >>= 4; /* 1.10.7w; 1.10.6s: < 480; >>=1; */
- tempbx -= tempax;
- }
+ if(tempbx > 770) tempbx = 770;
+ if(SiS_Pr->SiS_VGAVDE < 600) {
+ tempax = 768 - SiS_Pr->SiS_VGAVDE;
+ tempax >>= 4; /* From 1.10.7w; 1.10.6s: 3; */
+ if(SiS_Pr->SiS_VGAVDE <= 480) tempax >>= 4; /* From 1.10.7w; 1.10.6s: < 480; >>=1; */
+ tempbx -= tempax;
+ }
}
} else return;
}
+#if 0
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) {
+ }
+#endif
temp = tempbx & 0xff;
- SiS_SetReg(SiS_Pr->SiS_Part2Port,0x04,temp);
- temp = ((tempbx & 0xff00) >> 4) | tempcl;
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x04,temp);
+ temp = (tempbx & 0xff00) >> 8;
+ temp <<= 4;
+ temp |= tempcl;
SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x01,0x80,temp);
}
}
@@ -11723,24 +12121,25 @@ SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
#endif
+
/* ================= SiS 300 O.E.M. ================== */
#ifdef SIS300
void
-SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex, USHORT RefTabIndex)
+SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefTabIndex)
{
USHORT crt2crtc=0, modeflag, myindex=0;
UCHAR temp;
int i;
if(ModeNo <= 0x13) {
- modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
- crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
+ modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag;
+ crt2crtc = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
} else {
- modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
- crt2crtc = SiS_Pr->SiS_RefIndex[RefTabIndex].Ext_CRT2CRTC;
+ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
+ crt2crtc = SiS_Pr->SiS_RefIndex[RefTabIndex].Ext_CRT2CRTC;
}
crt2crtc &= 0x3f;
@@ -11752,7 +12151,7 @@ SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
if(modeflag & HalfDCLK) myindex = 1;
- if(SiS_Pr->SiS_SetFlag & LowModeTests) {
+ if(SiS_LowModeStuff(SiS_Pr,ModeNo,HwDeviceExtension)) {
for(i=0; i<7; i++) {
if(barco_p1[myindex][crt2crtc][i][0]) {
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,
@@ -11762,19 +12161,46 @@ SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
}
}
}
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x00);
if(temp & 0x80) {
- temp = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x18);
+ temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x18);
temp++;
- SiS_SetReg(SiS_Pr->SiS_Part1Port,0x18,temp);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,temp);
}
}
}
+#if 0 /* Not used */
+static USHORT
+GetRevisionID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension)
+{
+ ULONG temp1;
+#ifndef LINUX_XF86
+ ULONG base;
+#endif
+ USHORT temp2 = 0;
+
+ if((HwDeviceExtension->jChipType==SIS_540)||
+ (HwDeviceExtension->jChipType==SIS_630)||
+ (HwDeviceExtension->jChipType==SIS_730)) {
+#ifndef LINUX_XF86
+ base = 0x80000008;
+ OutPortLong(base,0xcf8);
+ temp1 = InPortLong(0xcfc);
+#else
+ temp1=pciReadLong(0x00000000, 0x08);
+#endif
+ temp1 &= 0x000000FF;
+ temp2 = (USHORT)(temp1);
+ return temp2;
+ }
+ return 0;
+}
+#endif
+
static USHORT
-GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, int Flag)
+GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr, int Flag)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT tempbx=0,romptr=0;
UCHAR customtable300[] = {
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
@@ -11785,21 +12211,24 @@ GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, int Flag)
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
- if(HwInfo->jChipType == SIS_300) {
+ if(HwDeviceExtension->jChipType == SIS_300) {
- tempbx = (SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) & 0x0f) - 2;
+ tempbx = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) - 2;
if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx += 4;
- if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) {
if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 3;
}
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(ROMAddr[0x235] & 0x80) {
tempbx = SiS_Pr->SiS_LCDTypeInfo;
if(Flag) {
- romptr = SISGETROMW(0x255);
- if(romptr) tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
- else tempbx = customtable300[SiS_Pr->SiS_LCDTypeInfo];
- if(tempbx == 0xFF) return 0xFFFF;
+ romptr = ROMAddr[0x255] | (ROMAddr[0x256] << 8);
+ if(romptr) {
+ tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
+ } else {
+ tempbx = customtable300[SiS_Pr->SiS_LCDTypeInfo];
+ }
+ if(tempbx == 0xFF) return 0xFFFF;
}
tempbx <<= 1;
if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx++;
@@ -11809,18 +12238,21 @@ GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, int Flag)
} else {
if(Flag) {
- if(SiS_Pr->SiS_UseROM) {
- romptr = SISGETROMW(0x255);
- if(romptr) tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
- else tempbx = 0xff;
- } else {
- tempbx = customtable630[SiS_Pr->SiS_LCDTypeInfo];
- }
- if(tempbx == 0xFF) return 0xFFFF;
- tempbx <<= 2;
- if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempbx += 2;
- if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
- return tempbx;
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ romptr = ROMAddr[0x255] | (ROMAddr[0x256] << 8);
+ if(romptr) {
+ tempbx = ROMAddr[romptr + SiS_Pr->SiS_LCDTypeInfo];
+ } else {
+ tempbx = 0xff;
+ }
+ } else {
+ tempbx = customtable630[SiS_Pr->SiS_LCDTypeInfo];
+ }
+ if(tempbx == 0xFF) return 0xFFFF;
+ tempbx <<= 2;
+ if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempbx += 2;
+ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++;
+ return tempbx;
}
tempbx = SiS_Pr->SiS_LCDTypeInfo << 2;
if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) tempbx += 2;
@@ -11830,18 +12262,17 @@ GetOEMLCDPtr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, int Flag)
}
static void
-SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT index,temp,romptr=0;
- if(SiS_Pr->SiS_LCDResInfo == Panel_Custom) return;
+ if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return;
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x237] & 0x01)) return;
if(!(ROMAddr[0x237] & 0x02)) return;
- romptr = SISGETROMW(0x24b);
+ romptr = ROMAddr[0x24b] | (ROMAddr[0x24c] << 8);
}
/* The Panel Compensation Delay should be set according to tables
@@ -11851,87 +12282,86 @@ SetOEMLCDDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
* Thus we don't set this if the user select a custom pdc or if
* we otherwise detected a valid pdc.
*/
- if(SiS_Pr->PDC != -1) return;
+ if(HwDeviceExtension->pdc) return;
- temp = GetOEMLCDPtr(SiS_Pr,HwInfo, 0);
+ temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 0);
if(SiS_Pr->UseCustomMode)
index = 0;
else
index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_LCDDelayIndex;
- if(HwInfo->jChipType != SIS_300) {
- if(romptr) {
- romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
- romptr += index;
- temp = ROMAddr[romptr];
- } else {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- temp = SiS300_OEMLCDDelay2[temp][index];
- } else {
- temp = SiS300_OEMLCDDelay3[temp][index];
- }
- }
- } else {
- if(SiS_Pr->SiS_UseROM && (ROMAddr[0x235] & 0x80)) {
+ if(HwDeviceExtension->jChipType != SIS_300) {
if(romptr) {
romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
romptr += index;
temp = ROMAddr[romptr];
} else {
- temp = SiS300_OEMLCDDelay5[temp][index];
- }
- } else {
- if(SiS_Pr->SiS_UseROM) {
- romptr = ROMAddr[0x249] | (ROMAddr[0x24a] << 8);
- if(romptr) {
- romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
- romptr += index;
- temp = ROMAddr[romptr];
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ temp = SiS300_OEMLCDDelay2[temp][index];
} else {
- temp = SiS300_OEMLCDDelay4[temp][index];
- }
- } else {
- temp = SiS300_OEMLCDDelay4[temp][index];
+ temp = SiS300_OEMLCDDelay3[temp][index];
+ }
}
- }
+ } else {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM && (ROMAddr[0x235] & 0x80)) {
+ if(romptr) {
+ romptr += (temp * 2);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
+ romptr += index;
+ temp = ROMAddr[romptr];
+ } else {
+ temp = SiS300_OEMLCDDelay5[temp][index];
+ }
+ } else {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
+ romptr = ROMAddr[0x249] | (ROMAddr[0x24a] << 8);
+ if(romptr) {
+ romptr += (temp * 2);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
+ romptr += index;
+ temp = ROMAddr[romptr];
+ } else {
+ temp = SiS300_OEMLCDDelay4[temp][index];
+ }
+ } else {
+ temp = SiS300_OEMLCDDelay4[temp][index];
+ }
+ }
}
temp &= 0x3c;
SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp); /* index 0A D[6:4] */
}
static void
-SetOEMLCDData(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetOEMLCDData(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
#if 0 /* Unfinished; Data table missing */
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT index,temp;
- if((SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x237] & 0x01)) return;
if(!(ROMAddr[0x237] & 0x04)) return;
/* No rom pointer in BIOS header! */
}
- temp = GetOEMLCDPtr(SiS_Pr,HwInfo, 1);
+ temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 1);
if(temp = 0xFFFF) return;
index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDHIndex;
for(i=0x14, j=0; i<=0x17; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,i,SiS300_LCDHData[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,i,SiS300_LCDHData[temp][index][j]);
}
SiS_SetRegANDOR(SiS_SiS_Part1Port,0x1a, 0xf8, (SiS300_LCDHData[temp][index][j] & 0x07));
index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDVIndex;
- SiS_SetReg(SiS_SiS_Part1Port,0x18, SiS300_LCDVData[temp][index][0]);
+ SiS_SetReg1(SiS_SiS_Part1Port,0x18, SiS300_LCDVData[temp][index][0]);
SiS_SetRegANDOR(SiS_SiS_Part1Port,0x19, 0xF0, SiS300_LCDVData[temp][index][1]);
SiS_SetRegANDOR(SiS_SiS_Part1Port,0x1A, 0xC7, (SiS300_LCDVData[temp][index][2] & 0x38));
for(i=0x1b, j=3; i<=0x1d; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part1Port,i,SiS300_LCDVData[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part1Port,i,SiS300_LCDVData[temp][index][j]);
}
#endif
}
@@ -11943,28 +12373,27 @@ GetOEMTVPtr(SiS_Private *SiS_Pr)
index = 0;
if(!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) index += 4;
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
if(SiS_Pr->SiS_VBInfo & SetCRT2ToSCART) index += 2;
- else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) index += 3;
- else if(SiS_Pr->SiS_TVMode & TVSetPAL) index += 1;
+ else if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) index += 3;
+ else if(SiS_Pr->SiS_VBInfo & SetPALTV) index += 1;
} else {
- if(SiS_Pr->SiS_TVMode & TVSetCHOverScan) index += 2;
- if(SiS_Pr->SiS_TVMode & TVSetPAL) index += 1;
+ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) index += 2;
+ if(SiS_Pr->SiS_VBInfo & SetPALTV) index += 1;
}
return index;
}
static void
-SetOEMTVDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetOEMTVDelay(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT index,temp,romptr=0;
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x238] & 0x01)) return;
if(!(ROMAddr[0x238] & 0x02)) return;
- romptr = SISGETROMW(0x241);
+ romptr = ROMAddr[0x241] | (ROMAddr[0x242] << 8);
}
temp = GetOEMTVPtr(SiS_Pr);
@@ -11973,31 +12402,31 @@ SetOEMTVDelay(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
if(romptr) {
romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
romptr += index;
temp = ROMAddr[romptr];
} else {
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
temp = SiS300_OEMTVDelay301[temp][index];
} else {
temp = SiS300_OEMTVDelayLVDS[temp][index];
}
}
temp &= 0x3c;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x13,~0x3C,temp); /* index 0A D[6:4] */
}
static void
-SetOEMAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex)
+SetOEMAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT index,temp,romptr=0;
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x238] & 0x01)) return;
if(!(ROMAddr[0x238] & 0x04)) return;
- romptr = SISGETROMW(0x243);
+ romptr = ROMAddr[0x243] | (ROMAddr[0x244] << 8);
}
temp = GetOEMTVPtr(SiS_Pr);
@@ -12006,31 +12435,28 @@ SetOEMAntiFlicker(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
if(romptr) {
romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
romptr += index;
temp = ROMAddr[romptr];
} else {
temp = SiS300_OEMTVFlicker[temp][index];
}
temp &= 0x70;
- SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0A,0x8F,temp);
+ SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x0A,0x8F,temp); /* index 0A D[6:4] */
}
static void
-SetOEMPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetOEMPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
USHORT index,i,j,temp,romptr=0;
- if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) return;
-
- if(SiS_Pr->SiS_TVMode & (TVSetNTSC1024 | TVSetNTSCJ | TVSetPALM | TVSetPALN)) return;
+ if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVisionTV) return;
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x238] & 0x01)) return;
if(!(ROMAddr[0x238] & 0x08)) return;
- romptr = SISGETROMW(0x245);
+ romptr = ROMAddr[0x245] | (ROMAddr[0x246] << 8);
}
temp = GetOEMTVPtr(SiS_Pr);
@@ -12038,120 +12464,101 @@ SetOEMPhaseIncr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVPhaseIndex;
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
- for(i=0x31, j=0; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Phase2[temp][index][j]);
- }
+ for(i=0x31, j=0; i<=0x34; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS300_Phase2[temp][index][j]);
+ }
} else {
- if(romptr) {
- romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
- romptr += (index * 4);
- for(i=0x31, j=0; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
- }
- } else {
- for(i=0x31, j=0; i<=0x34; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Phase1[temp][index][j]);
- }
- }
+ if(romptr) {
+ romptr += (temp * 2);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
+ romptr += (index * 4);
+ for(i=0x31, j=0; i<=0x34; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
+ }
+ } else {
+ for(i=0x31, j=0; i<=0x34; i++, j++) {
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS300_Phase1[temp][index][j]);
+ }
+ }
}
}
static void
-SetOEMYFilter(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex)
+SetOEMYFilter(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex)
{
- UCHAR *ROMAddr = HwInfo->pjVirtualRomBase;
- USHORT index,temp,i,j,romptr=0;
+ USHORT index,temp,temp1,i,j,romptr=0;
- if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSCART | SetCRT2ToHiVision | SetCRT2ToYPbPr525750)) return;
+ if(SiS_Pr->SiS_VBInfo & (SetCRT2ToSCART | SetCRT2ToHiVisionTV)) return;
- if(SiS_Pr->SiS_UseROM) {
+ if((ROMAddr) && SiS_Pr->SiS_UseROM) {
if(!(ROMAddr[0x238] & 0x01)) return;
if(!(ROMAddr[0x238] & 0x10)) return;
- romptr = SISGETROMW(0x247);
+ romptr = ROMAddr[0x247] | (ROMAddr[0x248] << 8);
}
temp = GetOEMTVPtr(SiS_Pr);
- if(SiS_Pr->SiS_TVMode & TVSetPALM) temp = 8;
- else if(SiS_Pr->SiS_TVMode & TVSetPALN) temp = 9;
- /* NTSCJ uses NTSC filters */
-
index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].VB_TVYFilterIndex;
+ if(HwDeviceExtension->jChipType > SIS_300) {
+ if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x01) {
+ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x35);
+ if(temp1 & (EnablePALM | EnablePALN)) {
+ temp = 8;
+ if(!(temp1 & EnablePALM)) temp = 9;
+ }
+ }
+ }
if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) {
for(i=0x35, j=0; i<=0x38; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
}
for(i=0x48; i<=0x4A; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS300_Filter2[temp][index][j]);
}
} else {
- if((romptr) && (!(SiS_Pr->SiS_TVMode & (TVSetPALM|TVSetPALN)))) {
+ if(romptr) {
romptr += (temp * 2);
- romptr = SISGETROMW(romptr);
+ romptr = ROMAddr[romptr] | (ROMAddr[romptr + 1] << 8);
romptr += (index * 4);
for(i=0x35, j=0; i<=0x38; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,ROMAddr[romptr + j]);
}
} else {
for(i=0x35, j=0; i<=0x38; i++, j++) {
- SiS_SetReg(SiS_Pr->SiS_Part2Port,i,SiS300_Filter1[temp][index][j]);
+ SiS_SetReg1(SiS_Pr->SiS_Part2Port,i,SiS300_Filter1[temp][index][j]);
}
}
}
}
-static USHORT
-SiS_SearchVBModeID(SiS_Private *SiS_Pr, USHORT *ModeNo)
-{
- USHORT ModeIdIndex;
- UCHAR VGAINFO = SiS_Pr->SiS_VGAINFO;
-
- if(*ModeNo <= 5) *ModeNo |= 1;
-
- for(ModeIdIndex=0; ; ModeIdIndex++) {
- if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == *ModeNo) break;
- if(SiS_Pr->SiS_VBModeIDTable[ModeIdIndex].ModeID == 0xFF) return 0;
- }
-
- if(*ModeNo != 0x07) {
- if(*ModeNo > 0x03) return ModeIdIndex;
- if(VGAINFO & 0x80) return ModeIdIndex;
- ModeIdIndex++;
- }
-
- if(VGAINFO & 0x10) ModeIdIndex++; /* 400 lines */
- /* else 350 lines */
- return ModeIdIndex;
-}
-
void
-SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex, USHORT RefTableIndex)
+SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefTableIndex)
{
USHORT OEMModeIdIndex=0;
if(!SiS_Pr->UseCustomMode) {
- OEMModeIdIndex = SiS_SearchVBModeID(SiS_Pr,&ModeNo);
+ OEMModeIdIndex = SiS_SearchVBModeID(SiS_Pr,ROMAddr,&ModeNo);
if(!(OEMModeIdIndex)) return;
}
if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) {
- SetOEMLCDDelay(SiS_Pr, HwInfo, ModeNo, OEMModeIdIndex);
- if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
- SetOEMLCDData(SiS_Pr, HwInfo, ModeNo, OEMModeIdIndex);
- }
+ SetOEMLCDDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
+ SetOEMLCDData(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ }
}
if(SiS_Pr->UseCustomMode) return;
if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {
- SetOEMTVDelay(SiS_Pr, HwInfo, ModeNo,OEMModeIdIndex);
- if(SiS_Pr->SiS_VBType & VB_SISVB) {
- SetOEMAntiFlicker(SiS_Pr, HwInfo, ModeNo, OEMModeIdIndex);
- SetOEMPhaseIncr(SiS_Pr, HwInfo, ModeNo, OEMModeIdIndex);
- SetOEMYFilter(SiS_Pr, HwInfo, ModeNo, OEMModeIdIndex);
- }
+ SetOEMTVDelay(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ if(SiS_Pr->SiS_IF_DEF_LVDS == 0) {
+ SetOEMAntiFlicker(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ SetOEMPhaseIncr(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ SetOEMYFilter(SiS_Pr,HwDeviceExtension,BaseAddr,ROMAddr,ModeNo,OEMModeIdIndex);
+ }
}
}
#endif
diff --git a/src/init301.h b/src/init301.h
index 9e86ee1..a8442fe 100644
--- a/src/init301.h
+++ b/src/init301.h
@@ -1,52 +1,36 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.h,v 1.23 2003/09/09 10:29:01 twini Exp $ */
/*
* Data and prototypes for init301.c
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
#ifndef _INIT301_
@@ -81,36 +65,36 @@
#endif
#endif
-const UCHAR SiS_YPbPrTable[3][64] = {
+const UCHAR SiS_HiVisionTable[3][64] = {
{
- 0x17,0x1d,0x03,0x09,0x05,0x06,0x0c,0x0c,
- 0x94,0x49,0x01,0x0a,0x06,0x0d,0x04,0x0a,
- 0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x1b,
- 0x0c,0x50,0x00,0x97,0x00,0xda,0x4a,0x17,
- 0x7d,0x05,0x4b,0x00,0x00,0xe2,0x00,0x02,
- 0x03,0x0a,0x65,0x9d,0x08,0x92,0x8f,0x40,
- 0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x53,
- 0x00,0x40,0x44,0x00,0xdb,0x02,0x3b,0x00
+ 0x17, 0x1d, 0x03, 0x09, 0x05, 0x06, 0x0c, 0x0c,
+ 0x94, 0x49, 0x01, 0x0a, 0x06, 0x0d, 0x04, 0x0a,
+ 0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x1b,
+ 0x0c, 0x50, 0x00, 0x97, 0x00, 0xd4, 0x4a, 0x17,
+ 0x7d, 0x05, 0x4b, 0x00, 0x00, 0xe2, 0x00, 0x02,
+ 0x03, 0x0a, 0x65, 0x9d, 0x08, 0x92, 0x8f, 0x40,
+ 0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x53,
+ 0x00, 0x40, 0x44, 0x00, 0xdb, 0x02, 0x3b, 0x00
},
{
- 0x1d,0x11,0x06,0x09,0x0b,0x0c,0x0c,0x0c,
- 0x98,0x0a,0x01,0x0d,0x06,0x0d,0x04,0x0a,
- 0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x3f,
- 0x0c,0x50,0xb2,0x9f,0x16,0x59,0x4f,0x13,
- 0xad,0x11,0xad,0x1d,0x40,0x8a,0x3d,0xb8,
- 0x51,0x5e,0x60,0x49,0x7d,0x92,0x0f,0x40,
- 0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x4b,
- 0x43,0x41,0x11,0x00,0xfc,0xff,0x32,0x00
+ 0x1d, 0x1d, 0x06, 0x09, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x98, 0x0a, 0x01, 0x0d, 0x06, 0x0d, 0x04, 0x0a,
+ 0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
+ 0x0c, 0x50, 0xb2, 0x2e, 0x16, 0xb5, 0xf4, 0x03,
+ 0x7d, 0x11, 0x7d, 0xea, 0x30, 0x36, 0x18, 0x96,
+ 0x21, 0x0a, 0x58, 0xee, 0x42, 0x92, 0x0f, 0x40,
+ 0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x04, 0xf3,
+ 0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
},
{
- 0x13,0x1d,0xe8,0x09,0x09,0xed,0x0c,0x0c,
- 0x98,0x0a,0x01,0x0c,0x06,0x0d,0x04,0x0a,
- 0x06,0x14,0x0d,0x04,0x0a,0x00,0x85,0x3f,
- 0xed,0x50,0x70,0x9f,0x16,0x59,0x2b,0x13,
- 0x27,0x0b,0x27,0xfc,0x30,0x27,0x1c,0xb0,
- 0x4b,0x4b,0x6f,0x2f,0x63,0x92,0x0f,0x40,
- 0x60,0x80,0x14,0x90,0x8c,0x60,0x14,0x27,
- 0x00,0x40,0x11,0x00,0xfc,0xff,0x32,0x00
+ 0x13, 0x1d, 0xe8, 0x09, 0x09, 0xed, 0x0c, 0x0c,
+ 0x98, 0x0a, 0x01, 0x0c, 0x06, 0x0d, 0x04, 0x0a,
+ 0x06, 0x14, 0x0d, 0x04, 0x0a, 0x00, 0x85, 0x3f,
+ 0xed, 0x50, 0x70, 0x9f, 0x16, 0x59, 0x2b, 0x13,
+ 0x27, 0x0b, 0x27, 0xfc, 0x30, 0x27, 0x1c, 0xb0,
+ 0x4b, 0x4b, 0x6f, 0x2f, 0x63, 0x92, 0x0f, 0x40,
+ 0x60, 0x80, 0x14, 0x90, 0x8c, 0x60, 0x14, 0x2a,
+ 0x00, 0x40, 0x11, 0x00, 0xfc, 0xff, 0x32, 0x00
}
};
@@ -136,217 +120,242 @@ const UCHAR SiS_HiTVGroup3_2[] = {
0x18, 0x1d, 0x23, 0x28, 0x4c, 0xaa, 0x01
};
-/* 301C / 302ELV (?) extended Part2 TV registers */
-
-static const UCHAR SiS_Part2CLVX_1[] = {
- 0x00,0x00,
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E
-};
-
-static const UCHAR SiS_Part2CLVX_2[] = {
- 0x00,0x00,
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E
-};
-
-static const UCHAR SiS_Part2CLVX_3[] = { /* NTSC, 525i, 525p */
- 0xE0,0x01,
- 0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x19,0x0A,0x7D,
- 0x7F,0x19,0x0C,0x7C,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
- 0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
- 0x7D,0x0C,0x19,0x7E,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
- 0x58,0x02,
- 0x07,0x14,0x07,0x7E,0x06,0x14,0x09,0x7D,0x05,0x14,0x0A,0x7D,0x04,0x13,0x0B,0x7E,
- 0x03,0x13,0x0C,0x7E,0x02,0x12,0x0D,0x7F,0x01,0x12,0x0E,0x7F,0x01,0x11,0x0F,0x7F,
- 0x00,0x10,0x10,0x00,0x7F,0x0F,0x11,0x01,0x7F,0x0E,0x12,0x01,0x7E,0x0D,0x12,0x03,
- 0x7E,0x0C,0x13,0x03,0x7E,0x0B,0x13,0x04,0x7E,0x0A,0x14,0x04,0x7D,0x09,0x14,0x06,
- 0x00,0x03,
- 0x09,0x0F,0x09,0x7F,0x08,0x0F,0x09,0x00,0x07,0x0F,0x0A,0x00,0x06,0x0F,0x0A,0x01,
- 0x06,0x0E,0x0B,0x01,0x05,0x0E,0x0B,0x02,0x04,0x0E,0x0C,0x02,0x04,0x0D,0x0C,0x03,
- 0x03,0x0D,0x0D,0x03,0x02,0x0C,0x0D,0x05,0x02,0x0C,0x0E,0x04,0x01,0x0B,0x0E,0x06,
- 0x01,0x0B,0x0E,0x06,0x00,0x0A,0x0F,0x07,0x00,0x0A,0x0F,0x07,0x00,0x09,0x0F,0x08,
- 0xFF,0xFF
-};
-
-static const UCHAR SiS_Part2CLVX_4[] = { /* PAL */
- 0x58,0x02,
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
- 0x00,0x03,
- 0x08,0x12,0x08,0x7E,0x07,0x12,0x09,0x7E,0x06,0x12,0x0A,0x7E,0x05,0x11,0x0B,0x7F,
- 0x04,0x11,0x0C,0x7F,0x03,0x11,0x0C,0x00,0x03,0x10,0x0D,0x00,0x02,0x0F,0x0E,0x01,
- 0x01,0x0F,0x0F,0x01,0x01,0x0E,0x0F,0x02,0x00,0x0D,0x10,0x03,0x7F,0x0C,0x11,0x04,
- 0x7F,0x0C,0x11,0x04,0x7F,0x0B,0x11,0x05,0x7E,0x0A,0x12,0x06,0x7E,0x09,0x12,0x07,
- 0x40,0x02,
- 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
- 0xFF,0xFF
-};
-
-static const UCHAR SiS_Part2CLVX_5[] = { /* 750p */
- 0x00,0x03,
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
- 0xFF,0xFF
-};
-
-static const UCHAR SiS_Part2CLVX_6[] = { /* 1080i */
- 0x00,0x04,
- 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x1D /* 0x7D? */ ,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
- 0xFF,0xFF,
-};
+extern BOOLEAN SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *RomAddr, USHORT *);
+BOOLEAN SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr);
+BOOLEAN SiS_IsNotM650or651(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_CRT2IsLCD(SiS_Private *SiS_Pr, USHORT BaseAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr);
+USHORT SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+BOOLEAN SiS_AdjustCRT2Rate(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT MODEIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *i,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SaveCRT2Info(SiS_Private *SiS_Pr, USHORT ModeNo);
+void SiS_GetCRT2Data(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_GetCRT2DataLVDS(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#ifdef SIS315H
+void SiS_GetCRT2PtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex);
+#endif
+void SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index, USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_GetCRT2Data301(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+USHORT SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_GetCRT2ResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_GetRAMDAC2DATA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_GetCRT2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCRT2ModeRegs(SiS_Private *SiS_Pr, USHORT BaseAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO );
+void SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr);
+void SiS_SetCRT2Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+USHORT SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+USHORT SiS_GetColorDepth(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+USHORT SiS_GetMCLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+USHORT SiS_CalcDelayVB(SiS_Private *SiS_Pr);
+USHORT SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCRT2Sync(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetRegANDOR(USHORT Port,USHORT Index,USHORT DataAND,USHORT DataOR);
+void SiS_SetRegOR(USHORT Port,USHORT Index,USHORT DataOR);
+void SiS_SetRegAND(USHORT Port,USHORT Index,USHORT DataAND);
+USHORT SiS_GetVGAHT2(SiS_Private *SiS_Pr);
+void SiS_Set300Part2Regs(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
+ USHORT BaseAddr, USHORT ModeNo);
+void SiS_SetGroup2(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetGroup3(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetGroup4(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetGroup5(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex);
+void SiS_FinalizeLCD(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCRT2VCLK(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_EnableCRT2(SiS_Private *SiS_Pr);
+void SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension, int checkcrt2mode);
+BOOLEAN SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+BOOLEAN SiS_BridgeIsEnable(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO);
+BOOLEAN SiS_BridgeInSlave(SiS_Private *SiS_Pr);
+void SiS_SetTVSystem(SiS_Private *SiS_Pr);
+void SiS_LongWait(SiS_Private *SiS_Pr);
+USHORT SiS_GetQueueConfig(SiS_Private *SiS_Pr);
+void SiS_VBLongWait(SiS_Private *SiS_Pr);
+USHORT SiS_GetVCLKLen(SiS_Private *SiS_Pr, UCHAR *ROMAddr);
+void SiS_WaitVBRetrace(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_WaitRetrace1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_WaitRetrace2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_WaitRetraceDDC(SiS_Private *SiS_Pr);
+void SiS_SetCRT2ECLK(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#ifdef SIS315H
+void SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+#endif
+void SiS_SetTPData(SiS_Private *SiS_Pr);
+void SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
+void SiS_ModCRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCHTVReg(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex);
+void SiS_GetCHTVRegPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex);
+void SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
+USHORT SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
+void SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
+USHORT SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
+void SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
+USHORT SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
+#ifdef LINUX_XF86
+USHORT SiS_I2C_GetByte(SiS_Private *SiS_Pr);
+Bool SiS_I2C_PutByte(SiS_Private *SiS_Pr, USHORT data);
+Bool SiS_I2C_Address(SiS_Private *SiS_Pr, USHORT addr);
+void SiS_I2C_Stop(SiS_Private *SiS_Pr);
+#endif
+void SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
+void SiS_SetSwitchDDC2(SiS_Private *SiS_Pr);
+USHORT SiS_SetStart(SiS_Private *SiS_Pr);
+USHORT SiS_SetStop(SiS_Private *SiS_Pr);
+void SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
+USHORT SiS_SetSCLKLow(SiS_Private *SiS_Pr);
+USHORT SiS_SetSCLKHigh(SiS_Private *SiS_Pr);
+USHORT SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+USHORT SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
+USHORT SiS_CheckACK(SiS_Private *SiS_Pr);
#ifdef SIS315H
-/* 661 et al LCD data structure */
-static const UCHAR SiS_LCDStruct661[] = {
- /* 1024x768 */
-/* type|CR37| HDE | VDE | HT | VT | hss | hse */
- 0x02,0xC0,0x00,0x04,0x00,0x03,0x40,0x05,0x26,0x03,0x10,0x00,0x88,
- 0x00,0x02,0x00,0x06,0x00,0x41,0x5A,0x64,0x37,0x6E,0x05,0x6E,0x04,
- /* | vss | vse |clck| clock |CRT2DataP|CRT2DataP|idx */
- /* VESA non-VESA noscale */
- /* 1280x1024 */
- 0x03,0xE0,0x00,0x05,0x00,0x04,0x98,0x06,0x2A,0x04,0x30,0x00,0x70,
- 0x00,0x01,0x00,0x03,0x00,0x6C,0xF8,0x2F,0x5F,0x6F,0xDB,0x6F,0x08,
- /* 1400x1050 */
- 0x09,0x20,0x78,0x05,0x1A,0x04,0x98,0x06,0x2A,0x04,0x18,0x00,0x38,
- 0x00,0x01,0x00,0x03,0x00,0x6C,0xF8,0x2F,0x35,0x70,0x00,0x00,0x09,
- /* 1600x1200 */
- 0x0B,0xE0,0x40,0x06,0xB0,0x04,0x70,0x08,0xE2,0x04,0x40,0x00,0xC0,
- 0x00,0x01,0x00,0x03,0x00,0xA2,0x70,0x24,0x07,0x71,0x00,0x00,0x0B,
- /* 1280x768 */
- 0x0A,0xC0,0x00,0x05,0x00,0x03,0x80,0x05,0x26,0x03,0x10,0x00,0x40,
- 0x00,0x03,0x00,0x06,0x00,0x44,0x63,0x46,0xEB,0x6E,0xA5,0x6E,0x06,
- /* 1280x720 */
- 0x0E,0xE0,0x00,0x05,0xD0,0x02,0x40,0x05,0x26,0x03,0x10,0x00,0x02,
- 0x00,0x01,0x00,0x06,0x00,0x41,0x5A,0x64,0x69,0x6E,0x00,0x00,0x05,
-#if 0 /* 0.92: */
- 0x0E,0xE0,0x00,0x05,0xD0,0x02,0x72,0x06,0xEE,0x02,0x2A,0x00,0x3F,
- 0x00,0x01,0x00,0x06,0x00,0x41,0x00,0x00,0xA7,0x6A,0x00,0x00,0x05,
+void SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex);
+void SiS_OEMLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex);
#endif
- /* 1280x800 */
- 0x0C,0xE0,0x00,0x05,0x20,0x03,0x80,0x05,0x30,0x03,0x15,0x00,0x18,
- 0x00,0x04,0x00,0x03,0x00,0x45,0x9C,0x62,0x31,0x6F,0x00,0x00,0x07,
- /* 1680x1050 */
- 0x0D,0xE0,0x90,0x06,0x1A,0x04,0x6C,0x07,0x2A,0x04,0x1A,0x00,0x4C,
- 0x00,0x03,0x00,0x06,0x00,0x79,0xBE,0x44,0x99,0x70,0x00,0x00,0x0A, /* 0.93: 0x0A=0x06 - WRONG? */
- /* 1280x768 (not in 0.93) */
- 0x0A,0xC0,0x00,0x05,0x00,0x03,0x80,0x06,0x1E,0x03,0x40,0x00,0x80,
- 0x00,0x03,0x00,0x07,0x00,0x4F,0x00,0x00,0x6F,0x6B,0x00,0x00,0x06
-};
+#ifdef SIS300
+void SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr,USHORT ModeNo, USHORT ModeIdIndex, USHORT RefTabindex);
+void SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr,
+ UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex,USHORT RefTableIndex);
#endif
+BOOLEAN SiS_LowModeStuff(SiS_Private *SiS_Pr, USHORT ModeNo,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+
+void SiS_GetLCDResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo, USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+/* void SiS_CHACRT1CRTC(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex); */
+BOOLEAN SiS_SetCRT2Group(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetGroup1(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
+void SiS_SetGroup1_LVDS(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
+#ifdef SIS315H
+void SiS_SetGroup1_LCDA(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
+#endif
+void SiS_SetGroup1_301(SiS_Private *SiS_Pr, USHORT BaseAddr,UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex);
#ifdef SIS300
-static UCHAR SiS300_TrumpionData[7][80] = {
- { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
- 0x20,0x03,0x0B,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x10,0x00,0x00,0x04,0x23,
- 0x00,0x00,0x03,0x28,0x03,0x10,0x05,0x08,0x40,0x10,0x00,0x10,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0xBC,0x01,0xFF,0x03,0xFF,0x19,0x01,0x00,0x05,0x09,0x04,0x04,0x05,
- 0x04,0x0C,0x09,0x05,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5A,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x27,0x00,0x80,0x02,
- 0x20,0x03,0x07,0x00,0x5E,0x01,0x0D,0x02,0x60,0x0C,0x30,0x11,0x00,0x00,0x04,0x23,
- 0x00,0x00,0x03,0x80,0x03,0x28,0x06,0x08,0x40,0x11,0x00,0x11,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0x90,0x01,0xFF,0x0F,0xF4,0x19,0x01,0x00,0x05,0x01,0x00,0x04,0x05,
- 0x04,0x0C,0x02,0x01,0x02,0xB0,0x00,0x00,0x02,0xBA,0xEC,0x57,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x8A,0x00,0xD8,0x02,
- 0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
- 0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0xD9,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
- 0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x59,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x72,0x00,0xD8,0x02,
- 0x84,0x03,0x16,0x00,0x90,0x01,0xC1,0x01,0x60,0x0C,0x30,0x1C,0x00,0x20,0x04,0x23,
- 0x00,0x01,0x03,0x53,0x03,0x28,0x06,0x08,0x40,0x1C,0x00,0x16,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0xDA,0x01,0xFF,0x0F,0xF4,0x18,0x07,0x05,0x05,0x13,0x04,0x04,0x05,
- 0x01,0x0B,0x13,0x0A,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x55,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x02,0x00,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0x7F,0x00,0x80,0x02,
- 0x20,0x03,0x16,0x00,0xE0,0x01,0x0D,0x02,0x60,0x0C,0x30,0x98,0x00,0x00,0x04,0x23,
- 0x00,0x01,0x03,0x45,0x03,0x48,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0xF4,0x01,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x05,0x01,0x00,0x05,0x05,
- 0x04,0x0C,0x08,0x05,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x02,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0xBF,0x00,0x20,0x03,
- 0x20,0x04,0x0D,0x00,0x58,0x02,0x71,0x02,0x80,0x0C,0x30,0x9A,0x00,0xFA,0x03,0x1D,
- 0x00,0x01,0x03,0x22,0x03,0x28,0x06,0x08,0x40,0x98,0x00,0x98,0x04,0x1D,0x00,0x1D,
- 0x03,0x11,0x60,0x39,0x03,0x40,0x05,0xF4,0x18,0x07,0x02,0x06,0x04,0x01,0x06,0x0B,
- 0x02,0x0A,0x20,0x19,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 },
- { 0x02,0x0A,0x0A,0x01,0x04,0x01,0x00,0x03,0x0D,0x00,0x0D,0x10,0xEF,0x00,0x00,0x04,
- 0x40,0x05,0x13,0x00,0x00,0x03,0x26,0x03,0x88,0x0C,0x30,0x90,0x00,0x00,0x04,0x23,
- 0x00,0x01,0x03,0x24,0x03,0x28,0x06,0x08,0x40,0x90,0x00,0x90,0x04,0x23,0x00,0x23,
- 0x03,0x11,0x60,0x40,0x05,0xFF,0x0F,0xF4,0x18,0x01,0x00,0x08,0x01,0x00,0x08,0x01,
- 0x00,0x08,0x01,0x01,0x02,0xB0,0x00,0x00,0x02,0xBA,0xF0,0x5B,0x01,0xBE,0x01,0x00 }
-};
+void SiS_SetCRT2FIFO_300(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#endif
+#ifdef SIS315H
+void SiS_SetCRT2FIFO_310(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,
+ PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_CRT2AutoThreshold(SiS_Private *SiS_Pr, USHORT BaseAddr);
#endif
+BOOLEAN SiS_GetLCDDDCInfo(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+void SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+void SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+void SiS_SetPanelDelay(SiS_Private *SiS_Pr, UCHAR* ROMAddr,PSIS_HW_DEVICE_INFO,USHORT DelayTime);
+void SiS_SetPanelDelayLoop(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT DelayTime, USHORT DelayLoop);
+void SiS_ShortDelay(SiS_Private *SiS_Pr, USHORT delay);
+void SiS_LongDelay(SiS_Private *SiS_Pr, USHORT delay);
+void SiS_GenericDelay(SiS_Private *SiS_Pr, USHORT delay);
+void SiS_VBWait(SiS_Private *SiS_Pr);
-void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_EnableCRT2(SiS_Private *SiS_Pr);
-USHORT SiS_GetRatePtr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo);
-void SiS_WaitRetrace1(SiS_Private *SiS_Pr);
-BOOLEAN SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-BOOLEAN SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
-void SiS_GetVBInfo(SiS_Private *SiS_Pr, USHORT ModeNo,
- USHORT ModeIdIndex,PSIS_HW_INFO HwInfo,
- int checkcrt2mode);
-void SiS_SetYPbPr(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_SetTVMode(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo);
-void SiS_GetLCDResInfo(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_INFO HwInfo);
-USHORT SiS_GetVCLK2Ptr(SiS_Private *SiS_Pr, USHORT ModeNo, USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex, PSIS_HW_INFO HwInfo);
-USHORT SiS_GetResInfo(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex);
-void SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-BOOLEAN SiS_SetCRT2Group(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo, USHORT ModeNo);
-void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
+void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
-void SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
-USHORT SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempax);
-void SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
-USHORT SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempax);
-void SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
-USHORT SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempax);
-void SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
+void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
#ifdef SIS315H
-void SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_ChrontelInitTVVSync(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
+void SiS_Chrontel701xOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ USHORT BaseAddr);
+void SiS_Chrontel701xOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_ChrontelResetDB(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_ChrontelDoSomething4(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_ChrontelDoSomething3(SiS_Private *SiS_Pr, USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_ChrontelDoSomething2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_ChrontelDoSomething1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_WeHaveBacklightCtrl(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+void SiS_ChrontelPowerSequencing(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+void SiS_SetCH701xForLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+#ifdef NEWCH701x
+void SiS_ChrontelDoSomething5(SiS_Private *SiS_Pr);
+#endif
#endif /* 315 */
-#ifdef SIS300
-void SiS_SetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx);
-USHORT SiS_GetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx);
-static BOOLEAN SiS_SetTrumpionBlock(SiS_Private *SiS_Pr, UCHAR *dataptr);
+#if 0
+BOOLEAN SiS_IsSomethingCR5F(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
#endif
+BOOLEAN SiS_IsYPbPr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsChScart(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsTVOrYPbPrOrScart(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_IsLCDOrLCDA(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr);
+BOOLEAN SiS_CR36BIOSWord23b(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+BOOLEAN SiS_CR36BIOSWord23d(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+BOOLEAN SiS_IsSR13_CR30(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_SetReg1(USHORT, USHORT, USHORT);
+extern void SiS_SetReg3(USHORT, USHORT);
+extern UCHAR SiS_GetReg1(USHORT, USHORT);
+extern UCHAR SiS_GetReg2(USHORT);
+extern BOOLEAN SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex);
+extern BOOLEAN SiS_GetRatePtr(SiS_Private *SiS_Pr, ULONG, USHORT);
+extern void SiS_SetReg4(USHORT, ULONG);
+extern ULONG SiS_GetReg3(USHORT);
+extern void SiS_SetReg5(USHORT, USHORT);
+extern USHORT SiS_GetReg4(USHORT);
+extern void SiS_DisplayOff(SiS_Private *SiS_Pr);
+extern void SiS_DisplayOn(SiS_Private *SiS_Pr);
+extern UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex);
+extern BOOLEAN SiS_GetLCDACRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *ResInfo,USHORT *DisplayType);
+extern BOOLEAN SiS_GetLVDSCRT1Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex,
+ USHORT RefreshRateTableIndex,USHORT *ResInfo,USHORT *DisplayType);
+extern void SiS_LoadDAC(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO, UCHAR *ROMAddr,USHORT ModeNo,
+ USHORT ModeIdIndex);
+#ifdef SIS315H
+extern UCHAR SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension);
+#endif
-USHORT SiS_ReadDDC1Bit(SiS_Private *SiS_Pr);
-void SiS_SetSwitchDDC2(SiS_Private *SiS_Pr);
-USHORT SiS_SetStart(SiS_Private *SiS_Pr);
-USHORT SiS_SetStop(SiS_Private *SiS_Pr);
-void SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
-USHORT SiS_SetSCLKLow(SiS_Private *SiS_Pr);
-USHORT SiS_SetSCLKHigh(SiS_Private *SiS_Pr);
-USHORT SiS_ReadDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
-USHORT SiS_WriteDDC2Data(SiS_Private *SiS_Pr, USHORT tempax);
-USHORT SiS_CheckACK(SiS_Private *SiS_Pr);
-
+/* DDC functions */
USHORT SiS_InitDDCRegs(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
USHORT adaptnum, USHORT DDCdatatype, BOOLEAN checkcr32);
USHORT SiS_WriteDABDDC(SiS_Private *SiS_Pr);
@@ -363,45 +372,4 @@ USHORT SiS_SenseLCDDDC(SiS_Private *SiS_Pr, SISPtr pSiS);
USHORT SiS_SenseVGA2DDC(SiS_Private *SiS_Pr, SISPtr pSiS);
#endif
-#ifdef SIS315H
-void SiS_OEM310Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex);
-void SiS_OEM661Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo,USHORT ModeIdIndex, USHORT RRTI);
-void SiS_FinalizeLCD(SiS_Private *, USHORT, USHORT, PSIS_HW_INFO);
-#endif
-#ifdef SIS300
-void SiS_OEM300Setting(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex, USHORT RefTabindex);
-void SetOEMLCDData2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo,
- USHORT ModeNo, USHORT ModeIdIndex,USHORT RefTableIndex);
-#endif
-
-extern void SiS_SetReg(SISIOADDRESS, USHORT, USHORT);
-extern void SiS_SetRegByte(SISIOADDRESS, USHORT);
-extern void SiS_SetRegShort(SISIOADDRESS, USHORT);
-extern void SiS_SetRegLong(SISIOADDRESS, ULONG);
-extern UCHAR SiS_GetReg(SISIOADDRESS, USHORT);
-extern UCHAR SiS_GetRegByte(SISIOADDRESS);
-extern USHORT SiS_GetRegShort(SISIOADDRESS);
-extern ULONG SiS_GetRegLong(SISIOADDRESS);
-extern void SiS_SetRegANDOR(SISIOADDRESS Port,USHORT Index,USHORT DataAND,USHORT DataOR);
-extern void SiS_SetRegOR(SISIOADDRESS Port,USHORT Index,USHORT DataOR);
-extern void SiS_SetRegAND(SISIOADDRESS Port,USHORT Index,USHORT DataAND);
-
-extern void SiS_DisplayOff(SiS_Private *SiS_Pr);
-extern void SiS_DisplayOn(SiS_Private *SiS_Pr);
-
-extern BOOLEAN SiS_SearchModeID(SiS_Private *, USHORT *, USHORT *);
-extern UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, USHORT ModeNo,USHORT ModeIdIndex);
-
-extern USHORT SiS_GetColorDepth(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex);
-extern USHORT SiS_GetOffset(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex,
- USHORT RefreshRateTableIndex,PSIS_HW_INFO HwInfo);
-
-extern void SiS_LoadDAC(SiS_Private *SiS_Pr, PSIS_HW_INFO,USHORT ModeNo,
- USHORT ModeIdIndex);
-
-extern void SiS_CalcLCDACRT1Timing(SiS_Private *SiS_Pr,USHORT ModeNo,USHORT ModeIdIndex);
-
#endif
diff --git a/src/initdef.h b/src/initdef.h
index 869364c..6fdc3d2 100644
--- a/src/initdef.h
+++ b/src/initdef.h
@@ -1,75 +1,45 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/initdef.h,v 1.17 2003/08/26 20:40:23 twini Exp $ */
/*
* Global definitions for init.c and init301.c
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
#ifndef _INITDEF_
#define _INITDEF_
-#define IS_SIS330 (HwInfo->jChipType == SIS_330)
-#define IS_SIS550 (HwInfo->jChipType == SIS_550)
-#define IS_SIS650 (HwInfo->jChipType == SIS_650) /* All versions, incl 651, M65x */
-#define IS_SIS740 (HwInfo->jChipType == SIS_740)
-#define IS_SIS651 (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652))
-#define IS_SISM650 (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653))
-#define IS_SIS65x (IS_SIS651 || IS_SISM650) /* Only special versions of 65x */
-#define IS_SIS661 (HwInfo->jChipType == SIS_661)
-#define IS_SIS741 (HwInfo->jChipType == SIS_741)
-#define IS_SIS660 (HwInfo->jChipType == SIS_660)
-#define IS_SIS760 (HwInfo->jChipType == SIS_760)
-#define IS_SIS661741660760 (IS_SIS661 || IS_SIS741 || IS_SIS660 || IS_SIS760)
-#define IS_SIS650740 ((HwInfo->jChipType >= SIS_650) && (HwInfo->jChipType < SIS_330))
-#define IS_SIS550650740 (IS_SIS550 || IS_SIS650740)
-#define IS_SIS650740660 (IS_SIS650 || IS_SIS740 || IS_SIS661741660760)
-#define IS_SIS550650740660 (IS_SIS550 || IS_SIS650740660)
-
-#define SISGETROMW(x) (ROMAddr[(x)] | (ROMAddr[(x)+1] << 8))
+#define SiS300 0x0300
+#define SiS540 0x5300
+#define SiS630 0x6300
+#define SiS730 0x6300
/* SiS_VBType */
#define VB_SIS301 0x0001
@@ -77,41 +47,34 @@
#define VB_SIS302B 0x0004
#define VB_SIS301LV 0x0008
#define VB_SIS302LV 0x0010
-#define VB_SIS302ELV 0x0020
-#define VB_SIS301C 0x0040
+#define VB_SIS301C 0x0020
+#define VB_SIS30xLV VB_SIS301LV
+#define VB_SIS30xNEW VB_SIS302LV
#define VB_NoLCD 0x8000
-#define VB_SIS301BLV302BLV (VB_SIS301B|VB_SIS301C|VB_SIS302B|VB_SIS301LV|VB_SIS302LV|VB_SIS302ELV)
+#define VB_SIS301BLV302BLV (VB_SIS301B|VB_SIS301C|VB_SIS302B|VB_SIS301LV|VB_SIS302LV)
#define VB_SIS301B302B (VB_SIS301B|VB_SIS301C|VB_SIS302B)
-#define VB_SIS301LV302LV (VB_SIS301LV|VB_SIS302LV|VB_SIS302ELV)
-#define VB_SISVB (VB_SIS301 | VB_SIS301BLV302BLV)
-
-/* VBInfo */
-#define SetSimuScanMode 0x0001 /* CR 30 */
-#define SwitchCRT2 0x0002
-#define SetCRT2ToAVIDEO 0x0004
-#define SetCRT2ToSVIDEO 0x0008
-#define SetCRT2ToSCART 0x0010
-#define SetCRT2ToLCD 0x0020
-#define SetCRT2ToRAMDAC 0x0040
-#define SetCRT2ToHiVision 0x0080 /* for SiS bridge */
-#define SetCRT2ToCHYPbPr SetCRT2ToHiVision /* for Chrontel */
-#define SetNTSCTV 0x0000 /* CR 31 */
-#define SetPALTV 0x0100 /* Deprecated here, now in TVMode */
-#define SetInSlaveMode 0x0200
-#define SetNotSimuMode 0x0400
-#define SetNotSimuTVMode SetNotSimuMode
-#define SetDispDevSwitch 0x0800
-#define SetCRT2ToYPbPr525750 0x0800
-#define LoadDACFlag 0x1000
-#define DisableCRT2Display 0x2000
-#define DriverMode 0x4000
-#define HotKeySwitch 0x8000
-#define SetCRT2ToLCDA 0x8000
+#define VB_SIS301LV302LV (VB_SIS301LV|VB_SIS302LV)
-/* v-- Needs change in sis_vga.c if changed (GPIO) --v */
-#define SetCRT2ToTV (SetCRT2ToYPbPr525750|SetCRT2ToHiVision|SetCRT2ToSCART|SetCRT2ToSVIDEO|SetCRT2ToAVIDEO)
-#define SetCRT2ToTVNoYPbPrHiVision (SetCRT2ToSCART | SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)
-#define SetCRT2ToTVNoHiVision (SetCRT2ToYPbPr525750 | SetCRT2ToSCART | SetCRT2ToSVIDEO | SetCRT2ToAVIDEO)
+#define IS_SIS330 (HwDeviceExtension->jChipType == SIS_330)
+#define IS_SIS550 (HwDeviceExtension->jChipType == SIS_550)
+#define IS_SIS650 (HwDeviceExtension->jChipType == SIS_650)
+#define IS_SIS740 (HwDeviceExtension->jChipType == SIS_740)
+#define IS_SIS651 (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652))
+#define IS_SISM650 (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653))
+#define IS_SIS661 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM651))
+#define IS_SIS741 (SiS_Pr->SiS_SysFlags & SF_IsM741)
+#define IS_SIS65x (IS_SIS651 || IS_SISM650)
+#define IS_SIS661741 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM661 | SF_Is741))
+#define IS_SIS660 (HwDeviceExtension->jChipType == SIS_660)
+#define IS_SIS760 (HwDeviceExtension->jChipType == SIS_760)
+#define IS_SIS650660 (IS_SIS650 || IS_SIS660)
+#define IS_SIS650740 ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330))
+#define IS_SIS650740660 (IS_SIS650 || IS_SIS660 || IS_SIS740 || IS_SIS760)
+#define IS_SIS550650740660 (IS_SIS550 || IS_SIS650 || IS_SIS660 || IS_SIS740 || IS_SIS760)
+
+#define CRT1Len 17
+#define LVDSCRT1Len 15
+#define CHTVRegDataLen 5
/* SiS_ModeType */
#define ModeText 0x00
@@ -139,68 +102,79 @@
#define DoubleScanMode 0x8000
/* Infoflag */
+#define SupportAllCRT2 0x0078
#define SupportTV 0x0008
-#define SupportTV1024 0x0800
-#define SupportCHTV 0x0800
-#define Support64048060Hz 0x0800 /* Special for 640x480 LCD */
-#define SupportHiVision 0x0010
-#define SupportYPbPr750p 0x1000
+#define SupportHiVisionTV 0x0010
#define SupportLCD 0x0020
-#define SupportRAMDAC2 0x0040 /* All (<= 100Mhz) */
-#define SupportRAMDAC2_135 0x0100 /* All except DH (<= 135Mhz) */
-#define SupportRAMDAC2_162 0x0200 /* B, C (<= 162Mhz) */
-#define SupportRAMDAC2_202 0x0400 /* C (<= 202Mhz) */
+#define SupportRAMDAC2 0x0040
+#define NoSupportTV 0x0070
+#define NoSupportHiVisionTV 0x0060
+#define NoSupportLCD 0x0058
+#define SupportCHTV 0x0800
+#define SupportTV1024 0x0800
#define InterlaceMode 0x0080
+#define SupportHiVisionTV2 0x1000
#define SyncPP 0x0000
#define SyncPN 0x4000
#define SyncNP 0x8000
#define SyncNN 0xc000
+#define ECLKindex0 0x0000
+#define ECLKindex1 0x0100
+#define ECLKindex2 0x0200
+#define ECLKindex3 0x0300
+#define ECLKindex4 0x0400
+
+/* VBInfo */
+#define SetSimuScanMode 0x0001 /* CR 30 */
+#define SwitchToCRT2 0x0002
+#define SetCRT2ToAVIDEO 0x0004
+#define SetCRT2ToSVIDEO 0x0008
+#define SetCRT2ToSCART 0x0010
+#define SetCRT2ToLCD 0x0020
+#define SetCRT2ToRAMDAC 0x0040
+#define SetCRT2ToHiVisionTV 0x0080
+#define SetCRT2ToTV 0x009C /* alias */
+#define SetNTSCTV 0x0000 /* CR 31 */
+#define SetPALTV 0x0100
+#define SetInSlaveMode 0x0200
+#define SetNotSimuMode 0x0400
+#define SetNotSimuTVMode 0x0400
+#define SetDispDevSwitch 0x0800
+#define LoadDACFlag 0x1000
+#define SetCHTVOverScan 0x1000 /* TW: Re-defined (from 0x8000) */
+#define DisableCRT2Display 0x2000
+#define CRT2DisplayFlag 0x2000
+#define DriverMode 0x4000
+#define HotKeySwitch 0x8000 /* TW: ? */
+#define SetCRT2ToLCDA 0x8000
/* SetFlag */
-#define ProgrammingCRT2 0x0001
-#define LowModeTests 0x0002
-/* #define TVSimuMode 0x0002 - deprecated */
-/* #define RPLLDIV2XO 0x0004 - deprecated */
-#define LCDVESATiming 0x0008
-#define EnableLVDSDDA 0x0010
-#define SetDispDevSwitchFlag 0x0020
-#define CheckWinDos 0x0040
-#define SetDOSMode 0x0080
-
-/* TVMode flag */
-#define TVSetPAL 0x0001
-#define TVSetNTSCJ 0x0002
-#define TVSetPALM 0x0004
-#define TVSetPALN 0x0008
-#define TVSetCHOverScan 0x0010
-#define TVSetYPbPr525i 0x0020 /* new 0x10 */
-#define TVSetYPbPr525p 0x0040 /* new 0x20 */
-#define TVSetYPbPr750p 0x0080 /* new 0x40 */
-#define TVSetHiVision 0x0100 /* new 0x80; = 1080i, software-wise identical */
-#define TVSetTVSimuMode 0x0200 /* new 0x200, prev. 0x800 */
-#define TVRPLLDIV2XO 0x0400 /* prev 0x1000 */
-#define TVSetNTSC1024 0x0800 /* new 0x100, prev. 0x2000 */
-#define TVAspect43 0x2000
-#define TVAspect169 0x4000
-#define TVAspect43LB 0x8000
-
-/* YPbPr flag (>=315, <661; converted to TVMode) */
-#define YPbPr525p 0x0001
-#define YPbPr750p 0x0002
-#define YPbPr525i 0x0004
-#define YPbPrHiVision 0x0008
-#define YPbPrModeMask (YPbPr750p | YPbPr525p | YPbPr525i | YPbPrHiVision)
-
-/* SysFlags (to identify special versions) */
+#define ProgrammingCRT2 0x01
+#define TVSimuMode 0x02
+#define RPLLDIV2XO 0x04
+#define LCDVESATiming 0x08
+#define EnableLVDSDDA 0x10
+#define SetDispDevSwitchFlag 0x20
+#define CheckWinDos 0x40
+#define SetDOSMode 0x80
+
+/* SysFlags */
#define SF_Is651 0x0001
#define SF_IsM650 0x0002
#define SF_Is652 0x0004
#define SF_IsM652 0x0008
#define SF_IsM653 0x0010
-#define SF_IsM661 0x0020
-#define SF_IsM741 0x0040
-#define SF_IsM760 0x0080
-#define SF_760UMA 0x8000
+#define SF_Is661 0x0020
+#define SF_IsM661 0x0040
+#define SF_Is741 0x0080
+#define SF_Is660 0x8000
+
+#define PanelRGB18Bit 0x0100
+#define PanelRGB24Bit 0x0000
+
+#define TVOverScan 0x10 /* Bit in CR35 (300 series only) */
+#define TVOverScanShift 4
+#define ClearBufferFlag 0x20
/* CR32 (Newer 630, and 315 series)
@@ -211,32 +185,9 @@
[4] VB connected with CRT2 (secondary VGA)
[5] CRT1 monitor is connected
[6] VB connected with Hi-Vision TV
- [7] <= 330: VB connected with DVI combo connector
- >= 661: VB connected to YPbPr
-*/
-
-/* CR35 (300 series only) */
-#define TVOverScan 0x10
-#define TVOverScanShift 4
-
-/* CR35 (661 series only)
-
- [0] 1 = PAL, 0 = NTSC
- [1] 1 = NTSC-J (if D0 = 0)
- [2] 1 = PALM (if D0 = 1)
- [3] 1 = PALN (if D0 = 1)
- [4] 1 = Overscan (Chrontel only)
- [7:5] (only if D2 in CR38 is set)
- 000 525i
- 001 525p
- 010 750p
- 011 1080i (or HiVision on 301, 301B)
+ [7] VB connected with DVI combo connector
- These bits are being translated to TVMode flag.
-
-*/
-/*
CR37
[0] Set 24/18 bit (0/1) RGB to LVDS/TMDS transmitter (set by BIOS)
@@ -247,14 +198,11 @@
011 LVDS + Tumpion Zurac
100 LVDS + Chrontel 7005
110 Chrontel 7005
- 315/330 series
+ 315 series
001 SiS30x (never seen)
010 LVDS
011 LVDS + Chrontel 7019
- 660 series [2:1] only:
- reserved (now in CR38)
All other combinations reserved
- [3] 661 only: Pass 1:1 data
[4] LVDS: 0: Panel Link expands / 1: Panel Link does not expand
30x: 0: Bridge scales / 1: Bridge does not scale = Panel scales (if possible)
[5] LCD polarity select
@@ -271,60 +219,37 @@
/* CR37: LCDInfo */
#define LCDRGB18Bit 0x0001
#define LCDNonExpanding 0x0010
-#define LCDSync 0x0020
-#define LCDPass11 0x0100 /* 0: center screen, 1: Pass 1:1 data */
-#define LCDDualLink 0x0200
-
#define DontExpandLCD LCDNonExpanding
#define LCDNonExpandingShift 4
#define DontExpandLCDShift LCDNonExpandingShift
+#define LCDSync 0x0020
+#define LCDPass11 0x0100
#define LCDSyncBit 0x00e0
#define LCDSyncShift 6
/* CR38 (315 series) */
-#define EnableDualEdge 0x01
-#define SetToLCDA 0x02 /* LCD channel A (301C/302B/30x(E)LV and 650+LVDS only) */
-#define EnableCHScart 0x04 /* Scart on Ch7019 (unofficial definition - TW) */
-#define EnableCHYPbPr 0x08 /* YPbPr on Ch7019 (480i HDTV); only on 650/Ch7019 systems */
-#define EnableSiSYPbPr 0x08 /* Enable YPbPr mode (30xLV/301C only) */
-#define EnableYPbPr525i 0x00 /* Enable 525i YPbPr mode (30xLV/301C only) (mask 0x30) */
-#define EnableYPbPr525p 0x10 /* Enable 525p YPbPr mode (30xLV/301C only) (mask 0x30) */
-#define EnableYPbPr750p 0x20 /* Enable 750p YPbPr mode (30xLV/301C only) (mask 0x30) */
-#define EnableYPbPr1080i 0x30 /* Enable 1080i YPbPr mode (30xLV/301C only) (mask 0x30) */
+#define EnableDualEdge 0x01
+#define SetToLCDA 0x02 /* LCD channel A (302B/LV and 650+LVDS only) */
+#define EnableSiSHiVision 0x04 /* HiVision (HDTV) on SiS bridge */
+#define EnableLVDSScart 0x04 /* Scart on Ch7019 (unofficial definition - TW) */
+#define EnableLVDSHiVision 0x08 /* YPbPr color format (480i HDTV); only on 650/Ch7019 systems */
+#define EnableHiVision750 0x08 /* Enable 750P HiVision mode (30xLV only) */
+#define EnableHiVision525 0x10 /* Enable 525P HiVision mode (30xLV only) */
+#define SiSHiVision2 0x20 /* ? - | --- mask 0x38 combinations have different meaning! */
#define EnablePALM 0x40 /* 1 = Set PALM */
#define EnablePALN 0x80 /* 1 = Set PALN */
-#define EnableNTSCJ EnablePALM /* Not BIOS */
-
-/* CR38 (661 and later)
- D[7:5] 000 No VB
- 001 301 series VB
- 010 LVDS
- 011 Chrontel 7019
- 100 Conexant
- D2 Enable YPbPr output (see CR35)
- D[1:0] LCDA (like before)
-*/
-#define EnablePALMN 0x40 /* Romflag: 1 = Allow PALM/PALN */
+#define SetSCARTOutput 0x01
+#define BoardTVType 0x02
-/* CR39 (650 only) */
-#define LCDPass1_1 0x01 /* 0: center screen, 1: pass 1:1 data output */
-#define Enable302LV_DualLink 0x04 /* 302LV only; enable dual link */
+#define EnablePALMN 0x40 /* Romflag: 1 = Allow PALM/PALN */
-/* CR39 (661 and later)
- D[1:0] YPbPr Aspect Ratio
- 00 4:3 letterbox
- 01 4:3
- 10 16:9
- 11 4:3
-*/
+/* CR39 (650) */
+#define LCDPass1_1 0x01 /* LVDS only; set by driver to pass 1:1 data to LVDS output */
+#define Enable302LV_DualLink 0x04 /* 30xNEW (302LV) only; set by mode switching function */
-/* CR3B (651+301C)
- D[1:0] YPbPr Aspect Ratio
- ?
-*/
-/* CR79 (315/330 series only; not 661 and later)
+/* CR79 (315 series only)
[3-0] Notify driver
0001 Mode Switch event (set by BIOS)
0010 Epansion On/Off event
@@ -351,7 +276,7 @@
#define Panel300_1024x600 0x06
#define Panel300_1152x768 0x07
#define Panel300_1280x768 0x0a
-#define Panel300_320x480 0x0e /* fstn - This is fake, can be any */
+#define Panel300_320x480 0x0e /* fstn - TW: This is fake, can be any */
#define Panel300_Custom 0x0f
#define Panel300_Barco1366 0x10
@@ -371,24 +296,8 @@
#define Panel310_320x480 0x0e /* fstn - TW: This is fake, can be any */
#define Panel310_Custom 0x0f
-#define Panel661_800x600 0x01
-#define Panel661_1024x768 0x02
-#define Panel661_1280x1024 0x03
-#define Panel661_640x480 0x04
-#define Panel661_1024x600 0x05
-#define Panel661_1152x864 0x06
-#define Panel661_1280x960 0x07
-#define Panel661_1152x768 0x08
-#define Panel661_1400x1050 0x09
-#define Panel661_1280x768 0x0a
-#define Panel661_1600x1200 0x0b
-#define Panel661_1280x800 0x0c
-#define Panel661_1680x1050 0x0d
-#define Panel661_1280x720 0x0e
-#define Panel661_Custom 0x0f
-
#define Panel_800x600 0x01 /* Unified values */
-#define Panel_1024x768 0x02 /* MUST match BIOS values from 0-e */
+#define Panel_1024x768 0x02
#define Panel_1280x1024 0x03
#define Panel_640x480 0x04
#define Panel_1024x600 0x05
@@ -396,57 +305,61 @@
#define Panel_1280x960 0x07
#define Panel_1152x768 0x08 /* LVDS only */
#define Panel_1400x1050 0x09
-#define Panel_1280x768 0x0a /* 30xB/C and LVDS only (BIOS: all) */
+#define Panel_1280x768 0x0a /* LVDS only */
#define Panel_1600x1200 0x0b
-#define Panel_1280x800 0x0c /* 661etc */
-#define Panel_1680x1050 0x0d /* 661etc */
-#define Panel_1280x720 0x0e /* 661etc */
-#define Panel_Custom 0x0f /* MUST BE 0x0f (for DVI DDC detection */
-#define Panel_320x480 0x10 /* SiS 550 fstn - TW: This is fake, can be any */
-#define Panel_Barco1366 0x11
-#define Panel_848x480 0x12
-#define Panel_640x480_2 0x13 /* SiS 550 */
-#define Panel_640x480_3 0x14 /* SiS 550 */
-#define Panel_1280x768_2 0x15 /* 30xLV */
-#define Panel_1280x768_3 0x16 /* 30xLV */
+#define Panel_640x480_2 0x0c
+#define Panel_640x480_3 0x0d
+#define Panel_320x480 0x0e /* fstn - TW: This is fake, can be any */
+#define Panel_Custom 0x0f
+#define Panel_Barco1366 0x10
+#define Panel_848x480 0x11
/* Index in ModeResInfo table */
-#define SIS_RI_320x200 0
-#define SIS_RI_320x240 1
-#define SIS_RI_320x400 2
-#define SIS_RI_400x300 3
-#define SIS_RI_512x384 4
-#define SIS_RI_640x400 5
-#define SIS_RI_640x480 6
-#define SIS_RI_800x600 7
-#define SIS_RI_1024x768 8
-#define SIS_RI_1280x1024 9
+#define SIS_RI_320x200 0
+#define SIS_RI_320x240 1
+#define SIS_RI_320x400 2
+#define SIS_RI_400x300 3
+#define SIS_RI_512x384 4
+#define SIS_RI_640x400 5
+#define SIS_RI_640x480 6
+#define SIS_RI_800x600 7
+#define SIS_RI_1024x768 8
+#define SIS_RI_1280x1024 9
#define SIS_RI_1600x1200 10
#define SIS_RI_1920x1440 11
#define SIS_RI_2048x1536 12
-#define SIS_RI_720x480 13
-#define SIS_RI_720x576 14
-#define SIS_RI_1280x960 15
-#define SIS_RI_800x480 16
-#define SIS_RI_1024x576 17
-#define SIS_RI_1280x720 18
-#define SIS_RI_856x480 19
-#define SIS_RI_1280x768 20
+#define SIS_RI_720x480 13
+#define SIS_RI_720x576 14
+#define SIS_RI_1280x960 15
+#define SIS_RI_800x480 16
+#define SIS_RI_1024x576 17
+#define SIS_RI_1280x720 18
+#define SIS_RI_856x480 19
+#define SIS_RI_1280x768 20
#define SIS_RI_1400x1050 21
-#define SIS_RI_1152x864 22 /* Up to this SiS conforming */
-#define SIS_RI_848x480 23
-#define SIS_RI_1360x768 24
-#define SIS_RI_1024x600 25
-#define SIS_RI_1152x768 26
-#define SIS_RI_768x576 27
+#define SIS_RI_1152x864 22
+#define SIS_RI_848x480 23
+#define SIS_RI_1360x768 24
+#define SIS_RI_1024x600 25
+#define SIS_RI_1152x768 26
+#define SIS_RI_768x576 27
#define SIS_RI_1360x1024 28
-#define SIS_RI_1680x1050 29
-#define SIS_RI_1280x800 30
-/* CR5F */
-#define IsM650 0x80
+#define ExtChipType 0x0e
+#define ExtChip301 0x02
+#define ExtChipLVDS 0x04
+#define ExtChipTrumpion 0x06
+#define ExtChipCH7005 0x08
+#define ExtChipMitacTV 0x0a /* TW: Incorrect, 0x0a = Chrontel 7005 only */
+
+#define IsM650 0x80 /* TW: CR5F */
+
+#define LCDDataLen 8
+#define HiTVDataLen 12
+#define TVDataLen 16
+#define SetPALTV 0x0100
+#define HalfDCLK 0x1000 /* modeflag */
-/* Timing data */
#define NTSCHT 1716
#define NTSC2HT 1920
#define NTSCVT 525
@@ -459,6 +372,9 @@
#define ExtHiTVHT 2100
#define ExtHiTVVT 1125
+#define VCLKStartFreq 25
+#define SoftDramType 0x80
+
/* Indices in (VB)VCLKData tables */
#define VCLK28 0x00 /* Index in VCLKData table (300 and 315) */
@@ -469,22 +385,13 @@
#define VCLK108_3_300 0x42 /* Index in VCLKData table (300) */
#define VCLK100_300 0x43 /* Index in VCLKData table (300) */
#define VCLK34_300 0x3d /* Index in VCLKData table (300) */
-#define VCLK_CUSTOM_300 0x46
#define VCLK65_315 0x0b /* Index in (VB)VCLKData table (315) */
#define VCLK108_2_315 0x19 /* Index in (VB)VCLKData table (315) */
#define VCLK81_315 0x5b /* Index in (VB)VCLKData table (315) */
-#define VCLK162_315 0x5e /* Index in (VB)VCLKData table (315) */
+#define VCLK162_315 0x21 /* Index in (VB)VCLKData table (315) */
#define VCLK108_3_315 0x45 /* Index in VBVCLKData table (315) */
#define VCLK100_315 0x46 /* Index in VBVCLKData table (315) */
-#define VCLK34_315 0x55
-#define VCLK68_315 0x0d
-#define VCLK69_315 0x5c /* Index in VBVCLKData table (315) */
-#define VCLK121_315 0x5d /* Index in VBVCLKData table (315) */
-#define VCLK_1280x720 0x5f
-#define VCLK_1280x768_2 0x60
-#define VCLK_1280x768_3 0x61
-#define VCLK_CUSTOM_315 0x62
-#define VCLK_1280x720_2 0x63
+#define VCLK34_315 0x55 /* Index in VBVCLKData table (315) */
#define TVCLKBASE_300 0x21 /* Indices on TV clocks in VCLKData table (300) */
#define TVCLKBASE_315 0x3a /* Indices on TV clocks in (VB)VCLKData table (315) */
@@ -494,14 +401,25 @@
#define HiTVVCLK 0x03 /* Index relative to TVCLKBASE */
#define HiTVSimuVCLK 0x04 /* Index relative to TVCLKBASE */
#define HiTVTextVCLK 0x05 /* Index relative to TVCLKBASE */
-#define YPbPr750pVCLK 0x25 /* Index relative to TVCLKBASE; was 0x0f NOT relative */
/* ------------------------------ */
-#define SetSCARTOutput 0x01
+#define LoadDACFlag 0x1000
+#define AfterLockCRT2 0x4000
+#define SetCRT2ToAVIDEO 0x0004
+#define SetCRT2ToSCART 0x0010
+#define Ext2StructSize 5
+#define SetSCARTOutput 0x01
+#define AVIDEOSense 0x01
+#define SVIDEOSense 0x02
+#define SCARTSense 0x04
+#define LCDSense 0x08
+#define Monitor1Sense 0x20
+#define Monitor2Sense 0x10
+#define HiTVSense 0x40
+#define BoardTVType 0x02
#define HotPlugFunction 0x08
-
#define StStructSize 0x06
#define SIS_VIDEO_CAPTURE 0x00 - 0x30
@@ -518,11 +436,8 @@
#define ADR_CHTVVCLKPtr 0x216
#define ADR_CHTVRegDataPtr 0x218
-#define LCDDataLen 8
-#define HiTVDataLen 12
-#define TVDataLen 16
-
#define LVDSDataLen 6
+#define EnableLVDSDDA 0x10
#define LVDSDesDataLen 3
#define ActiveNonExpanding 0x40
#define ActiveNonExpandingShift 6
@@ -533,6 +448,8 @@
#define SoftSettingAddr 0x52
#define ModeSettingAddr 0x53
+#define SelectCRT1Rate 0x4
+
#define _PanelType00 0x00
#define _PanelType01 0x08
#define _PanelType02 0x10
@@ -551,8 +468,7 @@
#define _PanelType0F 0x78
#define PRIMARY_VGA 0 /* 1: SiS is primary vga 0:SiS is secondary vga */
-
-#define BIOSIDCodeAddr 0x235 /* Offsets to ptrs in BIOS image */
+#define BIOSIDCodeAddr 0x235 /* TW: Offsets to ptrs in BIOS image */
#define OEMUtilIDCodeAddr 0x237
#define VBModeIDTableAddr 0x239
#define OEMTVPtrAddr 0x241
diff --git a/src/oem300.h b/src/oem300.h
index 7995893..9bf1a5d 100644
--- a/src/oem300.h
+++ b/src/oem300.h
@@ -1,52 +1,36 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem300.h,v 1.8 2003/06/19 13:28:01 twini Exp $ */
/*
* OEM Data for 300 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
const UCHAR SiS300_OEMTVDelay301[8][4] =
@@ -293,124 +277,140 @@ const UCHAR SiS300_OEMLCDDelay3[64][4] = { /* For LVDS */
{0x20,0x20,0x20,0x20}
};
-const UCHAR SiS300_Phase1[8][5][4] =
+const UCHAR SiS300_Phase1[8][6][4] =
{
{
{0x21,0xed,0x00,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
- {0x21,0xed,0x8a,0x08}
+ {0x21,0xed,0x8a,0x08},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x21,0xed,0x00,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
- {0x21,0xed,0x8a,0x08}
+ {0x21,0xed,0x8a,0x08},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
}
};
-const UCHAR SiS300_Phase2[8][5][4] =
+const UCHAR SiS300_Phase2[8][6][4] =
{
{
{0x21,0xed,0x00,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
- {0x21,0xed,0x8a,0x08}
+ {0x21,0xed,0x8a,0x08},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x21,0xed,0x00,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
{0x21,0xed,0x8a,0x08},
- {0x21,0xed,0x8a,0x08}
+ {0x21,0xed,0x8a,0x08},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
},
{
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
{0x2a,0x05,0xd3,0x00},
- {0x2a,0x05,0xd3,0x00}
+ {0x2a,0x05,0xd3,0x00},
+ {0xff,0xff,0xff,0xff}
}
};
diff --git a/src/oem310.h b/src/oem310.h
index f76b136..15f41d3 100644
--- a/src/oem310.h
+++ b/src/oem310.h
@@ -1,55 +1,39 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/oem310.h,v 1.12 2003/08/07 15:04:41 twini Exp $ */
/*
* OEM Data for 315/330 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
+ * Based on code by Silicon Intergrated Systems
+ *
*/
-static const UCHAR SiS310_LCDDelayCompensation_301[] = /* 301 */
+const UCHAR SiS310_LCDDelayCompensation_301[] = /* 301 */
{
0x00,0x00,0x00, /* 800x600 */
0x0b,0x0b,0x0b, /* 1024x768 */
@@ -69,7 +53,7 @@ static const UCHAR SiS310_LCDDelayCompensation_301[] = /* 301 */
};
/* This is contained in 650+301B BIOSes, but it is wrong - so we don't use it */
-static const UCHAR SiS310_LCDDelayCompensation_650301LV[] = /* 650 + 30xLV */
+UCHAR SiS310_LCDDelayCompensation_650301B[] = /* 30xB,LV */
{
0x01,0x01,0x01, /* 800x600 */
0x01,0x01,0x01, /* 1024x768 */
@@ -88,7 +72,65 @@ static const UCHAR SiS310_LCDDelayCompensation_650301LV[] = /* 650 + 30xLV *
0x02,0x02,0x02
};
-static const UCHAR SiS310_LCDDelayCompensation_651301LV[] = /* M650/651 301LV */
+/* This data is correct, so we use it instead of the table above */
+UCHAR SiS310_LCDDelayCompensation_3xx301B[] = /* 30xB,LV */
+{
+ 0x01,0x01,0x01, /* 800x600 */
+ 0x0C,0x0C,0x0C, /* 1024x768 */
+ 0x0C,0x0C,0x0C, /* 1280x1024 */
+ 0x08,0x08,0x08, /* 640x480 */
+ 0x0C,0x0C,0x0C, /* 1024x600 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1152x864 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1280x960 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1152x768 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1400x1050 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1280x768 (guessed) */
+ 0x0C,0x0C,0x0C, /* 1600x1200 (guessed) */
+ 0x02,0x02,0x02,
+ 0x02,0x02,0x02,
+ 0x02,0x02,0x02,
+ 0x02,0x02,0x02
+};
+
+const UCHAR SiS310_LCDDelayCompensation_LVDS650[] = /* LVDS */
+{
+ 0x00,0x00,0x00, /* 800x600 */
+ 0x00,0x00,0x00, /* 1024x768 */
+ 0x00,0x00,0x00, /* 1280x1024 */
+ 0x00,0x00,0x00, /* 640x480 (unknown) */
+ 0x00,0x00,0x00, /* 1024x600 (unknown) */
+ 0x00,0x00,0x00, /* 1152x864 (unknown) */
+ 0x00,0x00,0x00, /* 1280x960 (guessed) */
+ 0x00,0x00,0x00, /* 1152x768 (unknown) */
+ 0x00,0x00,0x00, /* 1400x1050 */
+ 0x00,0x00,0x00, /* 1280x768 (guessed) */
+ 0x00,0x00,0x00, /* 1600x1200 */
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00
+};
+
+const UCHAR SiS310_LCDDelayCompensation_LVDS740[] = /* LVDS */
+{
+ 0x03,0x03,0x03, /* 800x600 */
+ 0x03,0x03,0x03, /* 1024x768 */
+ 0x03,0x03,0x03, /* 1280x1024 */
+ 0x03,0x03,0x03, /* 640x480 (unknown) */
+ 0x03,0x03,0x03, /* 1024x600 (unknown) */
+ 0x03,0x03,0x03, /* 1152x864 (unknown) */
+ 0x03,0x03,0x03, /* 1280x960 (guessed) */
+ 0x03,0x03,0x03, /* 1152x768 (unknown) */
+ 0x03,0x03,0x03, /* 1400x1050 */
+ 0x03,0x03,0x03, /* 1280x768 (guessed) */
+ 0x03,0x03,0x03, /* 1600x1200 */
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00,
+ 0x00,0x00,0x00
+};
+
+const UCHAR SiS310_LCDDelayCompensation_651301LV[] = /* M650/651 301LV */
{
0x33,0x33,0x33, /* 800x600 (guessed) - new: PanelType, not PanelRes ! */
0x33,0x33,0x33, /* 1024x768 */
@@ -107,7 +149,7 @@ static const UCHAR SiS310_LCDDelayCompensation_651301LV[] = /* M650/651 301LV
0x33,0x33,0x33
};
-static const UCHAR SiS310_LCDDelayCompensation_651302LV[] = /* M650/651 302LV */
+const UCHAR SiS310_LCDDelayCompensation_651302LV[] = /* M650/651 302LV */
{
0x33,0x33,0x33, /* 800x600 (guessed) */
0x33,0x33,0x33, /* 1024x768 */
@@ -126,111 +168,66 @@ static const UCHAR SiS310_LCDDelayCompensation_651302LV[] = /* M650/651 302L
0x33,0x33,0x33
};
-static const UCHAR SiS310_LCDDelayCompensation_3xx301B[] = /* 30xB,LV */
-{
- 0x01,0x01,0x01, /* 800x600 */
- 0x0C,0x0C,0x0C, /* 1024x768 */
- 0x0C,0x0C,0x0C, /* 1280x1024 */
- 0x08,0x08,0x08, /* 640x480 */
- 0x0C,0x0C,0x0C, /* 1024x600 (guessed) */
- 0x0C,0x0C,0x0C, /* 1152x864 (guessed) */
- 0x0C,0x0C,0x0C, /* 1280x960 (guessed) */
- 0x0C,0x0C,0x0C, /* 1152x768 (guessed) */
- 0x0C,0x0C,0x0C, /* 1400x1050 (guessed) */
- 0x0C,0x0C,0x0C, /* 1280x768 (guessed) */
- 0x0C,0x0C,0x0C, /* 1600x1200 (guessed) */
- 0x02,0x02,0x02,
- 0x02,0x02,0x02,
- 0x02,0x02,0x02,
- 0x02,0x02,0x02
-};
-
-static const UCHAR SiS310_TVDelayCompensation_301[] = /* 301 */
+const UCHAR SiS310_TVDelayCompensation_301[] = /* 301 */
{
0x02,0x02, /* NTSC Enhanced, Standard */
0x02,0x02, /* PAL */
0x08,0x0b /* HiVision */
};
-static const UCHAR SiS310_TVDelayCompensation_301B[] = /* 30xB, 30xLV */
+const UCHAR SiS310_TVDelayCompensation_301B[] = /* 30xB, 30xLV */
{
0x03,0x03,
0x03,0x03,
0x03,0x03
};
-static const UCHAR SiS310_TVDelayCompensation_740301B[] = /* 740 + 30xB (30xLV?) */
+const UCHAR SiS310_TVDelayCompensation_740301B[] = /* 740 + 30xB (30xLV?) */
{
0x05,0x05,
0x05,0x05,
0x05,0x05
};
-static const UCHAR SiS310_TVDelayCompensation_651301LV[] = /* M650, 651, 301LV */
+const UCHAR SiS310_TVDelayCompensation_LVDS[] = /* LVDS */
{
- 0x33,0x33,
- 0x33,0x33,
- 0x33,0x33
+ 0x0a,0x0a,
+ 0x0a,0x0a,
+ 0x0a,0x0a
};
-static const UCHAR SiS310_TVDelayCompensation_651302LV[] = /* M650, 651, 302LV */
+const UCHAR SiS310_TVDelayCompensation_651301LV[] = /* M650, 651, 301LV */
{
0x33,0x33,
0x33,0x33,
0x33,0x33
};
-static const UCHAR SiS_TVDelay661_301[] = /* 661, 301 */
-{
- 0x44,0x44,
- 0x44,0x44,
- 0x00,0x00,
- 0x44,0x44,
- 0x44,0x44,
- 0x44,0x44
-};
-
-static const UCHAR SiS_TVDelay661_301B[] = /* 661, 301B et al */
-{
- 0x44,0x44,
- 0x44,0x44,
- 0x00,0x00,
- 0x44,0x44,
- 0x44,0x44,
- 0x44,0x44
-};
-
-static const UCHAR SiS310_TVDelayCompensation_LVDS[] = /* LVDS */
+const UCHAR SiS310_TVDelayCompensation_651302LV[] = /* M650, 651, 302LV */
{
- 0x0a,0x0a,
- 0x0a,0x0a,
- 0x0a,0x0a
+ 0x33,0x33,
+ 0x33,0x33,
+ 0x33,0x33
};
-static const UCHAR SiS310_TVAntiFlick1[6][2] =
+const UCHAR SiS310_TVAntiFlick1[3][2] =
{
{0x4,0x0},
{0x4,0x8},
- {0x0,0x0},
- {0x0,0x0},
- {0x0,0x0},
{0x0,0x0}
};
-static const UCHAR SiS310_TVEdge1[6][2] =
+const UCHAR SiS310_TVEdge1[3][2] =
{
{0x0,0x4},
{0x0,0x4},
- {0x0,0x0},
- {0x0,0x0},
- {0x0,0x0},
{0x0,0x0}
};
-static const UCHAR SiS310_TVYFilter1[5][8][4] =
+const UCHAR SiS310_TVYFilter1[3][8][4] =
{
{
- {0x00,0xf4,0x10,0x38}, /* NTSC */
+ {0x00,0xf4,0x10,0x38},
{0x00,0xf4,0x10,0x38},
{0xeb,0x04,0x25,0x18},
{0xf1,0x04,0x1f,0x18},
@@ -240,7 +237,7 @@ static const UCHAR SiS310_TVYFilter1[5][8][4] =
{0xeb,0x15,0x25,0xf6}
},
{
- {0x00,0xf4,0x10,0x38}, /* PAL */
+ {0x00,0xf4,0x10,0x38},
{0x00,0xf4,0x10,0x38},
{0xf1,0xf7,0x1f,0x32},
{0xf3,0x00,0x1d,0x20},
@@ -250,7 +247,7 @@ static const UCHAR SiS310_TVYFilter1[5][8][4] =
{0xfc,0xfb,0x14,0x2a}
},
{
- {0x00,0x00,0x00,0x00}, /* HiVision */
+ {0x00,0x00,0x00,0x00},
{0x00,0xf4,0x10,0x38},
{0x00,0xf4,0x10,0x38},
{0xeb,0x04,0x25,0x18},
@@ -258,33 +255,13 @@ static const UCHAR SiS310_TVYFilter1[5][8][4] =
{0x00,0xf4,0x10,0x38},
{0xeb,0x04,0x25,0x18},
{0xee,0x0c,0x22,0x08}
- },
- {
- {0x00,0xf4,0x10,0x38}, /* PAL-M */
- {0x00,0xf4,0x10,0x38},
- {0xeb,0x04,0x10,0x18},
- {0xf7,0x06,0x19,0x14},
- {0x00,0xf4,0x10,0x38},
- {0xeb,0x04,0x25,0x18},
- {0xeb,0x04,0x25,0x18},
- {0xeb,0x15,0x25,0xf6}
- },
- {
- {0x00,0xf4,0x10,0x38}, /* PAL-N */
- {0x00,0xf4,0x10,0x38},
- {0xeb,0x04,0x10,0x18},
- {0xf7,0x06,0x19,0x14},
- {0x00,0xf4,0x10,0x38},
- {0xeb,0x04,0x25,0x18},
- {0xeb,0x04,0x25,0x18},
- {0xeb,0x15,0x25,0xf6}
}
};
-static const UCHAR SiS310_TVYFilter2[5][9][7] =
+const UCHAR SiS310_TVYFilter2[3][9][7] =
{
{
- {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46}, /* NTSC */
+ {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
@@ -295,7 +272,7 @@ static const UCHAR SiS310_TVYFilter2[5][9][7] =
{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
},
{
- {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46}, /* PAL */
+ {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
@@ -306,7 +283,6 @@ static const UCHAR SiS310_TVYFilter2[5][9][7] =
{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
},
{
- {0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22}, /* HiVision */
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
@@ -315,9 +291,53 @@ static const UCHAR SiS310_TVYFilter2[5][9][7] =
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22},
{0x00,0x00,0x00,0xF4,0xFF,0x1C,0x22}
- },
- {
- {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46}, /* PAL-M */
+ }
+};
+
+const UCHAR SiS310_PALMFilter[16][4] =
+{
+ {0x00,0xf4,0x10,0x38},
+ {0x00,0xf4,0x10,0x38},
+ {0xeb,0x04,0x10,0x18},
+ {0xf7,0x06,0x19,0x14},
+ {0x00,0xf4,0x10,0x38},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x15,0x25,0xf6},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18}
+};
+
+const UCHAR SiS310_PALNFilter[16][4] =
+{
+ {0x00,0xf4,0x10,0x38},
+ {0x00,0xf4,0x10,0x38},
+ {0xeb,0x04,0x10,0x18},
+ {0xf7,0x06,0x19,0x14},
+ {0x00,0xf4,0x10,0x38},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x15,0x25,0xf6},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18},
+ {0xeb,0x04,0x25,0x18}
+};
+
+
+const UCHAR SiS310_PALMFilter2[9][7] =
+{
+ {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
@@ -326,9 +346,11 @@ static const UCHAR SiS310_TVYFilter2[5][9][7] =
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
- },
- {
- {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46}, /* PAL-N */
+};
+
+const UCHAR SiS310_PALNFilter2[9][7] =
+{
+ {0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0xFF,0x03,0x02,0xF6,0xFC,0x27,0x46},
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
@@ -337,10 +359,9 @@ static const UCHAR SiS310_TVYFilter2[5][9][7] =
{0x01,0x02,0xFE,0xF7,0x03,0x27,0x3C},
{0x01,0x01,0xFC,0xF8,0x08,0x26,0x38},
{0xFF,0xFF,0xFC,0x00,0x0F,0x22,0x28}
- }
};
-static const UCHAR SiS310_TVPhaseIncr1[3][2][4] =
+const UCHAR SiS310_TVPhaseIncr1[3][2][4] =
{
{
{0x21,0xed,0xba,0x08},
@@ -356,15 +377,15 @@ static const UCHAR SiS310_TVPhaseIncr1[3][2][4] =
}
};
-static const UCHAR SiS310_TVPhaseIncr2[3][2][4] =
+const UCHAR SiS310_TVPhaseIncr2[3][2][4] =
{
{
- {0x21,0xf0,0x7b,0xd6},
- {0x21,0xf0,0x7b,0xd6}
+ {0x21,0xf0,0x7b,0xd6}, /* 1.10.7w; 1.10.6s: {0x1e,0x8b,0xda,0xa7}, old: {0x21,0xF1,0x37,0x56} */
+ {0x21,0xf0,0x7b,0xd6} /* 1.10.7w; 1.10.6s: {0x1e,0x8b,0xda,0xa7} old: {0x21,0xF1,0x37,0x56} */
},
{
- {0x2a,0x0a,0x41,0xe9},
- {0x2a,0x0a,0x41,0xe9}
+ {0x2a,0x0a,0x41,0xe9}, /* 1.10.7w, 1.10.6s. old: {0x2a,0x09,0x86,0xe9}, */
+ {0x2a,0x0a,0x41,0xe9} /* 1.10.7w, 1.10.6s. old: {0x2a,0x09,0x86,0xe9} */
},
{
{0x2a,0x05,0xd3,0x00},
@@ -372,31 +393,7 @@ static const UCHAR SiS310_TVPhaseIncr2[3][2][4] =
}
};
-static const UCHAR SiS661_TVPhase[] = {
- 0x21,0xED,0xBA,0x08,
- 0x2A,0x05,0xE3,0x00,
- 0x21,0xE4,0x2E,0x9B,
- 0x21,0xF4,0x3E,0xBA,
- 0x1E,0x8B,0xA2,0xA7,
- 0x1E,0x83,0x0A,0xE0,
- 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,
- 0x21,0xF0,0x7B,0xD6,
- 0x2A,0x09,0x86,0xE9,
- 0x21,0xE6,0xEF,0xA4,
- 0x21,0xF6,0x94,0x46,
- 0x1E,0x8B,0xA2,0xA7,
- 0x1E,0x83,0x0A,0xE0,
- 0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00
-};
-
-/**************************************************************/
-/* CUSTOM TIMING DATA --------------------------------------- */
-/**************************************************************/
-
-/* Inventec / Compaq Presario 3045US, 3017 */
-
+/* OEM data for Compaq Presario 3045US */
static const SiS_LCDDataStruct SiS310_ExtCompaq1280x1024Data[] =
{
{ 211, 60,1024, 501,1688,1066},
@@ -409,21 +406,111 @@ static const SiS_LCDDataStruct SiS310_ExtCompaq1280x1024Data[] =
{ 1, 1,1696,1066,1696,1066}
};
-/* Asus A2xxxH _2 */
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_1[] =
+{
+ {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x35,0x1B,0xA0,0xC0,0x80,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x45,0x1C,0x20,0x3F,0xFF,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}},
+ {{0x49,0x1C,0x40,0x7F,0xFF,0xAD,0x23,0x0A,0x07,0xF3,0x8A,0x12}},
+ {{0x4C,0x1C,0x18,0x2F,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}
+};
+
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_2[] =
+{
+ {{0x2B,0x12,0xD9,0xE5,0xD5,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}},
+ {{0x22,0x12,0xC0,0xCC,0xBC,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}},
+ {{0x2B,0x12,0xD9,0xE5,0xD5,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}},
+ {{0x22,0x12,0xC0,0xCC,0xBC,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}},
+ {{0x33,0x13,0x01,0x0D,0xFD,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}},
+ {{0x3F,0x1B,0x3D,0x49,0x39,0x54,0x23,0xC0,0x27,0x66,0x30,0x42}},
+ {{0x33,0x1B,0x91,0x9D,0x8D,0x8C,0x23,0xF8,0x27,0x9E,0x68,0x42}},
+ {{0x43,0x24,0x11,0x1D,0x0D,0xCC,0x23,0x38,0x37,0xDE,0xA8,0x42}},
+ {{0x43,0x24,0x21,0x29,0x19,0xEA,0x23,0x0A,0x07,0x32,0xC6,0x42}}
+};
-static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Asus1024x768_3[] =
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_3[] =
{
- {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}},
+ {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}}
+};
+
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_1[] =
+{
+ {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
+ {{0x2C,0x12,0x9A,0xAE,0x88,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
+ {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
- {{0x38,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}},
- {{0x38,0x13,0x16,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
- {{0x36,0x13,0x13,0x25,0xff,0x5a,0x45,0x0a,0x07,0xfa,0x0a,0x24}},
+ {{0x38,0x13,0x16,0x0C,0xE6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
+ {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
- {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}
+ {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}
};
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_2[] =
+{
+ {{0x25,0x12,0x51,0x6E,0x48,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}},
+ {{0x25,0x12,0x51,0x6E,0x48,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0xE0,0x12,0xB1,0x47,0x30,0x71,0x33}},
+ {{0x2D,0x12,0x79,0x96,0x70,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}},
+ {{0x29,0x12,0xB5,0xD2,0xAC,0xF4,0x12,0xD9,0x47,0x44,0x99,0x33}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+#if 0
+ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x2C,0x12,0x38,0x55,0x2F,0xC1,0x35,0xB1,0x47,0xE9,0x71,0x33}},
+ {{0x2D,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}},
+ {{0x29,0x12,0xB5,0xD2,0xAC,0xE9,0x35,0xD9,0x47,0x11,0x99,0x33}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}
+#endif
+};
+static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_3[] =
+{
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, /* Corrected */
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+ {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x25,0x13,0xC9,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}
+};
+
+static const SiS_LVDSDesStruct Clevo1024x768Des_1[] =
+{
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 }
+};
+
+static const SiS_LVDSDesStruct Clevo1024x768Des_2[] =
+{
+ { 1184, 622 },
+ { 1184, 597 },
+ { 1184, 622 },
+ { 1184, 597 },
+ { 1152, 622 },
+ { 1232, 722 },
+ { 0, 0 },
+ { 0, 794 },
+ { 0, 0 }
+};
diff --git a/src/osdef.h b/src/osdef.h
index 663b976..3230658 100644
--- a/src/osdef.h
+++ b/src/osdef.h
@@ -1,126 +1,93 @@
-/* $XFree86$ */
-/*
- * OS depending defines
- *
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
- *
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
- *
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
- *
- * Otherwise, the following license terms apply:
- *
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- * Silicon Integrated Systems, Inc. (used by permission)
- *
- */
+
+/* OS depending defines */
/* The choices are: */
/* #define LINUX_KERNEL */ /* Kernel framebuffer */
#define LINUX_XF86 /* XFree86 */
+/**********************************************************************/
+#ifdef LINUX_KERNEL /* ----------------------------*/
+#include <linux/config.h>
+
+#ifdef CONFIG_FB_SIS_300
+#define SIS300
+#endif
+
+#ifdef CONFIG_FB_SIS_315
+#define SIS315H
+#endif
+
+#if 1
+#define SISFBACCEL /* Include 2D acceleration */
+#endif
+
+#endif
+
+#ifdef LINUX_XF86 /* ----------------------------- */
+#define SIS300
+#define SIS315H
+#endif
+
+/**********************************************************************/
+#ifdef LINUX_KERNEL
+#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+#define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+#endif
+
+#ifdef LINUX_XF86
+#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+#define SiS_MemoryCopy(Destination,Soruce,Length) memcpy(Destination,Soruce,Length)
+#endif
+
+/**********************************************************************/
+
#ifdef OutPortByte
#undef OutPortByte
-#endif
+#endif /* OutPortByte */
#ifdef OutPortWord
#undef OutPortWord
-#endif
+#endif /* OutPortWord */
#ifdef OutPortLong
#undef OutPortLong
-#endif
+#endif /* OutPortLong */
#ifdef InPortByte
#undef InPortByte
-#endif
+#endif /* InPortByte */
#ifdef InPortWord
#undef InPortWord
-#endif
+#endif /* InPortWord */
#ifdef InPortLong
#undef InPortLong
-#endif
+#endif /* InPortLong */
/**********************************************************************/
/* LINUX KERNEL */
/**********************************************************************/
#ifdef LINUX_KERNEL
-#include <linux/config.h>
-#include <linux/version.h>
-
-#ifdef CONFIG_FB_SIS_300
-#define SIS300
-#endif
-
-#ifdef CONFIG_FB_SIS_315
-#define SIS315H
-#endif
-
-#if 1
-#define SISFBACCEL /* Include 2D acceleration */
-#endif
-
-#define OutPortByte(p,v) outb((u8)(v),(IOADDRESS)(p))
-#define OutPortWord(p,v) outw((u16)(v),(IOADDRESS)(p))
-#define OutPortLong(p,v) outl((u32)(v),(IOADDRESS)(p))
-#define InPortByte(p) inb((IOADDRESS)(p))
-#define InPortWord(p) inw((IOADDRESS)(p))
-#define InPortLong(p) inl((IOADDRESS)(p))
-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset_io(MemoryAddress, value, MemorySize)
+#define OutPortByte(p,v) outb((u8)(v),(u16)(p))
+#define OutPortWord(p,v) outw((u16)(v),(u16)(p))
+#define OutPortLong(p,v) outl((u32)(v),(u16)(p))
+#define InPortByte(p) inb((u16)(p))
+#define InPortWord(p) inw((u16)(p))
+#define InPortLong(p) inl((u16)(p))
#endif
/**********************************************************************/
-/* XFree86 */
+/* LINUX XF86 */
/**********************************************************************/
#ifdef LINUX_XF86
-#define SIS300
-#define SIS315H
-
-#define OutPortByte(p,v) outb((IOADDRESS)(p),(CARD8)(v))
-#define OutPortWord(p,v) outw((IOADDRESS)(p),(CARD16)(v))
-#define OutPortLong(p,v) outl((IOADDRESS)(p),(CARD32)(v))
-#define InPortByte(p) inb((IOADDRESS)(p))
-#define InPortWord(p) inw((IOADDRESS)(p))
-#define InPortLong(p) inl((IOADDRESS)(p))
-#define SiS_SetMemory(MemoryAddress,MemorySize,value) memset(MemoryAddress, value, MemorySize)
+#define OutPortByte(p,v) outb((CARD16)(p),(CARD8)(v))
+#define OutPortWord(p,v) outw((CARD16)(p),(CARD16)(v))
+#define OutPortLong(p,v) outl((CARD16)(p),(CARD32)(v))
+#define InPortByte(p) inb((CARD16)(p))
+#define InPortWord(p) inw((CARD16)(p))
+#define InPortLong(p) inl((CARD16)(p))
#endif
diff --git a/src/sis.h b/src/sis.h
index 6d719e8..e8fa10c 100644
--- a/src/sis.h
+++ b/src/sis.h
@@ -1,51 +1,46 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis.h,v 1.60 2003/09/09 10:29:01 twini Exp $ */
/*
* Main global data and definitions
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Authors: Thomas Winischhofer <thomas@winischhofer.net>
- * others (old code base)
+ * Authors:
+ *
+ * ?
+ * Thomas Winischhofer <thomas@winischhofer.net>
*
*/
-
#ifndef _SIS_H
#define _SIS_H_
/* Always unlock the registers (should be set!) */
#define UNLOCK_ALWAYS
-#define SISDRIVERVERSIONYEAR 4
-#define SISDRIVERVERSIONMONTH 2
-#define SISDRIVERVERSIONDAY 26
+#define SISDRIVERVERSIONYEAR 3
+#define SISDRIVERVERSIONMONTH 9
+#define SISDRIVERVERSIONDAY 9
#define SISDRIVERREVISION 1
-#define SISDRIVERIVERSION (SISDRIVERVERSIONYEAR << 16) | \
- (SISDRIVERVERSIONMONTH << 8) | \
- SISDRIVERVERSIONDAY | \
- (SISDRIVERREVISION << 24)
+#define SISDRIVERIVERSION (SISDRIVERVERSIONYEAR << 16) | (SISDRIVERVERSIONMONTH << 8) \
+ | SISDRIVERVERSIONDAY | (SISDRIVERREVISION << 24)
#if 0
#define TWDEBUG /* for debugging */
@@ -65,18 +60,15 @@
#include "xaa.h"
#include "vgaHW.h"
#include "vbe.h"
-
#include "osdef.h"
#include "vgatypes.h"
#include "vstruct.h"
#ifdef XF86DRI
#undef SISNEWDRI
-#undef SISNEWDRI2
-#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,99,14,0)
+#if 0 /* Need to wait for the DRI merge */
+#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,99,??,0)
#define SISNEWDRI
-#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,4,99,99,0) /* Adapt this when the time has come */
-#define SISNEWDRI2
#endif
#endif
#include "xf86drm.h"
@@ -88,32 +80,36 @@
#include "sis_dri.h"
#endif
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,0,0,0)
+typedef unsigned long IOADDRESS;
+#endif
+
#if 1
-#define SISDUALHEAD /* Include Dual Head code */
+#define SISDUALHEAD /* Include Dual Head code */
#endif
#if 1
-#define SISMERGED /* Include Merged-FB mode */
+#define SISMERGED /* Include Merged-FB mode */
#endif
#ifdef SISMERGED
#if 1
-#define SISXINERAMA /* Include SiS Pseudo-Xinerama for MergedFB mode */
+#define SISXINERAMA /* Include SiS Pseudo-Xinerama for MergedFB mode */
#define SIS_XINERAMA_MAJOR_VERSION 1
#define SIS_XINERAMA_MINOR_VERSION 1
#endif
#endif
-#if 1
-#define SISGAMMA /* Include code for gamma correction */
+#if 0 /* Include code for cycling CRT2 type via keyboard */
+#define CYCLECRT2 /* (not functional yet) */
#endif
-#if 1 /* Include code for color hardware cursors */
-#define SIS_ARGB_CURSOR
+#if 1
+#define SISGAMMA /* Include code for gamma correction */
#endif
-#if 1 /* Include YPbPr support on SiS bridges (315 series and 661/741/760) */
-#define ENABLE_YPBPR
+#if 1 /* Include code for color hardware cursors */
+#define SIS_ARGB_CURSOR
#endif
#ifdef SISMERGED
@@ -151,7 +147,7 @@
#define PCI_CHIP_SIS330 0x0330
#endif
#ifndef PCI_CHIP_SIS660
-#define PCI_CHIP_SIS660 0x6330 /* 661_VGA, 741_VGA, 760_VGA */
+#define PCI_CHIP_SIS660 0x6330 /* 660_VGA and 760_VGA (obviously DOA) */
#endif
#define SIS_NAME "SIS"
@@ -183,28 +179,28 @@
/* VBFlags - if anything is changed here, increase VBFlagsVersion! */
#define CRT2_DEFAULT 0x00000001
-#define CRT2_LCD 0x00000002 /* Never change the order of the CRT2_XXX entries */
-#define CRT2_TV 0x00000004
+#define CRT2_LCD 0x00000002 /* TW: Never change the order of the CRT2_XXX entries */
+#define CRT2_TV 0x00000004 /* (see SISCycleCRT2Type()) */
#define CRT2_VGA 0x00000008
+#define CRT2_ENABLE (CRT2_LCD | CRT2_TV | CRT2_VGA)
+#define DISPTYPE_DISP2 CRT2_ENABLE
#define TV_NTSC 0x00000010
#define TV_PAL 0x00000020
#define TV_HIVISION 0x00000040
-#define TV_YPBPR 0x00000080
+#define TV_HIVISION_LV 0x00000080
+#define TV_TYPE (TV_NTSC | TV_PAL | TV_HIVISION | TV_HIVISION_LV)
#define TV_AVIDEO 0x00000100
#define TV_SVIDEO 0x00000200
#define TV_SCART 0x00000400
-#define VB_CONEXANT 0x00000800 /* 661 series only */
-#define VB_TRUMPION VB_CONEXANT /* 300 series only */
+#define TV_INTERFACE (TV_AVIDEO | TV_SVIDEO | TV_SCART | TV_CHSCART | TV_CHHDTV)
+#define VB_USELCDA 0x00000800
#define TV_PALM 0x00001000
#define TV_PALN 0x00002000
-#define TV_NTSCJ 0x00001000
-#define VB_302ELV 0x00004000
#define TV_CHSCART 0x00008000
-#define TV_CHYPBPR525I 0x00010000
-#define CRT1_VGA 0x00000000
-#define CRT1_LCDA 0x00020000
+#define TV_CHHDTV 0x00010000
#define VGA2_CONNECTED 0x00040000
#define DISPTYPE_CRT1 0x00080000 /* CRT1 connected and used */
+#define DISPTYPE_DISP1 DISPTYPE_CRT1
#define VB_301 0x00100000 /* Video bridge type */
#define VB_301B 0x00200000
#define VB_302B 0x00400000
@@ -213,41 +209,22 @@
#define VB_CHRONTEL 0x02000000
#define VB_301LV 0x04000000
#define VB_302LV 0x08000000
+#define VB_30xLV VB_301LV
+#define VB_30xLVX VB_302LV
#define VB_301C 0x10000000
+#define VB_VIDEOBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV| \
+ VB_LVDS|VB_CHRONTEL)
+#define VB_SISBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)
#define SINGLE_MODE 0x20000000 /* CRT1 or CRT2; determined by DISPTYPE_CRTx */
-#define MIRROR_MODE 0x40000000 /* CRT1 + CRT2 identical (mirror mode) */
-#define DUALVIEW_MODE 0x80000000 /* CRT1 + CRT2 independent (dual head mode) */
-
-/* Aliases: */
-#define CRT2_ENABLE (CRT2_LCD | CRT2_TV | CRT2_VGA)
-#define TV_STANDARD (TV_NTSC | TV_PAL | TV_PALM | TV_PALN | TV_NTSCJ)
-#define TV_INTERFACE (TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR)
-
-/* Only if TV_YPBPR is set: */
-#define TV_YPBPR525I TV_NTSC
-#define TV_YPBPR525P TV_PAL
-#define TV_YPBPR750P TV_PALM
-#define TV_YPBPR1080I TV_PALN
-#define TV_YPBPRALL (TV_YPBPR525I | TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I)
-
-#define TV_YPBPR43LB TV_CHSCART
-#define TV_YPBPR43 TV_CHYPBPR525I
-#define TV_YPBPR169 (TV_CHSCART | TV_CHYPBPR525I)
-#define TV_YPBPRAR (TV_CHSCART | TV_CHYPBPR525I)
-
-#define VB_SISBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV)
-#define VB_SISTVBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)
-#define VB_VIDEOBRIDGE (VB_SISBRIDGE | VB_LVDS | VB_CHRONTEL | VB_CONEXANT)
-
-#define DISPTYPE_DISP2 CRT2_ENABLE
-#define DISPTYPE_DISP1 DISPTYPE_CRT1
#define VB_DISPMODE_SINGLE SINGLE_MODE /* alias */
+#define MIRROR_MODE 0x40000000 /* CRT1 + CRT2 identical (mirror mode) */
#define VB_DISPMODE_MIRROR MIRROR_MODE /* alias */
+#define DUALVIEW_MODE 0x80000000 /* CRT1 + CRT2 independent (dual head mode) */
#define VB_DISPMODE_DUAL DUALVIEW_MODE /* alias */
-#define DISPLAY_MODE (SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE)
+#define DISPLAY_MODE (SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) /* TW */
-/* pSiS->VBLCDFlags */
-#define VB_LCD_320x480 0x00000001 /* DSTN/FSTN for 550 */
+/* TW: pSiS->VBLCDFlags */
+#define VB_LCD_320x480 0x00000001 /* TW: DSTN/FSTN for 550 */
#define VB_LCD_640x480 0x00000002
#define VB_LCD_800x600 0x00000004
#define VB_LCD_1024x768 0x00000008
@@ -263,23 +240,28 @@
#define VB_LCD_640x480_2 0x00002000 /* DSTN/FSTN */
#define VB_LCD_640x480_3 0x00004000 /* DSTN/FSTN */
#define VB_LCD_848x480 0x00008000 /* LVDS only, otherwise handled as custom */
-#define VB_LCD_1280x800 0x00010000
-#define VB_LCD_1680x1050 0x00020000
-#define VB_LCD_1280x720 0x00040000
#define VB_LCD_BARCO1366 0x20000000
#define VB_LCD_CUSTOM 0x40000000
#define VB_LCD_EXPANDING 0x80000000
-/* PresetMode argument */
-#define SIS_MODE_SIMU 0
-#define SIS_MODE_CRT1 1
-#define SIS_MODE_CRT2 2
-
/* pSiS->MiscFlags */
#define MISC_CRT1OVERLAY 0x00000001 /* Current display mode supports overlay */
#define MISC_PANELLINKSCALER 0x00000002 /* Panel link is currently scaling */
-#define MISC_CRT1OVERLAYGAMMA 0x00000004 /* Current display mode supports overlay gamma corr on CRT1 */
-#define MISC_TVNTSC1024 0x00000008 /* Current display mode is TV NTSC/PALM/YPBPR525I 1024x768 */
+
+/* More or less useful macros (although we often use pSiS->VGAEngine instead) */
+#define SIS_IS_300_CHIPSET (pSiS->Chipset == PCI_CHIP_SIS300) || \
+ (pSiS->Chipset == PCI_CHIP_SIS630) || \
+ (pSiS->Chipset == PCI_CHIP_SIS540) || \
+ (pSiS->Chipset == PCI_CHIP_SIS730)
+
+#define SIS_IS_315_CHIPSET (pSiS->Chipset == PCI_CHIP_SIS315) || \
+ (pSiS->Chipset == PCI_CHIP_SIS315H) || \
+ (pSiS->Chipset == PCI_CHIP_SIS315PRO) || \
+ (pSiS->Chipset == PCI_CHIP_SIS550) || \
+ (pSiS->Chipset == PCI_CHIP_SIS650) || \
+ (pSiS->Chipset == PCI_CHIP_SIS330) || \
+ (pSiS->Chipset == PCI_CHIP_SIS660) || \
+ (pSiS->Chipset == PCI_CHIP_SIS760)
/* SiS6326Flags */
#define SIS6326_HASTV 0x00000001
@@ -289,7 +271,7 @@
#define SIS6326_TVDETECTED 0x00000010
#define SIS6326_TVON 0x80000000
-#define HW_DEVICE_EXTENSION SIS_HW_INFO
+#define HW_DEVICE_EXTENSION SIS_HW_DEVICE_INFO
#ifdef DEBUG
#define PDEBUG(p) p
@@ -309,19 +291,19 @@ typedef unsigned char UChar;
#define SIS_530_VGA 1
#define SIS_OLD_VGA 2
#define SIS_300_VGA 3
-#define SIS_315_VGA 4 /* Includes 330/660/661/741/760 and M versions thereof */
+#define SIS_315_VGA 4 /* Includes Xabre; see ChipFlags */
/* oldChipset */
-#define OC_UNKNOWN 0
-#define OC_SIS86201 1
-#define OC_SIS86202 2
-#define OC_SIS6205A 3
-#define OC_SIS6205B 4
-#define OC_SIS82204 5
-#define OC_SIS6205C 6
-#define OC_SIS6225 7
-#define OC_SIS5597 8
-#define OC_SIS6326 9
+#define OC_UNKNOWN 0
+#define OC_SIS86201 1
+#define OC_SIS86202 2
+#define OC_SIS6205A 3
+#define OC_SIS6205B 4
+#define OC_SIS82204 5
+#define OC_SIS6205C 6
+#define OC_SIS6225 7
+#define OC_SIS5597 8
+#define OC_SIS6326 9
#define OC_SIS530A 11
#define OC_SIS530B 12
#define OC_SIS620 13
@@ -332,87 +314,53 @@ typedef unsigned char UChar;
/* ChipFlags */
/* Use only lower 16 bit for chip id! (sisctrl) */
-#define SiSCF_LARGEOVERLAY 0x00000001
-#define SiSCF_Is651 0x00000002
-#define SiSCF_IsM650 0x00000004
-#define SiSCF_IsM652 0x00000008
-#define SiSCF_IsM653 0x00000010
-#define SiSCF_Is652 0x00000020
-#define SiSCF_Is65x (SiSCF_Is651|SiSCF_IsM650|SiSCF_IsM652|SiSCF_IsM653|SiSCF_Is652)
-#define SiSCF_IsM661 0x00000100 /* M661FX */
-#define SiSCF_IsM741 0x00000200
-#define SiSCF_IsM760 0x00000400
-#define SiSCF_IsM661M 0x00000800 /* M661MX */
-#define SiSCF_IsM66x (SiSCF_IsM661 | SiSCF_IsM741 | SiSCF_IsM760 | SiSCF_IsM661M)
-#define SiSCF_315Core 0x00010000 /* 3D: Real 315 */
-#define SiSCF_Real256ECore 0x00020000 /* 3D: Similar to 315 core, no T&L? (65x, 661, 740, 741) */
-#define SiSCF_XabreCore 0x00040000 /* 3D: Real Xabre */
-#define SiSCF_Ultra256Core 0x00080000 /* 3D: Similar to Xabre, no T&L?, no P:Shader? (660, 760) */
-#define SiSCF_UseLCDA 0x01000000
-#define SiSCF_760UMA 0x10000000 /* 760: UMA active */
-#define SiSCF_CRT2HWCKaputt 0x20000000 /* CRT2 Mono HWCursor engine buggy (SiS 330) */
-#define SiSCF_Glamour3 0x40000000
-#define SiSCF_Integrated 0x80000000
+#define SiSCF_LARGEOVERLAY 0x00000001
+#define SiSCF_Is651 0x00000002
+#define SiSCF_IsM650 0x00000004
+#define SiSCF_IsM652 0x00000008
+#define SiSCF_IsM653 0x00000010
+#define SiSCF_Is652 0x00000020
+#define SiSCF_Is661FX 0x00000040
+#define SiSCF_IsM661FX 0x00000080
+#define SiSCF_Is661 (SiSCF_Is661FX | SiSCF_IsM661FX)
+#define SiSCF_Is741 0x00000100
+#define SiSCF_Is65x (SiSCF_Is651|SiSCF_IsM650|SiSCF_IsM652|SiSCF_IsM653| \
+ SiSCF_Is652|SiSCF_Is661FX|SiSCF_IsM661FX|SiSCF_Is741)
+#define SiSCF_IsM660 0x00000200
+#define SiSCF_IsM760 0x00000400
+#define SiSCF_Is66x (SiSCF_IsM660 | SiSCF_IsM760)
+#define SiSCF_XabreCore 0x00010000
+#define SiSCF_Glamour3 0x40000000
+#define SiSCF_Integrated 0x80000000
+
/* SiS Direct Xv-API */
-#define SiS_SD_IS300SERIES 0x00000001
-#define SiS_SD_IS315SERIES 0x00000002
-#define SiS_SD_IS330SERIES 0x00000004
-#define SiS_SD_SUPPORTPALMN 0x00000008 /* tv chip supports pal-m, pal-n */
-#define SiS_SD_SUPPORT2OVL 0x00000010 /* set = 2 overlays, clear = support SWITCHCRT xv prop */
-#define SiS_SD_SUPPORTTVPOS 0x00000020 /* supports changing tv position */
-#define SiS_SD_ISDUALHEAD 0x00000040 /* Driver is in dual head mode */
-#define SiS_SD_ISMERGEDFB 0x00000080 /* Driver is in merged fb mode */
-#define SiS_SD_ISDHSECONDHEAD 0x00000100 /* Dual head: This is CRT1 (=second head) */
-#define SiS_SD_ISDHXINERAMA 0x00000200 /* Dual head: We are running Xinerama */
-#define SiS_SD_VBHASSCART 0x00000400 /* videobridge has SCART instead of VGA2 */
-#define SiS_SD_ISDEPTH8 0x00000800 /* Depth is 8, no independent gamma correction */
-#define SiS_SD_SUPPORTSOVER 0x00001000 /* Support for Chrontel Super Overscan */
-#define SiS_SD_ENABLED 0x00002000 /* sisctrl is enabled (by option) */
-#define SiS_SD_PSEUDOXINERAMA 0x00004000 /* pseudo xinerama is active */
-#define SiS_SD_SUPPORTLCDA 0x00008000 /* Support LCD Channel A */
-#define SiS_SD_SUPPORTNTSCJ 0x00010000 /* tv chip supports ntsc-j */
-#define SiS_SD_ADDLSUPFLAG 0x00020000 /* 1 = the following flags are valid */
-#define SiS_SD_SUPPORTVGA2 0x00040000 /* CRT2=VGA supported */
-#define SiS_SD_SUPPORTSCART 0x00080000 /* CRT2=SCART supported */
-#define SiS_SD_SUPPORTOVERSCAN 0x00100000 /* Overscan flag supported */
-#define SiS_SD_SUPPORTXVGAMMA1 0x00200000 /* Xv Gamma correction for CRT1 supported */
-#define SiS_SD_SUPPORTTV 0x00400000 /* CRT2=TV supported */
-#define SiS_SD_SUPPORTYPBPR 0x00800000 /* CRT2=YPbPr (525i, 525p, 750p, 1080i) is supported */
-#define SiS_SD_SUPPORTHIVISION 0x01000000 /* CRT2=HiVision is supported */
-#define SiS_SD_SUPPORTYPBPRAR 0x02000000 /* YPbPr aspect ratio is supported */
-#define SiS_SD_SUPPORTSCALE 0x04000000 /* Scaling of LCD panel supported */
-#define SiS_SD_SUPPORTCENTER 0x08000000 /* If scaling supported: Centering of screen [NOT] supported (TMDS only) */
-
-#define SIS_DIRECTKEY 0x03145792
+#define SiS_SD_IS300SERIES 0x00000001
+#define SiS_SD_IS315SERIES 0x00000002
+#define SiS_SD_IS330SERIES 0x00000004
+#define SiS_SD_SUPPORTPALMN 0x00000008 /* tv chip supports pal-m, pal-n */
+#define SiS_SD_SUPPORT2OVL 0x00000010 /* set = 2 overlays, 1 = support SWITCHCRT xv prop */
+#define SiS_SD_SUPPORTTVPOS 0x00000020 /* supports changing tv position */
+#define SiS_SD_ISDUALHEAD 0x00000040 /* Driver is in dual head mode */
+#define SiS_SD_ISMERGEDFB 0x00000080 /* Driver is in merged fb mode */
+#define SiS_SD_ISDHSECONDHEAD 0x00000100 /* Dual head: This is CRT1 (=second head) */
+#define SiS_SD_ISDHXINERAMA 0x00000200 /* Dual head: We are running Xinerama */
+#define SiS_SD_VBHASSCART 0x00000400 /* videobridge has SCART instead of VGA2 */
+#define SiS_SD_ISDEPTH8 0x00000800 /* Depth is 8, no independent gamma correction */
+#define SiS_SD_SUPPORTSOVER 0x00001000 /* Support for Chrontel Super Overscan */
+#define SiS_SD_ENABLED 0x00002000 /* sisctrl is enabled (by option) */
+#define SiS_SD_PSEUDOXINERAMA 0x00004000 /* pseudo xinerama is active */
+
+#define SIS_DIRECTKEY 0x3145792
/* SiSCtrl: Check mode for CRT2 */
-#define SiS_CF2_LCD 0x01
-#define SiS_CF2_TV 0x02
-#define SiS_CF2_VGA2 0x04
-#define SiS_CF2_TVPAL 0x08
-#define SiS_CF2_TVNTSC 0x10 /* + NTSC-J */
-#define SiS_CF2_TVPALM 0x20
-#define SiS_CF2_TVPALN 0x40
-#define SiS_CF2_CRT1LCDA 0x80
-#define SiS_CF2_TYPEMASK (SiS_CF2_LCD | SiS_CF2_TV | SiS_CF2_VGA2 | SiS_CF2_CRT1LCDA)
-#define SiS_CF2_TVSPECIAL (SiS_CF2_LCD | SiS_CF2_TV)
-#define SiS_CF2_TVSPECMASK (SiS_CF2_TVPAL | SiS_CF2_TVNTSC | SiS_CF2_TVPALM | SiS_CF2_TVPALN)
-#define SiS_CF2_TVHIVISION SiS_CF2_TVPAL
-#define SiS_CF2_TVYPBPR525I SiS_CF2_TVNTSC
-#define SiS_CF2_TVYPBPR525P (SiS_CF2_TVPAL | SiS_CF2_TVNTSC)
-#define SiS_CF2_TVYPBPR750P SiS_CF2_TVPALM
-#define SiS_CF2_TVYPBPR1080I (SiS_CF2_TVPALM | SiS_CF2_TVPAL)
-
-/* AGP stuff for DRI */
-#define AGP_PAGE_SIZE 4096
-#define AGP_PAGES 2048 /* Default: 2048 pages @ 4096 = 8MB */
-/* 300 */
-#define AGP_CMDBUF_PAGES 256
-#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES)
-/* 315/330 */
-#define AGP_VTXBUF_PAGES 512
-#define AGP_VTXBUF_SIZE (AGP_PAGE_SIZE * AGP_VTXBUF_PAGES)
+#define SiS_CF2_LCD 0x01
+#define SiS_CF2_TV 0x02
+#define SiS_CF2_VGA2 0x04
+#define SiS_CF2_TVPAL 0x08
+#define SiS_CF2_TVNTSC 0x10
+#define SiS_CF2_TVPALM 0x20
+#define SiS_CF2_TVPALN 0x40
/* For backup of register contents */
typedef struct {
@@ -422,7 +370,7 @@ typedef struct {
unsigned char sisCapt[0x60];
unsigned char sisVid[0x50];
unsigned char VBPart1[0x50];
- unsigned char VBPart2[0x100];
+ unsigned char VBPart2[0x50];
unsigned char VBPart3[0x50];
unsigned char VBPart4[0x50];
unsigned short ch70xx[64];
@@ -460,16 +408,14 @@ typedef struct {
unsigned char * BIOS;
SiS_Private * SiS_Pr;
unsigned long agpHandle;
- unsigned long agpAddr;
+ CARD32 agpAddr;
unsigned char *agpBase;
unsigned int agpSize;
- unsigned int agpWantedSize;
- unsigned int agpWantedPages;
- unsigned long agpCmdBufAddr; /* 300 series */
+ CARD32 agpCmdBufAddr; /* 300 series */
unsigned char *agpCmdBufBase;
unsigned int agpCmdBufSize;
unsigned int agpCmdBufFree;
- unsigned long agpVtxBufAddr; /* 315 series */
+ CARD32 agpVtxBufAddr; /* 315 series */
unsigned char *agpVtxBufBase;
unsigned int agpVtxBufSize;
unsigned int agpVtxBufFree;
@@ -482,22 +428,20 @@ typedef struct {
DisplayModePtr CRT1DMode; /* Current display mode for CRT1 */
int CRT2ModeNo; /* Current display mode for CRT2 */
DisplayModePtr CRT2DMode; /* Current display mode for CRT2 */
- Bool CRT2ModeSet; /* CRT2 mode has been set */
Bool CRT2IsCustom;
- unsigned char CRT2CR30, CRT2CR31, CRT2CR35, CRT2CR38;
int refCount;
int lastInstance; /* number of entities */
Bool DisableDual; /* Emergency flag */
Bool ErrorAfterFirst; /* Emergency flag: Error after first init -> Abort second */
Bool HWCursor; /* Backup master settings for use on slave */
Bool TurboQueue;
- int ForceCRT1Type;
int ForceCRT2Type;
int OptTVStand;
int OptTVOver;
int OptTVSOver;
int OptROMUsage;
int OptUseOEM;
+ int PDC;
Bool NoAccel;
int forceCRT1;
int DSTN, FSTN;
@@ -535,34 +479,24 @@ typedef struct {
int sistvyfilter;
int tvxpos, tvypos;
int tvxscale, tvyscale;
- int ForceTVType, SenseYPbPr;
- unsigned long ForceYPbPrType, ForceYPbPrAR;
+ int ForceTVType;
int chtvtype;
- int NonDefaultPAL, NonDefaultNTSC;
+ int NonDefaultPAL;
unsigned short tvx, tvy;
- unsigned char p2_01, p2_02, p2_1f, p2_20, p2_43, p2_42, p2_2b;
+ unsigned char p2_01, p2_02, p2_1f, p2_20;
unsigned char p2_44, p2_45, p2_46;
unsigned long sistvccbase;
unsigned char p2_35, p2_36, p2_37, p2_38, p2_48, p2_49, p2_4a;
unsigned char p2_0a, p2_2f, p2_30, p2_47;
- unsigned char scalingp1[9], scalingp4[9], scalingp2[64];
+ unsigned char scalingp1[9], scalingp4[9];
unsigned short cursorBufferNum;
BOOLEAN restorebyset;
- BOOLEAN CRT1gamma, CRT1gammaGiven, CRT2gamma, XvGamma, XvGammaGiven;
- int XvGammaRed, XvGammaGreen, XvGammaBlue;
- int GammaBriR, GammaBriG, GammaBriB; /* strictly for Xinerama */
- int GammaPBriR, GammaPBriG, GammaPBriB; /* strictly for Xinerama */
+ BOOLEAN CRT1gamma, CRT2gamma;
int curxvcrtnum;
- int UsePanelScaler, CenterLCD;
+ int UsePanelScaler;
int AllowHotkey;
BOOLEAN enablesisctrl;
unsigned long cmdQ_SharedWritePort_2D;
- unsigned char *RenderAccelArray;
- unsigned char * FbBase1;
- unsigned long OnScreenSize1;
- unsigned char OldMode;
- int HWCursorMBufNum, HWCursorCBufNum;
- BOOLEAN ROM661New;
#ifdef SIS_CP
SIS_CP_H_ENT
#endif
@@ -602,7 +536,7 @@ typedef struct {
#ifdef __alpha__
unsigned char * IOBaseDense; /* MMIO for Alpha platform */
#endif
- SISIOADDRESS RelIO; /* Relocated IO Ports baseaddress */
+ CARD16 RelIO; /* Relocated IO Ports baseaddress */
unsigned char * BIOS;
int MemClock;
int BusWidth;
@@ -628,7 +562,6 @@ typedef struct {
Bool UsePCIRetry;
Bool TurboQueue;
int VESA;
- int ForceCRT1Type;
int ForceCRT2Type;
int OptTVStand;
int OptTVOver;
@@ -639,14 +572,13 @@ typedef struct {
int forceCRT1;
Bool CRT1changed;
unsigned char oldCR17, oldCR63, oldSR1F;
- unsigned char oldCR32, oldCR36, oldCR37;
- unsigned char myCR32, myCR36, myCR37, myCR63;
+ unsigned char oldCR32;
unsigned char newCR32;
unsigned long VBFlags; /* Video bridge configuration */
unsigned long VBFlags_backup; /* Backup for SlaveMode-modes */
unsigned long VBLCDFlags; /* Moved LCD panel size bits here */
int ChrontelType; /* CHRONTEL_700x or CHRONTEL_701x */
- unsigned int PDC, PDCA; /* PanelDelayCompensation */
+ int PDC; /* PanelDelayCompensation */
short scrnOffset; /* Screen pitch (data) */
short scrnPitch; /* Screen pitch (display; regarding interlace) */
short DstColor;
@@ -676,6 +608,7 @@ typedef struct {
xf86CursorInfoPtr CursorInfoPtr;
XAAInfoRecPtr AccelInfoPtr;
CloseScreenProcPtr CloseScreen;
+ unsigned int (*ddc1Read)(ScrnInfoPtr);
Bool (*ModeInit)(ScrnInfoPtr pScrn, DisplayModePtr mode);
void (*SiSSave)(ScrnInfoPtr pScrn, SISRegPtr sisreg);
void (*SiSSave2)(ScrnInfoPtr pScrn, SISRegPtr sisreg);
@@ -685,6 +618,8 @@ typedef struct {
void (*SiSRestore2)(ScrnInfoPtr pScrn, SISRegPtr sisreg);
void (*SiSRestore3)(ScrnInfoPtr pScrn, SISRegPtr sisreg);
void (*SiSRestoreLVDSChrontel)(ScrnInfoPtr pScrn, SISRegPtr sisreg);
+ void (*SetThreshold)(ScrnInfoPtr pScrn, DisplayModePtr mode,
+ unsigned short *Low, unsigned short *High);
void (*LoadCRT2Palette)(ScrnInfoPtr pScrn, int numColors,
int *indicies, LOCO *colors, VisualPtr pVisual);
@@ -704,16 +639,14 @@ typedef struct {
unsigned int cmdQueueSize_div4;
unsigned int cmdQueueSize_4_3;
unsigned long agpHandle;
- unsigned long agpAddr;
+ CARD32 agpAddr;
unsigned char *agpBase;
unsigned int agpSize;
- unsigned int agpWantedSize;
- unsigned int agpWantedPages;
- unsigned long agpCmdBufAddr; /* 300 series */
+ CARD32 agpCmdBufAddr; /* 300 series */
unsigned char *agpCmdBufBase;
unsigned int agpCmdBufSize;
unsigned int agpCmdBufFree;
- unsigned long agpVtxBufAddr; /* 315 series */
+ CARD32 agpVtxBufAddr; /* 315 series */
unsigned char *agpVtxBufBase;
unsigned int agpVtxBufSize;
unsigned int agpVtxBufFree;
@@ -750,8 +683,6 @@ typedef struct {
unsigned char *ShadowPtr;
int ShadowPitch;
- Bool loadDRI;
-
#ifdef XF86DRI
Bool directRenderingEnabled;
DRIInfoPtr pDRIInfo;
@@ -765,8 +696,6 @@ typedef struct {
XF86VideoAdaptorPtr adaptor;
ScreenBlockHandlerProcPtr BlockHandler;
void (*VideoTimerCallback)(ScrnInfoPtr, Time);
- void (*ResetXv)(ScrnInfoPtr);
- void (*ResetXvGamma)(ScrnInfoPtr);
OptionInfoPtr Options;
unsigned char LCDon;
@@ -799,13 +728,15 @@ typedef struct {
BOOL SiSXinerama; /* Do we use Xinerama mode? */
#endif
SISFBLayout CurrentLayout; /* Current framebuffer layout */
+ Bool (*i2cInit)(ScrnInfoPtr);/* I2C stuff (unused) */
+ I2CBusPtr I2C;
USHORT SiS_DDC2_Index;
USHORT SiS_DDC2_Data;
USHORT SiS_DDC2_Clk;
BOOL Primary; /* Display adapter is primary */
xf86Int10InfoPtr pInt; /* Our int10 */
int oldChipset; /* Type of old chipset */
- int RealVideoRam; /* 6326 can only address 4MB, but TQ can be above */
+ CARD32 RealVideoRam; /* 6326 can only address 4MB, but TQ can be above */
CARD32 CmdQueLenMask; /* Mask of queue length in MMIO register */
CARD32 CmdQueLenFix; /* Fix value to subtract from QueLen (530/620) */
CARD32 CmdQueMaxLen; /* (6326/5597/5598) Amount of cmds the queue can hold */
@@ -839,28 +770,24 @@ typedef struct {
int sis6326fscadjust;
BOOL sisfbfound;
BOOL donttrustpdc; /* Don't trust the detected PDC */
- unsigned char sisfbpdc, sisfbpdca;
+ unsigned char sisfbpdc;
unsigned char sisfblcda;
int sisfbscalelcd;
unsigned long sisfbspecialtiming;
- BOOL sisfb_haveemi, sisfb_haveemilcd;
- unsigned char sisfb_emi30,sisfb_emi31,sisfb_emi32,sisfb_emi33;
- int EMI;
int NoYV12; /* Disable Xv YV12 support (old series) */
unsigned char postVBCR32;
int newFastVram; /* Replaces FastVram */
- int ForceTVType, SenseYPbPr;
- int NonDefaultPAL, NonDefaultNTSC;
- unsigned long ForceYPbPrType, ForceYPbPrAR;
+ int ForceTVType;
+ int NonDefaultPAL;
unsigned long lockcalls; /* Count unlock calls for debug */
unsigned short tvx, tvy; /* Backup TV position registers */
- unsigned char p2_01, p2_02, p2_1f, p2_20, p2_43, p2_42, p2_2b; /* Backup TV position registers */
+ unsigned char p2_01, p2_02, p2_1f, p2_20; /* Backup TV position registers */
unsigned short tvx1, tvx2, tvx3, tvy1; /* Backup TV position registers */
unsigned char p2_44, p2_45, p2_46;
unsigned long sistvccbase;
unsigned char p2_35, p2_36, p2_37, p2_38, p2_48, p2_49, p2_4a;
unsigned char p2_0a, p2_2f, p2_30, p2_47;
- unsigned char scalingp1[9], scalingp4[9], scalingp2[64];
+ unsigned char scalingp1[9], scalingp4[9];
BOOLEAN ForceCursorOff;
BOOLEAN HaveCustomModes;
BOOLEAN IsCustom;
@@ -871,16 +798,11 @@ typedef struct {
Atom xvDisableGfx, xvDisableGfxLR, xvTVXPosition, xvTVYPosition;
Atom xvDisableColorkey, xvUseChromakey, xvChromaMin, xvChromaMax;
Atom xvInsideChromakey, xvYUVChromakey;
- Atom xvGammaRed, xvGammaGreen, xvGammaBlue;
Atom xv_QVF, xv_QVV, xv_USD, xv_SVF, xv_QDD, xv_TAF, xv_TSA, xv_TEE, xv_GSF;
Atom xv_TTE, xv_TCO, xv_TCC, xv_TCF, xv_TLF, xv_CMD, xv_CMDR, xv_CT1, xv_SGA;
Atom xv_GDV, xv_GHI, xv_OVR, xv_GBI, xv_TXS, xv_TYS, xv_CFI, xv_COC, xv_COF;
Atom xv_YFI, xv_GSS, xv_BRR, xv_BRG, xv_BRB, xv_PBR, xv_PBG, xv_PBB, xv_SHC;
- Atom xv_BRR2, xv_BRG2, xv_BRB2, xv_PBR2, xv_PBG2, xv_PBB2, xv_PMD;
-#ifdef TWDEBUG
- Atom xv_STR;
-#endif
- int xv_sisdirectunlocked;
+ BOOLEAN xv_sisdirectunlocked;
unsigned long xv_sd_result;
int CRT1isoff;
#ifdef SIS_CP
@@ -897,20 +819,17 @@ typedef struct {
BOOLEAN restorebyset;
BOOLEAN nocrt2ddcdetection;
BOOLEAN forcecrt2redetection;
- BOOLEAN CRT1gamma, CRT1gammaGiven, CRT2gamma, XvGamma, XvGammaGiven;
+ BOOLEAN CRT1gamma, CRT2gamma;
int XvDefCon, XvDefBri, XvDefHue, XvDefSat;
BOOLEAN XvDefDisableGfx, XvDefDisableGfxLR;
BOOLEAN XvUseMemcpy;
BOOLEAN XvUseChromaKey, XvDisableColorKey;
BOOLEAN XvInsideChromaKey, XvYUVChromaKey;
int XvChromaMin, XvChromaMax;
- int XvGammaRed, XvGammaGreen, XvGammaBlue;
- int XvGammaRedDef, XvGammaGreenDef, XvGammaBlueDef;
- CARD8 XvGammaRampRed[256], XvGammaRampGreen[256], XvGammaRampBlue[256];
BOOLEAN disablecolorkeycurrent;
CARD32 colorKey;
CARD32 MiscFlags;
- int UsePanelScaler, CenterLCD;
+ int UsePanelScaler;
FBLinearPtr AccelLinearScratch;
void (*AccelRenderCallback)(ScrnInfoPtr);
float zClearVal;
@@ -928,12 +847,8 @@ typedef struct {
int GammaPBriR, GammaPBriG, GammaPBriB;
Bool HideHWCursor; /* Custom application */
Bool HWCursorIsVisible;
- unsigned long HWCursorBackup[16];
- int HWCursorMBufNum, HWCursorCBufNum;
- unsigned long mmioSize;
- BOOLEAN ROM661New;
#ifdef SISMERGED
- Bool MergedFB, MergedFBAuto;
+ Bool MergedFB;
SiSScrn2Rel CRT2Position;
char * CRT2HSync;
char * CRT2VRefresh;
@@ -951,7 +866,6 @@ typedef struct {
int maxCRT1_X1, maxCRT1_X2, maxCRT1_Y1, maxCRT1_Y2;
int maxCRT2_X1, maxCRT2_X2, maxCRT2_Y1, maxCRT2_Y2;
int maxClone_X1, maxClone_X2, maxClone_Y1, maxClone_Y2;
- int MergedFBXDPI, MergedFBYDPI;
#ifdef SISXINERAMA
Bool UseSiSXinerama;
Bool CRT2IsScrn0;
@@ -1115,8 +1029,7 @@ extern void SiS_SetTVyposoffset(ScrnInfoPtr pScrn, int val);
extern void SiS_SetTVxscale(ScrnInfoPtr pScrn, int val);
extern void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val);
extern Bool SISSwitchCRT2Type(ScrnInfoPtr pScrn, unsigned long newvbflags);
-extern int SISCheckModeIndexForCRT2Type(ScrnInfoPtr pScrn, unsigned short cond,
- unsigned short index, Bool quiet);
+extern Bool SISCheckModeIndexForCRT2Type(ScrnInfoPtr pScrn, unsigned short cond, unsigned short index, Bool quiet);
extern Bool SISSwitchCRT1Status(ScrnInfoPtr pScrn, int onoff);
extern int SiS_GetCHTVlumabandwidthcvbs(ScrnInfoPtr pScrn);
extern int SiS_GetCHTVlumabandwidthsvideo(ScrnInfoPtr pScrn);
diff --git a/src/sis300_accel.c b/src/sis300_accel.c
index 568fe63..8e2e5f4 100644
--- a/src/sis300_accel.c
+++ b/src/sis300_accel.c
@@ -1,33 +1,32 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.c,v 1.20 2003/09/02 18:28:35 twini Exp $ */
/*
- * 2D Acceleration for SiS 530, 620, 300, 540, 630, 730.
+ * 2D Acceleration for SiS300, SiS540, SiS630, SiS730, SiS530, SiS620
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright Xavier Ducoin <x.ducoin@lectra.com>
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Authors: Thomas Winischhofer <thomas@winischhofer.net>
- * Can-Ru Yeou, SiS Inc.
+ * Authors:
+ *
+ * Xavier Ducoin <x.ducoin@lectra.com>
+ * Thomas Winischhofer <thomas@winischhofer.net>
*
*/
@@ -43,7 +42,6 @@
#include "compiler.h"
#include "xaa.h"
#include "xaalocal.h"
-#include "xaarop.h"
#include "sis.h"
#include "sis300_accel.h"
@@ -322,7 +320,7 @@ SiS300AccelInit(ScreenPtr pScreen)
if(Avail.y2 < pScrn->currentMode->VDisplay) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Not enough video RAM for accelerator. At least "
- "%dKB needed, %ldKB available\n",
+ "%dKB needed, %dKB available\n",
((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* TW: +8 for make it sure */
* pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8,
pSiS->maxxfbmem/1024);
@@ -373,6 +371,46 @@ SiSRestoreAccelState(ScrnInfoPtr pScrn)
}
#endif
+static const int sisALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0x88, /* dest &= src; DSa, GXand, 0x1 */
+ 0x44, /* dest = src & ~dest; SDna, GXandReverse, 0x2 */
+ 0xCC, /* dest = src; S, GXcopy, 0x3 */
+ 0x22, /* dest &= ~src; DSna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x66, /* dest = ^src; DSx, GXxor, 0x6 */
+ 0xEE, /* dest |= src; DSo, GXor, 0x7 */
+ 0x11, /* dest = ~src & ~dest; DSon, GXnor, 0x8 */
+ 0x99, /* dest ^= ~src ; DSxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xDD, /* dest = src|~dest ; SDno, GXorReverse, 0xB */
+ 0x33, /* dest = ~src; Sn, GXcopyInverted, 0xC */
+ 0xBB, /* dest |= ~src; DSno, GXorInverted, 0xD */
+ 0x77, /* dest = ~src|~dest; DSan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+/* same ROP but with Pattern as Source */
+static const int sisPatALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0xA0, /* dest &= src; DPa, GXand, 0x1 */
+ 0x50, /* dest = src & ~dest; PDna, GXandReverse, 0x2 */
+ 0xF0, /* dest = src; P, GXcopy, 0x3 */
+ 0x0A, /* dest &= ~src; DPna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x5A, /* dest = ^src; DPx, GXxor, 0x6 */
+ 0xFA, /* dest |= src; DPo, GXor, 0x7 */
+ 0x05, /* dest = ~src & ~dest; DPon, GXnor, 0x8 */
+ 0xA5, /* dest ^= ~src ; DPxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xF5, /* dest = src|~dest ; PDno, GXorReverse, 0xB */
+ 0x0F, /* dest = ~src; Pn, GXcopyInverted, 0xC */
+ 0xAF, /* dest |= ~src; DPno, GXorInverted, 0xD */
+ 0x5F, /* dest = ~src|~dest; DPan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+
static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir, int rop,
unsigned int planemask, int trans_color)
@@ -391,7 +429,7 @@ static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
SiSSetupSRCTrans(trans_color)
SiSSetupCMDFlag(TRANSPARENT_BITBLT)
} else {
- SiSSetupROP(XAACopyROP[rop])
+ SiSSetupROP(sisALUConv[rop])
}
if(xdir > 0) {
SiSSetupCMDFlag(X_INC)
@@ -461,7 +499,7 @@ SiSSetupForSolidFill(ScrnInfoPtr pScrn,
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
/* SiSSetupCMDFlag(PATFG) - is zero */
}
@@ -619,7 +657,7 @@ SiSSetupForSolidLine(ScrnInfoPtr pScrn,
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATFG | LINE)
}
@@ -708,7 +746,7 @@ SiSSetupForDashedLine(ScrnInfoPtr pScrn,
SiSSetupStyleLow(*pattern)
SiSSetupStyleHigh(*(pattern+4))
SiSSetupStylePeriod(length-1);
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupPATFG(fg)
SiSSetupCMDFlag(LINE | LINE_STYLE)
if(bg != -1) {
@@ -768,7 +806,7 @@ SiSSetupForMonoPatternFill(ScrnInfoPtr pScrn,
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupMONOPAT(patx,paty)
SiSSetupPATFG(fg)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATMONO)
if(bg != -1) {
SiSSetupPATBG(bg)
@@ -902,7 +940,7 @@ SiSSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
SiSSetupDSTColorDepth(pSiS->DstColor);
SiSSetupSRCXY(0,0)
SiSSetupSRCFG(fg)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(X_INC | Y_INC | COLOREXP)
if(bg == -1) {
SiSSetupCMDFlag(TRANSPARENT)
@@ -954,7 +992,7 @@ SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
SiSSetupDSTColorDepth(pSiS->DstColor)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
- SiSSetupROP(XAACopyROP[rop])
+ SiSSetupROP(sisALUConv[rop])
SiSSetupSRCFG(fg)
/* SiSSetupSRCXY(0,0) */
@@ -1120,7 +1158,7 @@ SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
while((MMIO_IN16(pSiS->IOBase, 0x8242) & 0x1F00) != 0) {} /* WDR: == 0x10 */
SiSSetupSRCXY(0,0);
- SiSSetupROP(XAACopyROP[rop]);
+ SiSSetupROP(sisALUConv[rop]);
SiSSetupSRCFG(fg);
SiSSetupDSTRect(pSiS->scrnOffset, -1);
SiSSetupDSTColorDepth(pSiS->DstColor);
diff --git a/src/sis300_accel.h b/src/sis300_accel.h
index e33fdbe..3cc5a66 100644
--- a/src/sis300_accel.h
+++ b/src/sis300_accel.h
@@ -1,34 +1,33 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis300_accel.h,v 1.13 2003/08/23 10:25:19 twini Exp $ */
/*
- * 2D Acceleration for SiS 530, 620, 300, 540, 630, 730.
+ * 2D Acceleration for SiS300, SiS540, SiS630, SiS730, SiS530, SiS620
* Definitions for the SIS engine communication
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright Xavier Ducoin <x.ducoin@lectra.com>
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Authors: Thomas Winischhofer <thomas@winischhofer.net>
- * Can-Ru Yeou, SiS Inc. (code base)
+ * Authors:
+ *
+ * Xavier Ducoin <x.ducoin@lectra.com>
+ * Thomas Winischhofer <thomas@winischhofer.net>
*
*/
@@ -230,7 +229,6 @@
} else { \
unsigned long temp; \
temp = MMIO_IN32(pSiS->IOBase, BR(16)); \
- (void) temp; \
} \
/* Line */
diff --git a/src/sis310_accel.c b/src/sis310_accel.c
index 4f26e06..e47da9e 100644
--- a/src/sis310_accel.c
+++ b/src/sis310_accel.c
@@ -1,36 +1,33 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.c,v 1.20 2003/09/02 18:28:35 twini Exp $ */
/*
- * 2D Acceleration for SiS 315 and 330 series
+ * 2D Acceleration for SiS 315 and Xabre series
+ * (315/550/650/740/M650/651/652/M652/330/660/M660/760/M760)
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Based on sis300_accel.c
+ * 2003/08/18: Rewritten for using VRAM command queue (TW)
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
- * 2003/08/18: Rewritten for using VRAM command queue
- *
*/
#include "xf86.h"
@@ -41,7 +38,6 @@
#include "compiler.h"
#include "xaa.h"
#include "xaalocal.h"
-#include "xaarop.h"
#include "sis.h"
#include "sis310_accel.h"
@@ -61,7 +57,7 @@
* checking the trapezoid for such a case is very
* time-intensive, it is faster to let it be done
* by the generic polygon functions.
- * Does not work on 330 series at all, hangs the engine.
+ * Does not work on XABRE at all, hangs the engine.
* Even with correct trapezoids, this is slower than
* doing it by the CPU.
*/
@@ -69,9 +65,9 @@
#undef CTSCE /* Use/Don't use CPUToScreenColorExpand. Disabled
* because it is slower than doing it by the CPU.
* Indirect mode does not work in VRAM queue mode.
- * Does not work on 330 series (even in MMIO mode).
+ * Does not work on Xabre (even in MMIO mode).
*/
-#undef CTSCE_DIRECT /* Use direct method - This works (on both 315 and 330 at
+#undef CTSCE_DIRECT /* Use direct method - This works (on both 315 and Xabre at
* least in VRAM queue mode) but we don't use this either,
* because it's slower than doing it by the CPU. (Using it
* would require defining CTSCE)
@@ -187,9 +183,9 @@ extern void SiSSubsequentCPUToScreenTexture(ScrnInfoPtr pScrn,
int width, int height);
extern CARD32 SiSAlphaTextureFormats[2];
-extern CARD32 SiSTextureFormats[2];
-CARD32 SiSAlphaTextureFormats[2] = { PICT_a8 , 0 };
-CARD32 SiSTextureFormats[2] = { PICT_a8r8g8b8, 0 };
+extern CARD32 SiSTextureFormats[2];
+CARD32 SiSAlphaTextureFormats[2] = { PICT_a8, 0 };
+CARD32 SiSTextureFormats[2] = { PICT_a8r8g8b8, 0 };
#endif
#endif
@@ -222,16 +218,13 @@ SiS315AccelInit(ScreenPtr pScreen)
int topFB;
int reservedFbSize;
int UsableFbSize;
+ unsigned char *AvailBufBase;
BoxRec Avail;
-#ifdef SISDUALHEAD
- SISEntPtr pSiSEnt = NULL;
-#endif
#ifdef CTSCE
- unsigned char *AvailBufBase;
#ifndef CTSCE_DIRECT
int i;
#endif
-#endif
+#endif
pSiS->AccelInfoPtr = infoPtr = XAACreateInfoRec();
if(!infoPtr) return FALSE;
@@ -249,10 +242,6 @@ SiS315AccelInit(ScreenPtr pScreen)
(pScrn->bitsPerPixel != 32))
return FALSE;
-#ifdef SISDUALHEAD
- pSiSEnt = pSiS->entityPrivate;
-#endif
-
/* BitBlt */
infoPtr->SetupForScreenToScreenCopy = SiSSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy = SiSSubsequentScreenToScreenCopy;
@@ -294,14 +283,14 @@ SiS315AccelInit(ScreenPtr pScreen)
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_SCREEN_ORIGIN |
HARDWARE_PATTERN_PROGRAMMED_BITS |
- BIT_ORDER_IN_BYTE_MSBFIRST;
+ BIT_ORDER_IN_BYTE_MSBFIRST ;
#ifdef SISVRAMQ
/* 8x8 color pattern fill (MMIO support not implemented) */
infoPtr->SetupForColor8x8PatternFill = SiSSetupForColor8x8PatternFill;
infoPtr->SubsequentColor8x8PatternFillRect = SiSSubsequentColor8x8PatternFillRect;
infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
- HARDWARE_PATTERN_SCREEN_ORIGIN |
+ HARDWARE_PATTERN_SCREEN_ORIGIN |
NO_TRANSPARENCY;
#endif
@@ -352,7 +341,7 @@ SiS315AccelInit(ScreenPtr pScreen)
*
* SLOW! SLOWER! SLOWEST!
*
- * Does not work on 330 series, hangs the engine (both VRAM and MMIO).
+ * Does not work on XABRE, hangs the engine (both VRAM and MMIO).
* Does not work in VRAM queue mode.
*/
#ifndef SISVRAMQ
@@ -386,35 +375,25 @@ SiS315AccelInit(ScreenPtr pScreen)
pSiS->PerColorExpandBufferSize = 0;
#endif
- pSiS->RenderAccelArray = NULL;
-
#ifdef INCL_RENDER
#ifdef RENDER
/* Render */
if(((pScrn->bitsPerPixel == 16) || (pScrn->bitsPerPixel == 32)) && pSiS->doRender) {
int i, j;
-#ifdef SISDUALHEAD
- if(pSiSEnt) pSiS->RenderAccelArray = pSiSEnt->RenderAccelArray;
-#endif
- if(!pSiS->RenderAccelArray) {
- if((pSiS->RenderAccelArray = xnfcalloc(65536, 1))) {
-#ifdef SISDUALHEAD
- if(pSiSEnt) pSiSEnt->RenderAccelArray = pSiS->RenderAccelArray;
-#endif
- for(i = 0; i < 256; i++) {
- for(j = 0; j < 256; j++) {
- pSiS->RenderAccelArray[(i << 8) + j] = (i * j) / 255;
- }
- }
+ if((pSiS->RenderAccelArray = xnfcalloc(65536, 1))) {
+ for(i = 0; i < 256; i++) {
+ for(j = 0; j < 256; j++) {
+ pSiS->RenderAccelArray[(i << 8) + j] = (i * j) / 255;
+ }
}
- }
- if(pSiS->RenderAccelArray) {
+
pSiS->AccelLinearScratch = NULL;
infoPtr->SetupForCPUToScreenAlphaTexture = SiSSetupForCPUToScreenAlphaTexture;
infoPtr->SubsequentCPUToScreenAlphaTexture = SiSSubsequentCPUToScreenTexture;
infoPtr->CPUToScreenAlphaTextureFormats = SiSAlphaTextureFormats;
- infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE;
+ infoPtr->CPUToScreenAlphaTextureFlags = XAA_RENDER_NO_TILE |
+ XAA_RENDER_NO_SRC_ALPHA;
infoPtr->SetupForCPUToScreenTexture = SiSSetupForCPUToScreenTexture;
infoPtr->SubsequentCPUToScreenTexture = SiSSubsequentCPUToScreenTexture;
@@ -445,8 +424,8 @@ SiS315AccelInit(ScreenPtr pScreen)
* UsableFbSize ColorExpandBuffers | DRI-Heap HWCursor CommandQueue
* topFB
*/
-#ifdef CTSCE
AvailBufBase = pSiS->FbBase + UsableFbSize;
+#ifdef CTSCE
if(pSiS->ColorExpandBufferNumber) {
#ifdef CTSCE_DIRECT
infoPtr->ColorExpandBase = (unsigned char *)AvailBufBase;
@@ -471,7 +450,7 @@ SiS315AccelInit(ScreenPtr pScreen)
if(Avail.y2 < pScrn->currentMode->VDisplay) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Not enough video RAM for accelerator. At least "
- "%dKB needed, %ldKB available\n",
+ "%dKB needed, %dKB available\n",
((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* +8 for make it sure */
* pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8,
pSiS->maxxfbmem/1024);
@@ -525,6 +504,47 @@ SiSRestoreAccelState(ScrnInfoPtr pScrn)
}
#endif
+static const int sisALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0x88, /* dest &= src; DSa, GXand, 0x1 */
+ 0x44, /* dest = src & ~dest; SDna, GXandReverse, 0x2 */
+ 0xCC, /* dest = src; S, GXcopy, 0x3 */
+ 0x22, /* dest &= ~src; DSna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x66, /* dest = ^src; DSx, GXxor, 0x6 */
+ 0xEE, /* dest |= src; DSo, GXor, 0x7 */
+ 0x11, /* dest = ~src & ~dest; DSon, GXnor, 0x8 */
+ 0x99, /* dest ^= ~src ; DSxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xDD, /* dest = src|~dest ; SDno, GXorReverse, 0xB */
+ 0x33, /* dest = ~src; Sn, GXcopyInverted, 0xC */
+ 0xBB, /* dest |= ~src; DSno, GXorInverted, 0xD */
+ 0x77, /* dest = ~src|~dest; DSan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+
+/* same ROP but with Pattern as Source */
+static const int sisPatALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0xA0, /* dest &= src; DPa, GXand, 0x1 */
+ 0x50, /* dest = src & ~dest; PDna, GXandReverse, 0x2 */
+ 0xF0, /* dest = src; P, GXcopy, 0x3 */
+ 0x0A, /* dest &= ~src; DPna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x5A, /* dest = ^src; DPx, GXxor, 0x6 */
+ 0xFA, /* dest |= src; DPo, GXor, 0x7 */
+ 0x05, /* dest = ~src & ~dest; DPon, GXnor, 0x8 */
+ 0xA5, /* dest ^= ~src ; DPxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xF5, /* dest = src|~dest ; PDno, GXorReverse, 0xB */
+ 0x0F, /* dest = ~src; Pn, GXcopyInverted, 0xC */
+ 0xAF, /* dest |= ~src; DPno, GXorInverted, 0xD */
+ 0x5F, /* dest = ~src|~dest; DPan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+
static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir, int rop,
unsigned int planemask, int trans_color)
@@ -549,7 +569,7 @@ static void SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
SiSSetupSRCTrans(trans_color)
SiSSetupCMDFlag(TRANSPARENT_BITBLT)
} else {
- SiSSetupROP(XAACopyROP[rop])
+ SiSSetupROP(sisALUConv[rop])
/* Set command - not needed, both 0 */
/* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */
}
@@ -584,9 +604,7 @@ static void SiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
* correctly if there are 512x512 slots, but no 256x256
* slots. This leads to catastrophic data fed to us.
* Filter this out here and warn the user.
- * Fixed in 4.3.99.10 (?) and Debian's 4.3.0.1
*/
-#if (XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,10,0)) && (XF86_VERSION_CURRENT != XF86_VERSION_NUMERIC(4,3,0,1,0))
if((src_x < 0) ||
(dst_x < 0) ||
(src_y < 0) ||
@@ -604,7 +622,6 @@ static void SiSSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
"Please update libxaa.a to avoid this error.\n");
return;
}
-#endif
/* Although the chip knows the direction to use
* if the source and destination areas overlap,
@@ -672,14 +689,14 @@ SiSSetupForSolidFill(ScrnInfoPtr pScrn, int color,
SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth);
SiSCheckQueue(16 * 1);
SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, -1)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATFG)
SiSSyncWP
#else
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor);
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATFG | pSiS->SiS310_AccelDepth)
#endif
}
@@ -726,7 +743,7 @@ SiSSubsequentSolidFillRect(ScrnInfoPtr pScrn,
/* This would work better if XAA would provide us with valid trapezoids.
* In fact, with small trapezoids the left and the right edge often cross
* each other which causes drawing errors (filling over whole scanline).
- * DOES NOT WORK ON 330 SERIES, HANGS THE ENGINE.
+ * DOES NOT WORK ON XABRE, HANGS THE ENGINE.
*/
#ifdef TRAP
static void
@@ -817,7 +834,7 @@ SiSSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop,
SiSCheckQueue(16 * 3);
SiSSetupLineCountPeriod(1, 1)
SiSSetupPATFGDSTRect(color, pSiS->scrnOffset, -1)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATFG | LINE)
SiSSyncWP
#else
@@ -825,7 +842,7 @@ SiSSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop,
SiSSetupPATFG(color)
SiSSetupDSTRect(pSiS->scrnOffset, -1)
SiSSetupDSTColorDepth(pSiS->DstColor)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATFG | LINE | pSiS->SiS310_AccelDepth)
#endif
}
@@ -936,7 +953,7 @@ SiSSetupForDashedLine(ScrnInfoPtr pScrn,
SiSSetupPATFG(fg)
#endif
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(LINE | LINE_STYLE)
@@ -1016,7 +1033,7 @@ SiSSetupForMonoPatternFill(ScrnInfoPtr pScrn,
SiSSetupMONOPAT(patx,paty)
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
#ifdef SISVRAMQ
SiSSetupCMDFlag(PATMONO)
@@ -1075,7 +1092,7 @@ SiSSubsequentMonoPatternFill(ScrnInfoPtr pScrn,
/* --- Trapezoid --- */
-/* Does not work at all on 330 series */
+/* Does not work at all on Xabre */
#ifdef TRAP
static void
@@ -1175,7 +1192,7 @@ SiSSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny,
patadr += 16; /* = 64 due to (CARD32 *) */
}
- SiSSetupROP(XAAPatternROP[rop])
+ SiSSetupROP(sisPatALUConv[rop])
SiSSetupCMDFlag(PATPATREG)
@@ -1234,7 +1251,7 @@ SiSSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
#ifdef SISVRAMQ
SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth);
- SiSSetupROP(XAACopyROP[rop]);
+ SiSSetupROP(sisALUConv[rop]);
SiSSetupSRCFGDSTRect(fg, pSiS->scrnOffset, -1)
if(bg == -1) {
SiSSetupCMDFlag(TRANSPARENT | ENCOLOREXP | SRCVIDEO);
@@ -1245,7 +1262,7 @@ SiSSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
SiSSyncWP
#else
SiSSetupSRCXY(0,0);
- SiSSetupROP(XAACopyROP[rop]);
+ SiSSetupROP(sisALUConv[rop]);
SiSSetupSRCFG(fg);
SiSSetupDSTRect(pSiS->scrnOffset, -1);
SiSSetupDSTColorDepth(pSiS->DstColor);
@@ -1346,7 +1363,7 @@ SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
#endif
SiSSetupSRCXY(0,0);
- SiSSetupROP(XAACopyROP[rop]);
+ SiSSetupROP(sisALUConv[rop]);
SiSSetupSRCFG(fg);
SiSSetupDSTRect(pSiS->scrnOffset, -1);
#ifndef SISVRAMQ
@@ -1457,7 +1474,7 @@ SiSSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
* limit the drawing width (similar to width set by SetupRect).
* XAA provides the pattern bitmap with scrnOffset (displayWidth * bpp/8)
* offset, but this is not supported by the hardware.
- * DOES NOT WORK ON 330 SERIES, HANGS ENGINE.
+ * DOES NOT WORK ON XABRE, HANGS ENGINE.
*/
#ifdef STSCE
@@ -1474,7 +1491,7 @@ SiSSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
SiSSetupDSTColorDepth(pSiS->DstColor)
#endif
SiSSetupDSTRect(pSiS->scrnOffset, -1)
- SiSSetupROP(XAACopyROP[rop])
+ SiSSetupROP(sisALUConv[rop])
SiSSetupSRCFG(fg)
/* SiSSetupSRCXY(0,0) */
@@ -1699,8 +1716,8 @@ SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn,
unsigned char *renderaccelarray;
#ifdef ACCELDEBUG
- xf86DrvMsg(0, X_INFO, "AT: op %d type %d ARGB %x %x %x %x, w %d h %d A-pitch %d\n",
- op, alphaType, alpha, red, green, blue, width, height, alphaPitch);
+ xf86DrvMsg(0, X_INFO, "AT: op %d RGB %x %x %x, w %d h %d A-pitch %d\n",
+ op, red, green, blue, width, height, alphaPitch);
#endif
if(op != PictOpOver) return FALSE;
@@ -1711,15 +1728,13 @@ SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn,
sizeNeeded = pitch * height;
if(pScrn->bitsPerPixel == 16) sizeNeeded <<= 1;
- if(!((renderaccelarray = pSiS->RenderAccelArray)))
- return FALSE;
-
- if(!SiSAllocateLinear(pScrn, sizeNeeded))
- return FALSE;
-
red &= 0xff00;
green &= 0xff00;
blue &= 0xff00;
+ renderaccelarray = pSiS->RenderAccelArray;
+
+ if(!SiSAllocateLinear(pScrn, sizeNeeded))
+ return FALSE;
#ifdef SISVRAMQ
SiSSetupDSTColorDepth(pSiS->SiS310_AccelDepth);
@@ -1744,38 +1759,17 @@ SiSSetupForCPUToScreenAlphaTexture(ScrnInfoPtr pScrn,
SiSIdle
}
-
- if(alpha == 0xffff) {
-
- while(height--) {
- for(x = 0; x < width; x++) {
- myalpha = alphaPtr[x];
- dstPtr[x] = (renderaccelarray[red + myalpha] << 16) |
- (renderaccelarray[green + myalpha] << 8) |
- renderaccelarray[blue + myalpha] |
- myalpha << 24;
- }
- dstPtr += pitch;
- alphaPtr += alphaPitch;
- }
-
- } else {
-
- alpha &= 0xff00;
-
- while(height--) {
- for(x = 0; x < width; x++) {
- myalpha = alphaPtr[x];
- dstPtr[x] = (renderaccelarray[alpha + myalpha] << 24) |
- (renderaccelarray[red + myalpha] << 16) |
- (renderaccelarray[green + myalpha] << 8) |
- renderaccelarray[blue + myalpha];
- }
- dstPtr += pitch;
- alphaPtr += alphaPitch;
- }
-
- }
+ while(height--) {
+ for(x = 0; x < width; x++) {
+ myalpha = alphaPtr[x];
+ dstPtr[x] = (renderaccelarray[red + myalpha] << 16) |
+ (renderaccelarray[green + myalpha] << 8) |
+ renderaccelarray[blue + myalpha] |
+ myalpha << 24;
+ }
+ dstPtr += pitch;
+ alphaPtr += alphaPitch;
+ }
return TRUE;
}
@@ -1852,7 +1846,8 @@ SiSSubsequentCPUToScreenTexture(ScrnInfoPtr pScrn,
long srcbase, dstbase;
srcbase = pSiS->AccelLinearScratch->offset << 1;
- if(pScrn->bitsPerPixel == 32) srcbase <<= 1;
+ if(pScrn->bitsPerPixel == 32)
+ srcbase <<= 1;
#ifdef ACCELDEBUG
xf86DrvMsg(0, X_INFO, "FIRE: scrbase %x dx %d dy %d w %d h %d\n",
diff --git a/src/sis310_accel.h b/src/sis310_accel.h
index d782cf5..fdf1e35 100644
--- a/src/sis310_accel.h
+++ b/src/sis310_accel.h
@@ -1,36 +1,33 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis310_accel.h,v 1.13 2003/09/02 18:28:35 twini Exp $ */
/*
* 2D Acceleration for SiS 315 and Xabre series
* Definitions for the SIS engine communication.
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Based on sis300_accel.h
* 2003/08/18: Added VRAM queue support
*
+ * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ *
*/
/* SiS315 and 330 engine commands */
diff --git a/src/sis6326_video.c b/src/sis6326_video.c
index fa3b556..7c9fdf9 100644
--- a/src/sis6326_video.c
+++ b/src/sis6326_video.c
@@ -1,33 +1,31 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis6326_video.c,v 1.9 2003/08/07 12:52:23 twini Exp $ */
/*
* Xv driver for SiS 5597/5598, 6236 and 530/620.
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Based on sis_video.c which is
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Author: Thomas Winischhofer <thomas@winischhofer.net>
*/
#include "sis.h"
@@ -392,7 +390,7 @@ typedef struct {
(SISPortPrivPtr)((SISPTR(pScrn))->adaptor->pPortPrivates[0].ptr)
static void
-SIS6326SetPortDefaults(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
+SIS6326SetPortDefaults (ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
{
SISPtr pSiS = SISPTR(pScrn);
@@ -578,11 +576,7 @@ SIS6326SetupImageVideo(ScreenPtr pScreen)
SIS6326SetPortDefaults(pScrn, pPriv);
/* gotta uninit this someplace */
-#if defined(REGION_NULL)
- REGION_NULL(pScreen, &pPriv->clip);
-#else
- REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);
-#endif
+ REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);
pSiS->adaptor = adapt;
@@ -594,7 +588,6 @@ SIS6326SetupImageVideo(ScreenPtr pScreen)
xvDisableGfx = MAKE_ATOM("XV_DISABLE_GRAPHICS");
SIS6326ResetVideo(pScrn);
- pSiS->ResetXv = SIS6326ResetVideo;
return adapt;
}
@@ -1390,25 +1383,29 @@ SIS6326PutImage(
SIS6326DisplayVideo(pScrn, pPriv);
/* update cliplist */
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
if( pPriv->autopaintColorKey &&
(pPriv->grabbedByV4L ||
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
!RegionsEqual(&pPriv->clip, clipBoxes)) ) {
-#else
- !REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) ) {
-#endif
/* We always paint colorkey for V4L */
if(!pPriv->grabbedByV4L)
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
/* draw these */
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
XAAFillSolidRects(pScrn, pPriv->colorKey, GXcopy, ~0,
REGION_NUM_RECTS(clipBoxes),
REGION_RECTS(clipBoxes));
+ }
#else
+ if( pPriv->autopaintColorKey &&
+ (pPriv->grabbedByV4L ||
+ !REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) ) {
+ /* We always paint colorkey for V4L */
+ if(!pPriv->grabbedByV4L)
+ REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
+ /* draw these */
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
-#endif
}
+#endif
pPriv->currentBuf ^= 1;
@@ -1661,7 +1658,7 @@ SIS6326DisplaySurface (
SIS6326DisplayVideo(pScrn, pPriv);
if(pPriv->autopaintColorKey) {
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
XAAFillSolidRects(pScrn, pPriv->colorKey, GXcopy, ~0,
REGION_NUM_RECTS(clipBoxes),
REGION_RECTS(clipBoxes));
diff --git a/src/sis_accel.c b/src/sis_accel.c
index 5a4488c..529a087 100644
--- a/src/sis_accel.c
+++ b/src/sis_accel.c
@@ -1,36 +1,34 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_accel.c,v 1.29 2003/06/26 22:35:17 twini Exp $ */
/*
* 2D acceleration for SiS5597/5598 and 6326
*
- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
- * Parts Copyright (C) 2001-2004 Thomas Winischhofer, Vienna, Austria.
- *
- * Licensed under the following terms:
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Parts Copyright 2002-2003 Thomas Winischhofer, Vienna, Austria.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
* about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
+ * "as is" without express or implied warranty.
*
* THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
- * Authors: Alan Hourihane <alanh@fairlite.demon.co.uk>,
+ * Authors: Alan Hourihane, alanh@fairlite.demon.co.uk
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
- * Mitani Hiroshi <hmitani@drl.mei.co.jp>,
- * David Thomas <davtom@dream.org.uk>,
- * Thomas Winischhofer <thomas@winischhofer.net>.
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>
+ * Thomas Winischhofer <thomas@winischhofer.net>
*/
#if 0
@@ -216,7 +214,7 @@ SiSAccelInit(ScreenPtr pScreen)
if(AvailFBArea.y2 < pScrn->currentMode->VDisplay) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Not enough video RAM for accelerator. At least "
- "%dKB needed, %ldKB available\n",
+ "%dKB needed, %dKB available\n",
((((pScrn->displayWidth * pScrn->bitsPerPixel/8) /* TW: +8 for make it sure */
* pScrn->currentMode->VDisplay) + reservedFbSize) / 1024) + 8,
pSiS->maxxfbmem/1024);
@@ -244,7 +242,7 @@ SiSSync(ScrnInfoPtr pScrn) {
}
/* Clipping */
-static void SiSSetClippingRectangle( ScrnInfoPtr pScrn,
+static void SiSSetClippingRectangle ( ScrnInfoPtr pScrn,
int left, int top, int right, int bottom)
{
SISPtr pSiS = SISPTR(pScrn);
@@ -255,12 +253,53 @@ static void SiSSetClippingRectangle( ScrnInfoPtr pScrn,
pSiS->ClipEnabled = TRUE;
}
-static void SiSDisableClipping(ScrnInfoPtr pScrn)
+static void SiSDisableClipping (ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
pSiS->ClipEnabled = FALSE;
}
+static const int sisALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0x88, /* dest &= src; DSa, GXand, 0x1 */
+ 0x44, /* dest = src & ~dest; SDna, GXandReverse, 0x2 */
+ 0xCC, /* dest = src; S, GXcopy, 0x3 */
+ 0x22, /* dest &= ~src; DSna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x66, /* dest = ^src; DSx, GXxor, 0x6 */
+ 0xEE, /* dest |= src; DSo, GXor, 0x7 */
+ 0x11, /* dest = ~src & ~dest; DSon, GXnor, 0x8 */
+ 0x99, /* dest ^= ~src ; DSxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xDD, /* dest = src|~dest ; SDno, GXorReverse, 0xB */
+ 0x33, /* dest = ~src; Sn, GXcopyInverted, 0xC */
+ 0xBB, /* dest |= ~src; DSno, GXorInverted, 0xD */
+ 0x77, /* dest = ~src|~dest; DSan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+/* same ROP but with Pattern as Source */
+static const int sisPatALUConv[] =
+{
+ 0x00, /* dest = 0; 0, GXclear, 0 */
+ 0xA0, /* dest &= src; DPa, GXand, 0x1 */
+ 0x50, /* dest = src & ~dest; PDna, GXandReverse, 0x2 */
+ 0xF0, /* dest = src; P, GXcopy, 0x3 */
+ 0x0A, /* dest &= ~src; DPna, GXandInverted, 0x4 */
+ 0xAA, /* dest = dest; D, GXnoop, 0x5 */
+ 0x5A, /* dest = ^src; DPx, GXxor, 0x6 */
+ 0xFA, /* dest |= src; DPo, GXor, 0x7 */
+ 0x05, /* dest = ~src & ~dest; DPon, GXnor, 0x8 */
+ 0xA5, /* dest ^= ~src ; DPxn, GXequiv, 0x9 */
+ 0x55, /* dest = ~dest; Dn, GXInvert, 0xA */
+ 0xF5, /* dest = src|~dest ; PDno, GXorReverse, 0xB */
+ 0x0F, /* dest = ~src; Pn, GXcopyInverted, 0xC */
+ 0xAF, /* dest |= ~src; DPno, GXorInverted, 0xD */
+ 0x5F, /* dest = ~src|~dest; DPan, GXnand, 0xE */
+ 0xFF, /* dest = 0xFF; 1, GXset, 0xF */
+};
+
+
/* Screen to screen copy */
static void
SiSSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir,
@@ -377,7 +416,7 @@ SiSSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny,
patternRegPtr = (unsigned int *)sisSETPATREG();
pSiS->sisPatternReg[0] = pSiS->sisPatternReg[2] = patternx ;
pSiS->sisPatternReg[1] = pSiS->sisPatternReg[3] = patterny ;
- for( i = 0 ; i < 16 /* sisPatternHeight */ ; ) {
+ for ( i = 0 ; i < 16 /* sisPatternHeight */ ; ) {
patternRegPtr[i++] = patternx ;
patternRegPtr[i++] = patterny ;
}
@@ -538,11 +577,11 @@ SiSSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
sisSETROPBG(0xAA); /* dst = dst (=noop) */
pSiS->CommandReg |= sisSRCFG;
} else {
- sisSETBGROPCOL(XAAPatternROP[rop], bg);
+ sisSETBGROPCOL(sisPatALUConv[rop], bg);
pSiS->CommandReg |= sisSRCFG | sisPATBG;
}
- sisSETFGROPCOL(XAACopyROP[rop], fg);
+ sisSETFGROPCOL(sisALUConv[rop], fg);
sisSETDSTPITCH(pSiS->scrnOffset);
}
diff --git a/src/sis_accel.h b/src/sis_accel.h
index cf37d91..5fe9a33 100644
--- a/src/sis_accel.h
+++ b/src/sis_accel.h
@@ -1,37 +1,35 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_accel.h,v 1.6 2003/06/26 22:35:17 twini Exp $ */
/*
* 2D acceleration for 5597/5598 and 6326
* Definitions for the SIS engine communication
*
- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
- * Parts Copyright (C) 2001-2004 Thomas Winischhofer, Vienna, Austria.
- *
- * Licensed under the following terms:
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Parts Copyright 2002,2003 Thomas Winischhofer, Vienna, Austria.
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
* about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
+ * "as is" without express or implied warranty.
*
* THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
- * Authors: Alan Hourihane <alanh@fairlite.demon.co.uk>,
+ * Authors: Alan Hourihane, alanh@fairlite.demon.co.uk
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
- * Mitani Hiroshi <hmitani@drl.mei.co.jp>,
- * David Thomas <davtom@dream.org.uk>,
- * Thomas Winischhofer <thomas@winischhofer.net>.
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>
+ * Thomas Winischhofer <thomas@winischhofer.net>
*/
@@ -118,7 +116,6 @@ const int sisReg32MMIO[] = {
unsigned long temp; \
MMIO_OUT16(pSiS->IOBase, BR(10) + 2, op); \
temp = MMIO_IN32(pSiS->IOBase, BR(10)); \
- (void)temp; \
}
/* set foreground color and fg ROP */
@@ -132,17 +129,29 @@ const int sisReg32MMIO[] = {
/* background color */
#define sisSETBGCOLOR(bgColor) \
MMIO_OUT32(pSiS->IOBase, BR(5), (bgColor));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(5)) = (bgColor)
+#endif
/* foreground color */
#define sisSETFGCOLOR(fgColor) \
MMIO_OUT32(pSiS->IOBase, BR(4), (fgcolor));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(4)) = (fgColor)
+#endif
/* ROP */
#define sisSETROPFG(op) \
MMIO_OUT8(pSiS->IOBase, BR(4) + 3, op);
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(4)) = ((*(volatile unsigned int *)(pSiS->IOBase + BR(4)))&0xffffff) | (op<<24)
+#endif
#define sisSETROPBG(op) \
MMIO_OUT8(pSiS->IOBase, BR(5) + 3, op);
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(5)) = ((*(volatile unsigned int *)(pSiS->IOBase + BR(5)))&0xffffff) | (op<<24)
+#endif
#define sisSETROP(op) \
sisSETROPFG(op); sisSETROPBG(op);
@@ -150,13 +159,23 @@ const int sisReg32MMIO[] = {
/* source and dest address */
#define sisSETSRCADDR(srcAddr) \
MMIO_OUT32(pSiS->IOBase, BR(0), (srcAddr & 0x3FFFFFL));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(0)) = srcAddr & 0x3FFFFFL
+#endif
#define sisSETDSTADDR(dstAddr) \
MMIO_OUT32(pSiS->IOBase, BR(1), (dstAddr & 0x3FFFFFL));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(1)) = dstAddr & 0x3FFFFFL
+#endif
/* pitch */
#define sisSETPITCH(srcPitch,dstPitch) \
MMIO_OUT32(pSiS->IOBase, BR(2), ((((dstPitch) & 0xFFFF) << 16) | ((srcPitch) & 0xFFFF)));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(2)) = ((dstPitch&0xFFFF)<<16)| \
+ (srcPitch&0xFFFF)
+#endif
#define sisSETSRCPITCH(srcPitch) \
MMIO_OUT16(pSiS->IOBase, BR(2), ((srcPitch) & 0xFFFF));
@@ -170,26 +189,54 @@ const int sisReg32MMIO[] = {
*/
#define sisSETHEIGHTWIDTH(Height, Width) \
MMIO_OUT32(pSiS->IOBase, BR(3), ((((Height) & 0xFFFF) << 16) | ((Width) & 0xFFFF)));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(3)) = (((Height)&0xFFFF)<<16)| \
+ ((Width)&0xFFFF)
+#endif
/* Clipping */
#define sisSETCLIPTOP(x, y) \
MMIO_OUT32(pSiS->IOBase, BR(8), ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF)));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(8)) = (((y)&0xFFFF)<<16)| \
+ ((x)&0xFFFF)
+#endif
#define sisSETCLIPBOTTOM(x, y) \
MMIO_OUT32(pSiS->IOBase, BR(9), ((((y) & 0xFFFF) << 16) | ((x) & 0xFFFF)));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(9)) = (((y)&0xFFFF)<<16)| \
+ ((x)&0xFFFF)
+#endif
/* Line drawing */
#define sisSETXStart(XStart) \
MMIO_OUT32(pSiS->IOBase, BR(0), ((XStart) & 0xFFFF));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(0)) = XStart&0xFFFF
+#endif
#define sisSETYStart(YStart) \
MMIO_OUT32(pSiS->IOBase, BR(1), ((YStart) & 0xFFFF));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(1)) = YStart&0xFFFF
+#endif
#define sisSETLineMajorCount(MajorAxisCount) \
MMIO_OUT32(pSiS->IOBase, BR(3), ((MajorAxisCount) & 0xFFFF));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(3)) = MajorAxisCount&0xFFFF
+#endif
#define sisSETLineSteps(K1,K2) \
MMIO_OUT32(pSiS->IOBase, BR(6), ((((K1) & 0xFFFF) << 16) | ((K2) & 0xFFFF)));
+#if 0
+ *(volatile unsigned int *)(pSiS->IOBase + BR(6)) = (((K1)&0xFFFF)<<16)| \
+ ((K2)&0xFFFF)
+#endif
#define sisSETLineErrorTerm(ErrorTerm) \
MMIO_OUT16(pSiS->IOBase, BR(7), (ErrorTerm));
+#if 0
+ *(volatile unsigned short *)(pSiS->IOBase + BR(7)) = ErrorTerm
+#endif
diff --git a/src/sis_common.h b/src/sis_common.h
index dbca0fd..cbddf0c 100644
--- a/src/sis_common.h
+++ b/src/sis_common.h
@@ -1,4 +1,4 @@
-/* $XFree86$ */
+/* * $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_common.h,v 1.1 2003/08/29 08:52:12 twini Exp $ */
/*
* Common header definitions for SiS 2D/3D/DRM suite
*
@@ -6,16 +6,16 @@
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
* about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
+ * "as is" without express or implied warranty.
*
* THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
diff --git a/src/sis_cursor.c b/src/sis_cursor.c
index 0ebb44d..22cc24a 100644
--- a/src/sis_cursor.c
+++ b/src/sis_cursor.c
@@ -1,35 +1,34 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_cursor.c,v 1.18 2003/09/04 15:32:42 twini Exp $ */
/*
* SiS hardware cursor handling
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- *
- * Idea based on code by Can-Ru Yeou, SiS Inc.
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Authors: Alan Hourihane, alanh@fairlite.demon.co.uk
+ * Mike Chapman <mike@paranoia.com>,
+ * Juanjo Santamarta <santamarta@ctv.es>,
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>.
+ * Thomas Winischhofer <thomas@winischhofer.net>
*/
#include "xf86.h"
@@ -49,6 +48,7 @@
extern void SISWaitRetraceCRT1(ScrnInfoPtr pScrn);
extern void SISWaitRetraceCRT2(ScrnInfoPtr pScrn);
+extern Bool InRegion(int x, int y, region r);
/* Helper function for Xabre to convert mono image to ARGB */
/* The Xabre's cursor engine for CRT2 is buggy and can't
@@ -67,6 +67,8 @@ SiSXConvertMono2ARGB(SISPtr pSiS)
if(!dest || !src) return;
+ if(pSiS->UseHWARGBCursor) return;
+
for(i = 0; i < 64; i++) {
for(j = 0; j < 8; j++) {
chunk = *(src + 8); mask = *src++;
@@ -104,23 +106,23 @@ SiS300HideCursor(ScrnInfoPtr pScrn)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode && (!pSiS->ForceCursorOff)) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis300DisableHWCursor()
- sis300SetCursorPositionY(2000, 0)
- } else {
- /* Head 1 is always CRT2 */
- sis301DisableHWCursor()
- sis301SetCursorPositionY(2000, 0)
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ sis300DisableHWCursor()
+ sis300SetCursorPositionY(2000, 0)
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ sis301DisableHWCursor()
+ sis301SetCursorPositionY(2000, 0)
+ }
} else {
#endif
- sis300DisableHWCursor()
- sis300SetCursorPositionY(2000, 0)
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301DisableHWCursor()
- sis301SetCursorPositionY(2000, 0)
- }
+ sis300DisableHWCursor()
+ sis300SetCursorPositionY(2000, 0)
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301DisableHWCursor()
+ sis301SetCursorPositionY(2000, 0)
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -135,23 +137,33 @@ SiS310HideCursor(ScrnInfoPtr pScrn)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode && (!pSiS->ForceCursorOff)) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis310DisableHWCursor()
- sis310SetCursorPositionY(2000, 0)
- } else {
- /* Head 1 is always CRT2 */
- sis301DisableHWCursor310()
- sis301SetCursorPositionY310(2000, 0)
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ sis310DisableHWCursor()
+ sis310SetCursorPositionY(2000, 0)
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301DisableHWCursor330()
+ sis301SetCursorPositionY330(2000, 0)
+ } else {
+ sis301DisableHWCursor310()
+ sis301SetCursorPositionY310(2000, 0)
+ }
+ }
} else {
#endif
- sis310DisableHWCursor()
- sis310SetCursorPositionY(2000, 0)
- if(pSiS->VBFlags & VB_VIDEOBRIDGE) {
- sis301DisableHWCursor310()
- sis301SetCursorPositionY310(2000, 0)
- }
+ sis310DisableHWCursor()
+ sis310SetCursorPositionY(2000, 0)
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301DisableHWCursor330()
+ sis301SetCursorPositionY330(2000, 0)
+ } else {
+ sis301DisableHWCursor310()
+ sis301SetCursorPositionY310(2000, 0)
+ }
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -184,50 +196,50 @@ SiS300ShowCursor(ScrnInfoPtr pScrn)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- if(pSiS->UseHWARGBCursor) {
-#ifdef SIS300_USE_ARGB16
- sis300EnableHWARGB16Cursor()
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ if(pSiS->UseHWARGBCursor) {
+#ifdef SIS300_USE_ARGB16
+ sis300EnableHWARGB16Cursor()
#else
- sis300EnableHWARGBCursor()
-#endif
- } else {
- sis300EnableHWCursor()
- }
- } else {
- /* Head 1 is always CRT2 */
- if(pSiS->UseHWARGBCursor) {
-#ifdef SIS300_USE_ARGB16
- sis301EnableHWARGB16Cursor()
+ sis300EnableHWARGBCursor()
+#endif
+ } else {
+ sis300EnableHWCursor()
+ }
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ if(pSiS->UseHWARGBCursor) {
+#ifdef SIS300_USE_ARGB16
+ sis301EnableHWARGB16Cursor()
#else
- sis301EnableHWARGBCursor()
-#endif
- } else {
- sis301EnableHWCursor()
- }
- }
+ sis301EnableHWARGBCursor()
+#endif
+ } else {
+ sis301EnableHWCursor()
+ }
+ }
} else {
#endif
- if(pSiS->UseHWARGBCursor) {
+ if(pSiS->UseHWARGBCursor) {
#ifdef SIS300_USE_ARGB16
- sis300EnableHWARGB16Cursor()
+ sis300EnableHWARGB16Cursor()
#else
- sis300EnableHWARGBCursor()
-#endif
- if(pSiS->VBFlags & CRT2_ENABLE) {
-#ifdef SIS300_USE_ARGB16
- sis301EnableHWARGB16Cursor()
+ sis300EnableHWARGBCursor()
+#endif
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+#ifdef SIS300_USE_ARGB16
+ sis301EnableHWARGB16Cursor()
#else
- sis301EnableHWARGBCursor()
-#endif
- }
- } else {
- sis300EnableHWCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301EnableHWCursor()
- }
- }
+ sis301EnableHWARGBCursor()
+#endif
+ }
+ } else {
+ sis300EnableHWCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301EnableHWCursor()
+ }
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -248,49 +260,49 @@ SiS310ShowCursor(ScrnInfoPtr pScrn)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- if(pSiS->UseHWARGBCursor) {
- sis310EnableHWARGBCursor()
- } else {
- sis310EnableHWCursor()
- }
- } else {
- /* Head 1 is always CRT2 */
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- sis301EnableHWCursor330()
- } else {
- if(pSiS->UseHWARGBCursor) {
- sis301EnableHWARGBCursor310()
- } else {
- sis301EnableHWCursor310()
- }
- }
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ if(pSiS->UseHWARGBCursor) {
+ sis310EnableHWARGBCursor()
+ } else {
+ sis310EnableHWCursor()
+ }
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301EnableHWCursor330()
+ } else {
+ if(pSiS->UseHWARGBCursor) {
+ sis301EnableHWARGBCursor310()
+ } else {
+ sis301EnableHWCursor310()
+ }
+ }
+ }
} else {
#endif
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- if(pSiS->UseHWARGBCursor) {
- sis310EnableHWARGBCursor()
- } else {
- sis310EnableHWCursor()
- }
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301EnableHWCursor330()
- }
- } else {
- if(pSiS->UseHWARGBCursor) {
- sis310EnableHWARGBCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301EnableHWARGBCursor310()
- }
- } else {
- sis310EnableHWCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301EnableHWCursor310()
- }
- }
- }
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ if(pSiS->UseHWARGBCursor) {
+ sis310EnableHWARGBCursor()
+ } else {
+ sis310EnableHWCursor()
+ }
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301EnableHWCursor330()
+ }
+ } else {
+ if(pSiS->UseHWARGBCursor) {
+ sis310EnableHWARGBCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301EnableHWARGBCursor310()
+ }
+ } else {
+ sis310EnableHWCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301EnableHWCursor310()
+ }
+ }
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -300,7 +312,7 @@ static void
SiSSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
{
SISPtr pSiS = SISPTR(pScrn);
- DisplayModePtr mode = pSiS->CurrentLayout.mode;
+ DisplayModePtr mode = pSiS->CurrentLayout.mode; /* pScrn->currentMode; */
unsigned char x_preset = 0;
unsigned char y_preset = 0;
int temp;
@@ -312,14 +324,14 @@ SiSSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- if(x < 0) {
- x_preset = (-x);
- x = 0;
+ if (x < 0) {
+ x_preset = (-x);
+ x = 0;
}
- if(y < 0) {
- y_preset = (-y);
- y = 0;
+ if (y < 0) {
+ y_preset = (-y);
+ y = 0;
}
if(mode->Flags & V_INTERLACE) y /= 2;
@@ -365,24 +377,24 @@ SiSSetCursorPositionMerged(ScrnInfoPtr pScrn1, int x, int y)
if((pSiS->VGAEngine == SIS_300_VGA) && (pSiS->UseHWARGBCursor)) maxpreset = 31;
if(x1 < 0) {
- x1_preset = (-x1);
- if(x1_preset > maxpreset) x1_preset = maxpreset;
- x1 = 0;
+ x1_preset = (-x1);
+ if(x1_preset > maxpreset) x1_preset = maxpreset;
+ x1 = 0;
}
if(y1 < 0) {
- y1_preset = (-y1);
- if(y1_preset > maxpreset) y1_preset = maxpreset;
- y1 = 0;
+ y1_preset = (-y1);
+ if(y1_preset > maxpreset) y1_preset = maxpreset;
+ y1 = 0;
}
if(x2 < 0) {
- x2_preset = (-x2);
- if(x2_preset > maxpreset) x2_preset = maxpreset;
- x2 = 0;
+ x2_preset = (-x2);
+ if(x2_preset > maxpreset) x2_preset = maxpreset;
+ x2 = 0;
}
if(y2 < 0) {
- y2_preset = (-y2);
- if(y2_preset > maxpreset) y2_preset = maxpreset;
- y2 = 0;
+ y2_preset = (-y2);
+ if(y2_preset > maxpreset) y2_preset = maxpreset;
+ y2 = 0;
}
if(mode1->Flags & V_INTERLACE) { y1 /= 2; y1_preset /= 2; }
@@ -391,10 +403,6 @@ SiSSetCursorPositionMerged(ScrnInfoPtr pScrn1, int x, int y)
if(mode2->Flags & V_INTERLACE) { y2 /= 2; y2_preset /= 2; }
else if(mode2->Flags & V_DBLSCAN) { y2 *= 2; y2_preset *= 2; }
- /* Work around bug in Cursor engine */
- if(x1 > mode1->HDisplay) { y1 = 2000; y1_preset = 0; }
- if(x2 > mode2->HDisplay) { y2 = 2000; y2_preset = 0; }
-
if(pSiS->VGAEngine == SIS_300_VGA) {
sis300SetCursorPositionX(x1, x1_preset)
sis300SetCursorPositionY(y1, y1_preset)
@@ -403,8 +411,13 @@ SiSSetCursorPositionMerged(ScrnInfoPtr pScrn1, int x, int y)
} else {
sis310SetCursorPositionX(x1, x1_preset)
sis310SetCursorPositionY(y1, y1_preset)
- sis301SetCursorPositionX310(x2 + 17, x2_preset)
- sis301SetCursorPositionY310(y2, y2_preset)
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301SetCursorPositionX330(x2 + 17, x2_preset)
+ sis301SetCursorPositionY330(y2, y2_preset)
+ } else {
+ sis301SetCursorPositionX310(x2 + 17, x2_preset)
+ sis301SetCursorPositionY310(y2, y2_preset)
+ }
}
}
#endif
@@ -424,13 +437,13 @@ SiS300SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
}
#endif
- if(x < 0) {
- x_preset = (-x);
- x = 0;
+ if (x < 0) {
+ x_preset = (-x);
+ x = 0;
}
- if(y < 0) {
- y_preset = (-y);
- y = 0;
+ if (y < 0) {
+ y_preset = (-y);
+ y = 0;
}
if(mode->Flags & V_INTERLACE) y /= 2;
@@ -438,23 +451,23 @@ SiS300SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis300SetCursorPositionX(x, x_preset)
- sis300SetCursorPositionY(y, y_preset)
- } else {
- /* Head 1 is always CRT2 */
- sis301SetCursorPositionX(x + 13, x_preset)
- sis301SetCursorPositionY(y, y_preset)
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ sis300SetCursorPositionX(x, x_preset)
+ sis300SetCursorPositionY(y, y_preset)
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ sis301SetCursorPositionX(x + 13, x_preset)
+ sis301SetCursorPositionY(y, y_preset)
+ }
} else {
#endif
- sis300SetCursorPositionX(x, x_preset)
- sis300SetCursorPositionY(y, y_preset)
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301SetCursorPositionX(x + 13, x_preset)
- sis301SetCursorPositionY(y, y_preset)
- }
+ sis300SetCursorPositionX(x, x_preset)
+ sis300SetCursorPositionY(y, y_preset)
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301SetCursorPositionX(x + 13, x_preset)
+ sis301SetCursorPositionY(y, y_preset)
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -475,13 +488,13 @@ SiS310SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
}
#endif
- if(x < 0) {
- x_preset = (-x);
- x = 0;
+ if (x < 0) {
+ x_preset = (-x);
+ x = 0;
}
- if(y < 0) {
- y_preset = (-y);
- y = 0;
+ if (y < 0) {
+ y_preset = (-y);
+ y = 0;
}
if(mode->Flags & V_INTERLACE) y /= 2;
@@ -489,22 +502,32 @@ SiS310SetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis310SetCursorPositionX(x, x_preset)
- sis310SetCursorPositionY(y, y_preset)
- } else {
- /* Head 1 is always CRT2 */
- sis301SetCursorPositionX310(x + 17, x_preset)
- sis301SetCursorPositionY310(y, y_preset)
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ sis310SetCursorPositionX(x, x_preset)
+ sis310SetCursorPositionY(y, y_preset)
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301SetCursorPositionX330(x + 17, x_preset)
+ sis301SetCursorPositionY330(y, y_preset)
+ } else {
+ sis301SetCursorPositionX310(x + 17, x_preset)
+ sis301SetCursorPositionY310(y, y_preset)
+ }
+ }
} else {
#endif
sis310SetCursorPositionX(x, x_preset)
sis310SetCursorPositionY(y, y_preset)
if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301SetCursorPositionX310(x + 17, x_preset)
- sis301SetCursorPositionY310(y, y_preset)
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301SetCursorPositionX330(x + 17, x_preset)
+ sis301SetCursorPositionY330(y, y_preset)
+ } else {
+ sis301SetCursorPositionX310(x + 17, x_preset)
+ sis301SetCursorPositionY310(y, y_preset)
+ }
}
#ifdef SISDUALHEAD
}
@@ -552,23 +575,23 @@ SiS300SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis300SetCursorBGColor(bg)
- sis300SetCursorFGColor(fg)
- } else {
- /* Head 1 is always CRT2 */
- sis301SetCursorBGColor(bg)
- sis301SetCursorFGColor(fg)
- }
+ if(pSiS->SecondHead) {
+ /* TW: Head 2 is always CRT1 */
+ sis300SetCursorBGColor(bg)
+ sis300SetCursorFGColor(fg)
+ } else {
+ /* TW: Head 1 is always CRT2 */
+ sis301SetCursorBGColor(bg)
+ sis301SetCursorFGColor(fg)
+ }
} else {
#endif
- sis300SetCursorBGColor(bg)
- sis300SetCursorFGColor(fg)
- if(pSiS->VBFlags & CRT2_ENABLE) {
- sis301SetCursorBGColor(bg)
- sis301SetCursorFGColor(fg)
- }
+ sis300SetCursorBGColor(bg)
+ sis300SetCursorFGColor(fg)
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ sis301SetCursorBGColor(bg)
+ sis301SetCursorFGColor(fg)
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -584,39 +607,39 @@ SiS310SetCursorColors(ScrnInfoPtr pScrn, int bg, int fg)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
if(pSiS->SecondHead) {
- /* Head 2 is always CRT1 */
- sis310SetCursorBGColor(bg)
- sis310SetCursorFGColor(fg)
+ /* TW: Head 2 is always CRT1 */
+ sis310SetCursorBGColor(bg)
+ sis310SetCursorFGColor(fg)
} else {
- /* Head 1 is always CRT2 */
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
+ /* TW: Head 1 is always CRT2 */
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ if((fg != pSiS->CurFGCol) || (bg != pSiS->CurBGCol)) {
+ pSiS->CurFGCol = fg;
+ pSiS->CurBGCol = bg;
+ SiSXConvertMono2ARGB(pSiS);
+ }
+ } else {
+ sis301SetCursorBGColor310(bg)
+ sis301SetCursorFGColor310(fg)
+ }
+ }
+ } else {
+#endif
+ sis310SetCursorBGColor(bg)
+ sis310SetCursorFGColor(fg)
+
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
if((fg != pSiS->CurFGCol) || (bg != pSiS->CurBGCol)) {
- pSiS->CurFGCol = fg;
- pSiS->CurBGCol = bg;
- SiSXConvertMono2ARGB(pSiS);
+ pSiS->CurFGCol = fg;
+ pSiS->CurBGCol = bg;
+ SiSXConvertMono2ARGB(pSiS);
}
} else {
sis301SetCursorBGColor310(bg)
sis301SetCursorFGColor310(fg)
}
- }
- } else {
-#endif
- sis310SetCursorBGColor(bg)
- sis310SetCursorFGColor(fg)
-
- if(pSiS->VBFlags & CRT2_ENABLE) {
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- if((fg != pSiS->CurFGCol) || (bg != pSiS->CurBGCol)) {
- pSiS->CurFGCol = fg;
- pSiS->CurBGCol = bg;
- SiSXConvertMono2ARGB(pSiS);
- }
- } else {
- sis301SetCursorBGColor310(bg)
- sis301SetCursorFGColor310(fg)
- }
- }
+ }
#ifdef SISDUALHEAD
}
#endif
@@ -716,33 +739,35 @@ SiS300LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
}
if(pSiS->UseHWARGBCursor) {
- if(pSiS->VBFlags & DISPTYPE_CRT1) {
- status1 = sis300GetCursorStatus;
- sis300DisableHWCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- status2 = sis301GetCursorStatus;
- sis301DisableHWCursor()
- }
- SISWaitRetraceCRT1(pScrn);
- sis300SwitchToMONOCursor();
- if(pSiS->VBFlags & CRT2_ENABLE) {
- SISWaitRetraceCRT2(pScrn);
- sis301SwitchToMONOCursor();
- }
- }
+ if(pSiS->VBFlags & DISPTYPE_CRT1) {
+ status1 = sis300GetCursorStatus;
+ sis300DisableHWCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ status2 = sis301GetCursorStatus;
+ sis301DisableHWCursor()
+ }
+ SISWaitRetraceCRT1(pScrn);
+ sis300SwitchToMONOCursor();
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ SISWaitRetraceCRT2(pScrn);
+ sis301SwitchToMONOCursor();
+ }
+ }
}
sis300SetCursorAddress(cursor_addr);
+ sis300SetCursorPatternSelect(0);
if(status1) sis300SetCursorStatus(status1)
if(pSiS->VBFlags & CRT2_ENABLE) {
- if((pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
- status2 = sis301GetCursorStatus;
- sis301DisableHWCursor()
- SISWaitRetraceCRT2(pScrn);
- sis301SwitchToMONOCursor();
- }
- sis301SetCursorAddress(cursor_addr)
- if(status2) sis301SetCursorStatus(status2)
+ if((pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
+ status2 = sis301GetCursorStatus;
+ sis301DisableHWCursor()
+ SISWaitRetraceCRT2(pScrn);
+ sis301SwitchToMONOCursor();
+ }
+ sis301SetCursorAddress(cursor_addr)
+ sis301SetCursorPatternSelect(0)
+ if(status2) sis301SetCursorStatus(status2)
}
pSiS->UseHWARGBCursor = FALSE;
@@ -756,19 +781,8 @@ SiS310LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
CARD32 status1 = 0, status2 = 0;
unsigned char *dest = pSiS->FbBase;
BOOLEAN sizedouble = FALSE;
- int bufnum;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
-
- if(pSiS->DualHeadMode) {
- pSiSEnt->HWCursorMBufNum ^= 1;
- bufnum = 1 << pSiSEnt->HWCursorMBufNum;
- } else {
-#endif
- pSiS->HWCursorMBufNum ^= 1;
- bufnum = 1 << pSiS->HWCursorMBufNum;
-#ifdef SISDUALHEAD
- }
#endif
#ifdef SISMERGED
@@ -782,17 +796,13 @@ SiS310LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
sizedouble = TRUE;
}
+ cursor_addr = pScrn->videoRam - pSiS->cursorOffset - (pSiS->CursorSize/1024); /* 1K boundary */
+
#ifdef SISDUALHEAD
- /* Use the global (real) FbBase in DHM */
+ /* TW: Use the global (real) FbBase in DHM */
if(pSiS->DualHeadMode) dest = pSiSEnt->FbBase;
#endif
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- cursor_addr = pScrn->videoRam - pSiS->cursorOffset - (pSiS->CursorSize/1024);
- } else {
- cursor_addr = pScrn->videoRam - pSiS->cursorOffset - ((pSiS->CursorSize/1024) * bufnum);
- }
-
if(sizedouble) {
int i;
for(i = 0; i < 32; i++) {
@@ -805,7 +815,7 @@ SiS310LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
memcpy((unsigned char *)dest + (cursor_addr * 1024), src, 1024);
}
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
/* Convert Mono image to color image */
@@ -817,44 +827,46 @@ SiS310LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
SiSXConvertMono2ARGB(pSiS);
if(pSiS->UseHWARGBCursor) {
- if(pSiS->VBFlags & DISPTYPE_CRT1) {
- status1 = sis310GetCursorStatus;
- sis310DisableHWCursor();
- SISWaitRetraceCRT1(pScrn);
- sis310SwitchToMONOCursor();
- }
- }
+ if(pSiS->VBFlags & DISPTYPE_CRT1) {
+ status1 = sis310GetCursorStatus;
+ sis310DisableHWCursor();
+ SISWaitRetraceCRT1(pScrn);
+ sis310SwitchToMONOCursor();
+ }
+ }
} else {
if(pSiS->UseHWARGBCursor) {
- if(pSiS->VBFlags & DISPTYPE_CRT1) {
- status1 = sis310GetCursorStatus;
- sis310DisableHWCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- status2 = sis301GetCursorStatus310;
- sis301DisableHWCursor310()
- }
- SISWaitRetraceCRT1(pScrn);
- sis310SwitchToMONOCursor();
- if(pSiS->VBFlags & CRT2_ENABLE) {
- SISWaitRetraceCRT2(pScrn);
- sis301SwitchToMONOCursor310();
- }
- }
- } else if(pSiS->Chipset == PCI_CHIP_SIS315H) {
- if(pSiS->VBFlags & DISPTYPE_CRT1) {
- SISWaitRetraceCRT1(pScrn);
- }
- }
+ if(pSiS->VBFlags & DISPTYPE_CRT1) {
+ status1 = sis310GetCursorStatus;
+ sis310DisableHWCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ status2 = sis301GetCursorStatus310;
+ sis301DisableHWCursor310()
+ }
+ SISWaitRetraceCRT1(pScrn);
+ sis310SwitchToMONOCursor();
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ SISWaitRetraceCRT2(pScrn);
+ sis301SwitchToMONOCursor310();
+ }
+ }
+ } else if(pSiS->Chipset == PCI_CHIP_SIS315H) {
+ if(pSiS->VBFlags & DISPTYPE_CRT1) {
+ SISWaitRetraceCRT1(pScrn);
+ }
+ }
}
sis310SetCursorAddress(cursor_addr);
+ sis310SetCursorPatternSelect(0);
if(status1) sis310SetCursorStatus(status1)
if(pSiS->VBFlags & CRT2_ENABLE) {
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- sis301SetCursorAddress310(cursor_addr2)
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301SetCursorAddress330(cursor_addr2)
+ sis301SetCursorPatternSelect330(0)
} else {
if((pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
status2 = sis301GetCursorStatus310;
@@ -863,6 +875,7 @@ SiS310LoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src)
sis301SwitchToMONOCursor310();
}
sis301SetCursorAddress310(cursor_addr)
+ sis301SetCursorPatternSelect310(0)
if(status2) sis301SetCursorStatus310(status2)
}
}
@@ -875,15 +888,15 @@ SiSUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
SISPtr pSiS = SISPTR(pScrn);
- DisplayModePtr mode = pSiS->CurrentLayout.mode;
-
+ DisplayModePtr mode = pSiS->CurrentLayout.mode; /* pScrn->currentMode; */
+
if(pSiS->Chipset != PCI_CHIP_SIS6326) return TRUE;
if(!(pSiS->SiS6326Flags & SIS6326_TVDETECTED)) return TRUE;
if((strcmp(mode->name, "PAL800x600U") == 0) ||
(strcmp(mode->name, "NTSC640x480U") == 0))
- return FALSE;
+ return FALSE;
else
- return TRUE;
+ return TRUE;
}
static Bool
@@ -891,7 +904,7 @@ SiS300UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
SISPtr pSiS = SISPTR(pScrn);
- DisplayModePtr mode = pSiS->CurrentLayout.mode;
+ DisplayModePtr mode = pSiS->CurrentLayout.mode; /* pScrn->currentMode; */
#ifdef SISMERGED
DisplayModePtr mode2 = NULL;
@@ -906,9 +919,9 @@ SiS300UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
case PCI_CHIP_SIS630:
case PCI_CHIP_SIS540:
if(mode->Flags & V_INTERLACE)
- return FALSE;
+ return FALSE;
if((mode->Flags & V_DBLSCAN) && (pCurs->bits->height > 32))
- return FALSE;
+ return FALSE;
#ifdef SISMERGED
if(pSiS->MergedFB) {
if(mode2->Flags & V_INTERLACE)
@@ -923,12 +936,12 @@ SiS300UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
case PCI_CHIP_SIS315:
case PCI_CHIP_SIS315H:
case PCI_CHIP_SIS315PRO:
- case PCI_CHIP_SIS660:
case PCI_CHIP_SIS330:
+ case PCI_CHIP_SIS660:
if(mode->Flags & V_INTERLACE)
- return FALSE;
+ return FALSE;
if((mode->Flags & V_DBLSCAN) && (pCurs->bits->height > 32))
- return FALSE;
+ return FALSE;
#ifdef SISMERGED
if(pSiS->MergedFB) {
if(mode2->Flags & V_INTERLACE)
@@ -937,12 +950,23 @@ SiS300UseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
return FALSE;
}
#endif
+ if(pSiS->Chipset == PCI_CHIP_SIS330) {
+ if((pSiS->VBFlags & CRT2_TV) &&
+ (pSiS->VBFlags & (TV_NTSC|TV_PALM))) {
+#ifdef SISMERGED
+ if(pSiS->MergedFB) {
+ if(mode2->HDisplay == 1024) return FALSE;
+ } else
+#endif
+ if(mode->HDisplay == 1024) return FALSE;
+ }
+ }
break;
default:
if(mode->Flags & V_INTERLACE)
- return FALSE;
+ return FALSE;
if((mode->Flags & V_DBLSCAN) && (pCurs->bits->height > 32))
- return FALSE;
+ return FALSE;
break;
}
return TRUE;
@@ -956,7 +980,7 @@ SiSUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
SISPtr pSiS = SISPTR(pScrn);
- DisplayModePtr mode = pSiS->CurrentLayout.mode;
+ DisplayModePtr mode = pSiS->CurrentLayout.mode; /* pScrn->currentMode; */
#ifdef SISMERGED
DisplayModePtr mode2 = NULL;
@@ -971,11 +995,11 @@ SiSUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs)
case PCI_CHIP_SIS630:
case PCI_CHIP_SIS540:
if(mode->Flags & V_INTERLACE)
- return FALSE;
- if((pCurs->bits->height > 32) || (pCurs->bits->width > 32))
- return FALSE;
+ return FALSE;
+ if(pCurs->bits->height > 32 || pCurs->bits->width > 32)
+ return FALSE;
if((mode->Flags & V_DBLSCAN) && (pCurs->bits->height > 16))
- return FALSE;
+ return FALSE;
#ifdef SISMERGED
if(pSiS->MergedFB) {
if(mode2->Flags & V_INTERLACE)
@@ -993,13 +1017,13 @@ SiSUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs)
case PCI_CHIP_SIS330:
case PCI_CHIP_SIS660:
if(mode->Flags & V_INTERLACE)
- return FALSE;
- if((pCurs->bits->height > 64) || (pCurs->bits->width > 64))
- return FALSE;
+ return FALSE;
+ if(pCurs->bits->height > 64 || pCurs->bits->width > 64)
+ return FALSE;
if((mode->Flags & V_DBLSCAN) && (pCurs->bits->height > 32))
- return FALSE;
+ return FALSE;
if((pSiS->CurrentLayout.bitsPerPixel == 8) && (pSiS->VBFlags & CRT2_ENABLE))
- return FALSE;
+ return FALSE;
#ifdef SISMERGED
if(pSiS->MergedFB) {
if(mode2->Flags & V_INTERLACE)
@@ -1008,8 +1032,20 @@ SiSUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs)
return FALSE;
}
#endif
+ if(pSiS->Chipset == PCI_CHIP_SIS330) {
+ if((pSiS->VBFlags & VB_SISBRIDGE) &&
+ (pSiS->VBFlags & CRT2_TV) &&
+ (pSiS->VBFlags & (TV_NTSC|TV_PALM))) {
+#ifdef SISMERGED
+ if(pSiS->MergedFB) {
+ if(mode2->HDisplay == 1024) return FALSE;
+ } else
+#endif
+ if(mode->HDisplay == 1024) return FALSE;
+ }
+ }
break;
- default:
+ default:
return FALSE;
}
return TRUE;
@@ -1061,10 +1097,10 @@ static void SiS300LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
dest = (MYSISPTRTYPE *)((unsigned char *)pSiS->FbBase + (cursor_addr * 1024));
if(sizedouble) {
- if(srcheight > 16) srcheight = 16;
- maxheight = 16;
+ if(srcheight > 16) srcheight = 16;
+ maxheight = 16;
}
-
+
#ifdef SIS300_USE_ARGB16 /* Use 16 Bit RGB pointer */
for(i = 0; i < srcheight; i++) {
p = src;
@@ -1144,34 +1180,35 @@ static void SiS300LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
#endif
if(!pSiS->UseHWARGBCursor) {
- if(pSiS->VBFlags & DISPTYPE_CRT1) {
- status1 = sis300GetCursorStatus;
- sis300DisableHWCursor()
- if(pSiS->VBFlags & CRT2_ENABLE) {
- status2 = sis301GetCursorStatus;
- sis301DisableHWCursor()
- }
- SISWaitRetraceCRT1(pScrn);
- sis300SwitchToRGBCursor();
- if(pSiS->VBFlags & CRT2_ENABLE) {
- SISWaitRetraceCRT2(pScrn);
- sis301SwitchToRGBCursor();
- }
- }
+ if(pSiS->VBFlags & DISPTYPE_CRT1) {
+ status1 = sis300GetCursorStatus;
+ sis300DisableHWCursor()
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ status2 = sis301GetCursorStatus;
+ sis301DisableHWCursor()
+ }
+ SISWaitRetraceCRT1(pScrn);
+ sis300SwitchToRGBCursor();
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ SISWaitRetraceCRT2(pScrn);
+ sis301SwitchToRGBCursor();
+ }
+ }
}
-
sis300SetCursorAddress(cursor_addr);
+ sis300SetCursorPatternSelect(0);
if(status1) sis300SetCursorStatus(status1)
- if(pSiS->VBFlags & CRT2_ENABLE) {
- if((!pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
- status2 = sis301GetCursorStatus;
- sis301DisableHWCursor()
- SISWaitRetraceCRT2(pScrn);
- sis301SwitchToRGBCursor();
- }
- sis301SetCursorAddress(cursor_addr)
- if(status2) sis301SetCursorStatus(status2)
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ if((!pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
+ status2 = sis301GetCursorStatus;
+ sis301DisableHWCursor()
+ SISWaitRetraceCRT2(pScrn);
+ sis301SwitchToRGBCursor();
+ }
+ sis301SetCursorAddress(cursor_addr)
+ sis301SetCursorPatternSelect(0)
+ if(status2) sis301SetCursorStatus(status2)
}
pSiS->UseHWARGBCursor = TRUE;
@@ -1186,7 +1223,6 @@ static void SiS310LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
int srcheight = pCurs->bits->height;
CARD32 status1 = 0, status2 = 0;
BOOLEAN sizedouble = FALSE;
- int bufnum;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
#endif
@@ -1202,64 +1238,47 @@ static void SiS310LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
sizedouble = TRUE;
}
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- pSiSEnt->HWCursorCBufNum ^= 1;
- bufnum = 1 << pSiSEnt->HWCursorCBufNum;
- } else {
-#endif
- pSiS->HWCursorCBufNum ^= 1;
- bufnum = 1 << pSiS->HWCursorCBufNum;
-#ifdef SISDUALHEAD
- }
-#endif
-
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- cursor_addr = pScrn->videoRam - pSiS->cursorOffset - ((pSiS->CursorSize/1024) * 2);
- } else {
- cursor_addr = pScrn->videoRam - pSiS->cursorOffset - ((pSiS->CursorSize/1024) * (2 + bufnum));
- }
+ cursor_addr = pScrn->videoRam - pSiS->cursorOffset - ((pSiS->CursorSize/1024) * 2);
if(srcwidth > 64) srcwidth = 64;
if(srcheight > 64) srcheight = 64;
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode)
- /* Use the global (real) FbBase in DHM */
- dest = (CARD32 *)((unsigned char *)pSiSEnt->FbBase + (cursor_addr * 1024));
+ /* TW: Use the global (real) FbBase in DHM */
+ dest = (CARD32 *)((unsigned char *)pSiSEnt->FbBase + (cursor_addr * 1024));
else
#endif
- dest = (CARD32 *)((unsigned char *)pSiS->FbBase + (cursor_addr * 1024));
+ dest = (CARD32 *)((unsigned char *)pSiS->FbBase + (cursor_addr * 1024));
if(sizedouble) {
- if(srcheight > 32) srcheight = 32;
- maxheight = 32;
+ if(srcheight > 32) srcheight = 32;
+ maxheight = 32;
}
for(i = 0; i < srcheight; i++) {
- p = src;
- pb = dest;
- src += pCurs->bits->width;
- for(j = 0; j < srcwidth; j++) *dest++ = *p++;
- if(srcwidth < 64) {
- for(; j < 64; j++) *dest++ = 0;
- }
- if(sizedouble) {
- for(j = 0; j < 64; j++) {
- *dest++ = *pb++;
- }
- }
+ p = src;
+ pb = dest;
+ src += pCurs->bits->width;
+ for(j = 0; j < srcwidth; j++) *dest++ = *p++;
+ if(srcwidth < 64) {
+ for(; j < 64; j++) *dest++ = 0;
+ }
+ if(sizedouble) {
+ for(j = 0; j < 64; j++) {
+ *dest++ = *pb++;
+ }
+ }
}
if(srcheight < maxheight) {
- for(; i < maxheight; i++) {
- for(j = 0; j < 64; j++) *dest++ = 0;
- if(sizedouble) {
- for(j = 0; j < 64; j++) *dest++ = 0;
- }
- }
+ for(; i < maxheight; i++)
+ for(j = 0; j < 64; j++) *dest++ = 0;
+ if(sizedouble) {
+ for(j = 0; j < 64; j++) *dest++ = 0;
+ }
}
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
if(!pSiS->UseHWARGBCursor) {
if(pSiS->VBFlags & DISPTYPE_CRT1) {
@@ -1291,11 +1310,13 @@ static void SiS310LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
}
sis310SetCursorAddress(cursor_addr);
+ sis310SetCursorPatternSelect(0);
if(status1) sis310SetCursorStatus(status1)
if(pSiS->VBFlags & CRT2_ENABLE) {
- if(pSiS->ChipFlags & SiSCF_CRT2HWCKaputt) {
- sis301SetCursorAddress310(cursor_addr)
+ if(pSiS->ChipFlags & SiSCF_XabreCore) {
+ sis301SetCursorAddress330(cursor_addr)
+ sis301SetCursorPatternSelect330(0)
} else {
if((!pSiS->UseHWARGBCursor) && (!pSiS->VBFlags & DISPTYPE_CRT1)) {
status2 = sis301GetCursorStatus310;
@@ -1304,6 +1325,7 @@ static void SiS310LoadCursorImageARGB(ScrnInfoPtr pScrn, CursorPtr pCurs)
sis301SwitchToRGBCursor310();
}
sis301SetCursorAddress310(cursor_addr)
+ sis301SetCursorPatternSelect310(0)
if(status2) sis301SetCursorStatus310(status2)
}
}
@@ -1366,7 +1388,7 @@ SiSHWCursorInit(ScreenPtr pScreen)
case PCI_CHIP_SIS315PRO:
case PCI_CHIP_SIS330:
case PCI_CHIP_SIS660:
- infoPtr->MaxWidth = 64;
+ infoPtr->MaxWidth = 64;
infoPtr->MaxHeight = 64;
infoPtr->ShowCursor = SiS310ShowCursor;
infoPtr->HideCursor = SiS310HideCursor;
diff --git a/src/sis_cursor.h b/src/sis_cursor.h
index c38d038..4d62cf3 100644
--- a/src/sis_cursor.h
+++ b/src/sis_cursor.h
@@ -1,39 +1,38 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_cursor.h,v 1.9 2003/06/26 22:35:17 twini Exp $ */
/*
* SiS hardware cursor handling
* Definitions
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- *
- * Idea based on code by Can-Ru Yeou, SiS Inc.
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Authors: Alan Hourihane, alanh@fairlite.demon.co.uk
+ * Mike Chapman <mike@paranoia.com>,
+ * Juanjo Santamarta <santamarta@ctv.es>,
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>.
+ * Thomas Winischhofer <thomas@winischhofer.net>:
*/
-#define CS(x) (0x8500 + (x << 2))
+#define CS(x) (0x8500+(x<<2))
/* 300 series, CRT1 */
@@ -119,11 +118,20 @@
{ \
unsigned long temp; \
temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
- temp &= 0xF0FF0000; \
+ temp &= 0xFFFF0000; \
temp |= address; \
MMIO_OUT32(pSiS->IOBase,CS(0),temp); \
}
+#define sis300SetCursorPatternSelect(pat_id)\
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xF0FFFFFF; \
+ temp |= (pat_id) << 24; \
+ MMIO_OUT32(pSiS->IOBase,CS(0),temp); \
+ }
+
/* 300 series, CRT2 */
/* 80000000 = RGB(1) - MONO(0)
@@ -208,11 +216,20 @@
{ \
unsigned long temp; \
temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
- temp &= 0xF0FF0000; \
+ temp &= 0xFFFF0000; \
temp |= address; \
MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
}
+#define sis301SetCursorPatternSelect(pat_id)\
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xF0FFFFFF; \
+ temp |= (pat_id) << 24; \
+ MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
+ }
+
/* 315/330 series CRT1 */
/* 80000000 = RGB(1) - MONO(0)
@@ -225,69 +242,86 @@
MMIO_IN32(pSiS->IOBase, CS(0)) & 0x40000000;
#define sis310SetCursorStatus(status) \
- pSiS->HWCursorBackup[0] &= 0xbfffffff; \
- pSiS->HWCursorBackup[0] |= status; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xbfffffff; \
+ temp |= status; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
#define sis310EnableHWCursor()\
- pSiS->HWCursorBackup[0] &= 0x0fffffff; \
- pSiS->HWCursorBackup[0] |= 0x40000000; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0x0fffffff; \
+ temp |= 0x40000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
#define sis310EnableHWARGBCursor()\
- pSiS->HWCursorBackup[0] &= 0x0FFFFFFF; \
- pSiS->HWCursorBackup[0] |= 0xE0000000; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0x0FFFFFFF; \
+ temp |= 0xE0000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
#define sis310SwitchToMONOCursor() \
- pSiS->HWCursorBackup[0] &= 0x4fffffff; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
-
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0x4fffffff; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
+
#define sis310SwitchToRGBCursor() \
- pSiS->HWCursorBackup[0] &= 0xBFFFFFFF; \
- pSiS->HWCursorBackup[0] |= 0xA0000000; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
-
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xBFFFFFFF; \
+ temp |= 0xA0000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
+
#define sis310DisableHWCursor()\
- pSiS->HWCursorBackup[0] &= 0xBFFFFFFF; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xBFFFFFFF; \
+ MMIO_OUT32(pSiS->IOBase, CS(0), temp); \
+ }
#define sis310SetCursorBGColor(color) \
- MMIO_OUT32(pSiS->IOBase, CS(1), (color)); \
- pSiS->HWCursorBackup[1] = color;
+ MMIO_OUT32(pSiS->IOBase, CS(1), (color));
#define sis310SetCursorFGColor(color)\
- MMIO_OUT32(pSiS->IOBase, CS(2), (color)); \
- pSiS->HWCursorBackup[2] = color;
+ MMIO_OUT32(pSiS->IOBase, CS(2), (color));
-#define sis310SetCursorPositionX(x,preset) \
- pSiS->HWCursorBackup[3] = ((x) | ((preset) << 16)); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]);
+#define sis310SetCursorPositionX(x,preset)\
+ MMIO_OUT32(pSiS->IOBase, CS(3), ((x) | ((preset) << 16)));
-#define sis310SetCursorPositionY(y,preset) \
- pSiS->HWCursorBackup[4] = ((y) | ((preset) << 16)); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+#define sis310SetCursorPositionY(y,preset)\
+ MMIO_OUT32(pSiS->IOBase, CS(4), ((y) | ((preset) << 16)));
#define sis310SetCursorAddress(address)\
- pSiS->HWCursorBackup[0] &= 0xF0F00000; \
- pSiS->HWCursorBackup[0] |= address; \
- MMIO_OUT32(pSiS->IOBase, CS(0), pSiS->HWCursorBackup[0]); \
- MMIO_OUT32(pSiS->IOBase, CS(1), pSiS->HWCursorBackup[1]); \
- MMIO_OUT32(pSiS->IOBase, CS(2), pSiS->HWCursorBackup[2]); \
- MMIO_OUT32(pSiS->IOBase, CS(3), pSiS->HWCursorBackup[3]); \
- MMIO_OUT32(pSiS->IOBase, CS(4), pSiS->HWCursorBackup[4]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xFFF00000; \
+ temp |= address; \
+ MMIO_OUT32(pSiS->IOBase,CS(0),temp); \
+ }
+
+#define sis310SetCursorPatternSelect(pat_id)\
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(0)); \
+ temp &= 0xF0FFFFFF; \
+ temp |= (pat_id) << 24; \
+ MMIO_OUT32(pSiS->IOBase,CS(0),temp); \
+ }
/* 315 series CRT2 */
@@ -301,62 +335,78 @@
MMIO_IN32(pSiS->IOBase, CS(8)) & 0x40000000;
#define sis301SetCursorStatus310(status) \
- pSiS->HWCursorBackup[8] &= 0xbfffffff; \
- pSiS->HWCursorBackup[8] |= status; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xbfffffff; \
+ temp |= status; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ }
#define sis301EnableHWCursor310()\
- pSiS->HWCursorBackup[8] &= 0x0fffffff; \
- pSiS->HWCursorBackup[8] |= 0x40000000; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ { \
+ unsigned long temp, temp1, temp2; \
+ temp1 = MMIO_IN32(pSiS->IOBase, CS(11)); \
+ temp2 = MMIO_IN32(pSiS->IOBase, CS(12)); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0x0fffffff; \
+ temp |= 0x40000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ MMIO_OUT32(pSiS->IOBase, CS(11), temp1); \
+ MMIO_OUT32(pSiS->IOBase, CS(12), temp2); \
+ }
#define sis301EnableHWARGBCursor310()\
- pSiS->HWCursorBackup[8] &= 0x0FFFFFFF; \
- pSiS->HWCursorBackup[8] |= 0xE0000000; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ { \
+ unsigned long temp, temp1, temp2; \
+ temp1 = MMIO_IN32(pSiS->IOBase, CS(11)); \
+ temp2 = MMIO_IN32(pSiS->IOBase, CS(12)); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0x0FFFFFFF; \
+ temp |= 0xE0000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ MMIO_OUT32(pSiS->IOBase, CS(11), temp1); \
+ MMIO_OUT32(pSiS->IOBase, CS(12), temp2); \
+ }
#define sis301SwitchToRGBCursor310() \
- pSiS->HWCursorBackup[8] &= 0xBFFFFFFF; \
- pSiS->HWCursorBackup[8] |= 0xA0000000; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xBFFFFFFF; \
+ temp |= 0xA0000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ }
#define sis301SwitchToMONOCursor310() \
- pSiS->HWCursorBackup[8] &= 0x4fffffff; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0x4fffffff; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ }
#define sis301DisableHWCursor310()\
- pSiS->HWCursorBackup[8] &= 0xBFFFFFFF; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
-
-#define sis301SetCursorBGColor310(color) \
- MMIO_OUT32(pSiS->IOBase, CS(9), (color)); \
- pSiS->HWCursorBackup[9] = color;
-
-#define sis301SetCursorFGColor310(color) \
- MMIO_OUT32(pSiS->IOBase, CS(10), (color)); \
- pSiS->HWCursorBackup[10] = color;
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xBFFFFFFF; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ }
-#define sis301SetCursorPositionX310(x,preset) \
- pSiS->HWCursorBackup[11] = ((x) | ((preset) << 16)); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]);
+#define sis301SetCursorBGColor310(color)\
+ MMIO_OUT32(pSiS->IOBase, CS(9), (color));
+#define sis301SetCursorFGColor310(color)\
+ MMIO_OUT32(pSiS->IOBase, CS(10), (color));
-#define sis301SetCursorPositionY310(y,preset) \
- pSiS->HWCursorBackup[12] = ((y) | ((preset) << 16)); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+#define sis301SetCursorPositionX310(x,preset)\
+ MMIO_OUT32(pSiS->IOBase, CS(11), ((x) | ((preset) << 16)));
+#define sis301SetCursorPositionY310(y,preset)\
+ MMIO_OUT32(pSiS->IOBase, CS(12), ((y) | ((preset) << 16)));
-#define sis301SetCursorAddress310(address) \
+#define sis301SetCursorAddress310(address)\
+ { \
+ unsigned long temp; \
if(pSiS->sishw_ext.jChipType == SIS_315H) { \
if(address & 0x10000) { \
address &= ~0x10000; \
@@ -365,18 +415,25 @@
andSISIDXREG(SISSR, 0x37, 0x7f); \
} \
} \
- pSiS->HWCursorBackup[8] &= 0xF0F00000; \
- pSiS->HWCursorBackup[8] |= address; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(9), pSiS->HWCursorBackup[9]); \
- MMIO_OUT32(pSiS->IOBase, CS(10), pSiS->HWCursorBackup[10]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]);
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xFFF00000; \
+ temp |= address; \
+ MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
+ }
+
+#define sis301SetCursorPatternSelect310(pat_id)\
+ { \
+ unsigned long temp; \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xF0FFFFFF; \
+ temp |= (pat_id) << 24; \
+ MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
+ }
/* 330 series CRT2 */
-/* Mono cursor engine for CRT2 on SiS330 (Xabre) has bugs
- * and cannot be used! Will hang engine.
+/* Mono cursor engine for CRt2 on 330 has bugs and cannot be
+ * used!
*/
/* 80000000 = RGB(1) - MONO(0)
@@ -385,14 +442,65 @@
* 10000000 = "ghost"(1) - Alpha Blend(0) ?
*/
-#define sis301EnableHWCursor330() \
- /* andSISIDXREG(SISCR,0x5b,~0x10); */ \
- pSiS->HWCursorBackup[8] &= 0x0fffffff; \
- pSiS->HWCursorBackup[8] |= 0xE0000000; \
- MMIO_OUT32(pSiS->IOBase, CS(8), pSiS->HWCursorBackup[8]); \
- MMIO_OUT32(pSiS->IOBase, CS(11), pSiS->HWCursorBackup[11]); \
- MMIO_OUT32(pSiS->IOBase, CS(12), pSiS->HWCursorBackup[12]); \
- /* orSISIDXREG(SISCR,0x5b,0x10); */
+#define sis301EnableHWCursor330()\
+ { \
+ unsigned long temp, temp1, temp2; \
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ temp1 = MMIO_IN32(pSiS->IOBase, CS(11)); \
+ temp2 = MMIO_IN32(pSiS->IOBase, CS(12)); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0x0fffffff; \
+ temp |= 0xE0000000; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ MMIO_OUT32(pSiS->IOBase, CS(11), temp1); \
+ MMIO_OUT32(pSiS->IOBase, CS(12), temp2); \
+ orSISIDXREG(SISCR,0x5b,0x10); \
+ }
+
+#define sis301DisableHWCursor330()\
+ { \
+ unsigned long temp; \
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xBFFFFFFF; \
+ MMIO_OUT32(pSiS->IOBase, CS(8), temp); \
+ orSISIDXREG(SISCR,0x5b,0x10); \
+ }
+
+#define sis301SetCursorPositionX330(x,preset)\
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ MMIO_OUT32(pSiS->IOBase, CS(11), ((x) | ((preset) << 16))); \
+ orSISIDXREG(SISCR,0x5b,0x10);
+
+#define sis301SetCursorPositionY330(y,preset)\
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ MMIO_OUT32(pSiS->IOBase, CS(12), ((y) | ((preset) << 16))); \
+ orSISIDXREG(SISCR,0x5b,0x10); \
+
+#define sis301SetCursorAddress330(address)\
+ { \
+ unsigned long temp, temp1, temp2; \
+ temp1 = MMIO_IN32(pSiS->IOBase, CS(11)); \
+ temp2 = MMIO_IN32(pSiS->IOBase, CS(12)); \
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xFFF00000; \
+ temp |= address; \
+ MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
+ MMIO_OUT32(pSiS->IOBase, CS(11), temp1); \
+ MMIO_OUT32(pSiS->IOBase, CS(12), temp2); \
+ orSISIDXREG(SISCR,0x5b,0x10); \
+ }
+#define sis301SetCursorPatternSelect330(pat_id)\
+ { \
+ unsigned long temp; \
+ andSISIDXREG(SISCR,0x5b,~0x10); \
+ temp = MMIO_IN32(pSiS->IOBase, CS(8)); \
+ temp &= 0xF0FFFFFF; \
+ temp |= (pat_id) << 24; \
+ MMIO_OUT32(pSiS->IOBase,CS(8),temp); \
+ orSISIDXREG(SISCR,0x5b,0x10); \
+ }
diff --git a/src/sis_dac.c b/src/sis_dac.c
index 296e808..78693da 100644
--- a/src/sis_dac.c
+++ b/src/sis_dac.c
@@ -1,45 +1,36 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.c,v 1.39 2003/08/26 20:40:23 twini Exp $ */
/*
* DAC helper functions (Save/Restore, MemClk, etc)
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
+ * Parts Copyright 1998,1999 by Alan Hourihane, Wigan, England.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the provider not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The provider makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE PROVIDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE PROVIDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
- * SiS_compute_vclk(), SiSCalcClock() and parts of SiSMclk():
- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England
- * Written by:
- * Alan Hourihane <alanh@fairlite.demon.co.uk>,
- * Mike Chapman <mike@paranoia.com>,
- * Juanjo Santamarta <santamarta@ctv.es>,
- * Mitani Hiroshi <hmitani@drl.mei.co.jp>,
- * David Thomas <davtom@dream.org.uk>,
- * Thomas Winischhofer <thomas@winischhofer.net>.
- * Licensed under the terms of the XFree86 license
- * (http://www.xfree86.org/current/LICENSE1.html)
- *
+ * MemClock functions by:
+ * Alan Hourihane <alanh@fairlite.demon.co.uk>
+ * Mike Chapman <mike@paranoia.com>,
+ * Juanjo Santamarta <santamarta@ctv.es>,
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>.
*/
#include "xf86.h"
@@ -70,6 +61,8 @@ static void SiS301BRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg);
static void SiSLVDSChrontelRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg);
static void SiS301LoadPalette(ScrnInfoPtr pScrn, int numColors,
int *indicies, LOCO *colors, VisualPtr pVisual);
+static void SiSThreshold(ScrnInfoPtr pScrn, DisplayModePtr mode,
+ unsigned short *Low, unsigned short *High);
static void SetBlock(CARD16 port, CARD8 from, CARD8 to, CARD8 *DataPtr);
static const unsigned short ch700xidx[] = {
@@ -82,7 +75,7 @@ static const unsigned short ch701xidx[] = {
0x1c,0x5f,0x64,0x6f,0x70,0x71,0x72,0x73,0x74,0x76,0x78,0x7d,
0x67,0x68,0x69,0x6a,0x6b,0x1e,0x00,0x01,0x02,0x04,0x03,0x05,
0x06,0x07,0x08,0x15,0x1f,0x0c,0x0d,0x0e,0x0f,0x10,0x66
- };
+ };
int SiS_compute_vclk(
int Clock,
@@ -195,18 +188,15 @@ SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk)
SISPtr pSiS = SISPTR(pScrn);
int M, N, P , PSN, VLD , PSNx ;
int bestM=0, bestN=0, bestP=0, bestPSN=0, bestVLD=0;
- double abest = 42.0;
+ double bestError, abest = 42.0, bestFout;
double target;
double Fvco, Fout;
double error, aerror;
-#ifdef DEBUG
- double bestFout;
-#endif
/*
* fd = fref*(Numerator/Denumerator)*(Divider/PostScaler)
*
- * M = Numerator [1:128]
+ * M = Numerator [1:128]
* N = DeNumerator [1:32]
* VLD = Divider (Vco Loop Divider) : divide by 1, 2
* P = Post Scaler : divide by 1, 2, 3, 4
@@ -267,14 +257,13 @@ SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk)
aerror = (error < 0) ? -error : error;
if(aerror < abest) {
abest = aerror;
+ bestError = error;
bestM = M;
bestN = N;
bestP = P;
bestPSN = PSN;
bestVLD = VLD;
-#ifdef DEBUG
bestFout = Fout;
-#endif
}
}
@@ -324,14 +313,13 @@ SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD, unsigned int *vclk)
aerror = (error < 0) ? -error : error;
if(aerror < abest) {
abest = aerror;
+ bestError = error;
bestM = M;
bestN = N;
bestP = P;
bestPSN = PSN;
bestVLD = VLD;
-#ifdef DEBUG
bestFout = Fout;
-#endif
}
#ifdef TWDEBUG
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO,3,
@@ -392,17 +380,17 @@ SiSSave(ScrnInfoPtr pScrn, SISRegPtr sisReg)
/* Save extended SR registers */
for(i = 0x00; i <= max; i++) {
- inSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
+ inSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"SR%02X - %02X \n", i,sisReg->sisRegs3C4[i]);
#endif
}
#ifdef TWDEBUG
for(i = 0x00; i <= 0x3f; i++) {
- inSISIDXREG(SISCR, i, max);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ inSISIDXREG(SISCR, i, max);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"CR%02X - %02X \n", i,max);
}
#endif
@@ -416,9 +404,9 @@ SiSSave(ScrnInfoPtr pScrn, SISRegPtr sisReg)
if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) {
outSISIDXREG(SISCR, 0x80, 0x86);
for(i = 0x00; i <= 0x44; i++) {
- sisReg->sis6326tv[i] = SiS6326GetTVReg(pScrn, i);
+ sisReg->sis6326tv[i] = SiS6326GetTVReg(pScrn, i);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"VR%02X - %02X \n", i,sisReg->sis6326tv[i]);
#endif
}
@@ -461,9 +449,9 @@ SiSRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
}
/* Restore other extended SR registers */
- for(i = 0x06; i <= max; i++) {
- if((i == 0x13) || (i == 0x2a) || (i == 0x2b)) continue;
- outSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
+ for (i = 0x06; i <= max; i++) {
+ if((i == 0x13) || (i == 0x2a) || (i == 0x2b)) continue;
+ outSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
}
/* Now restore VCLK (with correct SR38 setting) */
@@ -483,9 +471,9 @@ SiSRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
pSiS->SiS6326Flags &= ~SIS6326_TVON;
if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) {
for(i = 0x01; i <= 0x44; i++) {
- SiS6326SetTVReg(pScrn, i, sisReg->sis6326tv[i]);
+ SiS6326SetTVReg(pScrn, i, sisReg->sis6326tv[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"VR%02x restored to %02x\n",
i, sisReg->sis6326tv[i]);
#endif
@@ -555,12 +543,12 @@ SiS300Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
#ifndef TWDEBUG
if(!pSiS->UseVESA) {
#endif
- if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
- (*pSiS->SiSSaveLVDSChrontel)(pScrn, sisReg);
- if(pSiS->VBFlags & VB_301)
- (*pSiS->SiSSave2)(pScrn, sisReg);
- if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV))
- (*pSiS->SiSSave3)(pScrn, sisReg);
+ if (pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
+ (*pSiS->SiSSaveLVDSChrontel)(pScrn, sisReg);
+ if (pSiS->VBFlags & VB_301)
+ (*pSiS->SiSSave2)(pScrn, sisReg);
+ if (pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV))
+ (*pSiS->SiSSave3)(pScrn, sisReg);
#ifndef TWDEBUG
}
#endif
@@ -569,7 +557,7 @@ SiS300Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0)
if(!(pSiS->UseVESA))
#endif
- pSiS->BIOSModeSave = SiS_GetSetModeID(pScrn,0xFF);
+ pSiS->BIOSModeSave = SiS_GetSetModeID(pScrn,0xFF);
#ifdef TWDEBUG
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -593,67 +581,67 @@ SiS300Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- /* Wait for accelerator to finish on-going drawing operations. */
+ /* TW: Wait for accelerator to finish on-going drawing operations. */
inSISIDXREG(SISSR, 0x1E, temp);
if(temp & (0x40|0x10|0x02)) {
- while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
- while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
- while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
+ while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
+ while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
+ while ( (MMIO_IN16(pSiS->IOBase, 0x8242) & 0xE000) != 0xE000){};
}
-
+
if(!(pSiS->UseVESA)) {
if(pSiS->VBFlags & VB_LVDS) {
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
}
}
/* Restore extended CR registers */
for(i = 0x19; i < 0x40; i++) {
- outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
+ outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
}
if(pSiS->Chipset != PCI_CHIP_SIS300) {
- unsigned char val;
- inSISIDXREG(SISCR, 0x1A, val);
- if(val == sisReg->sisRegs3D4[0x19])
- outSISIDXREG(SISCR, 0x1A, sisReg->sisRegs3D4[0x19]);
- inSISIDXREG(SISCR,0x19,val);
- if(val == sisReg->sisRegs3D4[0x1A])
- outSISIDXREG(SISCR, 0x19, sisReg->sisRegs3D4[0x1A]);
+ unsigned char val;
+ inSISIDXREG(SISCR, 0x1A, val);
+ if(val == sisReg->sisRegs3D4[0x19])
+ outSISIDXREG(SISCR, 0x1A, sisReg->sisRegs3D4[0x19]);
+ inSISIDXREG(SISCR,0x19,val);
+ if(val == sisReg->sisRegs3D4[0x1A])
+ outSISIDXREG(SISCR, 0x19, sisReg->sisRegs3D4[0x1A]);
}
/* Set (and leave) PCI_IO_ENABLE on if accelerators are on */
if(sisReg->sisRegs3C4[0x1e] & 0x50) {
- sisReg->sisRegs3C4[0x20] |= 0x20;
- outSISIDXREG(SISSR, 0x20, sisReg->sisRegs3C4[0x20]);
+ sisReg->sisRegs3C4[0x20] |= 0x20;
+ outSISIDXREG(SISSR, 0x20, sisReg->sisRegs3C4[0x20]);
}
- /* If TQ is switched on, don't switch it off ever again!
- * Therefore, always restore registers with TQ enabled.
+ /* TW: If TQ is switched on, don't switch it off ever again!
+ * Therefore, always restore registers with TQ enabled.
*/
if((!pSiS->NoAccel) && (pSiS->TurboQueue)) {
- temp = (pScrn->videoRam/64) - 8;
- sisReg->sisRegs3C4[0x26] = temp & 0xFF;
- sisReg->sisRegs3C4[0x27] = ((temp >> 8) & 3) | 0xF0;
+ temp = (pScrn->videoRam/64) - 8;
+ sisReg->sisRegs3C4[0x26] = temp & 0xFF;
+ sisReg->sisRegs3C4[0x27] = ((temp >> 8) & 3) | 0xF0;
}
/* Restore extended SR registers */
- for(i = 0x06; i <= 0x3D; i++) {
- temp = sisReg->sisRegs3C4[i];
- if(!(pSiS->UseVESA)) {
- if(pSiS->VBFlags & VB_LVDS) {
- if(i == 0x11) {
- inSISIDXREG(SISSR,0x11,temp);
- temp &= 0x0c;
- temp |= (sisReg->sisRegs3C4[i] & 0xf3);
- }
- }
- }
- outSISIDXREG(SISSR, i, temp);
+ for (i = 0x06; i <= 0x3D; i++) {
+ temp = sisReg->sisRegs3C4[i];
+ if(!(pSiS->UseVESA)) {
+ if(pSiS->VBFlags & VB_LVDS) {
+ if(i == 0x11) {
+ inSISIDXREG(SISSR,0x11,temp);
+ temp &= 0x0c;
+ temp |= (sisReg->sisRegs3C4[i] & 0xf3);
+ }
+ }
+ }
+ outSISIDXREG(SISSR, i, temp);
}
-
- /* Restore VCLK and ECLK */
+
+ /* TW: Restore VCLK and ECLK */
if(pSiS->VBFlags & (VB_LVDS | VB_301B | VB_301C)) {
outSISIDXREG(SISSR,0x31,0x20);
outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
@@ -679,10 +667,10 @@ SiS300Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
}
-
+
/* Restore Misc register */
- outSISREG(SISMISCW, sisReg->sisRegs3C2);
-
+ outSISREG(SISMISCW, sisReg->sisRegs3C2);
+
/* Restore FQBQ and GUI timer settings */
if(pSiS->Chipset == PCI_CHIP_SIS630) {
temp1 = pciReadLong(0x00000000, 0x50);
@@ -692,9 +680,9 @@ SiS300Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
} else { /* 730 */
temp1 &= 0xfffff9ff;
temp1 |= (sisReg->sisRegsPCI50 & ~0xfffff9ff);
- }
+ }
pciWriteLong(0x00000000, 0x50, temp1);
-
+
temp1 = pciReadLong(0x00000000, 0xA0);
if(pciReadLong(0x00000000, 0x00) == 0x06301039) {
temp1 &= 0xf0ffffff;
@@ -702,20 +690,20 @@ SiS300Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
} else { /* 730 */
temp1 &= 0x00ffffff;
temp1 |= (sisReg->sisRegsPCIA0 & ~0x00ffffff);
- }
+ }
pciWriteLong(0x00000000, 0xA0, temp1);
}
/* Restore panel link/video bridge registers */
if(!(pSiS->UseVESA)) {
- if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
- (*pSiS->SiSRestoreLVDSChrontel)(pScrn, sisReg);
- if(pSiS->VBFlags & VB_301)
- (*pSiS->SiSRestore2)(pScrn, sisReg);
- if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV))
- (*pSiS->SiSRestore3)(pScrn, sisReg);
+ if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
+ (*pSiS->SiSRestoreLVDSChrontel)(pScrn, sisReg);
+ if(pSiS->VBFlags & VB_301)
+ (*pSiS->SiSRestore2)(pScrn, sisReg);
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV))
+ (*pSiS->SiSRestore3)(pScrn, sisReg);
}
-
+
/* MemClock needs this to take effect */
outSISIDXREG(SISSR, 0x00, 0x01); /* Synchronous Reset */
outSISIDXREG(SISSR, 0x00, 0x03); /* End Reset */
@@ -724,7 +712,7 @@ SiS300Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0)
if(!(pSiS->UseVESA))
#endif
- SiS_GetSetModeID(pScrn,pSiS->BIOSModeSave);
+ SiS_GetSetModeID(pScrn,pSiS->BIOSModeSave);
}
/* Save SiS315 series register contents */
@@ -742,10 +730,10 @@ SiS315Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
#endif
/* Save SR registers */
- for(i = 0x00; i <= 0x3F; i++) {
- inSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
+ for (i = 0x00; i <= 0x3F; i++) {
+ inSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"SR%02X - %02X \n", i,sisReg->sisRegs3C4[i]);
#endif
}
@@ -754,45 +742,45 @@ SiS315Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
sisReg->sisMMIO85C0 = MMIO_IN32(pSiS->IOBase, 0x85C0);
/* Save CR registers */
- for(i = 0x00; i <= 0x7c; i++) {
- inSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
+ for (i = 0x00; i <= 0x7a; i++) {
+ inSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"CR%02X Contents - %02X \n", i,sisReg->sisRegs3D4[i]);
#endif
}
/* Save video capture registers */
- for(i = 0x00; i <= 0x4f; i++) {
- inSISIDXREG(SISCAP, i, sisReg->sisCapt[i]);
+ for (i = 0x00; i <= 0x4f; i++) {
+ inSISIDXREG(SISCAP, i, sisReg->sisCapt[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Capt%02X Contents - %02X \n", i,sisReg->sisCapt[i]);
#endif
}
/* Save video playback registers */
- for(i = 0x00; i <= 0x3f; i++) {
- inSISIDXREG(SISVID, i, sisReg->sisVid[i]);
+ for (i = 0x00; i <= 0x3f; i++) {
+ inSISIDXREG(SISVID, i, sisReg->sisVid[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Vid%02X Contents - %02X \n", i,sisReg->sisVid[i]);
#endif
}
/* Save Misc register */
- sisReg->sisRegs3C2 = inSISREG(SISMISCR);
+ sisReg->sisRegs3C2 = inSISREG(SISMISCR);
/* Save panel link/video bridge registers */
#ifndef TWDEBUG
- if(!pSiS->UseVESA) {
+ if (!pSiS->UseVESA) {
#endif
- if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
- (*pSiS->SiSSaveLVDSChrontel)(pScrn, sisReg);
- if(pSiS->VBFlags & VB_301)
- (*pSiS->SiSSave2)(pScrn, sisReg);
- if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV))
- (*pSiS->SiSSave3)(pScrn, sisReg);
+ if (pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
+ (*pSiS->SiSSaveLVDSChrontel)(pScrn, sisReg);
+ if (pSiS->VBFlags & VB_301)
+ (*pSiS->SiSSave2)(pScrn, sisReg);
+ if (pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV))
+ (*pSiS->SiSSave3)(pScrn, sisReg);
#ifndef TWDEBUG
}
#endif
@@ -801,12 +789,12 @@ SiS315Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0)
if(!(pSiS->UseVESA))
#endif
- pSiS->BIOSModeSave = SiS_GetSetModeID(pScrn,0xFF);
-
-#ifdef TWDEBUG
+ pSiS->BIOSModeSave = SiS_GetSetModeID(pScrn,0xFF);
+
+#ifdef TWDEBUG
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"BIOS mode ds:449 = 0x%x\n", pSiS->BIOSModeSave);
-#endif
+#endif
}
/* Restore SiS315/330 series register contents */
@@ -825,10 +813,10 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
/* Wait for accelerator to finish on-going drawing operations. */
inSISIDXREG(SISSR, 0x1E, temp);
- if(temp & (0x40|0x10|0x02)) { /* 0x40 = 2D, 0x10 = 3D enabled*/
- while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
- while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
- while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
+ if (temp & (0x40|0x10|0x02)) { /* 0x40 = 2D, 0x10 = 3D enabled*/
+ while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
+ while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
+ while ( (MMIO_IN32(pSiS->IOBase, 0x85CC) & 0x80000000) != 0x80000000){};
}
/* We reset the command queue before restoring.
@@ -841,56 +829,51 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISSR, 0x26, 0x01);
/* Restore extended CR registers */
- for(i = 0x19; i < 0x5C; i++) {
- outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
- }
- if(pSiS->sishw_ext.jChipType < SIS_661) {
- outSISIDXREG(SISCR, 0x79, sisReg->sisRegs3D4[0x79]);
+ for (i = 0x19; i < 0x5C; i++) {
+ outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
}
- outSISIDXREG(SISCR, pSiS->myCR63, sisReg->sisRegs3D4[pSiS->myCR63]);
+ outSISIDXREG(SISCR, 0x79, sisReg->sisRegs3D4[0x79]);
+ outSISIDXREG(SISCR, 0x63, sisReg->sisRegs3D4[0x63]);
/* Leave PCI_IO_ENABLE on if accelerators are on (Is this required?) */
- if(sisReg->sisRegs3C4[0x1e] & 0x50) { /*0x40=2D, 0x10=3D*/
- sisReg->sisRegs3C4[0x20] |= 0x20;
- outSISIDXREG(SISSR, 0x20, sisReg->sisRegs3C4[0x20]);
+ if (sisReg->sisRegs3C4[0x1e] & 0x50) { /*0x40=2D, 0x10=3D*/
+ sisReg->sisRegs3C4[0x20] |= 0x20;
+ outSISIDXREG(SISSR, 0x20, sisReg->sisRegs3C4[0x20]);
}
/* Restore extended SR registers */
- if(pSiS->sishw_ext.jChipType >= SIS_661) {
- sisReg->sisRegs3C4[0x11] &= 0x0f;
- }
- for(i = 0x06; i <= 0x3F; i++) {
- outSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
+ for (i = 0x06; i <= 0x3F; i++) {
+ outSISIDXREG(SISSR, i, sisReg->sisRegs3C4[i]);
}
/* Restore VCLK and ECLK */
andSISIDXREG(SISSR,0x31,0xcf);
if(pSiS->VBFlags & VB_LVDS) {
- orSISIDXREG(SISSR,0x31,0x20);
- outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
- outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
- outSISIDXREG(SISSR,0x2d,0x80);
- andSISIDXREG(SISSR,0x31,0xcf);
- orSISIDXREG(SISSR,0x31,0x10);
- outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
- outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
- outSISIDXREG(SISSR,0x2d,0x80);
- andSISIDXREG(SISSR,0x31,0xcf);
- outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
- outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
- outSISIDXREG(SISSR,0x2d,0x01);
- outSISIDXREG(SISSR,0x31,0x20);
- outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
- outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
- outSISIDXREG(SISSR,0x31,0x10);
- outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
- outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
- outSISIDXREG(SISSR,0x31,0x00);
- outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
- outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
+ orSISIDXREG(SISSR,0x31,0x20);
+ outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
+ outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
+ outSISIDXREG(SISSR,0x2d,0x80);
+ andSISIDXREG(SISSR,0x31,0xcf);
+ orSISIDXREG(SISSR,0x31,0x10);
+ outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
+ outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
+ outSISIDXREG(SISSR,0x2d,0x80);
+ andSISIDXREG(SISSR,0x31,0xcf);
+ outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
+ outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
+ outSISIDXREG(SISSR,0x2d,0x01);
+ outSISIDXREG(SISSR,0x31,0x20);
+ outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
+ outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
+ outSISIDXREG(SISSR,0x31,0x10);
+ outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
+ outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
+ outSISIDXREG(SISSR,0x31,0x00);
+ outSISIDXREG(SISSR,0x2e,sisReg->sisRegs3C4[0x2e]);
+ outSISIDXREG(SISSR,0x2f,sisReg->sisRegs3C4[0x2f]);
} else {
- outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
- outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
- outSISIDXREG(SISSR,0x2d,0x01);
+ outSISIDXREG(SISSR,0x2b,sisReg->sisRegs3C4[0x2b]);
+ outSISIDXREG(SISSR,0x2c,sisReg->sisRegs3C4[0x2c]);
+ outSISIDXREG(SISSR,0x2d,0x01);
}
#ifndef SISVRAMQ
@@ -905,12 +888,12 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
/* Restore panel link/video bridge registers */
if(!(pSiS->UseVESA)) {
- if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
- (*pSiS->SiSRestoreLVDSChrontel)(pScrn, sisReg);
- if(pSiS->VBFlags & VB_301)
- (*pSiS->SiSRestore2)(pScrn, sisReg);
- if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV))
- (*pSiS->SiSRestore3)(pScrn, sisReg);
+ if(pSiS->VBFlags & (VB_LVDS|VB_CHRONTEL))
+ (*pSiS->SiSRestoreLVDSChrontel)(pScrn, sisReg);
+ if(pSiS->VBFlags & VB_301)
+ (*pSiS->SiSRestore2)(pScrn, sisReg);
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV))
+ (*pSiS->SiSRestore3)(pScrn, sisReg);
}
/* MemClock needs this to take effect */
@@ -924,56 +907,56 @@ SiS315Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
SiS_GetSetModeID(pScrn,pSiS->BIOSModeSave);
}
+/* Save SiS301 bridge register contents */
static void
-SiSVBSave(ScrnInfoPtr pScrn, SISRegPtr sisReg, int p1, int p2, int p3, int p4)
+SiS301Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
int i;
+ int Part1max=0, Part2max=0, Part3max=0, Part4max=0;
- for(i=0; i<=p1; i++) {
- inSISIDXREG(SISPART1, i, sisReg->VBPart1[i]);
+ /* Highest register number to save/restore */
+ switch (pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ Part1max = 0x1d;
+ Part2max = 0x45;
+ Part3max = 0x3e;
+ Part4max = 0x1b;
+ break;
+ case SIS_315_VGA:
+ Part1max = 0x2e; /* 0x23, but we also need 2d-2e */
+ Part2max = 0x45;
+ Part3max = 0x3e;
+ Part4max = 0x1b;
+ break;
+ }
+
+ for (i=0; i<=Part1max; i++) {
+ inSISIDXREG(SISPART1, i, sisReg->VBPart1[i]);
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "301xSave: Part1Port 0x%02x = 0x%02x\n", i, sisReg->VBPart1[i]);
+ xf86DrvMsg(0, X_INFO, "301Save: Part1Port 0x%02x = 0x%02x\n", i, sisReg->VBPart1[i]);
#endif
}
- for(i=0; i<=p2; i++) {
- inSISIDXREG(SISPART2, i, sisReg->VBPart2[i]);
+ for (i=0; i<=Part2max; i++) {
+ inSISIDXREG(SISPART2, i, sisReg->VBPart2[i]);
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "301xSave: Part2Port 0x%02x = 0x%02x\n", i, sisReg->VBPart2[i]);
+ xf86DrvMsg(0, X_INFO, "301Save: Part2Port 0x%02x = 0x%02x\n", i, sisReg->VBPart2[i]);
#endif
}
- for(i=0; i<=p3; i++) {
- inSISIDXREG(SISPART3, i, sisReg->VBPart3[i]);
+ for (i=0; i<=Part3max; i++) {
+ inSISIDXREG(SISPART3, i, sisReg->VBPart3[i]);
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "301xSave: Part3Port 0x%02x = 0x%02x\n", i, sisReg->VBPart3[i]);
+ xf86DrvMsg(0, X_INFO, "301Save: Part3Port 0x%02x = 0x%02x\n", i, sisReg->VBPart3[i]);
#endif
}
- for(i=0; i<=p4; i++) {
- inSISIDXREG(SISPART4, i, sisReg->VBPart4[i]);
+ for (i=0; i<=Part4max; i++) {
+ inSISIDXREG(SISPART4, i, sisReg->VBPart4[i]);
#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "301xSave: Part4Port 0x%02x = 0x%02x\n", i, sisReg->VBPart4[i]);
+ xf86DrvMsg(0, X_INFO, "301Save: Part4Port 0x%02x = 0x%02x\n", i, sisReg->VBPart4[i]);
#endif
}
-}
-
-/* Save SiS301 bridge register contents */
-static void
-SiS301Save(ScrnInfoPtr pScrn, SISRegPtr sisReg)
-{
- SISPtr pSiS = SISPTR(pScrn);
- int Part1max, Part2max, Part3max, Part4max;
-
- /* Highest register number to save/restore */
- if(pSiS->VGAEngine == SIS_300_VGA) Part1max = 0x1d;
- else Part1max = 0x2e; /* 0x23, but we also need 2d-2e */
-
- Part2max = 0x45;
- Part3max = 0x3e;
- Part4max = 0x1b;
-
- SiSVBSave(pScrn, sisReg, Part1max, Part2max, Part3max, Part4max);
- sisReg->VBPart2[0x00] &= ~0x20; /* Disable VB Processor */
+ sisReg->VBPart2[0] &= ~0x20; /* Disable VB Processor */
sisReg->sisRegs3C4[0x32] &= ~0x20; /* Disable Lock Mode */
}
@@ -982,19 +965,27 @@ static void
SiS301Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
- int Part1max, Part2max, Part3max, Part4max;
+ int Part1max=0, Part2max=0, Part3max=0, Part4max=0;
/* Highest register number to save/restore */
- if(pSiS->VGAEngine == SIS_300_VGA) Part1max = 0x1d;
- else Part1max = 0x23;
-
- Part2max = 0x45;
- Part3max = 0x3e;
- Part4max = 0x1b;
+ switch (pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ Part1max = 0x1d;
+ Part2max = 0x45;
+ Part3max = 0x3e;
+ Part4max = 0x1b;
+ break;
+ case SIS_315_VGA:
+ Part1max = 0x23;
+ Part2max = 0x45;
+ Part3max = 0x3e;
+ Part4max = 0x1b;
+ break;
+ }
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
/* Pre-restore Part1 */
outSISIDXREG(SISPART1, 0x04, 0x00);
@@ -1007,17 +998,22 @@ SiS301Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISPART4, 0x0D, sisReg->VBPart4[0x0D]);
outSISIDXREG(SISPART4, 0x0C, sisReg->VBPart4[0x0C]);
- if((!(sisReg->sisRegs3D4[0x30] & 0x03)) &&
- (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
- return;
+ if (!(sisReg->sisRegs3D4[0x30] & 0x03) &&
+ (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+ return;
}
/* Restore Part1 */
SetBlock(SISPART1, 0x02, Part1max, &(sisReg->VBPart1[0x02]));
- if(pSiS->VGAEngine == SIS_315_VGA) {
- /* Restore extra registers on 315 series */
- SetBlock(SISPART1, 0x2C, 0x2E, &(sisReg->VBPart1[0x2C]));
+ switch (pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ /* Nothing special here. */
+ break;
+ case SIS_315_VGA:
+ /* Restore extra registers on 315 series */
+ SetBlock(SISPART1, 0x2C, 0x2E, &(sisReg->VBPart1[0x2C]));
+ break;
}
/* Restore Part2 */
@@ -1037,58 +1033,99 @@ SiS301Restore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISPART4, 0x12, 0x00);
outSISIDXREG(SISPART4, 0x12, sisReg->VBPart4[0x12]);
- SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
SiS_DisplayOn(pSiS->SiS_Pr);
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
}
-/* Save SiS30xB/30xLV bridge register contents */
+/* Save SiS301B/302B/30xLV bridge register contents */
static void
SiS301BSave(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
- int Part1max, Part2max, Part3max, Part4max;
-
- Part1max = 0x4c;
- Part2max = 0x4d;
- Part3max = 0x3e;
- Part4max = 0x23;
- if(pSiS->VBFlags & (VB_301C|VB_302ELV)) {
- Part2max = 0xff;
- Part4max = 0x3c;
+ int i;
+ int Part1max=0, Part2max=0, Part3max=0, Part4max=0;
+
+ switch (pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ Part1max = 0x37; /* 0x1d, but we also need 2c-2e, 35-37 */
+ Part2max = 0x4d;
+ Part3max = 0x3e;
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV))
+ Part4max = 0x34;
+ else
+ Part4max = 0x23;
+ break;
+ case SIS_315_VGA:
+ Part1max = 0x37; /* 0x23, but we also need 2c-2e, 35-37 */
+ Part2max = 0x4d;
+ Part3max = 0x3e;
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV))
+ Part4max = 0x34;
+ else
+ Part4max = 0x23;
+ break;
+ }
+
+ for (i=0; i<=Part1max; i++) {
+ inSISIDXREG(SISPART1, i, sisReg->VBPart1[i]);
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "301BSave: Part1Port 0x%02x = 0x%02x\n", i, sisReg->VBPart1[i]);
+#endif
}
- if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
- Part4max = 0x34;
+ for (i=0; i<=Part2max; i++) {
+ inSISIDXREG(SISPART2, i, sisReg->VBPart2[i]);
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "301BSave: Part2Port 0x%02x = 0x%02x\n", i, sisReg->VBPart2[i]);
+#endif
}
-
- SiSVBSave(pScrn, sisReg, Part1max, Part2max, Part3max, Part4max);
-
- sisReg->VBPart2[0x00] &= ~0x20; /* Disable VB Processor */
+ for (i=0; i<=Part3max; i++) {
+ inSISIDXREG(SISPART3, i, sisReg->VBPart3[i]);
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "301BSave: Part3Port 0x%02x = 0x%02x\n", i, sisReg->VBPart3[i]);
+#endif
+ }
+ for (i=0; i<=Part4max; i++) {
+ inSISIDXREG(SISPART4, i, sisReg->VBPart4[i]);
+#ifdef TWDEBUG
+ xf86DrvMsg(0, X_INFO, "301BSave: Part4Port 0x%02x = 0x%02x\n", i, sisReg->VBPart4[i]);
+#endif
+ }
+ sisReg->VBPart2[0] &= ~0x20; /* Disable VB Processor */
sisReg->sisRegs3C4[0x32] &= ~0x20; /* Disable Lock Mode */
}
-/* Restore SiS30xB/30xLV bridge register contents */
+/* Restore SiS301B/302B/301LV/302LV bridge register contents */
static void
SiS301BRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
- int Part1max, Part2max, Part3max, Part4max;
-
- Part1max = 0x23;
- Part2max = 0x4d;
- Part3max = 0x3e;
- Part4max = 0x22;
- if(pSiS->VBFlags & (VB_301C|VB_302ELV)) {
- Part2max = 0xff;
- Part4max = 0x3c;
- }
- if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
- Part4max = 0x34;
- }
-
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
-
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ int Part1max=0, Part2max=0, Part3max=0, Part4max=0;
+
+ switch (pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ Part1max = 0x23;
+ Part2max = 0x4d;
+ Part3max = 0x3e;
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV))
+ Part4max = 0x24;
+ else
+ Part4max = 0x22;
+ break;
+ case SIS_315_VGA:
+ Part1max = 0x23;
+ Part2max = 0x4d;
+ Part3max = 0x3e;
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV))
+ Part4max = 0x24;
+ else
+ Part4max = 0x22;
+ break;
+ }
+
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
/* Pre-restore Part1 */
outSISIDXREG(SISPART1, 0x04, 0x00);
@@ -1097,18 +1134,17 @@ SiS301BRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISPART1, 0x00, sisReg->VBPart1[0x00]);
outSISIDXREG(SISPART1, 0x01, sisReg->VBPart1[0x01]);
/* Mode reg 0x01 became 0x2e on 315 series (0x01 still contains FIFO) */
- if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISPART1, 0x2e, sisReg->VBPart1[0x2e]);
- }
+ if(pSiS->VGAEngine == SIS_315_VGA)
+ outSISIDXREG(SISPART1, 0x2e, sisReg->VBPart1[0x2e]);
/* Pre-restore Part4 */
outSISIDXREG(SISPART4, 0x0D, sisReg->VBPart4[0x0D]);
outSISIDXREG(SISPART4, 0x0C, sisReg->VBPart4[0x0C]);
- if((!(sisReg->sisRegs3D4[0x30] & 0x03)) &&
- (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
- return;
+ if (!(sisReg->sisRegs3D4[0x30] & 0x03) &&
+ (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+ return;
}
/* Restore Part1 */
@@ -1134,9 +1170,9 @@ SiS301BRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISPART4, 0x12, 0x00);
outSISIDXREG(SISPART4, 0x12, sisReg->VBPart4[0x12]);
- SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
SiS_DisplayOn(pSiS->SiS_Pr);
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
}
/* Save LVDS bridge (+ Chrontel) register contents */
@@ -1147,31 +1183,31 @@ SiSLVDSChrontelSave(ScrnInfoPtr pScrn, SISRegPtr sisReg)
int i;
/* Save Part1 */
- for(i=0; i<0x46; i++) {
- inSISIDXREG(SISPART1, i, sisReg->VBPart1[i]);
+ for (i=0; i<0x46; i++) {
+ inSISIDXREG(SISPART1, i, sisReg->VBPart1[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"LVDSSave: Part1Port 0x%02x = 0x%02x\n",
i, sisReg->VBPart1[i]);
#endif
}
/* Save Chrontel registers */
- if(pSiS->VBFlags & VB_CHRONTEL) {
- if(pSiS->ChrontelType == CHRONTEL_700x) {
- for(i=0; i<0x1D; i++) {
- sisReg->ch70xx[i] = SiS_GetCH700x(pSiS->SiS_Pr, ch700xidx[i]);
+ if (pSiS->VBFlags & VB_CHRONTEL) {
+ if (pSiS->ChrontelType == CHRONTEL_700x) {
+ for (i=0; i<0x1D; i++) {
+ sisReg->ch70xx[i] = SiS_GetCH700x(pSiS->SiS_Pr, ch700xidx[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"LVDSSave: Chrontel 0x%02x = 0x%02x\n",
ch700xidx[i], sisReg->ch70xx[i]);
#endif
}
} else {
- for(i=0; i<35; i++) {
- sisReg->ch70xx[i] = SiS_GetCH701x(pSiS->SiS_Pr, ch701xidx[i]);
+ for (i=0; i<35; i++) {
+ sisReg->ch70xx[i] = SiS_GetCH701x(pSiS->SiS_Pr, ch701xidx[i]);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"LVDSSave: Chrontel 0x%02x = 0x%02x\n",
ch701xidx[i], sisReg->ch70xx[i]);
#endif
@@ -1190,24 +1226,24 @@ SiSLVDSChrontelRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
int i;
USHORT wtemp;
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
if(pSiS->sishw_ext.jChipType == SIS_730) {
- outSISIDXREG(SISPART1, 0x00, 0x80);
+ outSISIDXREG(SISPART1, 0x00, 0x80);
}
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
if(pSiS->VBFlags & VB_CHRONTEL) {
/* Restore Chrontel registers */
if(pSiS->ChrontelType == CHRONTEL_700x) {
for(i=0; i<0x11; i++) {
- wtemp = ((sisReg->ch70xx[i]) << 8) | (ch700xidx[i] & 0x00FF);
- SiS_SetCH700x(pSiS->SiS_Pr, wtemp);
+ wtemp = ((sisReg->ch70xx[i]) << 8) | (ch700xidx[i] & 0x00FF);
+ SiS_SetCH700x(pSiS->SiS_Pr, wtemp);
}
} else {
for(i=0; i<34; i++) {
- wtemp = ((sisReg->ch70xx[i]) << 8) | (ch701xidx[i] & 0x00FF);
- SiS_SetCH701x(pSiS->SiS_Pr, wtemp);
+ wtemp = ((sisReg->ch70xx[i]) << 8) | (ch701xidx[i] & 0x00FF);
+ SiS_SetCH701x(pSiS->SiS_Pr, wtemp);
}
}
}
@@ -1217,39 +1253,39 @@ SiSLVDSChrontelRestore(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISPART1, 0x05, 0x00);
outSISIDXREG(SISPART1, 0x06, 0x00);
outSISIDXREG(SISPART1, 0x00, sisReg->VBPart1[0]);
- if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
outSISIDXREG(SISPART1, 0x01, (sisReg->VBPart1[1] | 0x80));
} else {
outSISIDXREG(SISPART1, 0x01, sisReg->VBPart1[1]);
}
- if((!(sisReg->sisRegs3D4[0x30] & 0x03)) &&
- (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
- return;
+ if (!(sisReg->sisRegs3D4[0x30] & 0x03) &&
+ (sisReg->sisRegs3D4[0x31] & 0x20)) { /* disable CRT2 */
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+ return;
}
/* Restore Part1 */
- if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
outSISIDXREG(SISPART1, 0x02, (sisReg->VBPart1[2] | 0x40));
} else {
outSISIDXREG(SISPART1, 0x02, sisReg->VBPart1[2]);
}
SetBlock(SISPART1, 0x03, 0x23, &(sisReg->VBPart1[0x03]));
if(pSiS->VGAEngine == SIS_315_VGA) {
- SetBlock(SISPART1, 0x2C, 0x2E, &(sisReg->VBPart1[0x2C]));
- SetBlock(SISPART1, 0x35, 0x37, &(sisReg->VBPart1[0x35])); /* Panel Link Scaler */
+ SetBlock(SISPART1, 0x2C, 0x2E, &(sisReg->VBPart1[0x2C]));
+ SetBlock(SISPART1, 0x35, 0x37, &(sisReg->VBPart1[0x35])); /* Panel Link Scaler */
}
/* For 550 DSTN registers */
- if(pSiS->DSTN || pSiS->FSTN) {
- SetBlock(SISPART1, 0x25, 0x2E, &(sisReg->VBPart1[0x25]));
- SetBlock(SISPART1, 0x30, 0x45, &(sisReg->VBPart1[0x30]));
+ if (pSiS->DSTN || pSiS->FSTN) {
+ SetBlock(SISPART1, 0x25, 0x2E, &(sisReg->VBPart1[0x25]));
+ SetBlock(SISPART1, 0x30, 0x45, &(sisReg->VBPart1[0x30]));
}
- SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
SiS_DisplayOn(pSiS->SiS_Pr);
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
}
/* Restore output selection registers */
@@ -1257,30 +1293,123 @@ void
SiSRestoreBridge(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
- int i;
+ unsigned char temp = 0;
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- for(i = 0x30; i <= 0x3b; i++) {
- if(i == 0x34) continue;
- outSISIDXREG(SISCR, i, sisReg->sisRegs3D4[i]);
+ outSISIDXREG(SISCR, 0x30, sisReg->sisRegs3D4[0x30]);
+ outSISIDXREG(SISCR, 0x31, sisReg->sisRegs3D4[0x31]);
+ outSISIDXREG(SISCR, 0x33, sisReg->sisRegs3D4[0x33]);
+ outSISIDXREG(SISCR, 0x34, sisReg->sisRegs3D4[0x34]);
+ outSISIDXREG(SISCR, 0x36, sisReg->sisRegs3D4[0x36]);
+ outSISIDXREG(SISCR, 0x37, sisReg->sisRegs3D4[0x37]);
+ if(pSiS->Chipset != PCI_CHIP_SIS300) {
+ switch(pSiS->VGAEngine) {
+ case SIS_300_VGA: temp = 0x35; break;
+ case SIS_315_VGA: temp = 0x38; break;
+ }
+ if(temp) {
+ outSISIDXREG(SISCR, temp, sisReg->sisRegs3D4[temp]);
+ }
}
-
if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISCR, pSiS->myCR63, sisReg->sisRegs3D4[pSiS->myCR63]);
- if(pSiS->sishw_ext.jChipType < SIS_661) {
- outSISIDXREG(SISCR, 0x79, sisReg->sisRegs3D4[0x79]);
- }
+ outSISIDXREG(SISCR, 0x39, sisReg->sisRegs3D4[0x39]);
+ outSISIDXREG(SISCR, 0x63, sisReg->sisRegs3D4[0x63]);
+ outSISIDXREG(SISCR, 0x79, sisReg->sisRegs3D4[0x79]);
}
}
+unsigned int
+SiSddc1Read(ScrnInfoPtr pScrn)
+{
+ SISPtr pSiS = SISPTR(pScrn);
+ unsigned char temp;
+
+#ifdef UNLOCK_ALWAYS
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+#endif
+
+ /* Wait until vertical retrace is in progress. */
+ while(inSISREG(SISINPSTAT) & 0x08);
+ while(!(inSISREG(SISINPSTAT) & 0x08));
+
+ /* Get the result */
+ inSISIDXREG(SISSR, 0x11, temp);
+
+ return((temp & 0x02)>>1);
+}
+
+#if 0 /* TW: The following function should take a threshold value
+ * from predefined tables. This is only needed on some
+ * 530 boards, which have an ESS sound device on-board.
+ * However, I don't know how to calculate the index to
+ * be submitted to this function.
+ */
+unsigned short
+SiS_CalcSpecial530Threshold(ScrnInfoPtr pScrn, DisplayModePtr mode, int index)
+{
+ SISPtr pSiS = SISPTR(pScrn);
+ static const unsigned char t640x480[3][24] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,A9, /* b4 - 9d - depth 8 */
+ 0, 0,11,14,14, 0, 0, 0, 0, 0, 0,9D },
+ { 0, 0, 0, 0, 0,12,15, 0, 0, 0,92,91, /* 9c - 85 - depth 16 */
+ 0,31,31,31,31, 0, 0, 0, 0, 0, 0,85 },
+ { 0, 0, 0, 0, 0,17,22,25, 0, 0, 0,79, /* 84 - ? - depth 32 */
+ 0,31,31, 0, 0, 0, 0, 0, 0, 0, 0,6d }
+ }
+ static const unsigned char t800x600[3][24] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,61,
+ 0,18,25,30,27,31,31,31, 0, 0, 0, 0 },
+ {55, 0, 0, 0, 0, 9,10,15,18,19, 0, 0,
+ ... to be continued
+
+ depthindex = (pSiS->CurrentLayout.bitsPerPixel + 1) >> 3;
+ if(depthindex == 3) return(0);
+ if(depthindex == 4) depthindex--;
+ depthindex--;
+
+ switch(mode->HDisplay) {
+ case 640:
+ if(mode->VDisplay == 480) {
+ return(t640x480[depthindex][index];
+ } else return(0);
+ case 800:
+ if(mode->VDisplay == 600) {
+ return(t800x600[depthindex][index];
+ } else return(0);
+ case 1024:
+ if(mode->VDisplay == 768) {
+ return(t1024x768[depthindex][index];
+ } else return(0);
+ case 1280:
+ if(mode->VDisplay == 1024) {
+ return(t1280x1024[depthindex][index];
+ } else return(0);
+ case 1600:
+ if(mode->VDisplay == 1200) {
+ return(t1600x1200[depthindex][index];
+ } else return(0);
+ default: return(0);
+ }
+}
+#endif
+
+/* TW: Stub */
+static void
+SiSThreshold(ScrnInfoPtr pScrn, DisplayModePtr mode,
+ unsigned short *Low, unsigned short *High)
+{
+ return;
+}
+
+
/* Auxiliary function to find real memory clock (in Khz) */
/* Not for 530/620 if UMA (on these, the mclk is stored in SR10) */
int
SiSMclk(SISPtr pSiS)
-{
+{
int mclk;
unsigned char Num, Denum, Base;
@@ -1309,9 +1438,9 @@ SiSMclk(SISPtr pSiS)
/* Post-Scaler */
if((Denum & 0x80) == 0) {
- mclk = mclk / (((Denum & 0x60) >> 5) + 1);
+ mclk = mclk / (((Denum & 0x60) >> 5) + 1);
} else {
- mclk = mclk / ((((Denum & 0x60) >> 5) + 1) * 2);
+ mclk = mclk / ((((Denum & 0x60) >> 5) + 1) * 2);
}
break;
@@ -1335,11 +1464,11 @@ SiSMclk(SISPtr pSiS)
/* Post-scaler. Values' meaning depends on SR13 bit 7 */
inSISIDXREG(SISSR, 0x13, Base);
if((Base & 0x80) == 0) {
- mclk = mclk / (((Denum & 0x60) >> 5) + 1);
+ mclk = mclk / (((Denum & 0x60) >> 5) + 1);
} else {
- /* Values 00 and 01 are reserved */
- if ((Denum & 0x60) == 0x40) mclk /= 6;
- if ((Denum & 0x60) == 0x60) mclk /= 8;
+ /* Values 00 and 01 are reserved */
+ if ((Denum & 0x60) == 0x40) mclk /= 6;
+ if ((Denum & 0x60) == 0x60) mclk /= 8;
}
break;
}
@@ -1358,54 +1487,37 @@ SiSMclk(SISPtr pSiS)
* For VGA2, we share the bandwith equally.
*/
static int
-SiSEstimateCRT2Clock(ScrnInfoPtr pScrn, BOOLEAN IsForMergedFBCRT2)
+SiSEstimateCRT2Clock(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
if(pSiS->VBFlags & CRT2_LCD) {
- if(pSiS->VBLCDFlags & (VB_LCD_320x480 | VB_LCD_800x600 | VB_LCD_640x480)) {
- return 40000;
- } else if(pSiS->VBLCDFlags & (VB_LCD_1024x768 | VB_LCD_1024x600 | VB_LCD_1152x768)) {
- return 65000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1280x720) {
- return 75000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1280x768) {
- return 81000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1280x800) {
- /* Must fake clock; built-in mode shows 83 for VGA, but uses only 70 for LCD */
- if(IsForMergedFBCRT2) return 83000;
- else return 70000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1400x1050) {
- /* Must fake clock; built-in mode shows 122 for VGA, but uses only 108 for LCD */
- if(IsForMergedFBCRT2) return 123000;
- else return 108000;
- } else if(pSiS->VBLCDFlags & (VB_LCD_1280x1024 | VB_LCD_1280x960)) {
- return 108000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1680x1050) {
- /* Must fake clock; built-in mode shows 147 for VGA, but uses only 122 for LCD */
- if(IsForMergedFBCRT2) return 148000;
- else return 122000;
- } else if(pSiS->VBLCDFlags & VB_LCD_1600x1200) {
- return 162000;
- } else if((pSiS->VBLCDFlags & VB_LCD_CUSTOM) && (pSiS->SiS_Pr->CP_HaveCustomData)) {
- return pSiS->SiS_Pr->CP_MaxClock;
- } else
- return 108000;
+ if(pSiS->VBLCDFlags & (VB_LCD_320x480 | VB_LCD_800x600 | VB_LCD_640x480))
+ return 40000;
+ else if(pSiS->VBLCDFlags & (VB_LCD_1024x768 | VB_LCD_1024x600 | VB_LCD_1152x768))
+ return 65000;
+ else if(pSiS->VBLCDFlags & VB_LCD_1280x768)
+ return 81000;
+ else if(pSiS->VBLCDFlags & (VB_LCD_1280x1024 | VB_LCD_1280x960 | VB_LCD_1400x1050))
+ return 108000;
+ else if(pSiS->VBLCDFlags & VB_LCD_1600x1200)
+ return 162000;
+ else if((pSiS->VBLCDFlags & VB_LCD_CUSTOM) && (pSiS->SiS_Pr->CP_HaveCustomData))
+ return pSiS->SiS_Pr->CP_MaxClock;
+ else
+ return 108000;
} else if(pSiS->VBFlags & CRT2_TV) {
- if(pSiS->VBFlags & VB_CHRONTEL) {
- switch(pSiS->VGAEngine) {
- case SIS_300_VGA:
- return 50000;
- case SIS_315_VGA:
- default:
- return 70000;
- }
- } else if(pSiS->VBFlags & VB_SISBRIDGE) {
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR)
- return 75000;
- else
- return 70000;
- }
+ if(pSiS->VBFlags & VB_CHRONTEL) {
+ switch(pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ return 50000;
+ case SIS_315_VGA:
+ default:
+ return 70000;
+ }
+ } else if(pSiS->VBFlags & VB_SISBRIDGE) {
+ return 70000;
+ }
}
return 0;
@@ -1425,19 +1537,13 @@ int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2)
int bytesperpixel = (bpp + 7) / 8;
float magic=0.0, total, crt2used, maxcrt2;
int crt2clock, max=0;
-#ifdef __SUNPRO_C
-#define const
-#endif
const float magic300[4] = { 1.2, 1.368421, 2.263158, 1.2};
const float magic630[4] = { 1.441177, 1.441177, 2.588235, 1.441177 };
const float magic315[4] = { 1.2, 1.368421, 1.368421, 1.2 };
const float magic550[4] = { 1.441177, 1.441177, 2.588235, 1.441177 };
-#ifdef __SUNPRO_C
-#undef const
-#endif
BOOLEAN DHM, GetForCRT1;
- switch(pSiS->Chipset) {
+ switch (pSiS->Chipset) {
case PCI_CHIP_SIS5597:
total = ((mclk * (bus / 8)) * 0.7) / bytesperpixel;
@@ -1498,13 +1604,8 @@ int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2)
magic = magic550[bus/64];
max = 680000;
break;
- case PCI_CHIP_SIS660:
- if((pSiS->sishw_ext.jChipType >= SIS_660) &&
- (!(pSiS->ChipFlags & SiSCF_760UMA))) {
- magic = magic315[bus/64];
- } else {
- magic = magic550[bus/64];
- }
+ case PCI_CHIP_SIS660: /* Guessed */
+ magic = magic550[bus/64];
max = 680000;
}
@@ -1520,13 +1621,11 @@ int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2)
maxcrt2 = 135000;
if(pSiS->VBFlags & (VB_301B|VB_302B)) maxcrt2 = 162000;
- else if(pSiS->VBFlags & VB_301C) maxcrt2 = 203000;
- /* if(pSiS->VBFlags & VB_30xBDH) maxcrt2 = 100000;
- Ignore 301B-DH here; seems the current version is like
- 301B anyway */
+ else if(pSiS->VBFlags & VB_301C) maxcrt2 = 162000; /* ? */
+ if(pSiS->VBFlags & VB_30xBDH) maxcrt2 = 100000;
crt2used = 0.0;
- crt2clock = SiSEstimateCRT2Clock(pScrn, IsForCRT2);
+ crt2clock = SiSEstimateCRT2Clock(pScrn);
if(crt2clock) {
crt2used = crt2clock + 2000;
}
@@ -1586,6 +1685,7 @@ int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2)
crt2used/1000);
} else {
+
#ifdef SISDUALHEAD
/* TW: Second head = CRT1 */
@@ -1630,8 +1730,9 @@ int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2)
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"Bandwidth available for CRT1 is %g MHz\n", total/1000);
-
+#ifdef SISDUALHEAD
}
+#endif
}
total /= magic;
@@ -1657,9 +1758,7 @@ SISLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors,
{
SISPtr pSiS = SISPTR(pScrn);
int i, j, index;
- unsigned char backup = 0;
Bool dogamma1 = pSiS->CRT1gamma;
- Bool resetxvgamma = FALSE;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
@@ -1669,21 +1768,10 @@ SISLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors,
PDEBUG(ErrorF("SiSLoadPalette(%d)\n", numColors));
#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (pSiS->SecondHead)) {
+ if( ((pSiS->DualHeadMode) && (pSiS->SecondHead)) ||
+ (!pSiS->DualHeadMode) ) {
#endif
- if(pSiS->VGAEngine == SIS_315_VGA) {
- inSISIDXREG(SISSR, 0x1f, backup);
- andSISIDXREG(SISSR, 0x1f, 0xe7);
- if( (pSiS->XvGamma) &&
- (pSiS->MiscFlags & MISC_CRT1OVERLAYGAMMA) &&
- ((pSiS->CurrentLayout.depth == 16) ||
- (pSiS->CurrentLayout.depth == 24)) ) {
- orSISIDXREG(SISSR, 0x1f, 0x10);
- resetxvgamma = TRUE;
- }
- }
-
switch(pSiS->CurrentLayout.depth) {
#ifdef SISGAMMA
case 15:
@@ -1753,33 +1841,28 @@ SISLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors,
}
}
- if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISSR, 0x1f, backup);
- inSISIDXREG(SISSR, 0x07, backup);
- if((backup & 0x04) && (resetxvgamma) && (pSiS->ResetXvGamma)) {
- (pSiS->ResetXvGamma)(pScrn);
- }
- }
-
#ifdef SISDUALHEAD
}
- if((!pSiS->DualHeadMode) || (!pSiS->SecondHead)) {
+ if( ((pSiS->DualHeadMode) && (!pSiS->SecondHead)) ||
+ (!pSiS->DualHeadMode) ) {
#endif
- switch(pSiS->VGAEngine) {
- case SIS_300_VGA:
- case SIS_315_VGA:
- if(pSiS->VBFlags & CRT2_ENABLE) {
- /* Only the SiS bridges support a CRT2 palette */
- if(pSiS->VBFlags & VB_SISBRIDGE) {
- (*pSiS->LoadCRT2Palette)(pScrn, numColors, indices, colors, pVisual);
- }
- }
- }
+ switch(pSiS->VGAEngine) {
+ case SIS_300_VGA:
+ case SIS_315_VGA:
+ if(pSiS->VBFlags & CRT2_ENABLE) {
+ /* TW: Only the SiS bridges support a CRT2 palette */
+ if(pSiS->VBFlags & VB_SISBRIDGE) {
+ (*pSiS->LoadCRT2Palette)(pScrn, numColors, indices,
+ colors, pVisual);
+ }
+ }
+ break;
+ }
#ifdef SISDUALHEAD
- }
+ }
#endif
}
@@ -1895,6 +1978,8 @@ SISDACPreInit(ScrnInfoPtr pScrn)
pSiS->SiSRestore3 = SiS301BRestore;
pSiS->SiSRestoreLVDSChrontel = SiSLVDSChrontelRestore;
pSiS->LoadCRT2Palette = SiS301LoadPalette;
+ pSiS->SetThreshold = SiSThreshold;
+ pSiS->i2cInit = NULL;
break;
case PCI_CHIP_SIS300:
case PCI_CHIP_SIS630:
@@ -1909,6 +1994,8 @@ SISDACPreInit(ScrnInfoPtr pScrn)
pSiS->SiSRestore3 = SiS301BRestore;
pSiS->SiSRestoreLVDSChrontel = SiSLVDSChrontelRestore;
pSiS->LoadCRT2Palette = SiS301LoadPalette;
+ pSiS->SetThreshold = SiSThreshold;
+ pSiS->i2cInit = NULL;
break;
case PCI_CHIP_SIS5597:
case PCI_CHIP_SIS6326:
@@ -1917,6 +2004,8 @@ SISDACPreInit(ScrnInfoPtr pScrn)
pSiS->MaxClock = SiSMemBandWidth(pScrn, FALSE);
pSiS->SiSRestore = SiSRestore;
pSiS->SiSSave = SiSSave;
+ pSiS->SetThreshold = SiSThreshold;
+ pSiS->i2cInit = NULL;
break;
}
}
@@ -1945,12 +2034,12 @@ SiS6326SetTVReg(ScrnInfoPtr pScrn, CARD8 index, CARD8 data)
unsigned char
SiS6326GetTVReg(ScrnInfoPtr pScrn, CARD8 index)
{
- SISPtr pSiS = SISPTR(pScrn);
- unsigned char data;
+ SISPtr pSiS = SISPTR(pScrn);
+ unsigned char data;
- outSISIDXREG(SISCR, 0xE0, index);
- inSISIDXREG(SISCR, 0xE1, data);
- return(data);
+ outSISIDXREG(SISCR, 0xE0, index);
+ inSISIDXREG(SISCR, 0xE1, data);
+ return(data);
}
void
@@ -1964,10 +2053,10 @@ SiS6326SetXXReg(ScrnInfoPtr pScrn, CARD8 index, CARD8 data)
unsigned char
SiS6326GetXXReg(ScrnInfoPtr pScrn, CARD8 index)
{
- SISPtr pSiS = SISPTR(pScrn);
- unsigned char data;
+ SISPtr pSiS = SISPTR(pScrn);
+ unsigned char data;
- outSISIDXREG(SISCR, 0xE2, index);
- inSISIDXREG(SISCR, 0xE3, data);
- return(data);
+ outSISIDXREG(SISCR, 0xE2, index);
+ inSISIDXREG(SISCR, 0xE3, data);
+ return(data);
}
diff --git a/src/sis_dac.h b/src/sis_dac.h
index cbce161..8f4c202 100644
--- a/src/sis_dac.h
+++ b/src/sis_dac.h
@@ -1,41 +1,46 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dac.h,v 1.11 2003/06/10 16:44:19 twini Exp $ */
/*
* DAC helper functions (Save/Restore, MemClk, etc)
* Definitions and prototypes
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the provider not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The provider makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE PROVIDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE PROVIDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
+ * Authors: Alan Hourihane <alanh@fairlite.demon.co.uk>
+ * Mike Chapman <mike@paranoia.com>,
+ * Juanjo Santamarta <santamarta@ctv.es>,
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
+ * David Thomas <davtom@dream.org.uk>.
+ * Thomas Winischhofer <thomas@winischhofer.net>
*/
-int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
- int *out_sbit, int *out_scale);
+int SiS_compute_vclk(int Clock, int *out_n, int *out_dn, int *out_div,
+ int *out_sbit, int *out_scale);
void SISDACPreInit(ScrnInfoPtr pScrn);
+unsigned int SiSddc1Read(ScrnInfoPtr pScrn);
void SISLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies,
- LOCO *colors, VisualPtr pVisual);
+ LOCO *colors, VisualPtr pVisual);
void SiSCalcClock(ScrnInfoPtr pScrn, int clock, int max_VLD,
unsigned int *vclk);
+
void SiSIODump(ScrnInfoPtr pScrn);
int SiSMemBandWidth(ScrnInfoPtr pScrn, BOOLEAN IsForCRT2);
int SiSMclk(SISPtr pSiS);
@@ -48,11 +53,11 @@ extern unsigned char SiS6326GetXXReg(ScrnInfoPtr pScrn, CARD8 index);
extern int SiSCalcVRate(DisplayModePtr mode);
-/* Functions from init.c and init301.c */
-extern void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO);
-extern void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO);
-extern void SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO);
-extern void SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_INFO);
+/* TW: Functions from init.c & init301.c */
+extern void SiS_UnLockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+extern void SiS_LockCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+extern void SiS_DisableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
+extern void SiS_EnableBridge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT BaseAddr);
extern USHORT SiS_GetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
extern void SiS_SetCH700x(SiS_Private *SiS_Pr, USHORT tempbx);
extern USHORT SiS_GetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
@@ -60,10 +65,7 @@ extern void SiS_SetCH701x(SiS_Private *SiS_Pr, USHORT tempbx);
extern USHORT SiS_GetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx);
extern void SiS_SetCH70xx(SiS_Private *SiS_Pr, USHORT tempbx);
extern void SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh);
-extern void SiS_SetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx);
-extern USHORT SiS_GetTrumpReg(SiS_Private *SiS_Pr, USHORT tempbx);
extern void SiS_DDC2Delay(SiS_Private *SiS_Pr, USHORT delaytime);
-extern USHORT SiS_ReadDDC1Bit(SiS_Private *SiS_Pr);
extern USHORT SiS_HandleDDC(SiS_Private *SiS_Pr, unsigned long VBFlags, int VGAEngine,
USHORT adaptnum, USHORT DDCdatatype, unsigned char *buffer);
extern void SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo);
@@ -71,3 +73,15 @@ extern void SiS_DisplayOn(SiS_Private *SiS_Pr);
extern unsigned char SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id);
extern void SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable);
extern void SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable);
+#if 0
+extern void SiS_SetSwitchDDC2(SiS_Private *SiS_Pr);
+extern USHORT SiS_I2C_GetByte(SiS_Private *SiS_Pr);
+extern Bool SiS_I2C_PutByte(SiS_Private *SiS_Pr, USHORT data);
+extern Bool SiS_I2C_Address(SiS_Private *SiS_Pr, USHORT addr);
+extern void SiS_I2C_Stop(SiS_Private *SiS_Pr);
+#endif
+
+
+
+
+
diff --git a/src/sis_dga.c b/src/sis_dga.c
index a806cec..b417411 100644
--- a/src/sis_dga.c
+++ b/src/sis_dga.c
@@ -1,16 +1,14 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dga.c,v 1.9 2003/06/26 22:35:18 twini Exp $ */
/*
* SiS DGA handling
*
- * Copyright (C) 2000 by Alan Hourihane, Sychdyn, North Wales, UK.
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2000 by Alan Hourihane, Sychdyn, North Wales, UK.
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
* Portions from radeon_dga.c which is
* Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
* VA Linux Systems Inc., Fremont, California.
*
- * Licensed under the following terms:
- *
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
@@ -103,7 +101,7 @@ SISSetupDGAMode(
pMode = firstMode = pScrn->modes;
- while(pMode) {
+ while (pMode) {
otherPitch = secondPitch ? secondPitch : pMode->HDisplay;
@@ -142,9 +140,9 @@ SECOND_PASS:
currentMode->flags |= DGA_BLIT_RECT_TRANS;
}
}
- if(pMode->Flags & V_DBLSCAN)
+ if (pMode->Flags & V_DBLSCAN)
currentMode->flags |= DGA_DOUBLESCAN;
- if(pMode->Flags & V_INTERLACE)
+ if (pMode->Flags & V_INTERLACE)
currentMode->flags |= DGA_INTERLACED;
currentMode->byteOrder = pScrn->imageByteOrder;
currentMode->depth = depth;
@@ -192,8 +190,8 @@ SECOND_PASS:
}
pMode = pMode->next;
- if(pMode == firstMode)
- break;
+ if (pMode == firstMode)
+ break;
}
return modes;
@@ -209,23 +207,17 @@ SISDGAInit(ScreenPtr pScreen)
int num = 0;
/* 8 */
- /* We don't support 8bpp modes in dual head or MergedFB mode,
- * so don't offer them to DGA either.
- */
#ifdef SISDUALHEAD
+ /* We don't ever use 8bpp modes in dual head mode,
+ * so don't offer them to DGA either
+ */
if(!pSiS->DualHeadMode) {
#endif
-#ifdef SISMERGED
- if(!(pSiS->MergedFB)) {
-#endif
- modes = SISSetupDGAMode(pScrn, modes, &num, 8, 8,
- (pScrn->bitsPerPixel == 8),
- ((pScrn->bitsPerPixel != 8)
- ? 0 : pScrn->displayWidth),
- 0, 0, 0, PseudoColor);
-#ifdef SISMERGED
- }
-#endif
+ modes = SISSetupDGAMode(pScrn, modes, &num, 8, 8,
+ (pScrn->bitsPerPixel == 8),
+ ((pScrn->bitsPerPixel != 8)
+ ? 0 : pScrn->displayWidth),
+ 0, 0, 0, PseudoColor);
#ifdef SISDUALHEAD
}
#endif
@@ -238,21 +230,21 @@ SISDGAInit(ScreenPtr pScreen)
0xf800, 0x07e0, 0x001f, TrueColor);
if((pSiS->VGAEngine == SIS_530_VGA) || (pSiS->VGAEngine == SIS_OLD_VGA)) {
- /* 24 */
- modes = SISSetupDGAMode(pScrn, modes, &num, 24, 24,
- (pScrn->bitsPerPixel == 24),
- ((pScrn->bitsPerPixel != 24)
- ? 0 : pScrn->displayWidth),
+ /* 24 */
+ modes = SISSetupDGAMode(pScrn, modes, &num, 24, 24,
+ (pScrn->bitsPerPixel == 24),
+ ((pScrn->bitsPerPixel != 24)
+ ? 0 : pScrn->displayWidth),
0xff0000, 0x00ff00, 0x0000ff, TrueColor);
}
if(pSiS->VGAEngine != SIS_OLD_VGA) {
- /* 32 */
- modes = SISSetupDGAMode(pScrn, modes, &num, 32, 24,
- (pScrn->bitsPerPixel == 32),
- ((pScrn->bitsPerPixel != 32)
- ? 0 : pScrn->displayWidth),
- 0xff0000, 0x00ff00, 0x0000ff, TrueColor);
+ /* 32 */
+ modes = SISSetupDGAMode(pScrn, modes, &num, 32, 24,
+ (pScrn->bitsPerPixel == 32),
+ ((pScrn->bitsPerPixel != 32)
+ ? 0 : pScrn->displayWidth),
+ 0xff0000, 0x00ff00, 0x0000ff, TrueColor);
}
pSiS->numDGAModes = num;
diff --git a/src/sis_dri.c b/src/sis_dri.c
index c143d2f..08e17b3 100644
--- a/src/sis_dri.c
+++ b/src/sis_dri.c
@@ -1,38 +1,12 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.c,v 1.32 2003/08/29 08:50:54 twini Exp $ */
/*
- * DRI wrapper for 300 and 315 series
+ * DRI wrapper for 300 and 315 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Preliminary 315/330 support by Thomas Winischhofer
+ * Mesa 4/5 changes by Eric Anholt
*
- * Preliminary 315/330 support by Thomas Winischhofer
- * Portions of Mesa 4/5 changes by Eric Anholt
+ * Taken and modified from tdfx_dri.c, mga_dri.c
*
- * Licensed under the following terms:
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
- * about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
- *
- * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
- * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * Previously taken and modified from tdfx_dri.c, mga_dri.c
- *
- * Authors: Can-Ru Yeou, SiS Inc.
- * Alan Hourihane, Wigan, England,
- * Thomas Winischhofer <thomas@winischhofer.net>
- * others.
*/
#include "xf86.h"
@@ -47,11 +21,12 @@
#include "GL/glxtokens.h"
#include "sis.h"
+#include "sis_dri.h"
#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0)
#include "xf86drmCompat.h"
#endif
-#ifdef SISNEWDRI
+#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0)
#include "sis_common.h"
#endif
@@ -77,6 +52,16 @@ extern void GlxSetVisualConfigs(
void **configprivs
);
+#define AGP_PAGE_SIZE 4096
+#define AGP_PAGES 2048
+#define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES)
+#define AGP_CMDBUF_PAGES 256
+#define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES)
+
+/* 315/330 */
+#define AGP_VTXBUF_PAGES 512
+#define AGP_VTXBUF_SIZE (AGP_PAGE_SIZE * AGP_VTXBUF_PAGES)
+
static char SISKernelDriverName[] = "sis";
static char SISClientDriverName[] = "sis";
@@ -202,7 +187,7 @@ SISInitVisualConfigs(ScreenPtr pScreen)
}
if(i != numConfigs) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "[dri] Incorrect initialization of visuals. Disabling DRI.\n");
+ "[dri] Incorrect initialization of visuals. Disabling DRI.\n");
return FALSE;
}
break;
@@ -222,7 +207,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
SISPtr pSIS = SISPTR(pScrn);
DRIInfoPtr pDRIInfo;
SISDRIPtr pSISDRI;
-#ifdef SISNEWDRI
+#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0)
drmVersionPtr version;
#endif
@@ -232,8 +217,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
#endif
/* Check that the GLX, DRI, and DRM modules have been loaded by testing
- * for canonical symbols in each module.
- */
+ * for canonical symbols in each module. */
if(!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE;
if(!xf86LoaderCheckSymbol("DRIScreenInit")) return FALSE;
if(!xf86LoaderCheckSymbol("drmAvailable")) return FALSE;
@@ -250,8 +234,8 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
if(major != 4 || minor < 0) {
xf86DrvMsg(pScreen->myNum, X_ERROR,
"[dri] SISDRIScreenInit failed because of a version mismatch.\n"
- "\t[dri] libDRI version is %d.%d.%d but version 4.0.x is needed.\n"
- "\t[dri] Disabling DRI.\n",
+ "[dri] libDRI version is %d.%d.%d but version 4.0.x is needed.\n"
+ "[dri] Disabling DRI.\n",
major, minor, patch);
return FALSE;
}
@@ -263,20 +247,11 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
pDRIInfo->drmDriverName = SISKernelDriverName;
pDRIInfo->clientDriverName = SISClientDriverName;
-#ifdef SISNEWDRI2
- if(xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
- pDRIInfo->busIdString = DRICreatePCIBusID(pSiS->PciInfo);
- } else {
-#endif
- pDRIInfo->busIdString = xalloc(64);
- sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d",
- ((pciConfigPtr)pSIS->PciInfo->thisCard)->busnum,
- ((pciConfigPtr)pSIS->PciInfo->thisCard)->devnum,
- ((pciConfigPtr)pSIS->PciInfo->thisCard)->funcnum);
-#ifdef SISNEWDRI2
- }
-#endif
-
+ pDRIInfo->busIdString = xalloc(64);
+ sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d",
+ ((pciConfigPtr)pSIS->PciInfo->thisCard)->busnum,
+ ((pciConfigPtr)pSIS->PciInfo->thisCard)->devnum,
+ ((pciConfigPtr)pSIS->PciInfo->thisCard)->funcnum);
/* Hack to keep old DRI working -- checked for major==1 and
* minor==1.
*/
@@ -350,7 +325,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
if(!DRIScreenInit(pScreen, pDRIInfo, &pSIS->drmSubFD)) {
xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[dri] DRIScreenInit failed. Disabling DRI.\n");
+ "[dri] DRIScreenInit failed. Disabling DRI.\n");
xfree(pDRIInfo->devPrivate);
pDRIInfo->devPrivate = 0;
DRIDestroyInfoRec(pSIS->pDRIInfo);
@@ -359,7 +334,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
return FALSE;
}
-#ifdef SISNEWDRI
+#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0)
/* Check DRM kernel version */
version = drmGetVersion(pSIS->drmSubFD);
if(version) {
@@ -384,9 +359,9 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
fb.size = pSIS->DRIheapend - pSIS->DRIheapstart;
drmCommandWrite(pSIS->drmSubFD, DRM_SIS_FB_INIT, &fb, sizeof(fb));
xf86DrvMsg(pScreen->myNum, X_INFO,
- "[dri] DRI video RAM memory heap: 0x%lx to 0x%lx (%dKB)\n",
+ "[dri] DRI video RAM memory heap: 0x%x to 0x%x (%dKB)\n",
pSIS->DRIheapstart, pSIS->DRIheapend,
- (int)((pSIS->DRIheapend - pSIS->DRIheapstart) >> 10));
+ (pSIS->DRIheapend - pSIS->DRIheapstart) >> 10);
}
drmFreeVersion(version);
}
@@ -406,16 +381,15 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
/* AGP */
do {
- pSIS->agpWantedSize = pSIS->agpWantedPages * AGP_PAGE_SIZE;
pSIS->agpSize = 0;
pSIS->agpCmdBufSize = 0;
pSISDRI->AGPCmdBufSize = 0;
if(!pSIS->IsAGPCard)
break;
-
+
if(drmAgpAcquire(pSIS->drmSubFD) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to acquire AGP, AGP disabled\n");
+ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAcquire failed\n");
break;
}
@@ -423,76 +397,43 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
#ifdef SIS315DRI
/* Default to 1X agp mode in SIS315 */
if(drmAgpEnable(pSIS->drmSubFD, drmAgpGetMode(pSIS->drmSubFD) & ~0x00000002) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to enable AGP, AGP disabled\n");
+ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n");
break;
}
#endif
} else {
/* TODO: default value is 2x? */
if(drmAgpEnable(pSIS->drmSubFD, drmAgpGetMode(pSIS->drmSubFD) & ~0x0) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to enable AGP, AGP disabled\n");
- break;
- }
- }
-
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] AGP enabled\n");
-
-#define AGP_DEFAULT_SIZE_MB 8
-#define AGP_DEFAULT_SIZE (AGP_DEFAULT_SIZE_MB * 1024 * 1024)
-
- if(drmAgpAlloc(pSIS->drmSubFD, pSIS->agpWantedSize, 0, NULL, &pSIS->agpHandle) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to allocate %dMB AGP memory\n",
- (int)(pSIS->agpWantedSize / (1024 * 1024)));
- if(pSIS->agpWantedSize > AGP_DEFAULT_SIZE) {
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Retrying with %dMB\n", AGP_DEFAULT_SIZE_MB);
- pSIS->agpWantedSize = AGP_DEFAULT_SIZE;
- if(drmAgpAlloc(pSIS->drmSubFD, pSIS->agpWantedSize, 0, NULL, &pSIS->agpHandle) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to allocate %dMB AGP memory, AGP disabled\n",
- AGP_DEFAULT_SIZE_MB);
- drmAgpRelease(pSIS->drmSubFD);
- break;
- }
- } else {
- drmAgpRelease(pSIS->drmSubFD);
+ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpEnable failed\n");
break;
}
}
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Allocated %dMB AGP memory\n",
- (int)(pSIS->agpWantedSize / (1024 * 1024)));
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] drmAgpEnabled succeeded\n");
+ if(drmAgpAlloc(pSIS->drmSubFD, AGP_SIZE, 0, NULL, &pSIS->agpHandle) < 0) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpAlloc failed\n");
+ drmAgpRelease(pSIS->drmSubFD);
+ break;
+ }
+
if(drmAgpBind(pSIS->drmSubFD, pSIS->agpHandle, 0) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to bind AGP memory\n");
+ xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] drmAgpBind failed\n");
drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle);
- if(pSIS->agpWantedSize > AGP_DEFAULT_SIZE) {
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Retrying with %dMB\n", AGP_DEFAULT_SIZE_MB);
- pSIS->agpWantedSize = AGP_DEFAULT_SIZE;
- if(drmAgpAlloc(pSIS->drmSubFD, pSIS->agpWantedSize, 0, NULL, &pSIS->agpHandle) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to re-allocate AGP memory, AGP disabled\n");
- drmAgpRelease(pSIS->drmSubFD);
- break;
- } else if(drmAgpBind(pSIS->drmSubFD, pSIS->agpHandle, 0) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to bind AGP memory again, AGP disabled\n");
- drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle);
- drmAgpRelease(pSIS->drmSubFD);
- break;
- }
- } else {
- drmAgpRelease(pSIS->drmSubFD);
- break;
- }
+ drmAgpRelease(pSIS->drmSubFD);
+ break;
}
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Bound %dMB AGP memory\n",
- (int)(pSIS->agpWantedSize / (1024 * 1024)));
-
- pSIS->agpSize = pSIS->agpWantedSize;
+ pSIS->agpSize = AGP_SIZE;
pSIS->agpAddr = drmAgpBase(pSIS->drmSubFD);
/* pSIS->agpBase = */
pSISDRI->agp.size = pSIS->agpSize;
- if(drmAddMap(pSIS->drmSubFD, (drmHandle)0, pSISDRI->agp.size, DRM_AGP, 0, &pSISDRI->agp.handle) < 0) {
- xf86DrvMsg(pScreen->myNum, X_ERROR, "[drm] Failed to map public AGP area, AGP disabled\n");
+ if(drmAddMap(pSIS->drmSubFD, (drmHandle)0,
+ pSISDRI->agp.size, DRM_AGP, 0,
+ &pSISDRI->agp.handle) < 0) {
+ xf86DrvMsg(pScreen->myNum, X_ERROR,
+ "[drm] Failed to map public agp area\n");
pSISDRI->agp.size = 0;
break;
}
@@ -507,7 +448,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
pSISDRI->AGPVtxBufOffset = pSIS->agpVtxBufAddr - pSIS->agpAddr;
pSISDRI->AGPVtxBufSize = pSIS->agpVtxBufSize;
- drmSiSAgpInit(pSIS->drmSubFD, AGP_VTXBUF_SIZE,(pSIS->agpSize - AGP_VTXBUF_SIZE));
+ drmSiSAgpInit(pSIS->drmSubFD, AGP_VTXBUF_SIZE,(AGP_SIZE - AGP_VTXBUF_SIZE));
#endif
} else {
@@ -519,7 +460,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
pSISDRI->AGPCmdBufOffset = pSIS->agpCmdBufAddr - pSIS->agpAddr;
pSISDRI->AGPCmdBufSize = pSIS->agpCmdBufSize;
- drmSiSAgpInit(pSIS->drmSubFD, AGP_CMDBUF_SIZE,(pSIS->agpSize - AGP_CMDBUF_SIZE));
+ drmSiSAgpInit(pSIS->drmSubFD, AGP_CMDBUF_SIZE,(AGP_SIZE - AGP_CMDBUF_SIZE));
}
}
while(0);
@@ -532,7 +473,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
if((drmCtlInstHandler(pSIS->drmSubFD, pSIS->irq)) != 0) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "[drm] Failed to add IRQ %d handler, stereo disabled\n",
+ "[drm] failure adding irq %d handler, stereo disabled\n",
pSIS->irq);
pSIS->irqEnabled = FALSE;
} else {
@@ -546,7 +487,7 @@ Bool SISDRIScreenInit(ScreenPtr pScreen)
return FALSE;
}
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Visual configs initialized.\n" );
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized.\n" );
return TRUE;
}
@@ -584,9 +525,9 @@ SISDRICloseScreen(ScreenPtr pScreen)
if(pSIS->pVisualConfigsPriv) xfree(pSIS->pVisualConfigsPriv);
if(pSIS->agpSize){
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing AGP memory\n");
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n");
drmAgpFree(pSIS->drmSubFD, pSIS->agpHandle);
- xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing AGP module\n");
+ xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n");
drmAgpRelease(pSIS->drmSubFD);
}
}
diff --git a/src/sis_dri.h b/src/sis_dri.h
index 29ce331..d38e39a 100644
--- a/src/sis_dri.h
+++ b/src/sis_dri.h
@@ -1,35 +1,6 @@
-/* $XFree86$ */
-/*
- * SiS DRI wrapper
- *
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
- *
- * Licensed under the following terms:
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
- * about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
- *
- * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
- * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Can-Ru Yeou, SiS Inc.,
- * Thomas Winischhofer <thomas@winischhofer.net>,
- * others.
- *
- * Previously taken and modified from tdfx_dri.h
- */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_dri.h,v 1.9 2003/08/29 08:50:54 twini Exp $ */
+
+/* modified from tdfx_dri.h */
#ifndef _SIS_DRI_
#define _SIS_DRI_
diff --git a/src/sis_driver.c b/src/sis_driver.c
index 3951f7c..2940dd7 100644
--- a/src/sis_driver.c
+++ b/src/sis_driver.c
@@ -1,54 +1,66 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.c,v 1.125 2003/09/09 13:33:50 twini Exp $ */
/*
- * SiS driver main code
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Formerly based on old code which is
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
- * - driver entirely rewritten since 2001, only basic structure taken from
- * old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
- * sis_dga.c; these were mostly taken over; sis_dri.c was changed for
- * new versions of the DRI layer)
+ * - driver entirely rewritten, only basic structure taken from old code
+ * (except sis_dri.c, sis_shadow.c and parts of sis_dga.c;
+ * these were taken over; sis_dri.c was slightly adapted)
+ * - 315 series (315/550/650/651/M650/661FX/M661FX/740/741) support
+ * - Xabre series (330) support
+ * - new mode switching code for 300, 315 and 330 series
+ * - dual head support on 300, 315 and 330 series
+ * - merged-framebuffer support on 300, 315 and 330 series
+ * - Xinerama extension for MergedFB mode
+ * - rewritten for 5597/5598, 6326 and 530/620 chipsets,
+ * - rewritten for 300/540/630/730 chipsets,
+ * - VESA mode switching (deprecated),
+ * - extended CRT2/video bridge handling support,
+ * - 650/740/Chrontel 7019/LVDS support (up to 1600x1200)
+ * - 30x/30xB/30xLV video bridge support (300, 315, 330 series)
+ * - entirely rewritten Xv support for 300 series
+ * - Xv support for 5597/5598, 6326, 530/620, 315 and 330 series
+ * - TV and hi-res support for the 6326
+ * - Color HW cursor support for 300(emulated), 315 and 330 series
+ * - etc. etc. etc.
*
- * This notice covers the entire driver code unless otherwise indicated.
+ * This notice covers the entire driver code
*
- * Formerly based on code which is
- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
- * Written by:
- * Alan Hourihane <alanh@fairlite.demon.co.uk>,
+ * Authors of old code:
+ * Alan Hourihane, alanh@fairlite.demon.co.uk
* Mike Chapman <mike@paranoia.com>,
* Juanjo Santamarta <santamarta@ctv.es>,
- * Mitani Hiroshi <hmitani@drl.mei.co.jp>,
+ * Mitani Hiroshi <hmitani@drl.mei.co.jp>
* David Thomas <davtom@dream.org.uk>.
*/
#include "fb.h"
+#include "xf1bpp.h"
+#include "xf4bpp.h"
#include "mibank.h"
#include "micmap.h"
#include "xf86.h"
-#include "xf86Priv.h"
#include "xf86_OSproc.h"
#include "xf86Resources.h"
#include "xf86_ansic.h"
@@ -91,6 +103,82 @@
#include "dri.h"
#endif
+/* Mandatory functions */
+static void SISIdentify(int flags);
+static Bool SISProbe(DriverPtr drv, int flags);
+static Bool SISPreInit(ScrnInfoPtr pScrn, int flags);
+static Bool SISScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv);
+static Bool SISEnterVT(int scrnIndex, int flags);
+static void SISLeaveVT(int scrnIndex, int flags);
+static Bool SISCloseScreen(int scrnIndex, ScreenPtr pScreen);
+static Bool SISSaveScreen(ScreenPtr pScreen, int mode);
+static Bool SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
+static void SISAdjustFrame(int scrnIndex, int x, int y, int flags);
+#ifdef SISDUALHEAD
+static Bool SISSaveScreenDH(ScreenPtr pScreen, int mode);
+#endif
+
+/* Optional functions */
+static void SISFreeScreen(int scrnIndex, int flags);
+static int SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose,
+ int flags);
+
+/* Internally used functions */
+static Bool SISMapMem(ScrnInfoPtr pScrn);
+static Bool SISUnmapMem(ScrnInfoPtr pScrn);
+static void SISSave(ScrnInfoPtr pScrn);
+static void SISRestore(ScrnInfoPtr pScrn);
+static void SISVESARestore(ScrnInfoPtr pScrn);
+static Bool SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
+static void SISModifyModeInfo(DisplayModePtr mode);
+static void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
+static void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg);
+static void SiS6326PostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg);
+static Bool SiSSetVESAMode(ScrnInfoPtr pScrn, DisplayModePtr pMode);
+static void SiSBuildVesaModeList(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe);
+static UShort SiSCalcVESAModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode);
+static void SISVESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function);
+static void SISBridgeRestore(ScrnInfoPtr pScrn);
+static void SiSEnableTurboQueue(ScrnInfoPtr pScrn);
+unsigned char SISSearchCRT1Rate(ScrnInfoPtr pScrn, DisplayModePtr mode);
+static void SISWaitVBRetrace(ScrnInfoPtr pScrn);
+Bool InRegion(int x, int y, region r);
+
+void SISWaitRetraceCRT1(ScrnInfoPtr pScrn);
+void SISWaitRetraceCRT2(ScrnInfoPtr pScrn);
+
+BOOLEAN SiSBridgeIsInSlaveMode(ScrnInfoPtr pScrn);
+#ifdef CYCLECRT2
+Bool SISCycleCRT2Type(int scrnIndex, DisplayModePtr mode);
+#endif
+
+#ifdef DEBUG
+static void SiSDumpModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode);
+#endif
+
+/* Mode switching functions */
+extern int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber);
+extern BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+extern BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch);
+extern void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
+extern void SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo);
+extern void SiS_GetVBType(SiS_Private *SiS_Pr, USHORT BaseAddr, PSIS_HW_DEVICE_INFO);
+extern DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes, BOOLEAN isfordvi);
+#ifdef SISDUALHEAD
+extern BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+extern BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,
+ ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+#endif
+
+/* For power management for 315 series */
+extern void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
+extern void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+extern void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension);
+
/* Globals (yes, these ARE really required to be global) */
#ifdef SISDUALHEAD
@@ -100,6 +188,7 @@ static int SISEntityIndex = -1;
#ifdef SISMERGED
#ifdef SISXINERAMA
static Bool SiSnoPanoramiXExtension = TRUE;
+static unsigned char SiSXineramaReqCode = 0;
int SiSXineramaPixWidth = 0;
int SiSXineramaPixHeight = 0;
int SiSXineramaNumScreens = 0;
@@ -151,9 +240,11 @@ static SymTabRec SISChipsets[] = {
{ PCI_CHIP_SIS315H, "SIS315H" },
{ PCI_CHIP_SIS315PRO, "SIS315PRO" },
{ PCI_CHIP_SIS550, "SIS550" },
- { PCI_CHIP_SIS650, "SIS650/M650/651/740" },
+ { PCI_CHIP_SIS650, "SIS650/M650/651/661FX/M661FX/740/741" },
{ PCI_CHIP_SIS330, "SIS330(Xabre)" },
- { PCI_CHIP_SIS660, "SIS660/661FX/M661FX/M661MX/741/741GX/M741/760/M760" },
+#if 0
+ { PCI_CHIP_SIS660, "SIS660/M660/760/M760" },
+#endif
{ -1, NULL }
};
@@ -170,7 +261,9 @@ static PciChipsets SISPciChipsets[] = {
{ PCI_CHIP_SIS315PRO, PCI_CHIP_SIS315PRO, RES_SHARED_VGA },
{ PCI_CHIP_SIS650, PCI_CHIP_SIS650, RES_SHARED_VGA },
{ PCI_CHIP_SIS330, PCI_CHIP_SIS330, RES_SHARED_VGA },
+#if 0
{ PCI_CHIP_SIS660, PCI_CHIP_SIS660, RES_SHARED_VGA },
+#endif
{ -1, -1, RES_UNDEFINED }
};
@@ -204,6 +297,14 @@ static const char *vgahwSymbols[] = {
NULL
};
+#if defined(XFree86LOADER)
+static const char *miscfbSymbols[] = {
+ "xf1bppScreenInit",
+ "xf4bppScreenInit",
+ NULL
+};
+#endif
+
static const char *fbSymbols[] = {
"fbPictureInit",
"fbScreenInit",
@@ -226,6 +327,7 @@ static const char *ddcSymbols[] = {
"xf86PrintEDID",
"xf86SetDDCproperties",
"xf86InterpretEDID",
+ "xf86DoEDID_DDC1",
NULL
};
@@ -255,6 +357,8 @@ static const char *vbeSymbols[] = {
NULL
};
+#ifdef XFree86LOADER
+
#ifdef XF86DRI
static const char *drmSymbols[] = {
"drmAddMap",
@@ -283,15 +387,10 @@ static const char *driSymbols[] = {
"DRIScreenInit",
"DRIUnlock",
"GlxSetVisualConfigs",
-#ifdef SISNEWDRI2
- "DRICreatePCIBusID"
-#endif
NULL
};
#endif
-#ifdef XFree86LOADER
-
static MODULESETUPPROTO(sisSetup);
static XF86ModuleVersionInfo sisVersRec =
@@ -300,7 +399,7 @@ static XF86ModuleVersionInfo sisVersRec =
MODULEVENDORSTRING,
MODINFOSTRING1,
MODINFOSTRING2,
- XORG_VERSION_CURRENT,
+ XF86_VERSION_CURRENT,
SIS_MAJOR_VERSION, SIS_MINOR_VERSION, SIS_PATCHLEVEL,
ABI_CLASS_VIDEODRV, /* This is a video driver */
ABI_VIDEODRV_VERSION,
@@ -316,17 +415,17 @@ sisSetup(pointer module, pointer opts, int *errmaj, int *errmin)
static Bool setupDone = FALSE;
if(!setupDone) {
- setupDone = TRUE;
- xf86AddDriver(&SIS, module, 0);
- LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols,
- shadowSymbols, ramdacSymbols,
- vbeSymbols, int10Symbols,
+ setupDone = TRUE;
+ xf86AddDriver(&SIS, module, 0);
+ LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols,
+ miscfbSymbols, shadowSymbols, ramdacSymbols,
+ vbeSymbols, int10Symbols,
#ifdef XF86DRI
- drmSymbols, driSymbols,
+ drmSymbols, driSymbols,
#endif
- NULL);
- return (pointer)TRUE;
- }
+ NULL);
+ return (pointer)TRUE;
+ }
if(errmaj) *errmaj = LDR_ONCEONLY;
return NULL;
@@ -342,7 +441,8 @@ SISGetRec(ScrnInfoPtr pScrn)
* pScrn->driverPrivate is initialised to NULL, so we can check if
* the allocation has already been done.
*/
- if(pScrn->driverPrivate != NULL) return TRUE;
+ if(pScrn->driverPrivate != NULL)
+ return TRUE;
pScrn->driverPrivate = xnfcalloc(sizeof(SISRec), 1);
@@ -362,7 +462,7 @@ SISFreeRec(ScrnInfoPtr pScrn)
/* Just to make sure... */
if(!pSiS) return;
-
+
#ifdef SISDUALHEAD
pSiSEnt = pSiS->entityPrivate;
#endif
@@ -371,10 +471,9 @@ SISFreeRec(ScrnInfoPtr pScrn)
pSiS->pstate = NULL;
if(pSiS->fonts) xfree(pSiS->fonts);
pSiS->fonts = NULL;
-
#ifdef SISDUALHEAD
if(pSiSEnt) {
- if(!pSiS->SecondHead) {
+ if(!pSiS->SecondHead) {
/* Free memory only if we are first head; in case of an error
* during init of the second head, the server will continue -
* and we need the BIOS image and SiS_Private for the first
@@ -384,21 +483,16 @@ SISFreeRec(ScrnInfoPtr pScrn)
pSiSEnt->BIOS = pSiS->BIOS = NULL;
if(pSiSEnt->SiS_Pr) xfree(pSiSEnt->SiS_Pr);
pSiSEnt->SiS_Pr = pSiS->SiS_Pr = NULL;
- if(pSiSEnt->RenderAccelArray) xfree(pSiSEnt->RenderAccelArray);
- pSiSEnt->RenderAccelArray = pSiS->RenderAccelArray = NULL;
- } else {
+ } else {
pSiS->BIOS = NULL;
pSiS->SiS_Pr = NULL;
- pSiS->RenderAccelArray = NULL;
- }
+ }
} else {
#endif
- if(pSiS->BIOS) xfree(pSiS->BIOS);
- pSiS->BIOS = NULL;
- if(pSiS->SiS_Pr) xfree(pSiS->SiS_Pr);
- pSiS->SiS_Pr = NULL;
- if(pSiS->RenderAccelArray) xfree(pSiS->RenderAccelArray);
- pSiS->RenderAccelArray = NULL;
+ if(pSiS->BIOS) xfree(pSiS->BIOS);
+ pSiS->BIOS = NULL;
+ if(pSiS->SiS_Pr) xfree(pSiS->SiS_Pr);
+ pSiS->SiS_Pr = NULL;
#ifdef SISDUALHEAD
}
#endif
@@ -483,16 +577,10 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
((pSiS->VBFlags & (VB_LVDS | VB_CHRONTEL)) == VB_LVDS))) {
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(!pSiS->BlankCRT2) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- if(pSiS->sishw_ext.jChipType >= SIS_661) pSiS->LCDon &= 0x0f;
- }
+ if(!pSiS->BlankCRT2) inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
} else
#endif
- if(!pSiS->Blank) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- if(pSiS->sishw_ext.jChipType >= SIS_661) pSiS->LCDon &= 0x0f;
- }
+ if(!pSiS->Blank) inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
}
}
}
@@ -568,8 +656,14 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
}
if(docrt2) {
- if(pSiS->VGAEngine == SIS_315_VGA) {
- if(pSiS->VBFlags & CRT2_LCD) {
+ if(pSiS->VBFlags & CRT2_LCD) {
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ if(backlight) {
+ SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ } else {
+ SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
+ } else if(pSiS->VGAEngine == SIS_315_VGA) {
if(pSiS->VBFlags & VB_CHRONTEL) {
if(backlight) {
SiS_Chrontel701xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
@@ -581,18 +675,9 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
}
}
- if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- if((docrt2 && (pSiS->VBFlags & CRT2_LCD)) || (docrt1 && (pSiS->VBFlags & CRT1_LCDA))) {
- if(backlight) {
- SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- } else {
- SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
- }
- }
-
if(docrt1) {
setSISIDXREG(SISSR, 0x01, ~0x20, sr1); /* Set/Clear "Display On" bit */
+
switch(pSiS->VGAEngine) {
case SIS_OLD_VGA:
case SIS_530_VGA:
@@ -601,17 +686,15 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
setSISIDXREG(SISSR, 0x11, 0x3f, pmreg);
break;
case SIS_315_VGA:
- if((!pSiS->CRT1off) && ((!(pSiS->VBFlags & CRT1_LCDA)) || (pSiS->VBFlags & VB_301C))) {
- setSISIDXREG(SISCR, pSiS->myCR63, 0xbf, cr63);
+ if(!pSiS->CRT1off) {
+ setSISIDXREG(SISCR, 0x63, 0xbf, cr63);
setSISIDXREG(SISSR, 0x07, 0xef, sr7);
}
/* fall through */
default:
- if((!(pSiS->VBFlags & CRT1_LCDA)) || (pSiS->VBFlags & VB_301C)) {
- inSISIDXREG(SISSR, 0x1f, oldpmreg);
- if(!pSiS->CRT1off) {
- setSISIDXREG(SISSR, 0x1f, 0x3f, pmreg);
- }
+ inSISIDXREG(SISSR, 0x1f, oldpmreg);
+ if(!pSiS->CRT1off) {
+ setSISIDXREG(SISSR, 0x1f, 0x3f, pmreg);
}
/* TODO: Check if Chrontel TV is active and in slave mode,
* don't go into power-saving mode this in this case!
@@ -626,11 +709,7 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
(pSiS->VBFlags & (VB_301|VB_30xBDH|VB_LVDS))) ||
((pSiS->VGAEngine == SIS_315_VGA) &&
((pSiS->VBFlags & (VB_LVDS | VB_CHRONTEL)) == VB_LVDS))) {
- if(pSiS->sishw_ext.jChipType >= SIS_661) {
- setSISIDXREG(SISSR, 0x11, ~0xfc, sr11);
- } else {
- setSISIDXREG(SISSR, 0x11, ~0x0c, sr11);
- }
+ setSISIDXREG(SISSR, 0x11, ~0x0c, sr11);
}
if(pSiS->VGAEngine == SIS_300_VGA) {
if((pSiS->VBFlags & (VB_301B|VB_301C|VB_302B)) &&
@@ -650,7 +729,7 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
}
}
- if((docrt1) && (pmreg != oldpmreg) && ((!(pSiS->VBFlags & CRT1_LCDA)) || (pSiS->VBFlags & VB_301C))) {
+ if((docrt1) && (pmreg != oldpmreg)) {
outSISIDXREG(SISSR, 0x00, 0x01); /* Synchronous Reset */
usleep(10000);
outSISIDXREG(SISSR, 0x00, 0x03); /* End Reset */
@@ -658,6 +737,7 @@ SISDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla
}
+
/* Mandatory */
static void
SISIdentify(int flags)
@@ -724,23 +804,6 @@ SISCalculateGammaRamp(ScrnInfoPtr pScrn)
}
#endif
-static void
-SISErrorLog(ScrnInfoPtr pScrn, const char *format, ...)
-{
- va_list ap;
- static const char *str = "**************************************************\n";
-
- va_start(ap, format);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- " ERROR:\n");
- xf86VDrvMsgVerb(pScrn->scrnIndex, X_ERROR, 1, format, ap);
- va_end(ap);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- " END OF MESSAGE\n");
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, str);
-}
-
/* Mandatory */
static Bool
SISProbe(DriverPtr drv, int flags)
@@ -772,12 +835,13 @@ SISProbe(DriverPtr drv, int flags)
* specified.
*/
- if((numDevSections = xf86MatchDevice(SIS_DRIVER_NAME, &devSections)) <= 0) {
- /*
- * There's no matching device section in the config file, so quit
- * now.
- */
- return FALSE;
+ if((numDevSections = xf86MatchDevice(SIS_DRIVER_NAME,
+ &devSections)) <= 0) {
+ /*
+ * There's no matching device section in the config file, so quit
+ * now.
+ */
+ return FALSE;
}
/*
@@ -791,24 +855,25 @@ SISProbe(DriverPtr drv, int flags)
* amounts to checking the PCI data that the server has already collected.
*/
if(xf86GetPciVideoInfo() == NULL) {
- /*
- * We won't let anything in the config file override finding no
- * PCI video cards at all. This seems reasonable now, but we'll see.
- */
- return FALSE;
+ /*
+ * We won't let anything in the config file override finding no
+ * PCI video cards at all. This seems reasonable now, but we'll see.
+ */
+ return FALSE;
}
numUsed = xf86MatchPciInstances(SIS_NAME, PCI_VENDOR_SIS,
- SISChipsets, SISPciChipsets, devSections,
- numDevSections, drv, &usedChips);
+ SISChipsets, SISPciChipsets, devSections,
+ numDevSections, drv, &usedChips);
/* Free it since we don't need that list after this */
xfree(devSections);
- if(numUsed <= 0) return FALSE;
+ if(numUsed <= 0)
+ return FALSE;
- if(flags & PROBE_DETECT) {
+ if(flags & PROBE_DETECT)
foundScreen = TRUE;
- } else for(i = 0; i < numUsed; i++) {
+ else for(i = 0; i < numUsed; i++) {
ScrnInfoPtr pScrn;
#ifdef SISDUALHEAD
EntityInfoPtr pEnt;
@@ -848,28 +913,26 @@ SISProbe(DriverPtr drv, int flags)
DevUnion *pPriv;
xf86SetEntitySharable(usedChips[i]);
- if(SISEntityIndex < 0) {
- SISEntityIndex = xf86AllocateEntityPrivateIndex();
- }
+ if(SISEntityIndex < 0)
+ SISEntityIndex = xf86AllocateEntityPrivateIndex();
pPriv = xf86GetEntityPrivate(pScrn->entityList[0], SISEntityIndex);
if(!pPriv->ptr) {
- pPriv->ptr = xnfcalloc(sizeof(SISEntRec), 1);
- pSiSEnt = pPriv->ptr;
- pSiSEnt->lastInstance = -1;
- pSiSEnt->DisableDual = FALSE;
- pSiSEnt->ErrorAfterFirst = FALSE;
- pSiSEnt->MapCountIOBase = pSiSEnt->MapCountFbBase = 0;
- pSiSEnt->FbBase = pSiSEnt->IOBase = NULL;
- pSiSEnt->forceUnmapIOBase = FALSE;
- pSiSEnt->forceUnmapFbBase = FALSE;
- pSiSEnt->HWCursorCBufNum = pSiSEnt->HWCursorMBufNum = 0;
+ pPriv->ptr = xnfcalloc(sizeof(SISEntRec), 1);
+ pSiSEnt = pPriv->ptr;
+ pSiSEnt->lastInstance = -1;
+ pSiSEnt->DisableDual = FALSE;
+ pSiSEnt->ErrorAfterFirst = FALSE;
+ pSiSEnt->MapCountIOBase = pSiSEnt->MapCountFbBase = 0;
+ pSiSEnt->FbBase = pSiSEnt->IOBase = NULL;
+ pSiSEnt->forceUnmapIOBase = FALSE;
+ pSiSEnt->forceUnmapFbBase = FALSE;
#ifdef __alpha__
- pSiSEnt->MapCountIOBaseDense = 0;
- pSiSEnt->IOBaseDense = NULL;
- pSiSEnt->forceUnmapIOBaseDense = FALSE;
+ pSiSEnt->MapCountIOBaseDense = 0;
+ pSiSEnt->IOBaseDense = NULL;
+ pSiSEnt->forceUnmapIOBaseDense = FALSE;
#endif
} else {
- pSiSEnt = pPriv->ptr;
+ pSiSEnt = pPriv->ptr;
}
pSiSEnt->lastInstance++;
xf86SetEntityInstanceForScreen(pScrn, pScrn->entityList[0],
@@ -883,10 +946,8 @@ SISProbe(DriverPtr drv, int flags)
/* If monitor section has no HSync/VRefresh data,
- * derive it from DDC data. Done by common layer
- * since 4.3.99.14.
+ * derive it from DDC data.
*/
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0)
static void
SiSSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag)
{
@@ -949,13 +1010,13 @@ SiSSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag)
if(myhtiming[i].whichone == 1) temp = ddc->timings1.t1;
else temp = ddc->timings1.t2;
if(temp & myhtiming[i].mask) {
- if((i==0) || (myhlow > myhtiming[i].rate))
+ if((i==0) || (myhlow > myhtiming[i].rate))
myhlow = myhtiming[i].rate;
}
if(myhtiming[10-i].whichone == 1) temp = ddc->timings1.t1;
else temp = ddc->timings1.t2;
if(temp & myhtiming[10-i].mask) {
- if((i==0) || (myhhigh < myhtiming[10-i].rate))
+ if((i==0) || (myhhigh < myhtiming[10-i].rate))
myhhigh = myhtiming[10-i].rate;
}
}
@@ -994,13 +1055,13 @@ SiSSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag)
if(myvtiming[i].whichone == 1) temp = ddc->timings1.t1;
else temp = ddc->timings1.t2;
if(temp & myvtiming[i].mask) {
- if((i==0) || (myvlow > myvtiming[i].rate))
+ if((i==0) || (myvlow > myvtiming[i].rate))
myvlow = myvtiming[i].rate;
}
if(myvtiming[9-i].whichone == 1) temp = ddc->timings1.t1;
else temp = ddc->timings1.t2;
if(temp & myvtiming[9-i].mask) {
- if((i==0) || (myvhigh < myvtiming[9-i].rate))
+ if((i==0) || (myvhigh < myvtiming[9-i].rate))
myvhigh = myvtiming[9-i].rate;
}
}
@@ -1024,7 +1085,6 @@ SiSSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag)
}
}
-#endif
/* Some helper functions for MergedFB mode */
@@ -1034,7 +1094,7 @@ SiSSetSyncRangeFromEdid(ScrnInfoPtr pScrn, int flag)
* (Code base from mga driver)
*/
static int
-SiSStrToRanges(range *r, char *s, int max)
+SiSStrToRanges(range *r, char *s)
{
float num = 0.0;
int rangenum = 0;
@@ -1042,72 +1102,67 @@ SiSStrToRanges(range *r, char *s, int max)
Bool nextdash = FALSE;
char* strnum = NULL;
do {
- switch(*s) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '.':
- if(strnum == NULL) {
- strnum = s;
- gotdash = nextdash;
- nextdash = FALSE;
- }
- break;
- case '-':
- case ' ':
- case 0:
- if(strnum == NULL) break;
- sscanf(strnum, "%f", &num);
- strnum = NULL;
- if(gotdash) {
- r[rangenum - 1].hi = num;
- } else {
- r[rangenum].lo = num;
- r[rangenum].hi = num;
- rangenum++;
- }
- if(*s == '-') nextdash = (rangenum != 0);
- else if(rangenum >= max) return rangenum;
- break;
- default:
- return 0;
- }
-
+ switch(*s) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '.':
+ if(strnum == NULL) {
+ strnum = s;
+ gotdash = nextdash;
+ nextdash = FALSE;
+ }
+ break;
+ case '-':
+ case ' ':
+ case 0:
+ if(strnum == NULL) break;
+ if(strnum != NULL) sscanf(strnum,"%f",&num);
+ if(gotdash) {
+ r[rangenum - 1].hi = num;
+ } else {
+ r[rangenum].lo = num;
+ r[rangenum].hi = num;
+ rangenum++;
+ }
+ strnum = NULL;
+ if(*s == '-') nextdash = (rangenum != 0);
+ break;
+ default :
+ return 0;
+ }
} while(*(s++) != 0);
return rangenum;
}
-/* Copy and link two modes form mergedfb mode
+/* Copy and link two modes form merged-fb mode
* (Code base taken from mga driver)
* Copys mode i, links the result to dest, and returns it.
* Links i and j in Private record.
* If dest is NULL, return value is copy of i linked to itself.
- * For mergedfb auto-config, we only check the dimension
- * against virtualX/Y, if they were user-provided.
*/
static DisplayModePtr
SiSCopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest,
DisplayModePtr i, DisplayModePtr j,
SiSScrn2Rel srel)
{
+#ifdef SISXINERAMA
SISPtr pSiS = SISPTR(pScrn);
+#endif
DisplayModePtr mode;
int dx = 0,dy = 0;
- if(!((mode = xalloc(sizeof(DisplayModeRec))))) return dest;
+ mode = xalloc(sizeof(DisplayModeRec));
memcpy(mode, i, sizeof(DisplayModeRec));
- if(!((mode->Private = xalloc(sizeof(SiSMergedDisplayModeRec))))) {
- xfree(mode);
- return dest;
- }
+ mode->Private = xalloc(sizeof(SiSMergedDisplayModeRec));
((SiSMergedDisplayModePtr)mode->Private)->CRT1 = i;
((SiSMergedDisplayModePtr)mode->Private)->CRT2 = j;
((SiSMergedDisplayModePtr)mode->Private)->CRT2Position = srel;
@@ -1116,47 +1171,23 @@ SiSCopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest,
switch(srel) {
case sisLeftOf:
case sisRightOf:
- if(!(pScrn->display->virtualX)) {
- dx = i->HDisplay + j->HDisplay;
- } else {
- dx = min(pScrn->virtualX, i->HDisplay + j->HDisplay);
- }
- dx -= mode->HDisplay;
- if(!(pScrn->display->virtualY)) {
- dy = max(i->VDisplay, j->VDisplay);
- } else {
- dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay));
- }
- dy -= mode->VDisplay;
+ dx = min(pScrn->virtualX, i->HDisplay + j->HDisplay) - mode->HDisplay;
+ dy = min(pScrn->virtualY, max(i->VDisplay,j->VDisplay)) - mode->VDisplay;
+#ifdef SISXINERAMA
+ pSiS->AtLeastOneNonClone = TRUE;
+#endif
break;
case sisAbove:
case sisBelow:
- if(!(pScrn->display->virtualY)) {
- dy = i->VDisplay + j->VDisplay;
- } else {
- dy = min(pScrn->virtualY, i->VDisplay + j->VDisplay);
- }
- dy -= mode->VDisplay;
- if(!(pScrn->display->virtualX)) {
- dx = max(i->HDisplay, j->HDisplay);
- } else {
- dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay));
- }
- dx -= mode->HDisplay;
+ dy = min(pScrn->virtualY, i->VDisplay + j->VDisplay) - mode->VDisplay;
+ dx = min(pScrn->virtualX, max(i->HDisplay,j->HDisplay)) - mode->HDisplay;
+#ifdef SISXINERAMA
+ pSiS->AtLeastOneNonClone = TRUE;
+#endif
break;
case sisClone:
- if(!(pScrn->display->virtualX)) {
- dx = max(i->HDisplay, j->HDisplay);
- } else {
- dx = min(pScrn->virtualX, max(i->HDisplay, j->HDisplay));
- }
- dx -= mode->HDisplay;
- if(!(pScrn->display->virtualY)) {
- dy = max(i->VDisplay, j->VDisplay);
- } else {
- dy = min(pScrn->virtualY, max(i->VDisplay, j->VDisplay));
- }
- dy -= mode->VDisplay;
+ dx = min(pScrn->virtualX, max(i->HDisplay,j->HDisplay)) - mode->HDisplay;
+ dy = min(pScrn->virtualY, max(i->VDisplay,j->VDisplay)) - mode->VDisplay;
break;
}
mode->HDisplay += dx;
@@ -1169,38 +1200,20 @@ SiSCopyModeNLink(ScrnInfoPtr pScrn, DisplayModePtr dest,
mode->VTotal += dy;
mode->Clock = 0;
- if( ((mode->HDisplay * ((pScrn->bitsPerPixel + 7) / 8) * mode->VDisplay) > pSiS->maxxfbmem) ||
- (mode->HDisplay > 4088) ||
- (mode->VDisplay > 4096) ) {
-
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Skipped %dx%d, not enough video RAM or beyond hardware specs\n",
- mode->HDisplay, mode->VDisplay);
- xfree(mode->Private);
- xfree(mode);
-
- return dest;
- }
-
-#ifdef SISXINERAMA
- if(srel != sisClone) {
- pSiS->AtLeastOneNonClone = TRUE;
- }
-#endif
-
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Merged %dx%d and %dx%d to %dx%d%s\n",
+ "Merged %dx%d and %dx%d to %dx%d (Virtual %d %d)\n",
i->HDisplay, i->VDisplay, j->HDisplay, j->VDisplay,
- mode->HDisplay, mode->VDisplay, (srel == sisClone) ? " (Clone)" : "");
+ mode->HDisplay, mode->VDisplay,
+ pScrn->virtualX, pScrn->virtualY);
mode->next = mode;
mode->prev = mode;
if(dest) {
- mode->next = dest->next; /* Insert node after "dest" */
- dest->next->prev = mode;
- mode->prev = dest;
- dest->next = mode;
+ mode->next = dest->next; /* Insert node after "dest" */
+ dest->next->prev = mode;
+ mode->prev = dest;
+ dest->next = mode;
}
return mode;
@@ -1221,73 +1234,11 @@ SiSGetModeFromName(char* str, DisplayModePtr i)
return NULL;
}
-static DisplayModePtr
-SiSFindWidestTallestMode(DisplayModePtr i, Bool tallest)
-{
- DisplayModePtr c = i, d = NULL;
- int max = 0;
- if(!i) return NULL;
- do {
- if(tallest) {
- if(c->VDisplay > max) {
- max = c->VDisplay;
- d = c;
- }
- } else {
- if(c->HDisplay > max) {
- max = c->HDisplay;
- d = c;
- }
- }
- c = c->next;
- } while(c != i);
- return d;
-}
-
-static DisplayModePtr
-SiSGenerateModeListFromLargestModes(ScrnInfoPtr pScrn,
- DisplayModePtr i, DisplayModePtr j,
- SiSScrn2Rel srel)
-{
-#ifdef SISXINERAMA
- SISPtr pSiS = SISPTR(pScrn);
-#endif
- DisplayModePtr mode1 = NULL;
- DisplayModePtr mode2 = NULL;
- DisplayModePtr result = NULL;
-
-#ifdef SISXINERAMA
- pSiS->AtLeastOneNonClone = FALSE;
-#endif
-
- switch(srel) {
- case sisLeftOf:
- case sisRightOf:
- mode1 = SiSFindWidestTallestMode(i, FALSE);
- mode2 = SiSFindWidestTallestMode(j, FALSE);
- break;
- case sisAbove:
- case sisBelow:
- mode1 = SiSFindWidestTallestMode(i, TRUE);
- mode2 = SiSFindWidestTallestMode(j, TRUE);
- break;
- case sisClone:
- mode1 = i;
- mode2 = j;
- }
-
- if(mode1 && mode2) {
- return(SiSCopyModeNLink(pScrn, result, mode1, mode2, srel));
- } else {
- return NULL;
- }
-}
-
-/* Generate the merged-fb mode modelist from metamodes
+/* Generate the merged-fb mode modelist
* (Code base taken from mga driver)
*/
static DisplayModePtr
-SiSGenerateModeListFromMetaModes(ScrnInfoPtr pScrn, char* str,
+SiSGenerateModeList(ScrnInfoPtr pScrn, char* str,
DisplayModePtr i, DisplayModePtr j,
SiSScrn2Rel srel)
{
@@ -1383,180 +1334,6 @@ SiSGenerateModeListFromMetaModes(ScrnInfoPtr pScrn, char* str,
return result;
}
-static DisplayModePtr
-SiSGenerateModeList(ScrnInfoPtr pScrn, char* str,
- DisplayModePtr i, DisplayModePtr j,
- SiSScrn2Rel srel)
-{
- if(str != NULL) {
- return(SiSGenerateModeListFromMetaModes(pScrn, str, i, j, srel));
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "No MetaModes given, linking %s modes by default\n",
- (srel == sisClone) ? "first" :
- (((srel == sisLeftOf) || (srel == sisRightOf)) ? "widest" : "tallest"));
- return(SiSGenerateModeListFromLargestModes(pScrn, i, j, srel));
- }
-}
-
-static void
-SiSRecalcDefaultVirtualSize(ScrnInfoPtr pScrn)
-{
- DisplayModePtr mode, bmode;
- int max;
- static const char *str = "MergedFB: Virtual %s %d\n";
-
- if(!(pScrn->display->virtualX)) {
- mode = bmode = pScrn->modes;
- max = 0;
- do {
- if(mode->HDisplay > max) max = mode->HDisplay;
- mode = mode->next;
- } while(mode != bmode);
- pScrn->virtualX = max;
- pScrn->displayWidth = max;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "width", max);
- }
- if(!(pScrn->display->virtualY)) {
- mode = bmode = pScrn->modes;
- max = 0;
- do {
- if(mode->VDisplay > max) max = mode->VDisplay;
- mode = mode->next;
- } while(mode != bmode);
- pScrn->virtualY = max;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, str, "height", max);
- }
-}
-
-static void
-SiSMergedFBSetDpi(ScrnInfoPtr pScrn1, ScrnInfoPtr pScrn2, SiSScrn2Rel srel)
-{
- SISPtr pSiS = SISPTR(pScrn1);
- MessageType from = X_DEFAULT;
- xf86MonPtr DDC1 = (xf86MonPtr)(pScrn1->monitor->DDC);
- xf86MonPtr DDC2 = (xf86MonPtr)(pScrn2->monitor->DDC);
- int ddcWidthmm = 0, ddcHeightmm = 0;
- const char *dsstr = "MergedFB: Display dimensions: (%d, %d) mm\n";
-
- /* This sets the DPI for MergedFB mode. The problem is that
- * this can never be exact, because the output devices may
- * have different dimensions. This function tries to compromise
- * through a few assumptions, and it just calculates an average DPI
- * value for both monitors.
- */
-
- /* Given DisplaySize should regard BOTH monitors */
- pScrn1->widthmm = pScrn1->monitor->widthmm;
- pScrn1->heightmm = pScrn1->monitor->heightmm;
-
- /* Get DDC display size; if only either CRT1 or CRT2 provided these,
- * assume equal dimensions for both, otherwise add dimensions
- */
- if( (DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) &&
- (DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0)) ) {
- ddcWidthmm = max(DDC1->features.hsize, DDC2->features.hsize) * 10;
- ddcHeightmm = max(DDC1->features.vsize, DDC2->features.vsize) * 10;
- switch(srel) {
- case sisLeftOf:
- case sisRightOf:
- ddcWidthmm = (DDC1->features.hsize + DDC2->features.hsize) * 10;
- break;
- case sisAbove:
- case sisBelow:
- ddcHeightmm = (DDC1->features.vsize + DDC2->features.vsize) * 10;
- default:
- break;
- }
- } else if(DDC1 && (DDC1->features.hsize > 0 && DDC1->features.vsize > 0)) {
- ddcWidthmm = DDC1->features.hsize * 10;
- ddcHeightmm = DDC1->features.vsize * 10;
- switch(srel) {
- case sisLeftOf:
- case sisRightOf:
- ddcWidthmm *= 2;
- break;
- case sisAbove:
- case sisBelow:
- ddcHeightmm *= 2;
- default:
- break;
- }
- } else if(DDC2 && (DDC2->features.hsize > 0 && DDC2->features.vsize > 0) ) {
- ddcWidthmm = DDC2->features.hsize * 10;
- ddcHeightmm = DDC2->features.vsize * 10;
- switch(srel) {
- case sisLeftOf:
- case sisRightOf:
- ddcWidthmm *= 2;
- break;
- case sisAbove:
- case sisBelow:
- ddcHeightmm *= 2;
- default:
- break;
- }
- }
-
- if(monitorResolution > 0) {
-
- /* Set command line given values (overrules given options) */
- pScrn1->xDpi = monitorResolution;
- pScrn1->yDpi = monitorResolution;
- from = X_CMDLINE;
-
- } else if(pSiS->MergedFBXDPI) {
-
- /* Set option-wise given values (overrule DisplaySize) */
- pScrn1->xDpi = pSiS->MergedFBXDPI;
- pScrn1->yDpi = pSiS->MergedFBYDPI;
- from = X_CONFIG;
-
- } else if(pScrn1->widthmm > 0 || pScrn1->heightmm > 0) {
-
- /* Set values calculated from given DisplaySize */
- from = X_CONFIG;
- if(pScrn1->widthmm > 0) {
- pScrn1->xDpi = (int)((double)pScrn1->virtualX * 25.4 / pScrn1->widthmm);
- }
- if(pScrn1->heightmm > 0) {
- pScrn1->yDpi = (int)((double)pScrn1->virtualY * 25.4 / pScrn1->heightmm);
- }
- xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, pScrn1->widthmm, pScrn1->heightmm);
-
- } else if(ddcWidthmm && ddcHeightmm) {
-
- /* Set values from DDC-provided display size */
- from = X_PROBED;
- xf86DrvMsg(pScrn1->scrnIndex, from, dsstr, ddcWidthmm, ddcHeightmm );
- pScrn1->widthmm = ddcWidthmm;
- pScrn1->heightmm = ddcHeightmm;
- if(pScrn1->widthmm > 0) {
- pScrn1->xDpi = (int)((double)pScrn1->virtualX * 25.4 / pScrn1->widthmm);
- }
- if(pScrn1->heightmm > 0) {
- pScrn1->yDpi = (int)((double)pScrn1->virtualY * 25.4 / pScrn1->heightmm);
- }
-
- } else {
-
- pScrn1->xDpi = pScrn1->yDpi = DEFAULT_DPI;
-
- }
-
- /* Sanity check */
- if(pScrn1->xDpi > 0 && pScrn1->yDpi <= 0)
- pScrn1->yDpi = pScrn1->xDpi;
- if(pScrn1->yDpi > 0 && pScrn1->xDpi <= 0)
- pScrn1->xDpi = pScrn1->yDpi;
-
- pScrn2->xDpi = pScrn1->xDpi;
- pScrn2->yDpi = pScrn1->yDpi;
-
- xf86DrvMsg(pScrn1->scrnIndex, from, "MergedFB: DPI set to (%d, %d)\n",
- pScrn1->xDpi, pScrn1->yDpi);
-}
-
/* Pseudo-Xinerama extension for MergedFB mode */
#ifdef SISXINERAMA
@@ -1564,6 +1341,7 @@ static void
SiSUpdateXineramaScreenInfo(ScrnInfoPtr pScrn1)
{
SISPtr pSiS = SISPTR(pScrn1);
+ ScrnInfoPtr pScrn2 = NULL;
int crt1scrnnum = 0, crt2scrnnum = 1;
int x1=0, x2=0, y1=0, y2=0, h1=0, h2=0, w1=0, w2=0;
DisplayModePtr currentMode, firstMode;
@@ -1573,23 +1351,31 @@ SiSUpdateXineramaScreenInfo(ScrnInfoPtr pScrn1)
if(SiSnoPanoramiXExtension) return;
- if(!SiSXineramadataPtr) return;
+ if(!SiSXineramadataPtr) {
+ xf86DrvMsg(pScrn1->scrnIndex, X_ERROR,
+ "Internal error: SiSUpdateXineramaScreenInfo(): SiSXineramadataPtr is NULL\n");
+ return;
+ }
if(pSiS->CRT2IsScrn0) {
crt1scrnnum = 1;
crt2scrnnum = 0;
}
+ pScrn2 = pSiS->CRT2pScrn;
+
/* Attention: Usage of RandR may lead into virtual X and Y values
* actually smaller than our MetaModes! To avoid this, we calculate
* the maxCRT fields here (and not somewhere else, like in CopyNLink)
- *
- * *** For now: RandR will be disabled if SiS pseudo-Xinerama is on
*/
if((pSiS->SiSXineramaVX != pScrn1->virtualX) || (pSiS->SiSXineramaVY != pScrn1->virtualY)) {
- if(!(pScrn1->modes)) return;
+ if(!(pScrn1->modes)) {
+ xf86DrvMsg(pScrn1->scrnIndex, X_ERROR,
+ "Internal error: SiSUpdateXineramaScreenInfo(): pScrn->modes is NULL\n");
+ return;
+ }
pSiS->maxCRT1_X1 = pSiS->maxCRT1_X2 = 0;
pSiS->maxCRT1_Y1 = pSiS->maxCRT1_Y2 = 0;
@@ -1708,10 +1494,12 @@ SiSUpdateXineramaScreenInfo(ScrnInfoPtr pScrn1)
if(y2 < 0) y2 = 0;
w2 = pScrn1->virtualX;
h2 = pScrn1->virtualY - y2;
- default:
break;
+ default:
+ xf86DrvMsg(pScrn1->scrnIndex, X_ERROR,
+ "Internal error: UpdateXineramaInfo(): unsupported CRT2Position (%d)\n",
+ pSiS->CRT2Position);
}
-
SiSXineramadataPtr[crt1scrnnum].x = x1;
SiSXineramadataPtr[crt1scrnnum].y = y1;
SiSXineramadataPtr[crt1scrnnum].width = w1;
@@ -2063,6 +1851,8 @@ SiSXineramaExtensionInit(ScrnInfoPtr pScrn)
if(!pSiS->XineramaExtEntry) break;
+ SiSXineramaReqCode = (unsigned char)pSiS->XineramaExtEntry->base;
+
if(!(SiSXineramadataPtr = (SiSXineramaData *)
xcalloc(SiSXineramaNumScreens, sizeof(SiSXineramaData)))) break;
@@ -2071,13 +1861,14 @@ SiSXineramaExtensionInit(ScrnInfoPtr pScrn)
}
if(!success) {
- SISErrorLog(pScrn, "Failed to initialize SiS Pseudo-Xinerama extension\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to initialize SiS Pseudo-Xinerama extension\n");
SiSnoPanoramiXExtension = TRUE;
return;
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "SiS Pseudo-Xinerama extension initialized\n");
+ "Initialized SiS Pseudo-Xinerama extension\n");
pSiS->SiSXineramaVX = 0;
pSiS->SiSXineramaVY = 0;
@@ -2116,7 +1907,7 @@ static xf86MonPtr
SiSInternalDDC(ScrnInfoPtr pScrn, int crtno)
{
SISPtr pSiS = SISPTR(pScrn);
- USHORT temp = 0xffff, temp1, i, realcrtno = crtno;
+ USHORT temp, i, realcrtno = crtno;
unsigned char buffer[256];
xf86MonPtr pMonitor = NULL;
@@ -2127,20 +1918,15 @@ SiSInternalDDC(ScrnInfoPtr pScrn, int crtno)
if(pSiS->VBFlags & CRT2_LCD) realcrtno = 1;
else if(pSiS->VBFlags & CRT2_VGA) realcrtno = 2;
else return NULL;
- } else {
- /* If CRT1 is LCDA, skip DDC (except 301C: DDC allowed, but uses CRT2 port!) */
- if(pSiS->VBFlags & CRT1_LCDA) {
- if(pSiS->VBFlags & VB_301C) realcrtno = 1;
- else return NULL;
- }
}
- i = 3; /* Number of retrys */
- do {
- temp1 = SiS_HandleDDC(pSiS->SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, realcrtno, 0, &buffer[0]);
- if((temp1) && (temp1 != 0xffff)) temp = temp1;
- } while((temp == 0xffff) && i--);
- if(temp != 0xffff) {
+ temp = SiS_HandleDDC(pSiS->SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, realcrtno, 0, &buffer[0]);
+ if((!temp) || (temp == 0xffff)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "CRT%d DDC probing failed%s\n", crtno + 1,
+ (crtno == 0) ? ", now trying via VBE" : "");
+ return(NULL);
+ } else {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CRT%d DDC supported\n", crtno + 1);
xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CRT%d DDC level: %s%s%s%s\n",
crtno + 1,
@@ -2149,7 +1935,7 @@ SiSInternalDDC(ScrnInfoPtr pScrn, int crtno)
(temp & 0x08) ? "D&P" : "",
(temp & 0x10) ? "FPDI-2" : "");
if(temp & 0x02) {
- i = 5; /* Number of retrys */
+ i = 3; /* Number of retrys */
do {
temp = SiS_HandleDDC(pSiS->SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, realcrtno, 1, &buffer[0]);
} while((temp) && i--);
@@ -2157,12 +1943,12 @@ SiSInternalDDC(ScrnInfoPtr pScrn, int crtno)
if((pMonitor = xf86InterpretEDID(pScrn->scrnIndex, &buffer[0]))) {
return(pMonitor);
} else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"CRT%d DDC EDID corrupt\n", crtno + 1);
return(NULL);
}
} else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"CRT%d DDC reading failed\n", crtno + 1);
return(NULL);
}
@@ -2176,36 +1962,26 @@ SiSInternalDDC(ScrnInfoPtr pScrn, int crtno)
return(NULL);
}
return(NULL);
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "CRT%d DDC probing failed\n", crtno + 1);
- return(NULL);
}
}
static xf86MonPtr
-SiSDoPrivateDDC(ScrnInfoPtr pScrn, int *crtnum)
+SiSDoPrivateDDC(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- *crtnum = 1;
+ if(pSiS->SecondHead)
return(SiSInternalDDC(pScrn, 0));
- } else {
- *crtnum = 2;
+ else
return(SiSInternalDDC(pScrn, 1));
- }
} else
#endif
- if(pSiS->CRT1off) {
- *crtnum = 2;
+ if(pSiS->CRT1off)
return(SiSInternalDDC(pScrn, 1));
- } else {
- *crtnum = 1;
+ else
return(SiSInternalDDC(pScrn, 0));
- }
}
static BOOLEAN
@@ -2263,9 +2039,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = NULL;
#endif
-#if defined(SISMERGED) || defined(SISDUALHEAD)
DisplayModePtr first, p, n;
-#endif
unsigned char srlockReg,crlockReg;
unsigned char tempreg;
xf86MonPtr pMonitor = NULL;
@@ -2274,15 +2048,13 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
vbeInfoPtr pVbe;
VbeInfoBlock *vbe;
+ static const char *exceedlcdstr = "Not using mode \"%s\" (exceeds LCD panel dimension)\n";
+ static const char *nointerlacestr = "Not using mode \"%s\" (interlace not supported on CRT2)\n";
static const char *ddcsstr = "CRT%d DDC monitor info: ************************************\n";
static const char *ddcestr = "End of CRT%d DDC monitor info ******************************\n";
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0)
static const char *subshstr = "Substituting missing CRT%d monitor HSync data by DDC data\n";
static const char *subsvstr = "Substituting missing CRT%d monitor VRefresh data by DDC data\n";
-#endif
#ifdef SISMERGED
- static const char *mergednocrt1 = "CRT1 not detected or forced off. %s.\n";
- static const char *mergednocrt2 = "No CRT2 output selected or no bridge detected. %s.\n";
static const char *mergeddisstr = "MergedFB mode disabled";
static const char *modesforstr = "Modes for CRT%d: *********************************************\n";
static const char *crtsetupstr = "------------------------ CRT%d setup -------------------------\n";
@@ -2322,53 +2094,40 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Check the number of entities, and fail if it isn't one. */
if(pScrn->numEntities != 1) {
- SISErrorLog(pScrn, "Number of entities is not 1\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Number of entities is not 1\n");
return FALSE;
}
/* The vgahw module should be loaded here when needed */
if(!xf86LoadSubModule(pScrn, "vgahw")) {
- SISErrorLog(pScrn, "Could not load vgahw module\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not load vgahw module\n");
return FALSE;
}
xf86LoaderReqSymLists(vgahwSymbols, NULL);
- /* Due to the liberal license terms this is needed for
- * keeping the copyright notice readable and intact in
- * binary distributions. Removing this is a copyright
- * infringement. Please read the license terms above.
- */
-
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "SiS driver (%d/%02d/%02d-%d)\n",
+ "SiS driver (%d/%02d/%02d-%d) by "
+ "Thomas Winischhofer <thomas@winischhofer.net>\n",
SISDRIVERVERSIONYEAR + 2000, SISDRIVERVERSIONMONTH,
SISDRIVERVERSIONDAY, SISDRIVERREVISION);
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Copyright (C) 2001-2004 Thomas Winischhofer <thomas@winischhofer.net> and others\n");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Compiled for X.Org %d.%d.%d.%d\n",
- XF86_VERSION_MAJOR, XF86_VERSION_MINOR,
- XF86_VERSION_PATCH, XF86_VERSION_SNAP);
-#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,2,99,0,0)
- if(xf86GetVersion() != XF86_VERSION_CURRENT) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "This version of the driver is not compiled for this version of X.Org!\n");
- }
-#endif
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"See http://www.winischhofer.net/linuxsisvga.shtml "
"for documentation and updates\n");
/* Allocate a vgaHWRec */
if(!vgaHWGetHWRec(pScrn)) {
- SISErrorLog(pScrn, "Could not allocate VGA private\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not allocate VGA private\n");
return FALSE;
}
/* Allocate the SISRec driverPrivate */
if(!SISGetRec(pScrn)) {
- SISErrorLog(pScrn, "Could not allocate memory for pSiS private\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not allocate memory for pSiS private\n");
return FALSE;
}
pSiS = SISPTR(pScrn);
@@ -2383,7 +2142,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Get the entity, and make sure it is PCI. */
pSiS->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
if(pSiS->pEnt->location.type != BUS_PCI) {
- SISErrorLog(pScrn, "Entity's bus type is not PCI\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Entity's bus type is not PCI\n");
SISFreeRec(pScrn);
return FALSE;
}
@@ -2397,7 +2157,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* If something went wrong, quit here */
if((pSiSEnt->DisableDual) || (pSiSEnt->ErrorAfterFirst)) {
- SISErrorLog(pScrn, "First head encountered fatal error, can't continue\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "First head encountered fatal error, can't continue\n");
SISFreeRec(pScrn);
return FALSE;
}
@@ -2417,7 +2178,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->Primary) {
VGAHWPTR(pScrn)->MapSize = 0x10000; /* Standard 64k VGA window */
if(!vgaHWMapMem(pScrn)) {
- SISErrorLog(pScrn, "Could not map VGA memory\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not map VGA memory\n");
SISFreeRec(pScrn);
return FALSE;
}
@@ -2441,7 +2203,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->pInt = xf86InitInt10(pSiS->pEnt->index);
#endif
} else {
- SISErrorLog(pScrn, "Could not load int10 module\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not load int10 module\n");
}
}
@@ -2464,7 +2227,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* The ramdac module should be loaded here when needed */
if(!xf86LoadSubModule(pScrn, "ramdac")) {
- SISErrorLog(pScrn, "Could not load ramdac module\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not load ramdac module\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -2539,7 +2303,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
* SISProbe(), but check it just in case.
*/
if(pScrn->chipset == NULL) {
- SISErrorLog(pScrn, "ChipID 0x%04X is not recognised\n", pSiS->Chipset);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "ChipID 0x%04X is not recognised\n", pSiS->Chipset);
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -2548,7 +2313,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
}
if(pSiS->Chipset < 0) {
- SISErrorLog(pScrn, "Chipset \"%s\" is not recognised\n", pScrn->chipset);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Chipset \"%s\" is not recognised\n", pScrn->chipset);
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -2557,134 +2323,83 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
}
- /* Determine chipset and VGA engine type */
+ /* Determine chipset and VGA engine type for new mode switching code */
pSiS->ChipFlags = 0;
pSiS->SiS_SD_Flags = 0;
- pSiS->HWCursorMBufNum = pSiS->HWCursorCBufNum = 0;
-
switch(pSiS->Chipset) {
case PCI_CHIP_SIS300:
pSiS->sishw_ext.jChipType = SIS_300;
pSiS->VGAEngine = SIS_300_VGA;
pSiS->SiS_SD_Flags |= SiS_SD_IS300SERIES;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS630: /* 630 + 730 */
pSiS->sishw_ext.jChipType = SIS_630;
if(pciReadLong(0x00000000, 0x00) == 0x07301039) {
- pSiS->sishw_ext.jChipType = SIS_730;
+ pSiS->sishw_ext.jChipType = SIS_730;
}
pSiS->VGAEngine = SIS_300_VGA;
pSiS->SiS_SD_Flags |= SiS_SD_IS300SERIES;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS540:
pSiS->sishw_ext.jChipType = SIS_540;
pSiS->VGAEngine = SIS_300_VGA;
pSiS->SiS_SD_Flags |= SiS_SD_IS300SERIES;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS315H:
pSiS->sishw_ext.jChipType = SIS_315H;
pSiS->VGAEngine = SIS_315_VGA;
- pSiS->ChipFlags |= SiSCF_315Core;
pSiS->SiS_SD_Flags |= SiS_SD_IS315SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS315:
/* Override for simplicity */
pSiS->Chipset = PCI_CHIP_SIS315H;
pSiS->sishw_ext.jChipType = SIS_315;
- pSiS->ChipFlags |= SiSCF_315Core;
pSiS->VGAEngine = SIS_315_VGA;
pSiS->SiS_SD_Flags |= SiS_SD_IS315SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS315PRO:
/* Override for simplicity */
pSiS->Chipset = PCI_CHIP_SIS315H;
pSiS->sishw_ext.jChipType = SIS_315PRO;
- pSiS->ChipFlags |= SiSCF_315Core;
pSiS->VGAEngine = SIS_315_VGA;
- pSiS->SiS_SD_Flags |= SiS_SD_IS315SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS550:
pSiS->sishw_ext.jChipType = SIS_550;
pSiS->VGAEngine = SIS_315_VGA;
pSiS->ChipFlags |= SiSCF_Integrated;
pSiS->SiS_SD_Flags |= SiS_SD_IS315SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS650: /* 650 + 740 */
pSiS->sishw_ext.jChipType = SIS_650;
if(pciReadLong(0x00000000, 0x00) == 0x07401039) {
- pSiS->sishw_ext.jChipType = SIS_740;
+ pSiS->sishw_ext.jChipType = SIS_740;
}
pSiS->VGAEngine = SIS_315_VGA;
- pSiS->ChipFlags |= (SiSCF_Integrated | SiSCF_Real256ECore);
+ pSiS->ChipFlags |= SiSCF_Integrated;
pSiS->SiS_SD_Flags |= SiS_SD_IS315SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 128;
break;
case PCI_CHIP_SIS330:
pSiS->sishw_ext.jChipType = SIS_330;
pSiS->VGAEngine = SIS_315_VGA;
pSiS->ChipFlags |= SiSCF_XabreCore;
pSiS->SiS_SD_Flags |= SiS_SD_IS330SERIES;
- pSiS->myCR63 = 0x63;
- pSiS->mmioSize = 256;
break;
- case PCI_CHIP_SIS660: /* 660, 661, 741, 760 */
- {
- unsigned long hpciid = pciReadLong(0x00000000, 0x00);
- switch(hpciid) {
- case 0x06601039:
- pSiS->sishw_ext.jChipType = SIS_660;
- pSiS->ChipFlags |= SiSCF_Ultra256Core;
- pSiS->mmioSize = 256;
- break;
- case 0x07601039:
- pSiS->sishw_ext.jChipType = SIS_760;
- pSiS->ChipFlags |= SiSCF_Ultra256Core;
- pSiS->mmioSize = 256;
- break;
- case 0x07411039:
- pSiS->sishw_ext.jChipType = SIS_741;
- pSiS->ChipFlags |= SiSCF_Real256ECore;
- pSiS->mmioSize = 128;
- break;
- case 0x06611039:
- default:
- pSiS->sishw_ext.jChipType = SIS_661;
- pSiS->ChipFlags |= SiSCF_Real256ECore;
- pSiS->mmioSize = 128;
+ case PCI_CHIP_SIS660: /* 660 + 760 */
+ pSiS->sishw_ext.jChipType = SIS_660;
+ if(pciReadLong(0x00000000, 0x00) == 0x07601039) {
+ pSiS->sishw_ext.jChipType = SIS_760;
}
- /* Detection could also be done by CR5C & 0xf8:
- 0x10 = 661 (CR5F & 0xc0: 0x00 both A0 and A1)
- 0x80 = 760 (CR5F & 0xc0: 0x00 A0, 0x40 A1)
- 0x90 = 741 (CR5F & 0xc0: 0x00 A0,A1 0x40 A2)
- other: 660 (CR5F & 0xc0: 0x00 A0 0x40 A1) (DOA?)
- */
pSiS->VGAEngine = SIS_315_VGA;
- pSiS->ChipFlags |= SiSCF_Integrated;
+ pSiS->ChipFlags |= (SiSCF_XabreCore | SiSCF_Integrated);
pSiS->SiS_SD_Flags |= SiS_SD_IS330SERIES;
- pSiS->myCR63 = 0x53; /* Yes, 0x53 */
- }
break;
case PCI_CHIP_SIS530:
pSiS->sishw_ext.jChipType = SIS_530;
pSiS->VGAEngine = SIS_530_VGA;
- pSiS->mmioSize = 64;
break;
default:
pSiS->sishw_ext.jChipType = SIS_OLD;
pSiS->VGAEngine = SIS_OLD_VGA;
- pSiS->mmioSize = 64;
break;
}
@@ -2701,12 +2416,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
*/
pSiS->donttrustpdc = FALSE;
- pSiS->sisfbpdc = 0xff;
- pSiS->sisfbpdca = 0xff;
+ pSiS->sisfbpdc = 0;
pSiS->sisfblcda = 0xff;
pSiS->sisfbscalelcd = -1;
pSiS->sisfbspecialtiming = CUT_NONE;
- pSiS->sisfb_haveemi = FALSE;
pSiS->OldMode = 0;
pSiS->sisfbfound = FALSE;
@@ -2761,7 +2474,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Basically, we can't trust the pdc register if sisfb is loaded */
pSiS->donttrustpdc = TRUE;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "sisfb: memory heap starts at %dKB\n", (int)pSiS->sisfbMem);
+ "sisfb: memory heap starts at %dKB\n", pSiS->sisfbMem);
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"sisfb: using video mode 0x%02x\n", mysisfbinfo.fbvidmode);
pSiS->OldMode = mysisfbinfo.fbvidmode;
@@ -2782,7 +2495,6 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->VGAEngine == SIS_300_VGA) {
/* As of 1.5.11, sisfb saved the register for us (300 series) */
pSiS->sisfbpdc = mysisfbinfo.sisfb_lcdpdc;
- if(!pSiS->sisfbpdc) pSiS->sisfbpdc = 0xff;
}
}
if(sisfbversion >= 0x01050E) {
@@ -2797,27 +2509,6 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->VGAEngine == SIS_315_VGA) {
pSiS->donttrustpdc = FALSE;
pSiS->sisfbpdc = mysisfbinfo.sisfb_lcdpdc;
- if(sisfbversion >= 0x010618) {
- pSiS->sisfb_haveemi = mysisfbinfo.sisfb_haveemi ? TRUE : FALSE;
- pSiS->sisfb_haveemilcd = TRUE; /* will match most cases */
- pSiS->sisfb_emi30 = mysisfbinfo.sisfb_emi30;
- pSiS->sisfb_emi31 = mysisfbinfo.sisfb_emi31;
- pSiS->sisfb_emi32 = mysisfbinfo.sisfb_emi32;
- pSiS->sisfb_emi33 = mysisfbinfo.sisfb_emi33;
- }
- if(sisfbversion >= 0x010619) {
- pSiS->sisfb_haveemilcd = mysisfbinfo.sisfb_haveemilcd ? TRUE : FALSE;
- }
- if(sisfbversion >= 0x01061f) {
- pSiS->sisfbpdca = mysisfbinfo.sisfb_lcdpdca;
- } else {
- if(pSiS->sisfbpdc) {
- pSiS->sisfbpdca = (pSiS->sisfbpdc & 0xf0) >> 3;
- pSiS->sisfbpdc = (pSiS->sisfbpdc & 0x0f) << 1;
- } else {
- pSiS->sisfbpdca = pSiS->sisfbpdc = 0xff;
- }
- }
}
}
}
@@ -2872,13 +2563,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->SecondHead = FALSE;
pSiSEnt->pScrn_1 = pScrn;
pSiSEnt->CRT1ModeNo = pSiSEnt->CRT2ModeNo = -1;
- pSiSEnt->CRT2ModeSet = FALSE;
pSiS->DualHeadMode = TRUE;
pSiSEnt->DisableDual = FALSE;
pSiSEnt->BIOS = NULL;
- pSiSEnt->ROM661New = FALSE;
pSiSEnt->SiS_Pr = NULL;
- pSiSEnt->RenderAccelArray = NULL;
} else {
/* Second Head (always CRT1) */
pSiS->SecondHead = TRUE;
@@ -2909,7 +2597,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#endif
if(!pSiS->SiS_Pr) {
if(!(pSiS->SiS_Pr = xnfcalloc(sizeof(SiS_Private), 1))) {
- SISErrorLog(pScrn, "Could not allocate memory for SiS_Pr private\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not allocate memory for SiS_Pr private\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -2925,30 +2614,18 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->SiS_Pr->SiS_CHOverScan = -1;
pSiS->SiS_Pr->SiS_ChSW = FALSE;
pSiS->SiS_Pr->SiS_CustomT = CUT_NONE;
- pSiS->SiS_Pr->PanelSelfDetected = FALSE;
- pSiS->SiS_Pr->UsePanelScaler = -1;
- pSiS->SiS_Pr->CenterScreen = -1;
pSiS->SiS_Pr->CRT1UsesCustomMode = FALSE;
- pSiS->SiS_Pr->PDC = pSiS->SiS_Pr->PDCA = -1;
pSiS->SiS_Pr->LVDSHL = -1;
- pSiS->SiS_Pr->HaveEMI = FALSE;
- pSiS->SiS_Pr->HaveEMILCD = FALSE;
- pSiS->SiS_Pr->OverruleEMI = FALSE;
- pSiS->SiS_Pr->SiS_SensibleSR11 = FALSE;
- if(pSiS->sishw_ext.jChipType >= SIS_661) {
- pSiS->SiS_Pr->SiS_SensibleSR11 = TRUE;
- }
- pSiS->SiS_Pr->SiS_MyCR63 = pSiS->myCR63;
}
/* Get our relocated IO registers */
- pSiS->RelIO = (SISIOADDRESS)((pSiS->PciInfo->ioBase[2] & 0xFFFC) + pSiS->IODBase);
- pSiS->sishw_ext.ulIOAddress = (SISIOADDRESS)(pSiS->RelIO + 0x30);
+ pSiS->RelIO = (pSiS->PciInfo->ioBase[2] & 0xFFFC) + pSiS->IODBase;
+ pSiS->sishw_ext.ulIOAddress = pSiS->RelIO + 0x30;
xf86DrvMsg(pScrn->scrnIndex, from, "Relocated IO registers at 0x%lX\n",
(unsigned long)pSiS->RelIO);
/* Initialize SiS Port Reg definitions for externally used
- * init.c/init301.c functions.
+ * BIOS emulation (init.c/init301.c) functions.
*/
SiSRegInit(pSiS->SiS_Pr, pSiS->RelIO + 0x30);
@@ -2997,7 +2674,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
if(!xf86SetDepthBpp(pScrn, 0, 0, 0, pix24flags)) {
- SISErrorLog(pScrn, "xf86SetDepthBpp() error\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86SetDepthBpp() error\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -3024,7 +2702,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
if(temp) {
- SISErrorLog(pScrn,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Given color depth (%d) is not supported by this driver/chipset\n",
pScrn->depth);
if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
@@ -3037,8 +2715,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if( (((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) &&
(pScrn->bitsPerPixel == 24)) ||
((pSiS->VGAEngine == SIS_OLD_VGA) && (pScrn->bitsPerPixel == 32)) ) {
- SISErrorLog(pScrn,
- "Framebuffer bpp %d not supported for this chipset\n", pScrn->bitsPerPixel);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Framebuffer bpp %d not supported on this chipset\n", pScrn->bitsPerPixel);
if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
SISFreeRec(pScrn);
return FALSE;
@@ -3058,7 +2736,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
rgb zeros = {0, 0, 0};
if(!xf86SetWeight(pScrn, zeros, zeros)) {
- SISErrorLog(pScrn, "xf86SetWeight() error\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86SetWeight() error\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -3085,10 +2764,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
break;
}
if(ret) {
- SISErrorLog(pScrn,
- "RGB weight %d%d%d at depth %d not supported by hardware\n",
- (int)pScrn->weight.red, (int)pScrn->weight.green,
- (int)pScrn->weight.blue, pScrn->depth);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "RGB Weight %d%d%d at depth %d not supported by hardware\n",
+ pScrn->weight.red, pScrn->weight.green,
+ pScrn->weight.blue, pScrn->depth);
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -3105,7 +2784,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* (Inside this function, we can use pScrn's contents anyway) */
if(!xf86SetDefaultVisual(pScrn, -1)) {
- SISErrorLog(pScrn, "xf86SetDefaultVisual() error\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86SetDefaultVisual() error\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -3115,7 +2795,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
} else {
/* We don't support DirectColor at > 8bpp */
if(pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) {
- SISErrorLog(pScrn,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Given default visual (%s) is not supported at depth %d\n",
xf86GetVisualName(pScrn->defaultVisual), pScrn->depth);
#ifdef SISDUALHEAD
@@ -3130,13 +2810,24 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#ifdef SISDUALHEAD
/* Due to palette & timing problems we don't support 8bpp in DHM */
if((pSiS->DualHeadMode) && (pScrn->bitsPerPixel == 8)) {
- SISErrorLog(pScrn, "Color depth 8 not supported in Dual Head mode.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Color depth 8 not supported in Dual Head mode.\n");
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
SISFreeRec(pScrn);
return FALSE;
}
#endif
+#ifdef SISMERGED
+ /* Due to palette & timing problems we don't support 8bpp in MFBM */
+ if((pSiS->MergedFB) && (pScrn->bitsPerPixel == 8)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Color depth 8 not supported in MergedFB mode.\n");
+ if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
+ SISFreeRec(pScrn);
+ return FALSE;
+ }
+#endif
/*
* The cmap layer needs this to be initialised.
@@ -3145,7 +2836,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
Gamma zeros = {0.0, 0.0, 0.0};
if(!xf86SetGamma(pScrn, zeros)) {
- SISErrorLog(pScrn, "xf86SetGamma() error\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86SetGamma() error\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -3163,24 +2855,28 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pScrn->rgbBits = 6;
}
+ pSiS->ddc1Read = SiSddc1Read;
+
from = X_DEFAULT;
/* Unlock registers */
sisSaveUnlockExtRegisterLock(pSiS, &srlockReg, &crlockReg);
+ /* We need no backup area (300/315/330 new mode switching code) */
+ pSiS->sishw_ext.pSR = NULL;
+ pSiS->sishw_ext.pCR = NULL;
+
/* Read BIOS for 300 and 315/330 series customization */
pSiS->sishw_ext.pjVirtualRomBase = NULL;
pSiS->BIOS = NULL;
pSiS->sishw_ext.UseROM = FALSE;
- pSiS->ROM661New = FALSE;
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
#ifdef SISDUALHEAD
if(pSiSEnt) {
- if(pSiSEnt->BIOS) {
- pSiS->BIOS = pSiSEnt->BIOS;
- pSiS->sishw_ext.pjVirtualRomBase = pSiS->BIOS;
- pSiS->ROM661New = pSiSEnt->ROM661New;
+ if(pSiSEnt->BIOS) {
+ pSiS->BIOS = pSiSEnt->BIOS;
+ pSiS->sishw_ext.pjVirtualRomBase = pSiS->BIOS;
}
}
#endif
@@ -3190,8 +2886,20 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
"Could not allocate memory for video BIOS image\n");
} else {
unsigned long segstart;
- unsigned short romptr, pciid;
+ unsigned short romptr;
BOOLEAN found;
+ int i;
+ static const char sis_rom_sig[] = "Silicon Integrated Systems";
+ static const char *sis_sig[13] = {
+ "300", "540", "630", "730",
+ "315", "315", "315", "5315", "6325", "6325",
+ "Xabre", "6330", "6330" /* 6330 is a guess */
+ };
+ static const unsigned short sis_nums[13] = {
+ SIS_300, SIS_540, SIS_630, SIS_730,
+ SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740,
+ SIS_330, SIS_660, SIS_760
+ };
found = FALSE;
for(segstart=BIOS_BASE; segstart<0x000f0000; segstart+=0x00001000) {
@@ -3204,19 +2912,26 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if((pSiS->BIOS[0] != 0x55) || (pSiS->BIOS[1] != 0xaa)) continue;
- romptr = pSiS->BIOS[0x18] | (pSiS->BIOS[0x19] << 8);
- if(romptr > (BIOS_SIZE - 8)) continue;
- if((pSiS->BIOS[romptr] != 'P') || (pSiS->BIOS[romptr+1] != 'C') ||
- (pSiS->BIOS[romptr+2] != 'I') || (pSiS->BIOS[romptr+3] != 'R')) continue;
-
- pciid = pSiS->BIOS[romptr+4] | (pSiS->BIOS[romptr+5] << 8);
- if(pciid != 0x1039) continue;
-
- pciid = pSiS->BIOS[romptr+6] | (pSiS->BIOS[romptr+7] << 8);
- if(pciid != pSiS->Chipset) continue;
-
- found = TRUE;
- break;
+ romptr = pSiS->BIOS[0x12] | (pSiS->BIOS[0x13] << 8);
+ if(romptr > (BIOS_SIZE - strlen(sis_rom_sig))) continue;
+ if(strncmp(sis_rom_sig, (char *)&pSiS->BIOS[romptr], strlen(sis_rom_sig)) != 0) continue;
+
+ romptr = pSiS->BIOS[0x14] | (pSiS->BIOS[0x15] << 8);
+ if(romptr > (BIOS_SIZE - 5)) continue;
+ for(i = 0; (i < 13) && (!found); i++) {
+ if(strncmp(sis_sig[i], (char *)&pSiS->BIOS[romptr], strlen(sis_sig[i])) == 0) {
+ if(sis_nums[i] == pSiS->sishw_ext.jChipType) {
+ found = TRUE;
+ break;
+ } else {
+ if((pSiS->sishw_ext.jChipType != SIS_740) && (pSiS->sishw_ext.jChipType != SIS_760)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Ignoring BIOS for SiS %s at %p\n", sis_sig[i], segstart);
+ }
+ }
+ }
+ }
+ if(found) break;
}
if(!found) {
@@ -3225,18 +2940,14 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
xfree(pSiS->BIOS);
pSiS->BIOS = NULL;
} else {
+#ifdef SISDUALHEAD
+ if(pSiSEnt) pSiSEnt->BIOS = pSiS->BIOS;
+#endif
pSiS->sishw_ext.pjVirtualRomBase = pSiS->BIOS;
- pSiS->ROM661New = SiSDetermineROMLayout661(pSiS->SiS_Pr,&pSiS->sishw_ext);
romptr = pSiS->BIOS[0x16] | (pSiS->BIOS[0x17] << 8);
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Video BIOS version \"%7s\" found at 0x%lx (%s data layout)\n",
- &pSiS->BIOS[romptr], segstart, pSiS->ROM661New ? "new" : "old");
-#ifdef SISDUALHEAD
- if(pSiSEnt) {
- pSiSEnt->BIOS = pSiS->BIOS;
- pSiSEnt->ROM661New = pSiS->ROM661New;
- }
-#endif
+ "Video BIOS version \"%7s\" found at %p\n",
+ &pSiS->BIOS[romptr], segstart);
}
}
}
@@ -3247,14 +2958,6 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Evaluate options */
SiSOptions(pScrn);
-#ifdef SISMERGED
- /* Due to palette & timing problems we don't support 8bpp in MFBM */
- if((pSiS->MergedFB) && (pScrn->bitsPerPixel == 8)) {
- SISErrorLog(pScrn, "MergedFB: Color depth 8 not supported, %s\n", mergeddisstr);
- pSiS->MergedFB = pSiS->MergedFBAuto = FALSE;
- }
-#endif
-
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
if(!pSiS->SecondHead) {
@@ -3266,18 +2969,13 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiSEnt->OptUseOEM = pSiS->OptUseOEM;
pSiSEnt->TurboQueue = pSiS->TurboQueue;
pSiSEnt->forceCRT1 = pSiS->forceCRT1;
- pSiSEnt->ForceCRT1Type = pSiS->ForceCRT1Type;
pSiSEnt->ForceCRT2Type = pSiS->ForceCRT2Type;
pSiSEnt->ForceTVType = pSiS->ForceTVType;
- pSiSEnt->ForceYPbPrType = pSiS->ForceYPbPrType;
- pSiSEnt->ForceYPbPrAR = pSiS->ForceYPbPrAR;
pSiSEnt->UsePanelScaler = pSiS->UsePanelScaler;
- pSiSEnt->CenterLCD = pSiS->CenterLCD;
+ pSiSEnt->PDC = pSiS->PDC;
pSiSEnt->DSTN = pSiS->DSTN;
pSiSEnt->OptTVStand = pSiS->OptTVStand;
pSiSEnt->NonDefaultPAL = pSiS->NonDefaultPAL;
- pSiSEnt->NonDefaultNTSC = pSiS->NonDefaultNTSC;
- pSiSEnt->chtvtype = pSiS->chtvtype;
pSiSEnt->OptTVOver = pSiS->OptTVOver;
pSiSEnt->OptTVSOver = pSiS->OptTVSOver;
pSiSEnt->chtvlumabandwidthcvbs = pSiS->chtvlumabandwidthcvbs;
@@ -3300,17 +2998,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiSEnt->tvxscale = pSiS->tvxscale;
pSiSEnt->tvyscale = pSiS->tvyscale;
pSiSEnt->CRT1gamma = pSiS->CRT1gamma;
- pSiSEnt->CRT1gammaGiven = pSiS->CRT1gammaGiven;
- pSiSEnt->XvGammaRed = pSiS->XvGammaRed;
- pSiSEnt->XvGammaGreen = pSiS->XvGammaGreen;
- pSiSEnt->XvGammaBlue = pSiS->XvGammaBlue;
- pSiSEnt->XvGamma = pSiS->XvGamma;
- pSiSEnt->XvGammaGiven = pSiS->XvGammaGiven;
pSiSEnt->CRT2gamma = pSiS->CRT2gamma;
pSiSEnt->XvOnCRT2 = pSiS->XvOnCRT2;
pSiSEnt->AllowHotkey = pSiS->AllowHotkey;
pSiSEnt->enablesisctrl = pSiS->enablesisctrl;
- pSiSEnt->SenseYPbPr = pSiS->SenseYPbPr;
#ifdef SIS_CP
SIS_CP_DRIVER_COPYOPTIONSENT
#endif
@@ -3334,6 +3025,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
"Master head ruled: Acceleration shall be %s\n",
pSiS->NoAccel ? "disabled" : "enabled");
}
+
pSiS->TurboQueue = pSiSEnt->TurboQueue;
pSiS->restorebyset = pSiSEnt->restorebyset;
pSiS->AllowHotkey = pSiS->AllowHotkey;
@@ -3342,18 +3034,13 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->forceCRT1 = pSiSEnt->forceCRT1;
pSiS->nocrt2ddcdetection = FALSE;
pSiS->forcecrt2redetection = FALSE;
- pSiS->ForceCRT1Type = pSiSEnt->ForceCRT1Type;
pSiS->ForceCRT2Type = pSiSEnt->ForceCRT2Type;
pSiS->UsePanelScaler = pSiSEnt->UsePanelScaler;
- pSiS->CenterLCD = pSiSEnt->CenterLCD;
+ pSiS->PDC = pSiSEnt->PDC;
pSiS->DSTN = pSiSEnt->DSTN;
pSiS->OptTVStand = pSiSEnt->OptTVStand;
- pSiS->NonDefaultPAL = pSiSEnt->NonDefaultPAL;
- pSiS->NonDefaultNTSC = pSiSEnt->NonDefaultNTSC;
pSiS->chtvtype = pSiSEnt->chtvtype;
pSiS->ForceTVType = pSiSEnt->ForceTVType;
- pSiS->ForceYPbPrType = pSiSEnt->ForceYPbPrType;
- pSiS->ForceYPbPrAR = pSiSEnt->ForceYPbPrAR;
pSiS->OptTVOver = pSiSEnt->OptTVOver;
pSiS->OptTVSOver = pSiSEnt->OptTVSOver;
pSiS->chtvlumabandwidthcvbs = pSiSEnt->chtvlumabandwidthcvbs;
@@ -3375,29 +3062,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->tvypos = pSiSEnt->tvypos;
pSiS->tvxscale = pSiSEnt->tvxscale;
pSiS->tvyscale = pSiSEnt->tvyscale;
- pSiS->SenseYPbPr = pSiSEnt->SenseYPbPr;
- if(!pSiS->CRT1gammaGiven) {
- if(pSiSEnt->CRT1gammaGiven)
- pSiS->CRT1gamma = pSiSEnt->CRT1gamma;
- }
+ pSiS->CRT1gamma = pSiSEnt->CRT1gamma;
pSiS->CRT2gamma = pSiSEnt->CRT2gamma;
- if(!pSiS->XvGammaGiven) {
- if(pSiSEnt->XvGammaGiven) {
- pSiS->XvGamma = pSiSEnt->XvGamma;
- pSiS->XvGammaRed = pSiS->XvGammaRedDef = pSiSEnt->XvGammaRed;
- pSiS->XvGammaGreen = pSiS->XvGammaGreenDef = pSiSEnt->XvGammaGreen;
- pSiS->XvGammaBlue = pSiS->XvGammaBlueDef = pSiSEnt->XvGammaBlue;
- }
- }
pSiS->XvOnCRT2 = pSiSEnt->XvOnCRT2;
pSiS->enablesisctrl = pSiSEnt->enablesisctrl;
- /* Copy gamma brightness to Ent for Xinerama */
- pSiSEnt->GammaBriR = pSiS->GammaBriR;
- pSiSEnt->GammaBriG = pSiS->GammaBriG;
- pSiSEnt->GammaBriB = pSiS->GammaBriB;
- pSiSEnt->GammaPBriR = pSiS->GammaPBriR;
- pSiSEnt->GammaPBriG = pSiS->GammaPBriG;
- pSiSEnt->GammaPBriB = pSiS->GammaPBriB;
#ifdef SIS_CP
SIS_CP_DRIVER_COPYOPTIONS
#endif
@@ -3411,14 +3079,14 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->OptROMUsage == 0) {
pSiS->sishw_ext.UseROM = FALSE;
from = X_CONFIG;
- xf86DrvMsg(pScrn->scrnIndex, from, "Video ROM data usage is disabled\n");
}
+ xf86DrvMsg(pScrn->scrnIndex, from, "Video ROM data usage is %s\n",
+ pSiS->sishw_ext.UseROM ? "enabled" : "disabled");
if(!pSiS->OptUseOEM)
xf86DrvMsg(pScrn->scrnIndex, from, "Internal OEM LCD/TV/VGA2 data usage is disabled\n");
pSiS->SiS_Pr->UsePanelScaler = pSiS->UsePanelScaler;
- pSiS->SiS_Pr->CenterScreen = pSiS->CenterLCD;
}
/* Do basic configuration */
@@ -3452,41 +3120,36 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
* XXX Should check that the config file value matches one of the
* PCI base address values.
*/
- pSiS->IOAddress = pSiS->pEnt->device->IOBase;
- from = X_CONFIG;
+ pSiS->IOAddress = pSiS->pEnt->device->IOBase;
+ from = X_CONFIG;
} else {
- pSiS->IOAddress = pSiS->PciInfo->memBase[1] & 0xFFFFFFF0;
+ pSiS->IOAddress = pSiS->PciInfo->memBase[1] & 0xFFFFFFF0;
}
- xf86DrvMsg(pScrn->scrnIndex, from, "MMIO registers at 0x%lX (size %ldK)\n",
- (unsigned long)pSiS->IOAddress, pSiS->mmioSize);
+ xf86DrvMsg(pScrn->scrnIndex, from, "MMIO registers at 0x%lX\n",
+ (unsigned long)pSiS->IOAddress);
pSiS->sishw_ext.bIntegratedMMEnabled = TRUE;
/* Register the PCI-assigned resources. */
if(xf86RegisterResources(pSiS->pEnt->index, NULL, ResExclusive)) {
- SISErrorLog(pScrn, "xf86RegisterResources() found resource conflicts\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86RegisterResources() found resource conflicts\n");
#ifdef SISDUALHEAD
- if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
+ if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
- if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
- sisRestoreExtRegisterLock(pSiS,srlockReg,crlockReg);
- SISFreeRec(pScrn);
- return FALSE;
+ if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
+ sisRestoreExtRegisterLock(pSiS,srlockReg,crlockReg);
+ SISFreeRec(pScrn);
+ return FALSE;
}
from = X_PROBED;
- if(pSiS->pEnt->device->videoRam != 0) {
- if(pSiS->Chipset == PCI_CHIP_SIS6326) {
- pScrn->videoRam = pSiS->pEnt->device->videoRam;
- from = X_CONFIG;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Option \"VideoRAM\" ignored\n");
- }
+ if(pSiS->pEnt->device->videoRam != 0) {
+ pScrn->videoRam = pSiS->pEnt->device->videoRam;
+ from = X_CONFIG;
}
pSiS->RealVideoRam = pScrn->videoRam;
-
if((pSiS->Chipset == PCI_CHIP_SIS6326)
&& (pScrn->videoRam > 4096)
&& (from != X_CONFIG)) {
@@ -3494,10 +3157,9 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
xf86DrvMsg(pScrn->scrnIndex, from,
"SiS6326: Detected %d KB VideoRAM, limiting to %d KB\n",
pSiS->RealVideoRam, pScrn->videoRam);
- } else {
+ } else
xf86DrvMsg(pScrn->scrnIndex, from, "VideoRAM: %d KB\n",
pScrn->videoRam);
- }
if((pSiS->Chipset == PCI_CHIP_SIS6326) &&
(pScrn->videoRam > 4096)) {
@@ -3542,7 +3204,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->cursorBufferNum = 0;
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->cursorBufferNum = 0;
-#endif
+#endif
break;
case SIS_315_VGA:
@@ -3564,8 +3226,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
#endif
if(pSiS->HWCursor) {
- pSiS->availMem -= (pSiS->CursorSize * 2);
- if(pSiS->OptUseColorCursor) pSiS->availMem -= (pSiS->CursorSize * 2);
+ pSiS->availMem -= pSiS->CursorSize;
+ if(pSiS->OptUseColorCursor) pSiS->availMem -= pSiS->CursorSize;
}
pSiS->cursorBufferNum = 0;
#ifdef SISDUALHEAD
@@ -3650,17 +3312,17 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->maxxfbmem > pSiS->availMem) {
if(pSiS->sisfbMem) {
pSiS->maxxfbmem = pSiS->sisfbMem * 1024;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Invalid MaxXFBMem setting. Using sisfb heap start information\n");
} else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Invalid MaxXFBMem setting. Using all VideoRAM for framebuffer\n");
pSiS->maxxfbmem = pSiS->availMem;
}
} else if(pSiS->sisfbMem) {
if(pSiS->maxxfbmem > pSiS->sisfbMem * 1024) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "MaxXFBMem beyond sisfb heap start. Using sisfb heap start\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "MaxXFBMem beyond sisfb heap start. Using sisfb heap start information\n");
pSiS->maxxfbmem = pSiS->sisfbMem * 1024;
}
}
@@ -3669,8 +3331,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
else pSiS->maxxfbmem = pSiS->availMem;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %ldK of framebuffer memory\n",
- pSiS->maxxfbmem / 1024);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %dK of framebuffer memory\n",
+ pSiS->maxxfbmem / 1024);
/* Find out about sub-classes of some chipsets and check
* if the chipset supports two video overlays
@@ -3693,29 +3355,25 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
break;
case PCI_CHIP_SIS330:
pSiS->ChipFlags |= SiSCF_LARGEOVERLAY;
- pSiS->ChipFlags |= SiSCF_CRT2HWCKaputt;
break;
case PCI_CHIP_SIS660:
{
-#if 0
- static const char *id661str[] = {
- "661 ?", "661 ?", "661 ?", "661 ?",
- "661 ?", "661 ?", "661 ?", "661 ?",
- "661 ?", "661 ?", "661 ?", "661 ?",
- "661 ?", "661 ?", "661 ?", "661 ?"
+ static const char *id660str[] = {
+ "660 ?", "660 ?", "660 ?", "660 ?",
+ "660 ?", "660 ?", "660 ?", "660 ?",
+ "660 ?", "660 ?", "660 ?", "660 ?",
+ "660 ?", "660 ?", "660 ?", "660 ?"
};
-#endif
pSiS->ChipFlags |= SiSCF_LARGEOVERLAY;
+ /* This is a wild guess */
pSiS->hasTwoOverlays = TRUE;
pSiS->SiS_SD_Flags |= SiS_SD_SUPPORT2OVL;
-#if 0
- if(pSiS->sishw_ext.jChipType == SIS_661) {
+ if(pSiS->sishw_ext.jChipType == SIS_660) {
inSISIDXREG(SISCR, 0x5f, CR5F);
CR5F &= 0xf0;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "SiS661FX revision ID %x (%s)\n", CR5F, id661str[CR5F >> 4]);
+ "SiS660 revision ID %x (%s)\n", CR5F, id660str[CR5F >> 4]);
}
-#endif
break;
}
case PCI_CHIP_SIS650:
@@ -3805,18 +3463,18 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Backup VB connection and CRT1 on/off register */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- inSISIDXREG(SISSR, 0x1f, pSiS->oldSR1F);
- inSISIDXREG(SISCR, 0x17, pSiS->oldCR17);
inSISIDXREG(SISCR, 0x32, pSiS->oldCR32);
- inSISIDXREG(SISCR, 0x36, pSiS->oldCR36);
- inSISIDXREG(SISCR, 0x37, pSiS->oldCR37);
- if(pSiS->VGAEngine == SIS_315_VGA) {
- inSISIDXREG(SISCR, pSiS->myCR63, pSiS->oldCR63);
- }
-
+ inSISIDXREG(SISCR, 0x17, pSiS->oldCR17);
+ inSISIDXREG(SISCR, 0x63, pSiS->oldCR63);
+ inSISIDXREG(SISSR, 0x1f, pSiS->oldSR1F);
pSiS->postVBCR32 = pSiS->oldCR32;
}
+ if(pSiS->forceCRT1 != -1) {
+ if(pSiS->forceCRT1) pSiS->CRT1off = 0;
+ else pSiS->CRT1off = 1;
+ } else pSiS->CRT1off = -1;
+
/* There are some machines out there which require a special
* setup of the GPIO registers in order to make the Chrontel
* work. Try to find out if we're running on such a machine.
@@ -3894,232 +3552,104 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
} while(mycustomttable[i].chipID);
}
- /* Handle ForceCRT1 option */
- if(pSiS->forceCRT1 != -1) {
- if(pSiS->forceCRT1) pSiS->CRT1off = 0;
- else pSiS->CRT1off = 1;
- } else pSiS->CRT1off = -1;
-
- /* Detect video bridge and sense TV/VGA2 */
+ /* Detect video bridge and sense connected devices */
SISVGAPreInit(pScrn);
-
- /* Detect CRT1 (via DDC1 and DDC2, hence via VGA port; regardless of LCDA) */
+ /* Detect CRT1 */
SISCRT1PreInit(pScrn);
-
- /* Detect LCD (connected via CRT2, regardless of LCDA) and LCD resolution */
+ /* Detect CRT2-LCD and LCD size */
SISLCDPreInit(pScrn);
-
- /* LCDA only supported under these conditions: */
- if(pSiS->ForceCRT1Type == CRT1_LCDA) {
- if( ((pSiS->sishw_ext.jChipType != SIS_650) &&
- (pSiS->sishw_ext.jChipType < SIS_661)) ||
- (!(pSiS->VBFlags & (VB_301C | VB_302B | VB_301LV | VB_302LV))) ) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Chipset/Video bridge does not support LCD-via-CRT1\n");
- pSiS->ForceCRT1Type = CRT1_VGA;
- } else if(!(pSiS->VBFlags & CRT2_LCD)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "No digitally connected LCD panel found, LCD-via-CRT1 disabled\n");
- pSiS->ForceCRT1Type = CRT1_VGA;
- }
- }
-
- /* Setup SD flags */
- pSiS->SiS_SD_Flags |= SiS_SD_ADDLSUPFLAG;
-
- if(pSiS->VBFlags & (VB_SISTVBRIDGE | VB_CHRONTEL)) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTTV;
- }
-
-#ifdef ENABLE_YPBPR
- if((pSiS->VGAEngine == SIS_315_VGA) &&
- (pSiS->VBFlags & (VB_301C|VB_301LV|VB_302LV|VB_302ELV))) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTYPBPR;
- if((pSiS->Chipset == PCI_CHIP_SIS660) || (pSiS->VBFlags & VB_301C)) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTYPBPRAR;
- }
- }
- if(pSiS->VBFlags & (VB_301|VB_301B|VB_302B)) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTHIVISION;
- }
-#endif
-
- if(pSiS->VBFlags & CRT2_LCD) {
- if((pSiS->VGAEngine != SIS_300_VGA) || (!(pSiS->VBFlags & VB_TRUMPION))) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTSCALE;
- if(pSiS->VBFlags & (VB_301|VB_301B|VB_302B|VB_301C)) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTCENTER;
- }
- }
- }
-
-#ifdef TWDEBUG /* @@@ TEST @@@ */
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTYPBPRAR;
- xf86DrvMsg(0, X_INFO, "TEST: Support Aspect Ratio\n");
-#endif
-
/* Detect CRT2-TV and PAL/NTSC mode */
SISTVPreInit(pScrn);
-
/* Detect CRT2-VGA */
SISCRT2PreInit(pScrn);
/* Backup detected CRT2 devices */
- pSiS->detectedCRT2Devices = pSiS->VBFlags & (CRT2_LCD|CRT2_TV|CRT2_VGA|TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR);
-
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR)) {
- if((pSiS->ForceTVType != -1) && (pSiS->ForceTVType & TV_YPBPR)) {
- pSiS->ForceTVType = -1;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "YPbPr TV output not supported\n");
- }
- }
-
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTHIVISION)) {
- if((pSiS->ForceTVType != -1) && (pSiS->ForceTVType & TV_HIVISION)) {
- pSiS->ForceTVType = -1;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "HiVision TV output not supported\n");
- }
- }
+ pSiS->detectedCRT2Devices = pSiS->VBFlags & (CRT2_LCD | CRT2_TV | CRT2_VGA | TV_AVIDEO | TV_SVIDEO | TV_SCART);
- if((pSiS->VBFlags & VB_SISTVBRIDGE) ||
+ if((pSiS->VBFlags & VB_SISBRIDGE) ||
((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->ChrontelType == CHRONTEL_701x))) {
- pSiS->SiS_SD_Flags |= (SiS_SD_SUPPORTPALMN | SiS_SD_SUPPORTNTSCJ);
+ pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTPALMN;
}
- if((pSiS->VBFlags & VB_SISTVBRIDGE) ||
+ if((pSiS->VBFlags & VB_SISBRIDGE) ||
((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->ChrontelType == CHRONTEL_700x))) {
pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTTVPOS;
}
- if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) {
- pSiS->SiS_SD_Flags |= (SiS_SD_SUPPORTSCART | SiS_SD_SUPPORTVGA2);
+ if((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->ChrontelType == CHRONTEL_700x)) {
+ pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTSOVER;
}
- if(pSiS->VBFlags & VB_CHRONTEL) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTOVERSCAN;
- if(pSiS->ChrontelType == CHRONTEL_700x) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTSOVER;
- }
- }
-
- if( ((pSiS->sishw_ext.jChipType == SIS_650) ||
- (pSiS->sishw_ext.jChipType >= SIS_661)) &&
- (pSiS->VBFlags & (VB_301C | VB_302B | VB_301LV | VB_302LV)) &&
- (pSiS->VBFlags & CRT2_LCD) &&
- (pSiS->VESA != 1) ) {
- pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTLCDA;
- } else {
- /* Paranoia */
- pSiS->ForceCRT1Type = CRT1_VGA;
- }
-
- pSiS->VBFlags |= pSiS->ForceCRT1Type;
-
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "SDFlags %lx\n", pSiS->SiS_SD_Flags);
-#endif
/* Eventually overrule detected CRT2 type
- * If no type forced, use the detected devices in the order TV->LCD->VGA2
+ * If no type forced, use the detected devices in the order VGA2->TV->LCD
* Since the Chrontel 7005 sometimes delivers wrong detection results,
* we use a different order on such machines (LCD->TV)
*/
if(pSiS->ForceCRT2Type == CRT2_DEFAULT) {
- if((pSiS->VBFlags & CRT2_TV) && (!((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->VGAEngine == SIS_300_VGA))))
+ if(pSiS->VBFlags & CRT2_VGA)
+ pSiS->ForceCRT2Type = CRT2_VGA;
+ else if((pSiS->VBFlags & CRT2_TV) && (!((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->VGAEngine == SIS_300_VGA))))
pSiS->ForceCRT2Type = CRT2_TV;
- else if((pSiS->VBFlags & CRT2_LCD) && (pSiS->ForceCRT1Type == CRT1_VGA))
+ else if(pSiS->VBFlags & CRT2_LCD)
pSiS->ForceCRT2Type = CRT2_LCD;
else if(pSiS->VBFlags & CRT2_TV)
pSiS->ForceCRT2Type = CRT2_TV;
- else if(pSiS->VBFlags & CRT2_VGA)
- pSiS->ForceCRT2Type = CRT2_VGA;
}
switch(pSiS->ForceCRT2Type) {
case CRT2_TV:
- pSiS->VBFlags &= ~(CRT2_LCD | CRT2_VGA);
- if(pSiS->VBFlags & (VB_SISTVBRIDGE | VB_CHRONTEL))
- pSiS->VBFlags |= CRT2_TV;
- else {
- pSiS->VBFlags &= ~(CRT2_TV);
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware does not support TV output\n");
- }
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD | CRT2_VGA);
+ if(pSiS->VBFlags & VB_VIDEOBRIDGE)
+ pSiS->VBFlags = pSiS->VBFlags | CRT2_TV;
+ else
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV);
break;
case CRT2_LCD:
- pSiS->VBFlags &= ~(CRT2_TV | CRT2_VGA);
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_VGA);
if((pSiS->VBFlags & VB_VIDEOBRIDGE) && (pSiS->VBLCDFlags))
- pSiS->VBFlags |= CRT2_LCD;
+ pSiS->VBFlags = pSiS->VBFlags | CRT2_LCD;
else {
- pSiS->VBFlags &= ~(CRT2_LCD);
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_LCD);
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Can't force CRT2 to LCD, no LCD detected\n");
+ "Can't force CRT2 to LCD, no panel detected\n");
}
break;
case CRT2_VGA:
- pSiS->VBFlags &= ~(CRT2_TV | CRT2_LCD);
- if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))
- pSiS->VBFlags |= CRT2_VGA;
- else {
- pSiS->VBFlags &= ~(CRT2_VGA);
+ if(pSiS->VBFlags & VB_LVDS) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "LVDS does not support secondary VGA\n");
+ break;
+ } else if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Hardware does not support secondary VGA\n");
+ "SiS30xLV bridge does not support secondary VGA\n");
+ break;
}
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_TV | CRT2_LCD);
+ if(pSiS->VBFlags & VB_VIDEOBRIDGE)
+ pSiS->VBFlags = pSiS->VBFlags | CRT2_VGA;
+ else
+ pSiS->VBFlags = pSiS->VBFlags & ~(CRT2_VGA);
break;
default:
pSiS->VBFlags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA);
}
-
-#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (pSiS->SecondHead)) {
-#endif
- xf86DrvMsg(pScrn->scrnIndex, pSiS->CRT1gammaGiven ? X_CONFIG : X_INFO,
- "CRT1 gamma correction is %s\n",
- pSiS->CRT1gamma ? "enabled" : "disabled");
-
- if((pSiS->VGAEngine == SIS_315_VGA) && (!(pSiS->NoXvideo))) {
- xf86DrvMsg(pScrn->scrnIndex, pSiS->XvGammaGiven ? X_CONFIG : X_INFO,
- "Separate Xv gamma correction for CRT1 is %s\n",
- pSiS->XvGamma ? "enabled" : "disabled");
- if(pSiS->XvGamma) {
- xf86DrvMsg(pScrn->scrnIndex, pSiS->XvGammaGiven ? X_CONFIG : X_INFO,
- "Xv gamma correction: %.3f %.3f %.3f\n",
- (float)((float)pSiS->XvGammaRed / 1000),
- (float)((float)pSiS->XvGammaGreen / 1000),
- (float)((float)pSiS->XvGammaBlue / 1000));
- if(!pSiS->CRT1gamma) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Separate Xv gamma corr. only effective if CRT1 gamma corr. is enabled\n");
- }
- }
- }
-#ifdef SISDUALHEAD
- }
-#endif
-
+
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- if( (pSiS->VBFlags & VB_SISBRIDGE) &&
+ if( (pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) &&
(!((pSiS->VBFlags & VB_30xBDH) && (pSiS->VBFlags & CRT2_LCD))) ) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CRT2 gamma correction is %s\n",
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "CRT2 gamma correction is %s\n",
pSiS->CRT2gamma ? "enabled" : "disabled");
}
}
- /* Eventually overrule TV Type (SVIDEO, COMPOSITE, SCART, HIVISION, YPBPR) */
- if(pSiS->VBFlags & VB_SISTVBRIDGE) {
- if(pSiS->ForceTVType != -1) {
+ /* Eventually overrule TV Type (SVIDEO, COMPOSITE, SCART) */
+ if(pSiS->ForceTVType != -1) {
+ if(pSiS->VBFlags & VB_SISBRIDGE) {
pSiS->VBFlags &= ~(TV_INTERFACE);
- if(!(pSiS->VBFlags & VB_CHRONTEL)) {
- pSiS->VBFlags &= ~(TV_CHSCART | TV_CHYPBPR525I);
- }
pSiS->VBFlags |= pSiS->ForceTVType;
- if(pSiS->VBFlags & TV_YPBPR) {
- pSiS->VBFlags &= ~(TV_STANDARD);
- pSiS->VBFlags &= ~(TV_YPBPRAR);
- pSiS->VBFlags |= pSiS->ForceYPbPrType;
- pSiS->VBFlags |= pSiS->ForceYPbPrAR;
- }
}
}
- /* Handle ForceCRT1 option (part 2) */
+ /* Handle ForceCRT1 option */
pSiS->CRT1changed = FALSE;
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
usScratchCR17 = pSiS->oldCR17;
@@ -4167,7 +3697,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
*/
outSISIDXREG(SISCR, 0x17, usScratchCR17);
if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISCR, pSiS->myCR63, usScratchCR63);
+ outSISIDXREG(SISCR, 0x63, usScratchCR63);
}
outSISIDXREG(SISCR, 0x32, usScratchCR32);
if(pSiS->CRT1changed) {
@@ -4208,37 +3738,38 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->XvOnCRT2 = FALSE;
}
- /* LCDA? Then we don't switch off CRT1 */
- if(pSiS->VBFlags & CRT1_LCDA) pSiS->CRT1off = 0;
-
/* Handle TVStandard option */
- if((pSiS->NonDefaultPAL != -1) || (pSiS->NonDefaultNTSC != -1)) {
- if( (!(pSiS->VBFlags & VB_SISTVBRIDGE)) &&
+ if(pSiS->NonDefaultPAL != -1) {
+ if( (!(pSiS->VBFlags & VB_SISBRIDGE)) &&
(!((pSiS->VBFlags & VB_CHRONTEL)) && (pSiS->ChrontelType == CHRONTEL_701x)) ) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "PALM, PALN and NTSCJ not supported on this hardware\n");
- pSiS->NonDefaultPAL = pSiS->NonDefaultNTSC = -1;
- pSiS->VBFlags &= ~(TV_PALN | TV_PALM | TV_NTSCJ);
- pSiS->SiS_SD_Flags &= ~(SiS_SD_SUPPORTPALMN | SiS_SD_SUPPORTNTSCJ);
+ "PALM and PALN only supported on Chrontel 701x and SiS30x/B/LV\n");
+ pSiS->NonDefaultPAL = -1;
+ pSiS->VBFlags &= ~(TV_PALN | TV_PALM);
+ pSiS->SiS_SD_Flags &= ~SiS_SD_SUPPORTPALMN;
+ }
+ }
+ if(pSiS->NonDefaultPAL != -1) {
+ if((pSiS->Chipset == PCI_CHIP_SIS300) || (pSiS->Chipset == PCI_CHIP_SIS540)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "PALM and PALN not supported on SiS300 and SiS540\n");
+ pSiS->NonDefaultPAL = -1;
+ pSiS->VBFlags &= ~(TV_PALN | TV_PALM);
+ pSiS->SiS_SD_Flags &= ~SiS_SD_SUPPORTPALMN;
}
}
if(pSiS->OptTVStand != -1) {
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- if( (!((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->VBFlags & (TV_CHSCART | TV_CHYPBPR525I)))) &&
- (!(pSiS->VBFlags & (TV_HIVISION | TV_YPBPR))) ) {
- pSiS->VBFlags &= ~(TV_PAL | TV_NTSC | TV_PALN | TV_PALM | TV_NTSCJ);
- if(pSiS->OptTVStand) {
- pSiS->VBFlags |= TV_PAL;
- if(pSiS->NonDefaultPAL == 1) pSiS->VBFlags |= TV_PALM;
- else if(!pSiS->NonDefaultPAL) pSiS->VBFlags |= TV_PALN;
- } else {
- pSiS->VBFlags |= TV_NTSC;
- if(pSiS->NonDefaultNTSC == 1) pSiS->VBFlags |= TV_NTSCJ;
- }
+ if(!(pSiS->Flags & (TV_CHSCART | TV_CHHDTV))) {
+ pSiS->VBFlags &= ~(TV_PAL | TV_NTSC | TV_PALN | TV_PALM);
+ if(pSiS->OptTVStand) pSiS->VBFlags |= TV_PAL;
+ else pSiS->VBFlags |= TV_NTSC;
+ if(pSiS->NonDefaultPAL == 1) pSiS->VBFlags |= TV_PALM;
+ else if(!pSiS->NonDefaultPAL) pSiS->VBFlags |= TV_PALN;
} else {
pSiS->OptTVStand = pSiS->NonDefaultPAL = -1;
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Option TVStandard ignored for YPbPr, HiVision and Chrontel-SCART\n");
+ "Option TVStandard ignored for SCART and 480i HDTV\n");
}
} else if(pSiS->Chipset == PCI_CHIP_SIS6326) {
pSiS->SiS6326Flags &= ~SIS6326_TVPAL;
@@ -4249,10 +3780,10 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* SCART only supported for PAL */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
if((pSiS->VBFlags & VB_SISBRIDGE) && (pSiS->VBFlags & TV_SCART)) {
- pSiS->VBFlags &= ~(TV_NTSC | TV_PALN | TV_PALM | TV_NTSCJ);
+ pSiS->VBFlags &= ~(TV_NTSC | TV_PALN | TV_PALM);
pSiS->VBFlags |= TV_PAL;
pSiS->OptTVStand = 1;
- pSiS->NonDefaultPAL = pSiS->NonDefaultNTSC = -1;
+ pSiS->NonDefaultPAL = -1;
}
}
@@ -4290,20 +3821,14 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->sistvedgeenhance = -1;
}
}
- if(pSiS->sistvsaturation != -1) {
- if(pSiS->VBFlags & VB_301) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "SISTVSaturation not supported on SiS301\n");
- pSiS->sistvsaturation = -1;
- }
- }
/* Do some MergedFB mode initialisation */
#ifdef SISMERGED
if(pSiS->MergedFB) {
pSiS->CRT2pScrn = xalloc(sizeof(ScrnInfoRec));
if(!pSiS->CRT2pScrn) {
- SISErrorLog(pScrn, "Failed to allocate memory for 2nd pScrn, %s\n", mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate memory for merged pScrn, %s\n", mergeddisstr);
pSiS->MergedFB = FALSE;
} else {
memcpy(pSiS->CRT2pScrn, pScrn, sizeof(ScrnInfoRec));
@@ -4322,7 +3847,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->CRT1off) { /* CRT2 only ------------------------------- */
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- SISErrorLog(pScrn,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"CRT1 not detected or forced off. Dual Head mode can't initialize.\n");
if(pSiSEnt) pSiSEnt->DisableDual = TRUE;
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
@@ -4335,11 +3860,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
- if(pSiS->MergedFBAuto) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt1, mergeddisstr);
- } else {
- SISErrorLog(pScrn, mergednocrt1, mergeddisstr);
- }
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "CRT1 not detected or forced off. %s.\n", mergeddisstr);
if(pSiS->CRT2pScrn) xfree(pSiS->CRT2pScrn);
pSiS->CRT2pScrn = NULL;
pSiS->MergedFB = FALSE;
@@ -4374,7 +3896,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
} else { /* CRT1 only ------------------------------- */
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- SISErrorLog(pScrn,
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"No CRT2 output selected or no bridge detected. "
"Dual Head mode can't initialize.\n");
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
@@ -4387,11 +3909,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
- if(pSiS->MergedFBAuto) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, mergednocrt2, mergeddisstr);
- } else {
- SISErrorLog(pScrn, mergednocrt2, mergeddisstr);
- }
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "No CRT2 output selected or no bridge detected. %s.", mergeddisstr);
if(pSiS->CRT2pScrn) xfree(pSiS->CRT2pScrn);
pSiS->CRT2pScrn = NULL;
pSiS->MergedFB = FALSE;
@@ -4400,7 +3919,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->VBFlags |= (VB_DISPMODE_SINGLE | DISPTYPE_CRT1);
}
- if((pSiS->VGAEngine == SIS_315_VGA) || (pSiS->VGAEngine == SIS_300_VGA)) {
+ if((pSiS->VGAEngine == SIS_315_VGA) ||
+ (pSiS->VGAEngine == SIS_300_VGA) ) {
if((!pSiS->NoXvideo) && (!pSiS->hasTwoOverlays)) {
xf86DrvMsg(pScrn->scrnIndex, from,
"Using Xv overlay by default on CRT%d\n",
@@ -4416,219 +3936,129 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* VBFlags are initialized now. Back them up for SlaveMode modes. */
pSiS->VBFlags_backup = pSiS->VBFlags;
- /* Backup CR32,36,37 (in order to write them back after a VT switch) */
- if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- inSISIDXREG(SISCR,0x32,pSiS->myCR32);
- inSISIDXREG(SISCR,0x36,pSiS->myCR36);
- inSISIDXREG(SISCR,0x37,pSiS->myCR37);
- }
-
/* Find out about paneldelaycompensation and evaluate option */
-#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (!pSiS->SecondHead)) {
-#endif
- if(pSiS->VGAEngine == SIS_300_VGA) {
-
- if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
-
- /* Save the current PDC if the panel is used at the moment.
- * This seems by far the safest way to find out about it.
- * If the system is using an old version of sisfb, we can't
- * trust the pdc register value. If sisfb saved the pdc for
- * us, use it.
- */
- if(pSiS->sisfbpdc != 0xff) {
- pSiS->SiS_Pr->PDC = pSiS->sisfbpdc;
- } else {
- if(!(pSiS->donttrustpdc)) {
- unsigned char tmp;
- inSISIDXREG(SISCR, 0x30, tmp);
- if(tmp & 0x20) {
- inSISIDXREG(SISPART1, 0x13, pSiS->SiS_Pr->PDC);
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Unable to detect LCD PanelDelayCompensation, LCD is not active\n");
- }
- } else {
+ pSiS->sishw_ext.pdc = 0;
+
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
+ /* Save the current PDC if the panel is used at the moment.
+ * This seems by far the safest way to find out about it.
+ * If the system is using an old version of sisfb, we can't
+ * trust the pdc register value. If sisfb saved the pdc for
+ * us, use it.
+ */
+ if(pSiS->sisfbpdc) {
+ pSiS->sishw_ext.pdc = pSiS->sisfbpdc;
+ } else {
+ if(!(pSiS->donttrustpdc)) {
+ unsigned char tmp;
+ inSISIDXREG(SISCR, 0x30, tmp);
+ if(tmp & 0x20) {
+ inSISIDXREG(SISPART1, 0x13, pSiS->sishw_ext.pdc);
+ } else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Unable to detect LCD PanelDelayCompensation, please update sisfb\n");
- }
- }
- if(pSiS->SiS_Pr->PDC != -1) {
- pSiS->SiS_Pr->PDC &= 0x3c;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected LCD PanelDelayCompensation 0x%02x\n",
- pSiS->SiS_Pr->PDC);
- }
+ "Unable to detect LCD PanelDelayCompensation, LCD is not active\n");
+ }
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Unable to detect LCD PanelDelayCompensation, please update sisfb\n");
+ }
+ }
+ pSiS->sishw_ext.pdc &= 0x3c;
+ if(pSiS->sishw_ext.pdc) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected LCD PanelDelayCompensation %d\n",
+ pSiS->sishw_ext.pdc);
+ }
+
+ /* If we haven't been able to find out, use our other methods */
+ if(pSiS->sishw_ext.pdc == 0) {
- /* If we haven't been able to find out, use our other methods */
- if(pSiS->SiS_Pr->PDC == -1) {
- int i=0;
- do {
- if(mypdctable[i].subsysVendor == pSiS->PciInfo->subsysVendor &&
- mypdctable[i].subsysCard == pSiS->PciInfo->subsysCard) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ int i=0;
+ do {
+ if(mypdctable[i].subsysVendor == pSiS->PciInfo->subsysVendor &&
+ mypdctable[i].subsysCard == pSiS->PciInfo->subsysCard) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"PCI card/vendor identified for non-default PanelDelayCompensation\n");
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Vendor: %s, card: %s (ID %04x), PanelDelayCompensation: 0x%02x\n",
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Vendor: %s, card: %s (ID %04x), PanelDelayCompensation: %d\n",
mypdctable[i].vendorName, mypdctable[i].cardName,
pSiS->PciInfo->subsysCard, mypdctable[i].pdc);
- if(pSiS->PDC == -1) {
- pSiS->PDC = mypdctable[i].pdc;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ if(pSiS->PDC == -1) {
+ pSiS->PDC = mypdctable[i].pdc;
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
"PanelDelayCompensation overruled by option\n");
- }
- break;
- }
- i++;
- } while(mypdctable[i].subsysVendor != 0);
- }
+ }
+ break;
+ }
+ i++;
+ } while(mypdctable[i].subsysVendor != 0);
+
+ }
- if(pSiS->PDC != -1) {
- if(pSiS->BIOS) {
- if(pSiS->VBFlags & VB_LVDS) {
- if(pSiS->BIOS[0x220] & 0x80) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "BIOS contains custom LCD Panel Delay Compensation 0x%02x\n",
+ if(pSiS->PDC != -1) {
+ if(pSiS->BIOS) {
+ if(pSiS->VBFlags & VB_LVDS) {
+ if(pSiS->BIOS[0x220] & 0x80) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "BIOS contains custom LCD Panel Delay Compensation %d\n",
pSiS->BIOS[0x220] & 0x3c);
- pSiS->BIOS[0x220] &= 0x7f;
- }
- }
- if(pSiS->VBFlags & (VB_301B|VB_302B)) {
- if(pSiS->BIOS[0x220] & 0x80) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "BIOS contains custom LCD Panel Delay Compensation 0x%02x\n",
+ pSiS->BIOS[0x220] &= 0x7f;
+ }
+ }
+ if(pSiS->VBFlags & (VB_301B|VB_302B)) {
+ if(pSiS->BIOS[0x220] & 0x80) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "BIOS contains custom LCD Panel Delay Compensation %d\n",
( (pSiS->VBLCDFlags & VB_LCD_1280x1024) ?
pSiS->BIOS[0x223] : pSiS->BIOS[0x224] ) & 0x3c);
- pSiS->BIOS[0x220] &= 0x7f;
- }
- }
- }
- pSiS->SiS_Pr->PDC = (pSiS->PDC & 0x3c);
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Using LCD Panel Delay Compensation 0x%02x\n", pSiS->SiS_Pr->PDC);
- }
- }
-
- } /* SIS_300_VGA */
-
- if(pSiS->VGAEngine == SIS_315_VGA) {
-
- unsigned char tmp, tmp2;
- inSISIDXREG(SISCR, 0x30, tmp);
-
- /* Save the current PDC if the panel is used at the moment. */
- if(pSiS->VBFlags & (VB_301LV | VB_302LV | VB_302ELV)) {
-
- if(pSiS->sisfbpdc != 0xff) {
- pSiS->SiS_Pr->PDC = pSiS->sisfbpdc;
- }
- if(pSiS->sisfbpdca != 0xff) {
- pSiS->SiS_Pr->PDCA = pSiS->sisfbpdca;
- }
+ pSiS->BIOS[0x220] &= 0x7f;
+ }
+ }
+ }
+ pSiS->sishw_ext.pdc = (pSiS->PDC & 0x3c);
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Using LCD Panel Delay Compensation %d\n", pSiS->PDC);
+ }
+ }
+ }
- if(!pSiS->donttrustpdc) {
- if((pSiS->sisfbpdc == 0xff) && (pSiS->sisfbpdca == 0xff)) {
- CARD16 tempa, tempb;
- inSISIDXREG(SISPART1,0x2d,tmp2);
- tempa = (tmp2 & 0xf0) >> 3;
- tempb = (tmp2 & 0x0f) << 1;
- inSISIDXREG(SISPART1,0x20,tmp2);
- tempa |= ((tmp2 & 0x40) >> 6);
- inSISIDXREG(SISPART1,0x35,tmp2);
- tempb |= ((tmp2 & 0x80) >> 7);
- inSISIDXREG(SISPART1,0x13,tmp2);
- if(!pSiS->ROM661New) {
- if((tmp2 & 0x04) || (tmp & 0x20)) {
- pSiS->SiS_Pr->PDCA = tempa;
- pSiS->SiS_Pr->PDC = tempb;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Unable to detect PanelDelayCompensation, LCD is not active\n");
- }
- } else {
- if(tmp2 & 0x04) {
- pSiS->SiS_Pr->PDCA = tempa;
- } else if(tmp & 0x20) {
- pSiS->SiS_Pr->PDC = tempb;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Unable to detect PanelDelayCompensation, LCD is not active\n");
- }
- }
- }
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(pSiS->VBFlags & (VB_301LV | VB_302LV)) {
+ /* Save the current PDC if the panel is used at the moment.
+ * This seems by far the safest way to find out about it.
+ */
+ if(pSiS->sisfbpdc) {
+ pSiS->sishw_ext.pdc = pSiS->sisfbpdc;
+ } else {
+ if(!(pSiS->donttrustpdc)) {
+ unsigned char tmp;
+ inSISIDXREG(SISCR, 0x30, tmp);
+ if(tmp & 0x20) {
+ inSISIDXREG(SISPART1, 0x2D, pSiS->sishw_ext.pdc);
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Unable to detect LCD PanelDelayCompensation, LCD is not active\n");
+ }
} else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Unable to detect PanelDelayCompensation, please update sisfb\n");
- }
- if(pSiS->SiS_Pr->PDC != -1) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected LCD PanelDelayCompensation 0x%02x (for LCD=CRT2)\n",
- pSiS->SiS_Pr->PDC);
- }
- if(pSiS->SiS_Pr->PDCA != -1) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected LCD PanelDelayCompensation1 0x%02x (for LCD=CRT1)\n",
- pSiS->SiS_Pr->PDCA);
+ "Unable to detect LCD PanelDelayCompensation, please update sisfb\n");
}
}
-
- /* Let user override (for all bridges) */
- if(pSiS->VBFlags & (VB_301B | VB_301C | VB_301LV | VB_302LV | VB_302ELV)) {
- if(pSiS->PDC != -1) {
- pSiS->SiS_Pr->PDC = pSiS->PDC & 0x1f;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Using LCD PanelDelayCompensation 0x%02x (for LCD=CRT2)\n",
- pSiS->SiS_Pr->PDC);
- }
- if(pSiS->PDCA != -1) {
- pSiS->SiS_Pr->PDCA = pSiS->PDCA & 0x1f;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Using LCD PanelDelayCompensation1 0x%02x (for LCD=CRT1)\n",
- pSiS->SiS_Pr->PDCA);
- }
- }
-
- /* Read the current EMI (if not overruled) */
- if(pSiS->VBFlags & (VB_302LV | VB_302ELV)) {
- MessageType from = X_PROBED;
- if(pSiS->EMI != -1) {
- pSiS->SiS_Pr->EMI_30 = (pSiS->EMI >> 24) & 0x60;
- pSiS->SiS_Pr->EMI_31 = (pSiS->EMI >> 16) & 0xff;
- pSiS->SiS_Pr->EMI_32 = (pSiS->EMI >> 8) & 0xff;
- pSiS->SiS_Pr->EMI_33 = pSiS->EMI & 0xff;
- pSiS->SiS_Pr->HaveEMI = pSiS->SiS_Pr->HaveEMILCD = TRUE;
- pSiS->SiS_Pr->OverruleEMI = TRUE;
- from = X_CONFIG;
- } else if((pSiS->sisfbfound) && (pSiS->sisfb_haveemi)) {
- pSiS->SiS_Pr->EMI_30 = pSiS->sisfb_emi30;
- pSiS->SiS_Pr->EMI_31 = pSiS->sisfb_emi31;
- pSiS->SiS_Pr->EMI_32 = pSiS->sisfb_emi32;
- pSiS->SiS_Pr->EMI_33 = pSiS->sisfb_emi33;
- pSiS->SiS_Pr->HaveEMI = TRUE;
- if(pSiS->sisfb_haveemilcd) pSiS->SiS_Pr->HaveEMILCD = TRUE;
- pSiS->SiS_Pr->OverruleEMI = FALSE;
- } else {
- inSISIDXREG(SISPART4, 0x30, pSiS->SiS_Pr->EMI_30);
- inSISIDXREG(SISPART4, 0x31, pSiS->SiS_Pr->EMI_31);
- inSISIDXREG(SISPART4, 0x32, pSiS->SiS_Pr->EMI_32);
- inSISIDXREG(SISPART4, 0x33, pSiS->SiS_Pr->EMI_33);
- pSiS->SiS_Pr->HaveEMI = TRUE;
- if(tmp & 0x20) pSiS->SiS_Pr->HaveEMILCD = TRUE;
- pSiS->SiS_Pr->OverruleEMI = FALSE;
- }
- xf86DrvMsg(pScrn->scrnIndex, from,
- "302LV/302ELV: Using EMI 0x%02x%02x%02x%02x%s\n",
- pSiS->SiS_Pr->EMI_30,pSiS->SiS_Pr->EMI_31,
- pSiS->SiS_Pr->EMI_32,pSiS->SiS_Pr->EMI_33,
- pSiS->SiS_Pr->HaveEMILCD ? " (LCD)" : "");
+ if(pSiS->sishw_ext.pdc) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected LCD PanelDelayCompensation %d\n",
+ pSiS->sishw_ext.pdc);
}
-
- } /* SIS_315_VGA */
-#ifdef SISDUALHEAD
+ if(pSiS->PDC != -1) {
+ pSiS->sishw_ext.pdc = pSiS->PDC & 0xff;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Using LCD PanelDelayCompensation %d\n",
+ pSiS->sishw_ext.pdc);
+ }
+ }
}
-#endif
#ifdef SISDUALHEAD
/* In dual head mode, both heads (currently) share the maxxfbmem equally.
@@ -4649,7 +4079,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiSEnt->slaveFbAddress = pSiS->FbAddress + pSiS->maxxfbmem;
pSiSEnt->slaveFbSize = pSiS->maxxfbmem;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "%ldKB video RAM at 0x%lx available for master head (CRT2)\n",
+ "%dKB video RAM at 0x%lx available for master head (CRT2)\n",
pSiS->maxxfbmem/1024, pSiS->FbAddress);
} else {
/* ===== Second head (always CRT1) ===== */
@@ -4660,7 +4090,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Initialize dhmOffset */
pSiS->dhmOffset = pSiS->availMem - pSiS->maxxfbmem;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "%ldKB video RAM at 0x%lx available for slave head (CRT1)\n",
+ "%dKB video RAM at 0x%lx available for slave head (CRT1)\n",
pSiS->maxxfbmem/1024, pSiS->FbAddress);
}
} else
@@ -4689,7 +4119,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
/* Now for something completely different: DDC.
- * For 300 and 315/330 series, we provide our
+ * For 300 and 315 series, we provide our
* own functions (in order to probe CRT2 as well)
* If these fail, use the VBE.
* All other chipsets will use VBE. No need to re-invent
@@ -4701,13 +4131,20 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
if(xf86LoadSubModule(pScrn, "ddc")) {
- int crtnum = 0;
xf86LoaderReqSymLists(ddcSymbols, NULL);
- if((pMonitor = SiSDoPrivateDDC(pScrn, &crtnum))) {
+ if((pMonitor = SiSDoPrivateDDC(pScrn))) {
didddc2 = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcsstr, crtnum);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcsstr,
+#ifdef SISDUALHEAD
+ pSiS->DualHeadMode ? (pSiS->SecondHead ? 1 : 2) :
+#endif
+ (pSiS->CRT1off ? 2 : 1));
xf86PrintEDID(pMonitor);
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcestr, crtnum);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcestr,
+#ifdef SISDUALHEAD
+ pSiS->DualHeadMode ? (pSiS->SecondHead ? 1 : 2) :
+#endif
+ (pSiS->CRT1off ? 2 : 1));
xf86SetDDCproperties(pScrn, pMonitor);
pScrn->monitor->DDC = pMonitor;
}
@@ -4720,11 +4157,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
didddc2 = TRUE;
#endif
- if(!didddc2) {
- /* If CRT1 is off or LCDA, skip DDC via VBE */
- if((pSiS->CRT1off) || (pSiS->VBFlags & CRT1_LCDA))
- didddc2 = TRUE;
- }
+ /* If CRT1 is off (eventually forced), skip DDC via VBE */
+ if((!didddc2) && (pSiS->CRT1off)) didddc2 = TRUE;
/* Now (re-)load and initialize the DDC module */
if(!didddc2) {
@@ -4794,11 +4228,11 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
if(pSiS->CRT2HSync) {
pSiS->CRT2pScrn->monitor->nHsync =
- SiSStrToRanges(pSiS->CRT2pScrn->monitor->hsync, pSiS->CRT2HSync, MAX_HSYNC);
+ SiSStrToRanges(pSiS->CRT2pScrn->monitor->hsync, pSiS->CRT2HSync);
}
if(pSiS->CRT2VRefresh) {
pSiS->CRT2pScrn->monitor->nVrefresh =
- SiSStrToRanges(pSiS->CRT2pScrn->monitor->vrefresh, pSiS->CRT2VRefresh, MAX_VREFRESH);
+ SiSStrToRanges(pSiS->CRT2pScrn->monitor->vrefresh, pSiS->CRT2VRefresh);
}
if((pMonitor = SiSInternalDDC(pSiS->CRT2pScrn, 1))) {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcsstr, 2);
@@ -4806,20 +4240,13 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
xf86DrvMsg(pScrn->scrnIndex, X_PROBED, ddcestr, 2);
xf86SetDDCproperties(pSiS->CRT2pScrn, pMonitor);
pSiS->CRT2pScrn->monitor->DDC = pMonitor;
- /* use DDC data if no ranges in config file */
- if(!pSiS->CRT2HSync) {
- pSiS->CRT2pScrn->monitor->nHsync = 0;
- }
- if(!pSiS->CRT2VRefresh) {
- pSiS->CRT2pScrn->monitor->nVrefresh = 0;
- }
} else {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"Failed to read DDC data for CRT2\n");
}
} else {
- SISErrorLog(pScrn, "Failed to allocate memory for CRT2 monitor, %s.\n",
- mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to allocate memory for CRT2 monitor, %s.\n", mergeddisstr);
if(pSiS->CRT2pScrn) xfree(pSiS->CRT2pScrn);
pSiS->CRT2pScrn = NULL;
pSiS->MergedFB = FALSE;
@@ -4828,33 +4255,21 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#endif
/* If there is no HSync or VRefresh data for the monitor,
- * derive it from DDC data. Done by common layer since
- * 4.3.99.14.
+ * derive it from DDC data. (Idea taken from radeon driver)
*/
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0)
if(pScrn->monitor->DDC) {
if(pScrn->monitor->nHsync <= 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, subshstr,
-#ifdef SISDUALHEAD
- pSiS->DualHeadMode ? (pSiS->SecondHead ? 1 : 2) :
-#endif
- pSiS->CRT1off ? 2 : 1);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, subshstr, pSiS->CRT1off ? 2 : 1);
SiSSetSyncRangeFromEdid(pScrn, 1);
}
if(pScrn->monitor->nVrefresh <= 0) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, subsvstr,
-#ifdef SISDUALHEAD
- pSiS->DualHeadMode ? (pSiS->SecondHead ? 1 : 2) :
-#endif
- pSiS->CRT1off ? 2 : 1);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, subsvstr, pSiS->CRT1off ? 2 : 1);
SiSSetSyncRangeFromEdid(pScrn, 0);
}
}
-#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0)
if(pSiS->CRT2pScrn->monitor->DDC) {
if(pSiS->CRT2pScrn->monitor->nHsync <= 0) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO, subshstr, 2);
@@ -4865,7 +4280,6 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
SiSSetSyncRangeFromEdid(pSiS->CRT2pScrn, 0);
}
}
-#endif
xf86DrvMsg(pScrn->scrnIndex, X_INFO, crtsetupstr, 1);
}
@@ -4925,13 +4339,12 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
clockRanges->doubleScanAllowed = TRUE;
/*
- * Since we have lots of built-in modes for 300/315/330 series
- * with vb support, we replace the given default mode list with our
- * own. In case the video bridge is to be used, we only allow other
- * modes if
- * -) vbtype is 301, 301B, 301C or 302B, and
- * -) crt2 device is not TV, and
- * -) crt1 is not LCDA
+ * TW: Since we have lots of built-in modes for 300/315/330 series
+ * with vb support, we replace the given default mode list with our
+ * own. In case the video bridge is to be used, we only allow other
+ * modes if
+ * -) vbtype is 301, 301B or 302B, and
+ * -) crt2 device is not TV.
*/
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
if(!(pSiS->noInternalModes)) {
@@ -4945,7 +4358,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
if(!pSiS->SecondHead) {
- if((pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) && (!(pSiS->VBFlags & VB_30xBDH))) {
+ if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) {
if(!(pSiS->VBFlags & (CRT2_LCD|CRT2_VGA))) includelcdmodes = FALSE;
if(pSiS->VBFlags & CRT2_LCD) isfordvi = TRUE;
if(pSiS->VBFlags & CRT2_TV) acceptcustommodes = FALSE;
@@ -4953,36 +4366,26 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
acceptcustommodes = FALSE;
includelcdmodes = FALSE;
}
- clockRanges->interlaceAllowed = FALSE;
} else {
includelcdmodes = FALSE;
- if(pSiS->VBFlags & CRT1_LCDA) {
- acceptcustommodes = FALSE;
- /* Ignore interlace, mode switching code will handle this */
- }
}
} else
#endif
#ifdef SISMERGED
- if(pSiS->MergedFB) {
+ if(pSiS->MergedFB)
includelcdmodes = FALSE;
- if(pSiS->VBFlags & CRT1_LCDA) {
- acceptcustommodes = FALSE;
- /* Ignore interlace, mode switching code will handle this */
- }
- } else
+ else
#endif
- if((pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) && (!(pSiS->VBFlags & VB_30xBDH))) {
+ if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) {
if(!(pSiS->VBFlags & (CRT2_LCD|CRT2_VGA))) includelcdmodes = FALSE;
if(pSiS->VBFlags & CRT2_LCD) isfordvi = TRUE;
- if(pSiS->VBFlags & (CRT2_TV|CRT1_LCDA)) acceptcustommodes = FALSE;
- } else if(pSiS->VBFlags & (CRT2_ENABLE | CRT1_LCDA)) {
+ if(pSiS->VBFlags & CRT2_TV) acceptcustommodes = FALSE;
+ } else if(pSiS->VBFlags & CRT2_ENABLE) {
acceptcustommodes = FALSE;
includelcdmodes = FALSE;
} else {
includelcdmodes = FALSE;
}
- /* Ignore interlace, mode switching code will handle this */
pSiS->HaveCustomModes = FALSE;
if(SiSMakeOwnModeList(pScrn, acceptcustommodes, includelcdmodes, isfordvi, &pSiS->HaveCustomModes)) {
@@ -4996,7 +4399,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
#endif
} else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Building list of built-in modes failed, using X.Org defaults\n");
+ "Building list of built-in modes failed, using XFree86 defaults\n");
}
} else {
pSiS->HaveCustomModes = TRUE;
@@ -5015,12 +4418,12 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
SiS6326PAL800x600Mode.next = pScrn->monitor->Modes;
pScrn->monitor->Modes = &SiS6326PAL640x480Mode;
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "\t\"PAL800x600\" \"PAL800x600U\" \"PAL720x540\" \"PAL640x480\"\n");
+ "\"PAL800x600\" \"PAL800x600U\" \"PAL720x540\" \"PAL640x480\"\n");
} else {
SiS6326NTSC640x480Mode.next = pScrn->monitor->Modes;
pScrn->monitor->Modes = &SiS6326NTSC640x400Mode;
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "\t\"NTSC640x480\" \"NTSC640x480U\" \"NTSC640x400\"\n");
+ "\"NTSC640x480\" \"NTSC640x480U\" \"NTSC640x400\"\n");
}
}
}
@@ -5096,7 +4499,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
if(i == -1) {
- SISErrorLog(pScrn, "xf86ValidateModes() error\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86ValidateModes() error\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5111,8 +4515,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
unsigned long memreq = (pScrn->virtualX * ((pScrn->bitsPerPixel + 7) / 8)) * pScrn->virtualY;
if(memreq > pSiS->maxxfbmem) {
- SISErrorLog(pScrn,
- "Virtual screen too big for memory; %ldK needed, %ldK available\n",
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Virtual screen too big for memory; %dK needed, %dK available\n",
memreq/1024, pSiS->maxxfbmem/1024);
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
@@ -5125,55 +4529,89 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
}
- /* Dual Head:
- * -) Go through mode list and mark all those modes as bad,
- * which are unsuitable for dual head mode.
- * -) Find the highest used pixelclock on the master head.
+ /* Go through mode list and mark all those modes as bad,
+ * - which are unsuitable for dual head mode (if running dhm),
+ * - which exceed the LCD panels specs (if running on LCD)
+ * - TODO: which exceed TV capabilities (if running on TV)
+ * Also, find the highest used pixelclock on the master head.
*/
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
+ if(!pSiS->SecondHead) pSiSEnt->maxUsedClock = 0;
+ }
+#endif
+ if((p = first = pScrn->modes)) {
+ do {
+ n = p->next;
+
+#ifdef SISDUALHEAD
+ /* Modes that require the bridge to operate in SlaveMode
+ * are not suitable for Dual Head mode. Also check for
+ * modes that exceed panel dimension.
+ */
+ if(pSiS->DualHeadMode) {
+ if(pSiS->SecondHead == FALSE) {
+ if( pSiS->VGAEngine == SIS_300_VGA &&
+ ( (strcmp(p->name, "320x200") == 0) ||
+ (strcmp(p->name, "320x240") == 0) ||
+ (strcmp(p->name, "400x300") == 0) ||
+ (strcmp(p->name, "512x384") == 0) ||
+ (strcmp(p->name, "640x400") == 0) ) ) {
+ p->status = MODE_BAD;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, notsuitablestr, p->name, "dual head");
+ }
+ if(p->Flags & V_INTERLACE) {
+ p->status = MODE_BAD;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, nointerlacestr, p->name);
+ }
+ if((pSiS->VBFlags & CRT2_LCD) && (pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if((p->HDisplay > pSiS->LCDwidth) || (p->VDisplay > pSiS->LCDheight)) {
+ p->status = MODE_PANEL;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, exceedlcdstr, p->name);
+ }
+ }
+ }
- if(!pSiS->SecondHead) {
-
- pSiSEnt->maxUsedClock = 0;
-
- if((p = first = pScrn->modes)) {
- do {
- n = p->next;
-
- /* Modes that require the bridge to operate in SlaveMode
- * are not suitable for Dual Head mode.
- */
- if( (pSiS->VGAEngine == SIS_300_VGA) &&
- ( (strcmp(p->name, "320x200") == 0) ||
- (strcmp(p->name, "320x240") == 0) ||
- (strcmp(p->name, "400x300") == 0) ||
- (strcmp(p->name, "512x384") == 0) ||
- (strcmp(p->name, "640x400") == 0) ) ) {
- p->status = MODE_BAD;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, notsuitablestr, p->name, "dual head");
- }
-
- /* Search for the highest clock on first head in order to calculate
- * max clock for second head (CRT1)
- */
- if((p->status == MODE_OK) && (p->Clock > pSiSEnt->maxUsedClock)) {
- pSiSEnt->maxUsedClock = p->Clock;
- }
-
- p = n;
-
- } while (p != NULL && p != first);
- }
- }
- }
+ /* Search for the highest clock on first head in order to calculate
+ * max clock for second head (CRT1)
+ */
+ if(!pSiS->SecondHead) {
+ if((p->status == MODE_OK) && (p->Clock > pSiSEnt->maxUsedClock)) {
+ pSiSEnt->maxUsedClock = p->Clock;
+ }
+ }
+ } else {
+#endif
+ if(pSiS->VBFlags & DISPTYPE_DISP2) {
+#ifdef SISMERGED
+ if(!pSiS->MergedFB) {
+#endif
+ if((pSiS->VBFlags & CRT2_LCD) && (pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if((p->HDisplay > pSiS->LCDwidth) || (p->VDisplay > pSiS->LCDheight)) {
+ p->status = MODE_PANEL;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, exceedlcdstr, p->name);
+ }
+ }
+ if(p->Flags & V_INTERLACE) {
+ p->status = MODE_BAD;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, nointerlacestr, p->name);
+ }
+#ifdef SISMERGED
+ }
+#endif
+ }
+#ifdef SISDUALHEAD
+ }
#endif
+ p = n;
+ } while (p != NULL && p != first);
+ }
/* Prune the modes marked as invalid */
xf86PruneDriverModes(pScrn);
if(i == 0 || pScrn->modes == NULL) {
- SISErrorLog(pScrn, "No valid modes found\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5188,7 +4626,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Set the current mode to the first in the list */
pScrn->currentMode = pScrn->modes;
- /* Copy to CurrentLayout */
+ /* TW: Copy to CurrentLayout */
pSiS->CurrentLayout.mode = pScrn->currentMode;
pSiS->CurrentLayout.displayWidth = pScrn->displayWidth;
@@ -5224,7 +4662,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Max pixel clock for CRT2 is %d MHz\n",
clockRanges->maxClock / 1000);
- if((pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) && (!(pSiS->VBFlags & VB_30xBDH))) {
+ if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) {
if(!(pSiS->VBFlags & (CRT2_LCD|CRT2_VGA))) includelcdmodes = FALSE;
if(pSiS->VBFlags & CRT2_LCD) isfordvi = TRUE;
if(pSiS->VBFlags & CRT2_TV) acceptcustommodes = FALSE;
@@ -5236,8 +4674,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->HaveCustomModes2 = FALSE;
if(!SiSMakeOwnModeList(pSiS->CRT2pScrn, acceptcustommodes, includelcdmodes, isfordvi, &pSiS->HaveCustomModes2)) {
- SISErrorLog(pScrn, "Building list of built-in modes for CRT2 failed, %s\n",
- mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Building list of built-in modes for CRT2 failed, %s\n", mergeddisstr);
SiSFreeCRT2Structs(pSiS);
pSiS->MergedFB = FALSE;
@@ -5256,14 +4694,15 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
pSiS->CRT2pScrn->display->modes, clockRanges,
NULL, 256, 4088,
pSiS->CRT2pScrn->bitsPerPixel * 8, 128, 4096,
- pScrn->display->virtualX ? pScrn->virtualX : 0,
- pScrn->display->virtualY ? pScrn->virtualY : 0,
+ pScrn->virtualX, /* pSiS->CRT2pScrn->display->virtualX, */
+ pScrn->virtualY, /* pSiS->CRT2pScrn->display->virtualY, */
pSiS->maxxfbmem,
LOOKUP_BEST_REFRESH);
pSiS->CheckForCRT2 = FALSE;
if(i == -1) {
- SISErrorLog(pScrn, "xf86ValidateModes() error, %s.\n", mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86ValidateModes() error, %s.\n", mergeddisstr);
SiSFreeCRT2Structs(pSiS);
pSiS->MergedFB = FALSE;
}
@@ -5275,7 +4714,7 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if((p = first = pSiS->CRT2pScrn->modes)) {
do {
n = p->next;
- if( (pSiS->VGAEngine == SIS_300_VGA) &&
+ if( pSiS->VGAEngine == SIS_300_VGA &&
( (strcmp(p->name, "320x200") == 0) ||
(strcmp(p->name, "320x240") == 0) ||
(strcmp(p->name, "400x300") == 0) ||
@@ -5284,14 +4723,20 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
p->status = MODE_BAD;
xf86DrvMsg(pScrn->scrnIndex, X_INFO, notsuitablestr, p->name, "MergedFB");
}
- p = n;
+ if((pSiS->VBFlags & CRT2_LCD) && (pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848)) {
+ if((p->HDisplay > pSiS->LCDwidth) || (p->VDisplay > pSiS->LCDheight)) {
+ p->status = MODE_PANEL;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, exceedlcdstr, p->name);
+ }
+ }
} while (p != NULL && p != first);
}
xf86PruneDriverModes(pSiS->CRT2pScrn);
if(i == 0 || pSiS->CRT2pScrn->modes == NULL) {
- SISErrorLog(pScrn, "No valid modes found for CRT2; %s\n", mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "No valid modes found for CRT2; %s\n", mergeddisstr);
SiSFreeCRT2Structs(pSiS);
pSiS->MergedFB = FALSE;
}
@@ -5317,42 +4762,34 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(!pScrn->modes) {
- SISErrorLog(pScrn, "Failed to parse MetaModes or no modes found. %s.\n",
- mergeddisstr);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to parse MetaModes or no modes found. %s.\n", mergeddisstr);
SiSFreeCRT2Structs(pSiS);
pScrn->modes = pSiS->CRT1Modes;
pSiS->CRT1Modes = NULL;
pSiS->MergedFB = FALSE;
- }
-
- }
-
- if(pSiS->MergedFB) {
+ } else {
- /* If no virtual dimension was given by the user,
- * calculate a sane one now. Adapts pScrn->virtualX,
- * pScrn->virtualY and pScrn->displayWidth.
- */
- SiSRecalcDefaultVirtualSize(pScrn);
+ pScrn->modes = pScrn->modes->next;
+ pScrn->currentMode = pScrn->modes;
- pScrn->modes = pScrn->modes->next; /* We get the last from GenerateModeList(), skip to first */
- pScrn->currentMode = pScrn->modes;
+ /* Update CurrentLayout */
+ pSiS->CurrentLayout.mode = pScrn->currentMode;
+ pSiS->CurrentLayout.displayWidth = pScrn->displayWidth;
- /* Update CurrentLayout */
- pSiS->CurrentLayout.mode = pScrn->currentMode;
- pSiS->CurrentLayout.displayWidth = pScrn->displayWidth;
+ }
}
#endif
/* Set display resolution */
+ xf86SetDpi(pScrn, 0, 0);
#ifdef SISMERGED
if(pSiS->MergedFB) {
- SiSMergedFBSetDpi(pScrn, pSiS->CRT2pScrn, pSiS->CRT2Position);
- } else
+ xf86SetDpi(pSiS->CRT2pScrn, 0, 0);
+ }
#endif
- xf86SetDpi(pScrn, 0, 0);
/* Load fb module */
switch(pScrn->bitsPerPixel) {
@@ -5361,7 +4798,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
case 24:
case 32:
if(!xf86LoadSubModule(pScrn, "fb")) {
- SISErrorLog(pScrn, "Failed to load fb module");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to load fb module");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5372,7 +4810,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
}
break;
default:
- SISErrorLog(pScrn, "Unsupported framebuffer bpp (%d)\n", pScrn->bitsPerPixel);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Unsupported framebuffer bpp (%d)\n", pScrn->bitsPerPixel);
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5387,7 +4826,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(!pSiS->NoAccel) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Accel enabled\n");
if(!xf86LoadSubModule(pScrn, "xaa")) {
- SISErrorLog(pScrn, "Could not load xaa module\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not load xaa module\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5402,7 +4842,8 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
/* Load shadowfb if needed */
if(pSiS->ShadowFB) {
if(!xf86LoadSubModule(pScrn, "shadowfb")) {
- SISErrorLog(pScrn, "Could not load shadowfb module\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not load shadowfb module\n");
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->ErrorAfterFirst = TRUE;
#endif
@@ -5414,21 +4855,6 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
xf86LoaderReqSymLists(shadowSymbols, NULL);
}
- /* Load the dri module if requested. */
-#ifdef XF86DRI
- if(pSiS->loadDRI) {
- if(xf86LoadSubModule(pScrn, "dri")) {
- xf86LoaderReqSymLists(driSymbols, drmSymbols, NULL);
- } else {
-#ifdef SISDUALHEAD
- if(!pSiS->DualHeadMode)
-#endif
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Remove >Load \"dri\"< from the Module section of your XF86Config file\n");
- }
- }
-#endif
-
/* Now load and initialize VBE module for VESA and mode restoring. */
pSiS->UseVESA = 0;
if(pSiS->VESA == 1) {
@@ -5474,28 +4900,23 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
if(pSiS->pInt) xf86FreeInt10(pSiS->pInt);
pSiS->pInt = NULL;
- if(pSiS->VGAEngine == SIS_315_VGA) pSiS->SiS_SD_Flags |= SiS_SD_SUPPORTXVGAMMA1;
-
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
pSiS->SiS_SD_Flags |= SiS_SD_ISDUALHEAD;
if(pSiS->SecondHead) pSiS->SiS_SD_Flags |= SiS_SD_ISDHSECONDHEAD;
- else pSiS->SiS_SD_Flags &= ~(SiS_SD_SUPPORTXVGAMMA1);
#ifdef PANORAMIX
- if(!noPanoramiXExtension) {
- pSiS->SiS_SD_Flags |= SiS_SD_ISDHXINERAMA;
- pSiS->SiS_SD_Flags &= ~(SiS_SD_SUPPORTXVGAMMA1);
- }
+ if(!noPanoramiXExtension) pSiS->SiS_SD_Flags |= SiS_SD_ISDHXINERAMA;
#endif
}
#endif
-
#ifdef SISMERGED
if(pSiS->MergedFB) pSiS->SiS_SD_Flags |= SiS_SD_ISMERGEDFB;
#endif
if(pSiS->enablesisctrl) pSiS->SiS_SD_Flags |= SiS_SD_ENABLED;
+ if(pSiS->CurrentLayout.bitsPerPixel == 8) pSiS->SiS_SD_Flags |= SiS_SD_ISDEPTH8;
+
return TRUE;
}
@@ -5537,16 +4958,17 @@ SISMapMem(ScrnInfoPtr pScrn)
if(!(pSiSEnt->IOBase)) {
/* Only map if not mapped previously */
pSiSEnt->IOBase = xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
- pSiS->PciTag, pSiS->IOAddress, (pSiS->mmioSize * 1024));
+ pSiS->PciTag, pSiS->IOAddress, 0x10000);
}
pSiS->IOBase = pSiSEnt->IOBase;
} else
#endif
pSiS->IOBase = xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
- pSiS->PciTag, pSiS->IOAddress, (pSiS->mmioSize * 1024));
+ pSiS->PciTag, pSiS->IOAddress, 0x10000);
if(pSiS->IOBase == NULL) {
- SISErrorLog(pScrn, "Could not map MMIO area\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not map MMIO area\n");
return FALSE;
}
@@ -5561,17 +4983,18 @@ SISMapMem(ScrnInfoPtr pScrn)
if(!(pSiSEnt->IOBaseDense)) {
/* Only map if not mapped previously */
pSiSEnt->IOBaseDense = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
- pSiS->PciTag, pSiS->IOAddress, (pSiS->mmioSize * 1024));
+ pSiS->PciTag, pSiS->IOAddress, 0x10000);
}
pSiS->IOBaseDense = pSiSEnt->IOBaseDense;
} else
#endif
pSiS->IOBaseDense = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
- pSiS->PciTag, pSiS->IOAddress, (pSiS->mmioSize * 1024));
+ pSiS->PciTag, pSiS->IOAddress, 0x10000);
if(pSiS->IOBaseDense == NULL) {
- SISErrorLog(pScrn, "Could not map MMIO dense area\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not map MMIO dense area\n");
+ return FALSE;
}
#endif /* __alpha__ */
@@ -5600,8 +5023,9 @@ SISMapMem(ScrnInfoPtr pScrn)
#endif
if(pSiS->FbBase == NULL) {
- SISErrorLog(pScrn, "Could not map framebuffer area\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not map framebuffer area\n");
+ return FALSE;
}
return TRUE;
@@ -5634,7 +5058,7 @@ SISUnmapMem(ScrnInfoPtr pScrn)
if(pSiSEnt->MapCountIOBase) {
pSiSEnt->MapCountIOBase--;
if((pSiSEnt->MapCountIOBase == 0) || (pSiSEnt->forceUnmapIOBase)) {
- xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiSEnt->IOBase, (pSiS->mmioSize * 1024));
+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiSEnt->IOBase, 0x10000);
pSiSEnt->IOBase = NULL;
pSiSEnt->MapCountIOBase = 0;
pSiSEnt->forceUnmapIOBase = FALSE;
@@ -5645,7 +5069,7 @@ SISUnmapMem(ScrnInfoPtr pScrn)
if(pSiSEnt->MapCountIOBaseDense) {
pSiSEnt->MapCountIOBaseDense--;
if((pSiSEnt->MapCountIOBaseDense == 0) || (pSiSEnt->forceUnmapIOBaseDense)) {
- xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiSEnt->IOBaseDense, (pSiS->mmioSize * 1024));
+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiSEnt->IOBaseDense, 0x10000);
pSiSEnt->IOBaseDense = NULL;
pSiSEnt->MapCountIOBaseDense = 0;
pSiSEnt->forceUnmapIOBaseDense = FALSE;
@@ -5666,10 +5090,10 @@ SISUnmapMem(ScrnInfoPtr pScrn)
}
} else {
#endif
- xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiS->IOBase, (pSiS->mmioSize * 1024));
+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiS->IOBase, 0x10000);
pSiS->IOBase = NULL;
#ifdef __alpha__
- xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiS->IOBaseDense, (pSiS->mmioSize * 1024));
+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiS->IOBaseDense, 0x10000);
pSiS->IOBaseDense = NULL;
#endif
xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pSiS->FbBase, pSiS->FbMapSize);
@@ -5702,13 +5126,13 @@ SISSave(ScrnInfoPtr pScrn)
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
if((pSiS->VBFlags & VB_VIDEOBRIDGE) && (SiSBridgeIsInSlaveMode(pScrn))) {
- vgaHWSave(pScrn, vgaReg, VGA_SR_CMAP | VGA_SR_MODE);
- SiSRegInit(pSiS->SiS_Pr, pSiS->RelIO+0x30);
- SiSSetLVDSetc(pSiS->SiS_Pr, &pSiS->sishw_ext, 0);
- SiS_GetVBType(pSiS->SiS_Pr, &pSiS->sishw_ext);
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
- vgaHWSave(pScrn, vgaReg, VGA_SR_FONTS);
- SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ vgaHWSave(pScrn, vgaReg, VGA_SR_CMAP | VGA_SR_MODE);
+ SiSRegInit(pSiS->SiS_Pr, pSiS->RelIO+0x30);
+ SiSSetLVDSetc(pSiS->SiS_Pr, &pSiS->sishw_ext, 0);
+ SiS_GetVBType(pSiS->SiS_Pr, pSiS->RelIO+0x30, &pSiS->sishw_ext);
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
+ vgaHWSave(pScrn, vgaReg, VGA_SR_FONTS);
+ SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
} else {
vgaHWSave(pScrn, vgaReg, VGA_SR_ALL);
}
@@ -5719,27 +5143,31 @@ SISSave(ScrnInfoPtr pScrn)
sisSaveUnlockExtRegisterLock(pSiS,&sisReg->sisRegs3C4[0x05],&sisReg->sisRegs3D4[0x80]);
(*pSiS->SiSSave)(pScrn, sisReg);
-
+
if(pSiS->UseVESA) SISVESASaveRestore(pScrn, MODE_SAVE);
-
- /* "Save" these again as they may have been changed prior to SISSave() call */
+
+ /* Save these as they may have been changed prior to SISSave() call */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- sisReg->sisRegs3C4[0x1f] = pSiS->oldSR1F;
- sisReg->sisRegs3D4[0x17] = pSiS->oldCR17;
- if(vgaReg->numCRTC >= 0x17) vgaReg->CRTC[0x17] = pSiS->oldCR17;
- sisReg->sisRegs3D4[0x32] = pSiS->oldCR32;
- sisReg->sisRegs3D4[0x36] = pSiS->oldCR36;
- sisReg->sisRegs3D4[0x37] = pSiS->oldCR37;
- if(pSiS->VGAEngine == SIS_315_VGA) {
- sisReg->sisRegs3D4[pSiS->myCR63] = pSiS->oldCR63;
- }
+ sisReg->sisRegs3D4[0x17] = pSiS->oldCR17;
+ if(vgaReg->numCRTC >= 0x17) vgaReg->CRTC[0x17] = pSiS->oldCR17;
+ sisReg->sisRegs3D4[0x32] = pSiS->oldCR32;
+ sisReg->sisRegs3C4[0x1f] = pSiS->oldSR1F;
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ sisReg->sisRegs3D4[0x63] = pSiS->oldCR63;
+ }
}
}
+/*
+ * Just adapted from the std* functions in vgaHW.c
+ */
static void
SiS_WriteAttr(SISPtr pSiS, int index, int value)
{
- (void) inb(pSiS->IODBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET);
+ CARD8 tmp;
+
+ tmp = inb(pSiS->IODBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET);
+
index |= 0x20;
outb(pSiS->IODBase + VGA_ATTR_INDEX, index);
outb(pSiS->IODBase + VGA_ATTR_DATA_W, value);
@@ -5748,14 +5176,15 @@ SiS_WriteAttr(SISPtr pSiS, int index, int value)
static int
SiS_ReadAttr(SISPtr pSiS, int index)
{
- (void) inb(pSiS->IODBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET);
+ CARD8 tmp;
+
+ tmp = inb(pSiS->IODBase + VGA_IOBASE_COLOR + VGA_IN_STAT_1_OFFSET);
+
index |= 0x20;
outb(pSiS->IODBase + VGA_ATTR_INDEX, index);
- return(inb(pSiS->IODBase + VGA_ATTR_DATA_R));
+ return (inb(pSiS->IODBase + VGA_ATTR_DATA_R));
}
-#define SIS_FONTS_SIZE (8 * 8192)
-
static void
SiS_SaveFonts(ScrnInfoPtr pScrn)
{
@@ -5767,17 +5196,15 @@ SiS_SaveFonts(ScrnInfoPtr pScrn)
pointer vgaIOBase = VGAHWPTR(pScrn)->Base;
#endif
- if(pSiS->fonts) return;
+ if(pSiS->fonts != NULL)
+ return;
/* If in graphics mode, don't save anything */
attr10 = SiS_ReadAttr(pSiS, 0x10);
- if(attr10 & 0x01) return;
+ if(attr10 & 0x01)
+ return;
- if(!(pSiS->fonts = xalloc(SIS_FONTS_SIZE * 2))) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Could not save console fonts, mem allocation failed\n");
- return;
- }
+ pSiS->fonts = xalloc(16384);
/* save the registers that are needed here */
miscOut = inSISREG(SISMISCR);
@@ -5803,7 +5230,7 @@ SiS_SaveFonts(ScrnInfoPtr pScrn)
outSISIDXREG(SISGR, 0x04, 0x02); /* read plane 2 */
outSISIDXREG(SISGR, 0x05, 0x00); /* write mode 0, read mode 0 */
outSISIDXREG(SISGR, 0x06, 0x05); /* set graphics */
- slowbcopy_frombus(vgaIOBase, pSiS->fonts, SIS_FONTS_SIZE);
+ slowbcopy_frombus(vgaIOBase, pSiS->fonts, 8192);
/* font2 */
outSISIDXREG(SISSR, 0x02, 0x08); /* write to plane 3 */
@@ -5811,7 +5238,7 @@ SiS_SaveFonts(ScrnInfoPtr pScrn)
outSISIDXREG(SISGR, 0x04, 0x03); /* read plane 3 */
outSISIDXREG(SISGR, 0x05, 0x00); /* write mode 0, read mode 0 */
outSISIDXREG(SISGR, 0x06, 0x05); /* set graphics */
- slowbcopy_frombus(vgaIOBase, pSiS->fonts + SIS_FONTS_SIZE, SIS_FONTS_SIZE);
+ slowbcopy_frombus(vgaIOBase, pSiS->fonts + 8192, 8192);
inSISIDXREG(SISSR, 0x01, scrn);
outSISIDXREG(SISSR, 0x00, 0x01);
@@ -5839,7 +5266,13 @@ SiS_RestoreFonts(ScrnInfoPtr pScrn)
pointer vgaIOBase = VGAHWPTR(pScrn)->Base;
#endif
- if(!pSiS->fonts) return;
+ if(pSiS->fonts == NULL)
+ return;
+
+#if 0
+ if(pVesa->mapPhys == 0xa0000 && pVesa->curBank != 0)
+ VESABankSwitch(pScrn->pScreen, 0);
+#endif
/* save the registers that are needed here */
miscOut = inSISREG(SISMISCR);
@@ -5862,9 +5295,9 @@ SiS_RestoreFonts(ScrnInfoPtr pScrn)
SiS_WriteAttr(pSiS, 0x10, 0x01); /* graphics mode */
if(pScrn->depth == 4) {
- outSISIDXREG(SISGR, 0x03, 0x00); /* don't rotate, write unmodified */
- outSISIDXREG(SISGR, 0x08, 0xFF); /* write all bits in a byte */
- outSISIDXREG(SISGR, 0x01, 0x00); /* all planes come from CPU */
+ outSISIDXREG(SISGR, 0x03, 0x00); /* don't rotate, write unmodified */
+ outSISIDXREG(SISGR, 0x08, 0xFF); /* write all bits in a byte */
+ outSISIDXREG(SISGR, 0x01, 0x00); /* all planes come from CPU */
}
outSISIDXREG(SISSR, 0x02, 0x04); /* write to plane 2 */
@@ -5872,14 +5305,14 @@ SiS_RestoreFonts(ScrnInfoPtr pScrn)
outSISIDXREG(SISGR, 0x04, 0x02); /* read plane 2 */
outSISIDXREG(SISGR, 0x05, 0x00); /* write mode 0, read mode 0 */
outSISIDXREG(SISGR, 0x06, 0x05); /* set graphics */
- slowbcopy_tobus(pSiS->fonts, vgaIOBase, SIS_FONTS_SIZE);
+ slowbcopy_tobus(pSiS->fonts, vgaIOBase, 8192);
outSISIDXREG(SISSR, 0x02, 0x08); /* write to plane 3 */
outSISIDXREG(SISSR, 0x04, 0x06); /* enable plane graphics */
outSISIDXREG(SISGR, 0x04, 0x03); /* read plane 3 */
outSISIDXREG(SISGR, 0x05, 0x00); /* write mode 0, read mode 0 */
outSISIDXREG(SISGR, 0x06, 0x05); /* set graphics */
- slowbcopy_tobus(pSiS->fonts + SIS_FONTS_SIZE, vgaIOBase, SIS_FONTS_SIZE);
+ slowbcopy_tobus(pSiS->fonts + 8192, vgaIOBase, 8192);
inSISIDXREG(SISSR, 0x01, scrn);
outSISIDXREG(SISSR, 0x00, 0x01);
@@ -5899,53 +5332,53 @@ SiS_RestoreFonts(ScrnInfoPtr pScrn)
outSISIDXREG(SISSR, 0x04, seq4);
}
-#undef SIS_FONTS_SIZE
-
/* VESASaveRestore taken from vesa driver */
static void
SISVESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function)
{
- SISPtr pSiS = SISPTR(pScrn);
+ SISPtr pSiS;
+
+ pSiS = SISPTR(pScrn);
/* Query amount of memory to save state */
- if((function == MODE_QUERY) ||
- (function == MODE_SAVE && pSiS->state == NULL)) {
+ if(function == MODE_QUERY ||
+ (function == MODE_SAVE && pSiS->state == NULL)) {
- /* Make sure we save at least this information in case of failure */
- (void)VBEGetVBEMode(pSiS->pVbe, &pSiS->stateMode);
- SiS_SaveFonts(pScrn);
+ /* Make sure we save at least this information in case of failure */
+ (void)VBEGetVBEMode(pSiS->pVbe, &pSiS->stateMode);
+ SiS_SaveFonts(pScrn);
- if(pSiS->vesamajor > 1) {
- if(!VBESaveRestore(pSiS->pVbe, function, (pointer)&pSiS->state,
- &pSiS->stateSize, &pSiS->statePage)) {
- return;
- }
- }
+ if(pSiS->vesamajor > 1) {
+ if(!VBESaveRestore(pSiS->pVbe,function,(pointer)&pSiS->state,
+ &pSiS->stateSize,&pSiS->statePage))
+ return;
+
+ }
}
/* Save/Restore Super VGA state */
if(function != MODE_QUERY) {
+ Bool retval = TRUE;
+
+ if(pSiS->vesamajor > 1) {
+ if(function == MODE_RESTORE)
+ memcpy(pSiS->state, pSiS->pstate, pSiS->stateSize);
+
+ if((retval = VBESaveRestore(pSiS->pVbe,function,
+ (pointer)&pSiS->state,
+ &pSiS->stateSize,&pSiS->statePage))
+ && function == MODE_SAVE) {
+ /* don't rely on the memory not being touched */
+ if(pSiS->pstate == NULL)
+ pSiS->pstate = xalloc(pSiS->stateSize);
+ memcpy(pSiS->pstate, pSiS->state, pSiS->stateSize);
+ }
+ }
- if(pSiS->vesamajor > 1) {
- if(function == MODE_RESTORE) {
- memcpy(pSiS->state, pSiS->pstate, pSiS->stateSize);
- }
-
- if(VBESaveRestore(pSiS->pVbe,function,(pointer)&pSiS->state,
- &pSiS->stateSize,&pSiS->statePage) &&
- (function == MODE_SAVE)) {
- /* don't rely on the memory not being touched */
- if(!pSiS->pstate) {
- pSiS->pstate = xalloc(pSiS->stateSize);
- }
- memcpy(pSiS->pstate, pSiS->state, pSiS->stateSize);
- }
- }
-
- if(function == MODE_RESTORE) {
- VBESetVBEMode(pSiS->pVbe, pSiS->stateMode, NULL);
- SiS_RestoreFonts(pScrn);
- }
+ if(function == MODE_RESTORE) {
+ VBESetVBEMode(pSiS->pVbe, pSiS->stateMode, NULL);
+ SiS_RestoreFonts(pScrn);
+ }
}
}
@@ -5979,206 +5412,188 @@ SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
if(pSiS->UseVESA) { /* With VESA: */
#ifdef SISDUALHEAD
- /* No dual head mode when using VESA */
- if(pSiS->SecondHead) return TRUE;
+ /* No dual head mode when using VESA */
+ if(pSiS->SecondHead) return TRUE;
#endif
- pScrn->vtSema = TRUE;
-
- /*
- * This order is required:
- * The video bridge needs to be adjusted before the
- * BIOS is run as the BIOS sets up CRT2 according to
- * these register settings.
- * After the BIOS is run, the bridges and turboqueue
- * registers need to be readjusted as the BIOS may
- * very probably have messed them up.
- */
- if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
- SiSPreSetMode(pScrn, mode, SIS_MODE_SIMU);
- }
- if(!SiSSetVESAMode(pScrn, mode)) {
- SISErrorLog(pScrn, "SiSSetVESAMode() failed\n");
- return FALSE;
- }
- sisSaveUnlockExtRegisterLock(pSiS,NULL,NULL);
- if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
- SiSPreSetMode(pScrn, mode, SIS_MODE_SIMU);
- SiSPostSetMode(pScrn, &pSiS->ModeReg);
- }
+ pScrn->vtSema = TRUE;
+
+ /*
+ * This order is required:
+ * The video bridge needs to be adjusted before the
+ * BIOS is run as the BIOS sets up CRT2 according to
+ * these register settings.
+ * After the BIOS is run, the bridges and turboqueue
+ * registers need to be readjusted as the BIOS may
+ * very probably have messed them up.
+ */
+ if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
+ SiSPreSetMode(pScrn, mode);
+ }
+ if(!SiSSetVESAMode(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "SiSSetVESAMode() failed\n");
+ return FALSE;
+ }
+ sisSaveUnlockExtRegisterLock(pSiS,NULL,NULL);
+ if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
+ SiSPreSetMode(pScrn, mode);
+ SiSPostSetMode(pScrn, &pSiS->ModeReg);
+ }
+ /* Prepare some register contents and set
+ * up some mode dependent variables.
+ */
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"REAL REGISTER CONTENTS AFTER SETMODE:\n");
#endif
- if(!(*pSiS->ModeInit)(pScrn, mode)) {
- SISErrorLog(pScrn, "ModeInit() failed\n");
- return FALSE;
- }
+ if(!(*pSiS->ModeInit)(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ModeInit() failed\n");
+ return FALSE;
+ }
- vgaHWProtect(pScrn, TRUE);
- (*pSiS->SiSRestore)(pScrn, &pSiS->ModeReg);
- vgaHWProtect(pScrn, FALSE);
+ /* Program the registers */
+ vgaHWProtect(pScrn, TRUE);
+ (*pSiS->SiSRestore)(pScrn, &pSiS->ModeReg);
+ vgaHWProtect(pScrn, FALSE);
} else { /* Without VESA: */
#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
-
- if(!(*pSiS->ModeInit)(pScrn, mode)) {
- SISErrorLog(pScrn, "ModeInit() failed\n");
- return FALSE;
- }
-
- pScrn->vtSema = TRUE;
-
- pSiSEnt = pSiS->entityPrivate;
-
- if(!(pSiS->SecondHead)) {
- /* Head 1 (master) is always CRT2 */
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT2);
- if(!SiSBIOSSetModeCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn, mode, pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT2() failed\n");
- return FALSE;
- }
- SiSPostSetMode(pScrn, &pSiS->ModeReg);
- SISAdjustFrame(pSiSEnt->pScrn_2->scrnIndex,
- pSiSEnt->pScrn_2->frameX0,
- pSiSEnt->pScrn_2->frameY0, 0);
- } else {
- /* Head 2 (slave) is always CRT1 */
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT1);
- if(!SiSBIOSSetModeCRT1(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn, mode, pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT1() failed\n");
- return FALSE;
- }
- SiSPostSetMode(pScrn, &pSiS->ModeReg);
- SISAdjustFrame(pSiSEnt->pScrn_1->scrnIndex,
- pSiSEnt->pScrn_1->frameX0,
- pSiSEnt->pScrn_1->frameY0, 0);
- }
+ if(pSiS->DualHeadMode) {
+ if(!(*pSiS->ModeInit)(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ModeInit() failed\n");
+ return FALSE;
+ }
- } else {
+ pScrn->vtSema = TRUE;
+
+ pSiSEnt = pSiS->entityPrivate;
+
+ if(!(pSiS->SecondHead)) {
+ /* Head 1 (master) is always CRT2 */
+ SiSPreSetMode(pScrn, mode);
+ if(!SiSBIOSSetModeCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn, mode, pSiS->IsCustom)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSBIOSSetModeCRT2() failed\n");
+ return FALSE;
+ }
+ SiSPostSetMode(pScrn, &pSiS->ModeReg);
+ SISAdjustFrame(pSiSEnt->pScrn_2->scrnIndex,
+ pSiSEnt->pScrn_2->frameX0,
+ pSiSEnt->pScrn_2->frameY0, 0);
+ } else {
+ /* Head 2 (slave) is always CRT1 */
+ SiSPreSetMode(pScrn, mode);
+ if(!SiSBIOSSetModeCRT1(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn, mode, pSiS->IsCustom)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSBIOSSetModeCRT1() failed\n");
+ return FALSE;
+ }
+ SiSPostSetMode(pScrn, &pSiS->ModeReg);
+ SISAdjustFrame(pSiSEnt->pScrn_1->scrnIndex,
+ pSiSEnt->pScrn_1->frameX0,
+ pSiSEnt->pScrn_1->frameY0, 0);
+ }
+ } else {
#endif
+ if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
- if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
+ /* Set up some mode-depending variables */
+ if(!(*pSiS->ModeInit)(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ModeInit() failed\n");
+ return FALSE;
+ }
- if(!(*pSiS->ModeInit)(pScrn, mode)) {
- SISErrorLog(pScrn, "ModeInit() failed\n");
- return FALSE;
- }
+ pScrn->vtSema = TRUE;
- pScrn->vtSema = TRUE;
+ SiSPreSetMode(pScrn, mode);
#ifdef SISMERGED
- if(pSiS->MergedFB) {
+ if(pSiS->MergedFB) {
- xf86DrvMsg(0, X_INFO, "Setting MergedFB mode %dx%d\n",
+ xf86DrvMsg(0, X_INFO, "Setting MergedFB mode %dx%d\n",
mode->HDisplay, mode->VDisplay);
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT1);
-
- if(!SiSBIOSSetModeCRT1(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
- ((SiSMergedDisplayModePtr)mode->Private)->CRT1,
- pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT1() failed\n");
- return FALSE;
- }
-
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT2);
-
- if(!SiSBIOSSetModeCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
- ((SiSMergedDisplayModePtr)mode->Private)->CRT2,
- pSiS->IsCustomCRT2)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT2() failed\n");
- return FALSE;
- }
-
- } else {
-#endif
-
- if(pSiS->VBFlags & CRT1_LCDA) {
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT1);
- if(!SiSBIOSSetModeCRT1(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
- mode, pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT1() failed\n");
- return FALSE;
- }
- SiSPreSetMode(pScrn, mode, SIS_MODE_CRT2);
- if(!SiSBIOSSetModeCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
- mode, pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT2() failed\n");
- return FALSE;
- }
- } else {
- SiSPreSetMode(pScrn, mode, SIS_MODE_SIMU);
- if(!SiSBIOSSetMode(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
- mode, pSiS->IsCustom)) {
- SISErrorLog(pScrn, "SiSBIOSSetModeCRT() failed\n");
- return FALSE;
- }
- }
+ if(!SiSBIOSSetModeCRT1(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
+ ((SiSMergedDisplayModePtr)mode->Private)->CRT1,
+ pSiS->IsCustom)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSBIOSSetModeCRT1() failed\n");
+ return FALSE;
+ }
+ if(!SiSBIOSSetModeCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
+ ((SiSMergedDisplayModePtr)mode->Private)->CRT2,
+ pSiS->IsCustomCRT2)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSBIOSSetModeCRT2() failed\n");
+ return FALSE;
+ }
+
+ } else
+#endif
+ if(!SiSBIOSSetMode(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn,
+ mode, pSiS->IsCustom)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSBIOSSetMode() failed\n");
+ return FALSE;
+ }
-#ifdef SISMERGED
- }
-#endif
- SiSPostSetMode(pScrn, &pSiS->ModeReg);
+ SiSPostSetMode(pScrn, &pSiS->ModeReg);
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VBFlags %lx\n", pSiS->VBFlags);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "REAL REGISTER CONTENTS AFTER SETMODE:\n");
- (*pSiS->ModeInit)(pScrn, mode);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "REAL REGISTER CONTENTS AFTER SETMODE:\n");
+ (*pSiS->ModeInit)(pScrn, mode);
#endif
+ } else {
- } else {
-
- /* For other chipsets, use the old method */
+ /* For other chipsets, use the old method */
- /* Initialise the ModeReg values */
- if(!vgaHWInit(pScrn, mode)) {
- SISErrorLog(pScrn, "vgaHWInit() failed\n");
- return FALSE;
- }
+ /* Initialise the ModeReg values */
+ if(!vgaHWInit(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "vgaHWInit() failed\n");
+ return FALSE;
+ }
- /* Reset our PIOOffset as vgaHWInit might have reset it */
- VGAHWPTR(pScrn)->PIOOffset = pSiS->IODBase + (pSiS->PciInfo->ioBase[2] & 0xFFFC) - 0x380;
+ /* Reset our PIOOffset as vgaHWInit might have reset it */
+ VGAHWPTR(pScrn)->PIOOffset = pSiS->IODBase + (pSiS->PciInfo->ioBase[2] & 0xFFFC) - 0x380;
- /* Prepare the register contents */
- if(!(*pSiS->ModeInit)(pScrn, mode)) {
- SISErrorLog(pScrn, "ModeInit() failed\n");
- return FALSE;
- }
+ /* Prepare the register contents */
+ if(!(*pSiS->ModeInit)(pScrn, mode)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ModeInit() failed\n");
+ return FALSE;
+ }
- pScrn->vtSema = TRUE;
+ pScrn->vtSema = TRUE;
- /* Program the registers */
- vgaHWProtect(pScrn, TRUE);
- vgaReg = &hwp->ModeReg;
- sisReg = &pSiS->ModeReg;
+ /* Program the registers */
+ vgaHWProtect(pScrn, TRUE);
+ vgaReg = &hwp->ModeReg;
+ sisReg = &pSiS->ModeReg;
- vgaReg->Attribute[0x10] = 0x01;
- if(pScrn->bitsPerPixel > 8) {
- vgaReg->Graphics[0x05] = 0x00;
- }
+ vgaReg->Attribute[0x10] = 0x01;
+ if(pScrn->bitsPerPixel > 8) {
+ vgaReg->Graphics[0x05] = 0x00;
+ }
- vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE);
+ vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE);
- (*pSiS->SiSRestore)(pScrn, sisReg);
+ (*pSiS->SiSRestore)(pScrn, sisReg);
- if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) {
- SiS6326PostSetMode(pScrn, &pSiS->ModeReg);
- }
+ if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) {
+ SiS6326PostSetMode(pScrn, &pSiS->ModeReg);
+ }
#ifdef TWDEBUG
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"REAL REGISTER CONTENTS AFTER SETMODE:\n");
- (*pSiS->ModeInit)(pScrn, mode);
+ (*pSiS->ModeInit)(pScrn, mode);
#endif
- vgaHWProtect(pScrn, FALSE);
- }
+ vgaHWProtect(pScrn, FALSE);
+ }
#ifdef SISDUALHEAD
- }
+ }
#endif
}
@@ -6198,22 +5613,22 @@ SiSSetVESAMode(ScrnInfoPtr pScrn, DisplayModePtr pMode)
if(!(mode = SiSCalcVESAModeIndex(pScrn, pMode))) return FALSE;
- mode |= (1 << 15); /* Don't clear framebuffer */
- mode |= (1 << 14); /* Use linear adressing */
+ mode |= 1 << 15; /* Don't clear framebuffer */
+ mode |= 1 << 14; /* Use linear adressing */
if(VBESetVBEMode(pSiS->pVbe, mode, NULL) == FALSE) {
- SISErrorLog(pScrn, "Setting VESA mode 0x%x failed\n",
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Setting VESA mode 0x%x failed\n",
mode & 0x0fff);
- return (FALSE);
+ return (FALSE);
}
- if(pMode->HDisplay != pScrn->virtualX) {
- VBESetLogicalScanline(pSiS->pVbe, pScrn->virtualX);
- }
+ if(pMode->HDisplay != pScrn->virtualX)
+ VBESetLogicalScanline(pSiS->pVbe, pScrn->virtualX);
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Setting VESA mode 0x%x succeeded\n",
- mode & 0x0fff);
+ "Setting VESA mode 0x%x succeeded\n",
+ mode & 0x0fff);
return (TRUE);
}
@@ -6235,21 +5650,20 @@ SISSpecialRestore(ScrnInfoPtr pScrn)
* (although it should not do any harm on other chipsets/bridges
* etc.) However, even if I call the VBE to restore mode 0x03,
* these registers don't get restored correctly, possibly
- * because that int-2f-call for some reason results non-zero. So
+ * because that int-2f-call results non-zero. So
* what I do here is to restore these few registers
* manually.
*/
if(!(pSiS->ChipFlags & SiSCF_Is65x)) return;
inSISIDXREG(SISCR, 0x34, temp);
- temp &= 0x7f;
if(temp > 0x13) return;
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL,NULL);
#endif
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
outSISIDXREG(SISCAP, 0x3f, sisReg->sisCapt[0x3f]);
outSISIDXREG(SISCAP, 0x00, sisReg->sisCapt[0x00]);
@@ -6303,11 +5717,6 @@ SISRestore(ScrnInfoPtr pScrn)
* correct combination was pure hell.
*/
- /* Wait for the accelerators */
- if(pSiS->AccelInfoPtr) {
- (*pSiS->AccelInfoPtr->Sync)(pScrn);
- }
-
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
#ifdef SISDUALHEAD
@@ -6315,6 +5724,11 @@ SISRestore(ScrnInfoPtr pScrn)
if(pSiS->DualHeadMode && pSiS->SecondHead) return;
#endif
+ /* Wait for the accelerators */
+ if(pSiS->AccelInfoPtr) {
+ (*pSiS->AccelInfoPtr->Sync)(pScrn);
+ }
+
/* We must not disable the sequencer if the bridge is in SlaveMode! */
if(!(SiSBridgeIsInSlaveMode(pScrn))) {
vgaHWProtect(pScrn, TRUE);
@@ -6327,20 +5741,20 @@ SISRestore(ScrnInfoPtr pScrn)
/* First, restore CRT1 on/off and VB connection registers */
outSISIDXREG(SISCR, 0x32, pSiS->oldCR32);
if(!(pSiS->oldCR17 & 0x80)) { /* CRT1 was off */
- if(!(SiSBridgeIsInSlaveMode(pScrn))) { /* Bridge is NOT in SlaveMode now -> do it */
- doit = TRUE;
- } else {
- doitlater = TRUE;
- }
+ if(!(SiSBridgeIsInSlaveMode(pScrn))) { /* Bridge is NOT in SlaveMode now -> do it */
+ doit = TRUE;
+ } else {
+ doitlater = TRUE;
+ }
} else { /* CRT1 was on -> do it now */
- doit = TRUE;
+ doit = TRUE;
}
if(doit) {
outSISIDXREG(SISCR, 0x17, pSiS->oldCR17);
}
if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISCR, pSiS->myCR63, pSiS->oldCR63);
+ outSISIDXREG(SISCR, 0x63, pSiS->oldCR63);
}
outSISIDXREG(SISSR, 0x1f, pSiS->oldSR1F);
@@ -6352,7 +5766,7 @@ SISRestore(ScrnInfoPtr pScrn)
* the option RestoreBySetMode.
*/
if( ( (pSiS->restorebyset) ||
- (pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV)) ||
+ (pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) ||
((pSiS->sishw_ext.jChipType == SIS_730) && (pSiS->VBFlags & VB_LVDS)) ) &&
(pSiS->OldMode) ) {
@@ -6382,10 +5796,9 @@ SISRestore(ScrnInfoPtr pScrn)
if(vesasuccess == FALSE) {
int backupscaler = pSiS->SiS_Pr->UsePanelScaler;
- int backupcenter = pSiS->SiS_Pr->CenterScreen;
unsigned long backupspecialtiming = pSiS->SiS_Pr->SiS_CustomT;
- if((pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV))) {
+ if((pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV))) {
/* !!! REQUIRED for 630+301B-DH, otherwise the text modes
* will not be restored correctly !!!
* !!! Do this ONLY for LCD; VGA2 will not be restored
@@ -6404,7 +5817,6 @@ SISRestore(ScrnInfoPtr pScrn)
pSiS->SiS_Pr->UseCustomMode = FALSE;
pSiS->SiS_Pr->CRT1UsesCustomMode = FALSE;
pSiS->SiS_Pr->UsePanelScaler = pSiS->sisfbscalelcd;
- pSiS->SiS_Pr->CenterScreen = 0;
pSiS->SiS_Pr->SiS_CustomT = pSiS->sisfbspecialtiming;
SiSSetMode(pSiS->SiS_Pr, &pSiS->sishw_ext, pScrn, pSiS->OldMode, FALSE);
if(changedmode) {
@@ -6414,14 +5826,13 @@ SISRestore(ScrnInfoPtr pScrn)
SISSpecialRestore(pScrn);
SiS_GetSetModeID(pScrn,pSiS->OldMode);
pSiS->SiS_Pr->UsePanelScaler = backupscaler;
- pSiS->SiS_Pr->CenterScreen = backupcenter;
pSiS->SiS_Pr->SiS_CustomT = backupspecialtiming;
}
/* Restore CRT1 status */
if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISCR, pSiS->myCR63, pSiS->oldCR63);
+ outSISIDXREG(SISCR, 0x63, pSiS->oldCR63);
}
outSISIDXREG(SISSR, 0x1f, pSiS->oldSR1F);
@@ -6429,19 +5840,15 @@ SISRestore(ScrnInfoPtr pScrn)
/* Restore queue mode registers on 315/330 series */
/* (This became necessary due to the switch to VRAM queue) */
if(pSiS->VGAEngine == SIS_315_VGA) {
- unsigned char tempCR55=0;
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- inSISIDXREG(SISCR,0x55,tempCR55);
- andSISIDXREG(SISCR,0x55,0x33);
- }
+ unsigned char tempCR55;
+ inSISIDXREG(SISCR,0x55,tempCR55);
+ andSISIDXREG(SISCR,0x55,0x33);
outSISIDXREG(SISSR,0x26,0x01);
MMIO_OUT32(pSiS->IOBase, 0x85c4, 0);
outSISIDXREG(SISSR,0x27,sisReg->sisRegs3C4[0x27]);
outSISIDXREG(SISSR,0x26,sisReg->sisRegs3C4[0x26]);
MMIO_OUT32(pSiS->IOBase, 0x85C0, sisReg->sisMMIO85C0);
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- outSISIDXREG(SISCR,0x55,tempCR55);
- }
+ outSISIDXREG(SISCR,0x55,tempCR55);
}
#endif
@@ -6479,24 +5886,42 @@ SISRestore(ScrnInfoPtr pScrn)
*/
SiSRegInit(pSiS->SiS_Pr, pSiS->RelIO+0x30);
SiSSetLVDSetc(pSiS->SiS_Pr, &pSiS->sishw_ext, 0);
- SiS_GetVBType(pSiS->SiS_Pr, &pSiS->sishw_ext);
- SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_GetVBType(pSiS->SiS_Pr, pSiS->RelIO+0x30, &pSiS->sishw_ext);
+ SiS_DisableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
vgaHWProtect(pScrn, TRUE);
/* We now restore ALL to overcome the vga=extended problem */
vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL);
+#if 0
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) {
+ if(vesasuccess) {
+ vgaHWRestore(pScrn, vgaReg, (VGA_SR_CMAP | VGA_SR_FONTS));
+ } else {
+ vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL);
+ }
+ } else {
+ vgaHWRestore(pScrn, vgaReg, (VGA_SR_CMAP | VGA_SR_FONTS));
+ }
+#endif
+
vgaHWProtect(pScrn, FALSE);
- SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_EnableBridge(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
andSISIDXREG(SISSR, 0x01, ~0x20); /* Display on */
} else {
vgaHWProtect(pScrn, TRUE);
/* We now restore ALL to overcome the vga=extended problem */
vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL);
-
+#if 0
+ if(vesasuccess) {
+ vgaHWRestore(pScrn, vgaReg, (VGA_SR_CMAP | VGA_SR_FONTS));
+ } else {
+ vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL);
+ }
+#endif
vgaHWProtect(pScrn, FALSE);
}
}
@@ -6531,32 +5956,32 @@ SISRestore(ScrnInfoPtr pScrn)
* TV output will flicker terribly
*/
if((pSiS->Chipset == PCI_CHIP_SIS6326) && (pSiS->SiS6326Flags & SIS6326_HASTV)) {
- if(sisReg->sis6326tv[0] & 0x04) {
- unsigned char tmp;
- int val;
-
- orSISIDXREG(SISSR, 0x01, 0x20);
- tmp = SiS6326GetTVReg(pScrn,0x00);
- tmp &= ~0x04;
+ if(sisReg->sis6326tv[0] & 0x04) {
+ unsigned char tmp;
+ int val;
+
+ orSISIDXREG(SISSR, 0x01, 0x20);
+ tmp = SiS6326GetTVReg(pScrn,0x00);
+ tmp &= ~0x04;
+ while(!(inSISREG(SISINPSTAT) & 0x08)); /* Wait while NOT vb */
+ SiS6326SetTVReg(pScrn,0x00,tmp);
+ for(val=0; val < 2; val++) {
while(!(inSISREG(SISINPSTAT) & 0x08)); /* Wait while NOT vb */
- SiS6326SetTVReg(pScrn,0x00,tmp);
- for(val=0; val < 2; val++) {
- while(!(inSISREG(SISINPSTAT) & 0x08)); /* Wait while NOT vb */
- while(inSISREG(SISINPSTAT) & 0x08); /* wait while vb */
- }
- SiS6326SetTVReg(pScrn, 0x00, sisReg->sis6326tv[0]);
- tmp = inSISREG(SISINPSTAT);
- outSISREG(SISAR, 0x20);
- tmp = inSISREG(SISINPSTAT);
- while(inSISREG(SISINPSTAT) & 0x01);
- while(!(inSISREG(SISINPSTAT) & 0x01));
- andSISIDXREG(SISSR, 0x01, ~0x20);
- for(val=0; val < 10; val++) {
- while(!(inSISREG(SISINPSTAT) & 0x08)); /* Wait while NOT vb */
- while(inSISREG(SISINPSTAT) & 0x08); /* wait while vb */
- }
- andSISIDXREG(SISSR, 0x01, ~0x20);
- }
+ while(inSISREG(SISINPSTAT) & 0x08); /* wait while vb */
+ }
+ SiS6326SetTVReg(pScrn, 0x00, sisReg->sis6326tv[0]);
+ tmp = inSISREG(SISINPSTAT);
+ outSISREG(SISAR, 0x20);
+ tmp = inSISREG(SISINPSTAT);
+ while(inSISREG(SISINPSTAT) & 0x01);
+ while(!(inSISREG(SISINPSTAT) & 0x01));
+ andSISIDXREG(SISSR, 0x01, ~0x20);
+ for(val=0; val < 10; val++) {
+ while(!(inSISREG(SISINPSTAT) & 0x08)); /* Wait while NOT vb */
+ while(inSISREG(SISINPSTAT) & 0x08); /* wait while vb */
+ }
+ andSISIDXREG(SISSR, 0x01, ~0x20);
+ }
}
sisRestoreExtRegisterLock(pSiS,sisReg->sisRegs3C4[5],sisReg->sisRegs3D4[0x80]);
@@ -6577,19 +6002,15 @@ SISVESARestore(ScrnInfoPtr pScrn)
/* (This became necessary due to the switch to VRAM queue) */
if(pSiS->VGAEngine == SIS_315_VGA) {
SISRegPtr sisReg = &pSiS->SavedReg;
- unsigned char tempCR55=0;
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- inSISIDXREG(SISCR,0x55,tempCR55);
- andSISIDXREG(SISCR,0x55,0x33);
- }
+ unsigned char tempCR55;
+ inSISIDXREG(SISCR,0x55,tempCR55);
+ andSISIDXREG(SISCR,0x55,0x33);
outSISIDXREG(SISSR,0x26,0x01);
MMIO_OUT32(pSiS->IOBase, 0x85c4, 0);
outSISIDXREG(SISSR,0x27,sisReg->sisRegs3C4[0x27]);
outSISIDXREG(SISSR,0x26,sisReg->sisRegs3C4[0x26]);
MMIO_OUT32(pSiS->IOBase, 0x85C0, sisReg->sisMMIO85C0);
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- outSISIDXREG(SISCR,0x55,tempCR55);
- }
+ outSISIDXREG(SISCR,0x55,tempCR55);
}
#endif
}
@@ -6672,7 +6093,8 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH);
#endif
} else {
- SISErrorLog(pScrn, "Failed to load VBE submodule\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Failed to load VBE submodule\n");
}
#ifdef SISDUALHEAD
}
@@ -6680,8 +6102,8 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- pSiSEnt = pSiS->entityPrivate;
- pSiSEnt->refCount++;
+ pSiSEnt = pSiS->entityPrivate;
+ pSiSEnt->refCount++;
}
#endif
@@ -6689,7 +6111,8 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
if(pSiS->Primary) {
hwp->MapSize = 0x10000; /* Standard 64k VGA window */
if(!vgaHWMapMem(pScrn)) {
- SISErrorLog(pScrn, "Could not map VGA memory window\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Could not map VGA window\n");
return FALSE;
}
}
@@ -6702,8 +6125,9 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Map the SIS memory and MMIO areas */
if(!SISMapMem(pScrn)) {
- SISErrorLog(pScrn, "SiSMapMem() failed\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSMapMem() failed\n");
+ return FALSE;
}
#ifdef UNLOCK_ALWAYS
@@ -6726,7 +6150,10 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Save the current state */
SISSave(pScrn);
-
+
+ OnScreenSize = pScrn->displayWidth * pScrn->currentMode->VDisplay
+ * (pScrn->bitsPerPixel / 8);
+
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
if(!pSiS->OldMode) {
@@ -6738,8 +6165,8 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Read 0:449 which the BIOS sets to the current mode number
* Unfortunately, this not reliable since the int10 emulation
* does not change this. So if we call the VBE later, this
- * byte won't be touched (which is why we set this manually
- * then).
+ * byte won't be touched. (which is why we set this manually
+ * then)
*/
unsigned char myoldmode = SiS_GetSetModeID(pScrn,0xFF);
unsigned char cr30, cr31;
@@ -6766,23 +6193,30 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
* two is valid).
*/
if(pSiS->OldMode > 0x7f) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Previous video mode (%02x) invalid, using BIOS scratch (%02x)\n",
+ pSiS->OldMode, myoldmode);
pSiS->OldMode = myoldmode;
}
}
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- if(!pSiS->SecondHead) pSiSEnt->OldMode = pSiS->OldMode;
- else pSiS->OldMode = pSiSEnt->OldMode;
- }
-#endif
+
+ /* Clear frame buffer on 300 and 315/330 series
+ * (older chipsets don't like this to be done before
+ * setting the mode (such as rev 0x0b of 6326))
+ */
+ bzero(pSiS->FbBase, OnScreenSize);
}
/* Initialise the first mode */
if(!SISModeInit(pScrn, pScrn->currentMode)) {
- SISErrorLog(pScrn, "SiSModeInit() failed\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSModeInit() failed\n");
+ return FALSE;
}
+ /* Clear frame buffer */
+ bzero(pSiS->FbBase, OnScreenSize);
+
/* Darken the screen for aesthetic reasons */
/* Not using Dual Head variant on purpose; we darken
* the screen for both displays, and un-darken
@@ -6816,14 +6250,23 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
* For bpp > 8, the default visuals are not acceptable because we only
* support TrueColor and not DirectColor.
*/
- if(!miSetVisualTypes(pScrn->depth,
- (pScrn->bitsPerPixel > 8) ?
- TrueColorMask : miGetDefaultVisualMask(pScrn->depth),
- pScrn->rgbBits, pScrn->defaultVisual)) {
- SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- SISErrorLog(pScrn, "miSetVisualTypes() failed (bpp %d)\n",
- pScrn->bitsPerPixel);
- return FALSE;
+ if(pScrn->bitsPerPixel > 8) {
+ if(!miSetVisualTypes(pScrn->depth, TrueColorMask, pScrn->rgbBits,
+ pScrn->defaultVisual)) {
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "miSetVisualTypes() failed (bpp %d)\n", pScrn->bitsPerPixel);
+ return FALSE;
+ }
+ } else {
+ if(!miSetVisualTypes(pScrn->depth,
+ miGetDefaultVisualMask(pScrn->depth),
+ pScrn->rgbBits, pScrn->defaultVisual)) {
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "miSetVisualTypes() failed (bpp %d)\n", pScrn->bitsPerPixel);
+ return FALSE;
+ }
}
width = pScrn->virtualX;
@@ -6831,59 +6274,53 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
displayWidth = pScrn->displayWidth;
if(pSiS->Rotate) {
- height = pScrn->virtualX;
- width = pScrn->virtualY;
+ height = pScrn->virtualX;
+ width = pScrn->virtualY;
}
if(pSiS->ShadowFB) {
- pSiS->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width);
- pSiS->ShadowPtr = xalloc(pSiS->ShadowPitch * height);
- displayWidth = pSiS->ShadowPitch / (pScrn->bitsPerPixel >> 3);
- FBStart = pSiS->ShadowPtr;
+ pSiS->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width);
+ pSiS->ShadowPtr = xalloc(pSiS->ShadowPitch * height);
+ displayWidth = pSiS->ShadowPitch / (pScrn->bitsPerPixel >> 3);
+ FBStart = pSiS->ShadowPtr;
} else {
- pSiS->ShadowPtr = NULL;
- FBStart = pSiS->FbBase;
+ pSiS->ShadowPtr = NULL;
+ FBStart = pSiS->FbBase;
}
if(!miSetPixmapDepths()) {
- SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- SISErrorLog(pScrn, "miSetPixmapDepths() failed\n");
- return FALSE;
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "miSetPixmapDepths() failed\n");
+ return FALSE;
}
- /* Point cmdQueuePtr to pSiSEnt for shared usage
- * (same technique is then eventually used in DRIScreeninit)
- * For 315/330 series, this is done in EnableTurboQueue
- * which has already been called during ModeInit().
- */
#ifdef SISDUALHEAD
if(pSiS->SecondHead)
- pSiS->cmdQueueLenPtr = &(SISPTR(pSiSEnt->pScrn_1)->cmdQueueLen);
+ pSiS->cmdQueueLenPtr = &(SISPTR(pSiSEnt->pScrn_1)->cmdQueueLen);
else
#endif
- pSiS->cmdQueueLenPtr = &(pSiS->cmdQueueLen);
+ pSiS->cmdQueueLenPtr = &(pSiS->cmdQueueLen);
pSiS->cmdQueueLen = 0; /* Force an EngineIdle() at start */
#ifdef XF86DRI
- if(pSiS->loadDRI) {
#ifdef SISDUALHEAD
- /* No DRI in dual head mode */
- if(pSiS->DualHeadMode) {
- pSiS->directRenderingEnabled = FALSE;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ /* No DRI in dual head mode */
+ if(pSiS->DualHeadMode) {
+ pSiS->directRenderingEnabled = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"DRI not supported in Dual Head mode\n");
- } else
+ } else
#endif
- /* Force the initialization of the context */
- if(pSiS->VGAEngine != SIS_315_VGA) {
- pSiS->directRenderingEnabled = SISDRIScreenInit(pScreen);
+ /* Force the initialization of the context */
+ if(pSiS->VGAEngine != SIS_315_VGA) {
+ pSiS->directRenderingEnabled = SISDRIScreenInit(pScreen);
} else {
xf86DrvMsg(pScrn->scrnIndex, X_NOT_IMPLEMENTED,
- "DRI not supported on this chipset\n");
+ "DRI not supported on this chipset\n");
pSiS->directRenderingEnabled = FALSE;
}
- }
#endif
/*
@@ -6908,37 +6345,38 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
break;
}
if(!ret) {
- SISErrorLog(pScrn, "Unsupported bpp (%d) or fbScreenInit() failed\n",
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "Unsupported bpp (%d) or fbScreenInit() failed\n",
pScrn->bitsPerPixel);
- SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- return FALSE;
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ return FALSE;
}
if(pScrn->bitsPerPixel > 8) {
- /* Fixup RGB ordering */
- visual = pScreen->visuals + pScreen->numVisuals;
- while (--visual >= pScreen->visuals) {
- if((visual->class | DynamicClass) == DirectColor) {
- visual->offsetRed = pScrn->offset.red;
- visual->offsetGreen = pScrn->offset.green;
- visual->offsetBlue = pScrn->offset.blue;
- visual->redMask = pScrn->mask.red;
- visual->greenMask = pScrn->mask.green;
- visual->blueMask = pScrn->mask.blue;
- }
- }
+ /* Fixup RGB ordering */
+ visual = pScreen->visuals + pScreen->numVisuals;
+ while (--visual >= pScreen->visuals) {
+ if((visual->class | DynamicClass) == DirectColor) {
+ visual->offsetRed = pScrn->offset.red;
+ visual->offsetGreen = pScrn->offset.green;
+ visual->offsetBlue = pScrn->offset.blue;
+ visual->redMask = pScrn->mask.red;
+ visual->greenMask = pScrn->mask.green;
+ visual->blueMask = pScrn->mask.blue;
+ }
+ }
}
/* Initialize RENDER ext; must be after RGB ordering fixed */
fbPictureInit(pScreen, 0, 0);
/* hardware cursor needs to wrap this layer <-- TW: what does that mean? */
- if(!pSiS->ShadowFB) SISDGAInit(pScreen);
+ if(!pSiS->ShadowFB) SISDGAInit(pScreen);
xf86SetBlackWhitePixels(pScreen);
if(!pSiS->NoAccel) {
- switch(pSiS->VGAEngine) {
+ switch(pSiS->VGAEngine) {
case SIS_530_VGA:
case SIS_300_VGA:
SiS300AccelInit(pScreen);
@@ -6948,7 +6386,7 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
break;
default:
SiSAccelInit(pScreen);
- }
+ }
}
miInitializeBackingStore(pScreen);
xf86SetBackingStore(pScreen);
@@ -6957,23 +6395,24 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Initialise cursor functions */
miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
- if(pSiS->HWCursor) {
- SiSHWCursorInit(pScreen);
- }
+ if(pSiS->HWCursor)
+ SiSHWCursorInit(pScreen);
/* Initialise default colourmap */
if(!miCreateDefColormap(pScreen)) {
- SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- SISErrorLog(pScrn, "miCreateDefColormap() failed\n");
- return FALSE;
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "miCreateDefColormap() failed\n");
+ return FALSE;
}
-
+
if(!xf86HandleColormaps(pScreen, 256, (pScrn->depth == 8) ? 8 : pScrn->rgbBits,
SISLoadPalette, NULL,
CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) {
- SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- SISErrorLog(pScrn, "xf86HandleColormaps() failed\n");
- return FALSE;
+ SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "xf86HandleColormaps() failed\n");
+ return FALSE;
}
#if 0
@@ -7014,8 +6453,6 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Init memPhysBase and fbOffset in pScrn */
pScrn->memPhysBase = pSiS->FbAddress;
pScrn->fbOffset = 0;
-
- pSiS->ResetXv = pSiS->ResetXvGamma = NULL;
#if (XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,99,0,0)) || (defined(XvExtension))
if(!pSiS->NoXvideo) {
@@ -7072,24 +6509,23 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
#endif
#ifdef XF86DRI
- if(pSiS->loadDRI) {
- if(pSiS->directRenderingEnabled) {
- /* Now that mi, drm and others have done their thing,
- * complete the DRI setup.
- */
- pSiS->directRenderingEnabled = SISDRIFinishScreenInit(pScreen);
- }
- if(pSiS->directRenderingEnabled) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n");
- /* TODO */
- /* SISSetLFBConfig(pSiS); */
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering disabled\n");
- }
+ if(pSiS->directRenderingEnabled) {
+ /* Now that mi, drm and others have done their thing,
+ * complete the DRI setup.
+ */
+ pSiS->directRenderingEnabled = SISDRIFinishScreenInit(pScreen);
+ }
+ if(pSiS->directRenderingEnabled) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n");
+ /* TODO */
+ /* SISSetLFBConfig(pSiS); */
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering disabled\n");
}
#endif
- /* Wrap some funcs and setup remaining SD flags */
+
+ /* Wrap some funcs */
pSiS->SiS_SD_Flags &= ~(SiS_SD_PSEUDOXINERAMA);
#ifdef SISMERGED
@@ -7103,11 +6539,6 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
SiSnoPanoramiXExtension = FALSE;
SiSXineramaExtensionInit(pScrn);
if(!SiSnoPanoramiXExtension) {
-#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,0,0,0)
- xf86DisableRandR();
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "SiS Pseudo-Xinerama enabled, RandR disabled\n");
-#endif
pSiS->SiS_SD_Flags |= SiS_SD_PSEUDOXINERAMA;
}
}
@@ -7133,42 +6564,15 @@ SISScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
}
- /* Clear frame buffer */
- /* For CRT2, we don't do that at this point in dual head
- * mode since the mode isn't switched at this time (it will
- * be reset when setting the CRT1 mode). Hence, we just
- * save the necessary data and clear the screen when
- * going through this for CRT1.
- */
-
- OnScreenSize = pScrn->displayWidth * pScrn->currentMode->VDisplay
- * (pScrn->bitsPerPixel >> 3);
-
/* Turn on the screen now */
- /* We do this in dual head mode after second head is finished */
+ /* TW: We do this in dual head mode after second head is finished */
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- bzero(pSiS->FbBase, OnScreenSize);
- bzero(pSiSEnt->FbBase1, pSiSEnt->OnScreenSize1);
+ if(pSiS->SecondHead)
SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- } else {
- pSiSEnt->FbBase1 = pSiS->FbBase;
- pSiSEnt->OnScreenSize1 = OnScreenSize;
- }
- } else {
+ } else
#endif
SISSaveScreen(pScreen, SCREEN_SAVER_OFF);
- bzero(pSiS->FbBase, OnScreenSize);
-#ifdef SISDUALHEAD
- }
-#endif
-
- pSiS->SiS_SD_Flags &= ~SiS_SD_ISDEPTH8;
- if(pSiS->CurrentLayout.bitsPerPixel == 8) {
- pSiS->SiS_SD_Flags |= SiS_SD_ISDEPTH8;
- pSiS->SiS_SD_Flags &= ~SiS_SD_SUPPORTXVGAMMA1;
- }
return TRUE;
}
@@ -7182,7 +6586,7 @@ SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
if(!pSiS->NoAccel) {
if(pSiS->AccelInfoPtr) {
- (*pSiS->AccelInfoPtr->Sync)(pScrn);
+ (*pSiS->AccelInfoPtr->Sync)(pScrn);
}
}
@@ -7201,14 +6605,15 @@ SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
return TRUE;
}
+#ifdef CYCLECRT2
+/* TW: Cycle CRT2 output devices */
Bool
-SISSwitchCRT2Type(ScrnInfoPtr pScrn, unsigned long newvbflags)
+SISCycleCRT2Type(int scrnIndex, DisplayModePtr mode)
{
+ ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
SISPtr pSiS = SISPTR(pScrn);
+ int i = 0;
BOOLEAN hcm;
- DisplayModePtr mode = pScrn->currentMode;
-
- /* Do NOT use this to switch from CRT2_LCD to CRT1_LCDA */
/* Only on 300 and 315/330 series */
if(pSiS->VGAEngine != SIS_300_VGA &&
@@ -7217,311 +6622,231 @@ SISSwitchCRT2Type(ScrnInfoPtr pScrn, unsigned long newvbflags)
/* Only if there is a video bridge */
if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return FALSE;
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) return FALSE;
+ /* Only if there were more than 1 CRT2 devices detected */
+ if(pSiS->detectedCRT2Devices & CRT2_VGA) i++;
+ if(pSiS->detectedCRT2Devices & CRT2_LCD) i++;
+ if(pSiS->detectedCRT2Devices & CRT2_TV) i++;
+ if(i <= 1) return FALSE;
+
+ /* Cycle CRT2 type */
+ i = (pSiS->VBFlags & DISPTYPE_DISP2) << 1;
+ while(!(i & pSiS->detectedCRT2Devices)) {
+ i <<= 1;
+ if(i > CRT2_VGA) i = CRT2_LCD;
+ }
+#ifdef SISMERGED
+ if(pSiS->MergedFB) hcm = pSiS->HaveCustomModes2;
+ else
+#endif
+ hcm = pSiS->HaveCustomModes;
+
+ /* Check if the current mode is suitable for desired output device */
+ if(!SiS_CheckCalcModeIndex(pScrn, pScrn->currentMode,
+ ((pSiS->VBFlags & ~(DISPTYPE_DISP2)) | i), hcm)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Current mode not suitable for desired CRT2 output device\n");
+ return FALSE;
+ }
+
+ /* Sync the accelerators */
+ if(!pSiS->NoAccel) {
+ if(pSiS->AccelInfoPtr) {
+ (*pSiS->AccelInfoPtr->Sync)(pScrn);
+ }
+ }
+
+ pSiS->VBFlags &= ~(DISPTYPE_DISP2);
+ pSiS->VBFlags |= i;
+
+ xf86DrvMsg(0, X_INFO, "Calling SiSModeInit()\n");
+
+ /* return SISModeInit(xf86Screens[scrnIndex], mode); */
+ /* Remember to restore the palette after this */
+ if(!(pScrn->SwitchMode(scrnIndex, pScrn->currentMode, 0))) return FALSE;
+ SISAdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
+ return TRUE;
+}
#endif
-#define SiS_NewVBMask (CRT2_ENABLE|CRT1_LCDA|TV_PAL|TV_NTSC|TV_PALM|TV_PALN|TV_NTSCJ| \
- TV_AVIDEO|TV_SVIDEO|TV_SCART|TV_HIVISION|TV_YPBPR|TV_YPBPRALL|\
- TV_YPBPRAR)
+Bool
+SISSwitchCRT2Type(ScrnInfoPtr pScrn, unsigned long newvbflags)
+{
+ SISPtr pSiS = SISPTR(pScrn);
+ BOOLEAN hcm;
+ DisplayModePtr mode = pScrn->currentMode;
+
+ /* Only on 300 and 315/330 series */
+ if(pSiS->VGAEngine != SIS_300_VGA &&
+ pSiS->VGAEngine != SIS_315_VGA) return FALSE;
+
+ /* Only if there is a video bridge */
+ if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return FALSE;
+
+#define SiS_NewVBMask (CRT2_ENABLE | TV_PAL | TV_NTSC | TV_PALM | TV_PALN | TV_AVIDEO | TV_SVIDEO)
newvbflags &= SiS_NewVBMask;
newvbflags |= pSiS->VBFlags & ~SiS_NewVBMask;
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTLCDA)) {
- newvbflags &= ~CRT1_LCDA;
- }
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTHIVISION)) {
- newvbflags &= ~TV_HIVISION;
- }
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR)) {
- newvbflags &= ~TV_YPBPR;
- }
-
#ifdef SISMERGED
- if(pSiS->MergedFB) {
- if(!(newvbflags & CRT2_ENABLE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ if(pSiS->MergedFB) {
+ hcm = pSiS->HaveCustomModes2;
+ if(mode->Private) {
+ mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2;
+ }
+ if(!(newvbflags & CRT2_ENABLE)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"CRT2 can't be switched off in MergedFB mode\n");
- return FALSE;
- }
- hcm = pSiS->HaveCustomModes2;
- if(mode->Private) {
- mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2;
- }
+ return FALSE;
+ }
} else
#endif
- hcm = pSiS->HaveCustomModes;
+ hcm = pSiS->HaveCustomModes;
if((!(newvbflags & CRT2_ENABLE)) && (!newvbflags & DISPTYPE_CRT1)) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "CRT2 can't be switched off while CRT1 is off\n");
+ "CRT2 can't be switched off if CRT1 is off, too\n");
return FALSE;
}
- /* CRT2_LCD overrules LCDA */
- if(newvbflags & CRT2_LCD) {
- newvbflags &= ~CRT1_LCDA;
- }
-
- /* Check if the current mode is suitable for desired output device (if any) */
- if(newvbflags & CRT2_ENABLE) {
- if(!SiS_CheckCalcModeIndex(pScrn, mode, newvbflags, hcm)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Current mode not suitable for desired CRT2 output device\n");
- return FALSE;
- }
- }
-
- /* Remember: Dualhead not supported */
- newvbflags &= ~(SINGLE_MODE | MIRROR_MODE);
- if((newvbflags & DISPTYPE_CRT1) && (newvbflags & CRT2_ENABLE)) {
- newvbflags |= MIRROR_MODE;
- } else {
- newvbflags |= SINGLE_MODE;
+ /* Check if the current mode is suitable for desired output device */
+ if(!SiS_CheckCalcModeIndex(pScrn, mode, newvbflags, hcm)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Current mode not suitable for desired CRT2 output device\n");
+ return FALSE;
}
/* Sync the accelerators */
if(!pSiS->NoAccel) {
- if(pSiS->AccelInfoPtr) {
- (*pSiS->AccelInfoPtr->Sync)(pScrn);
- }
+ if(pSiS->AccelInfoPtr) {
+ (*pSiS->AccelInfoPtr->Sync)(pScrn);
+ }
}
pSiS->VBFlags = pSiS->VBFlags_backup = newvbflags;
if(!(pScrn->SwitchMode(pScrn->scrnIndex, pScrn->currentMode, 0))) return FALSE;
+ /* if(!SISModeInit(xf86Screens[pScrn->scrnIndex], pScrn->currentMode)) return FALSE; */
SISAdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
return TRUE;
}
-int
+Bool
SISCheckModeIndexForCRT2Type(ScrnInfoPtr pScrn, unsigned short cond, unsigned short index, Bool quiet)
{
SISPtr pSiS = SISPTR(pScrn);
- BOOLEAN hcm = pSiS->HaveCustomModes;
- DisplayModePtr mode = pScrn->modes, mastermode;
- int i, result = 0;
+ BOOLEAN hcm;
+ DisplayModePtr mode = pScrn->modes;
+ int i;
unsigned long vbflags = pSiS->VBFlags;
- /* Not only CRT2, but also LCDA */
+ /* Only on 300 and 315/330 series */
+ if(pSiS->VGAEngine != SIS_300_VGA &&
+ pSiS->VGAEngine != SIS_315_VGA) return FALSE;
- /* returns 0 if mode ok,
- * 0x01 if mode not ok for CRT2 device,
- * 0x02 if mode too large for current root window
- * or combinations thereof
- */
+ /* Mode is OK if there is no video bridge */
+ /* (Requires screen size check in app) */
+ if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return TRUE;
- /* No special treatment for NTSC-J here; conditions equal NTSC */
if(cond) {
- vbflags &= ~(CRT2_ENABLE | CRT1_LCDA | TV_STANDARD | TV_INTERFACE);
- if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_LCD) {
+ vbflags &= ~(CRT2_ENABLE | TV_TYPE | TV_PALM | TV_PALN);
+ if(cond & SiS_CF2_LCD) {
vbflags |= CRT2_LCD;
- } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_TV) {
- vbflags |= (CRT2_TV | TV_SVIDEO);
+ } else if(cond & SiS_CF2_TV) {
+ vbflags |= CRT2_TV;
if(cond & SiS_CF2_TVPAL) vbflags |= TV_PAL;
else if(cond & SiS_CF2_TVPALM) vbflags |= (TV_PAL | TV_PALM);
else if(cond & SiS_CF2_TVPALN) vbflags |= (TV_PAL | TV_PALN);
else if(cond & SiS_CF2_TVNTSC) vbflags |= TV_NTSC;
- } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_TVSPECIAL) {
- vbflags |= CRT2_TV;
- if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVHIVISION)
- vbflags |= TV_HIVISION;
- else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR525I)
- vbflags |= (TV_YPBPR | TV_YPBPR525I);
- else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR525P)
- vbflags |= (TV_YPBPR | TV_YPBPR525P);
- else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR750P)
- vbflags |= (TV_YPBPR | TV_YPBPR750P);
- else if((cond & SiS_CF2_TVSPECMASK) == SiS_CF2_TVYPBPR1080I)
- vbflags |= (TV_YPBPR | TV_YPBPR1080I);
- } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_VGA2) {
+ } else if(cond & SiS_CF2_VGA2) {
vbflags |= CRT2_VGA;
- } else if((cond & SiS_CF2_TYPEMASK) == SiS_CF2_CRT1LCDA) {
- vbflags |= CRT1_LCDA;
}
}
+ /* Mode is obviously OK if video bridge is disabled */
+ /* (Required extra check for eventual screen size problems in app) */
+ if(!(vbflags & CRT2_ENABLE)) return TRUE;
+
/* Find mode of given index */
if(index) {
for(i = 0; i < index; i++) {
- if(!mode) return 0x03;
+ if(!mode) return FALSE;
mode = mode->next;
}
}
- mastermode = mode;
-
-#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (!pSiS->SecondHead)) {
-#endif
-
- if(vbflags & CRT2_ENABLE) {
-
#ifdef SISMERGED
- if(pSiS->MergedFB) {
- hcm = pSiS->HaveCustomModes2;
- if(mode->Private) {
- mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2;
- }
- }
+ if(pSiS->MergedFB) {
+ hcm = pSiS->HaveCustomModes2;
+ if(mode->Private) {
+ mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT2;
+ }
+ } else
#endif
+ hcm = pSiS->HaveCustomModes;
- /* For RandR */
- if((mode->HDisplay > pScrn->virtualX) || (mode->VDisplay > pScrn->virtualY)) {
- if(!quiet) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Desired mode too large for current screen size\n");
- }
- result |= 0x02;
- }
-
- /* Check if the desired mode is suitable for current CRT2 output device */
- if(!SiS_CheckCalcModeIndex(pScrn, mode, vbflags, hcm)) {
- if((!cond) && (!quiet)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Desired mode not suitable for current CRT2 output device\n");
- }
- result |= 0x01;
- }
-
+ /* For RandR */
+ if((mode->HDisplay > pScrn->virtualX) || (mode->VDisplay > pScrn->virtualY)) {
+ if(!quiet) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Desired mode too large for current screen size\n");
}
-
-#ifdef SISDUALHEAD
+ return FALSE;
}
-#endif
-
- mode = mastermode;
-#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (pSiS->SecondHead)) {
-#endif
-
- if(vbflags & CRT1_LCDA) {
-
-#ifdef SISMERGED
- if(pSiS->MergedFB) {
- hcm = pSiS->HaveCustomModes;
- if(mode->Private) {
- mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1;
- }
- }
-#endif
-
- /* For RandR */
- if((mode->HDisplay > pScrn->virtualX) || (mode->VDisplay > pScrn->virtualY)) {
- if(!quiet) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Desired mode too large for current screen size\n");
- }
- result |= 0x02;
- }
-
- /* Check if the desired mode is suitable for current CRT1 output device */
- if(!SiS_CalcModeIndex(pScrn, mode, vbflags, hcm)) {
- if((!cond) && (!quiet)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Desired mode not suitable for current CRT1 output device\n");
- }
- result |= 0x01;
- }
-
- }
-
-#ifdef SISDUALHEAD
+ /* Check if the desired mode is suitable for current output device */
+ if(!SiS_CheckCalcModeIndex(pScrn, mode, vbflags, hcm)) {
+ if((!cond) && (!quiet)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Desired mode not suitable for current CRT2 output device\n");
+ }
+ return FALSE;
}
-#endif
- return result;
+ return TRUE;
}
Bool
SISSwitchCRT1Status(ScrnInfoPtr pScrn, int onoff)
{
SISPtr pSiS = SISPTR(pScrn);
- DisplayModePtr mode = pScrn->currentMode;
- unsigned long vbflags = pSiS->VBFlags;
- int crt1off;
-
- /* onoff: 0=OFF, 1=ON(VGA), 2=ON(LCDA) */
- /* Switching to LCDA will disable CRT2 if previously LCD */
-
- /* Do NOT use this to switch from CRT1_LCDA to CRT2_LCD */
/* Only on 300 and 315/330 series */
if(pSiS->VGAEngine != SIS_300_VGA &&
pSiS->VGAEngine != SIS_315_VGA) return FALSE;
- /* Off only if at least one CRT2 device is active */
- if((!onoff) && (!(vbflags & CRT2_ENABLE))) return FALSE;
-
-#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) return FALSE;
-#endif
-
- /* Can't switch to LCDA of not supported (duh!) */
- if(!(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTLCDA)) {
- if(onoff == 2) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "LCD-via-CRT1 not supported on this hardware\n");
- return FALSE;
- }
- }
+ /* Only if at least one CRT2 device is active */
+ if(!(pSiS->VBFlags & CRT2_ENABLE)) return FALSE;
#ifdef SISMERGED
- if(pSiS->MergedFB) {
- if(!onoff) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ if(pSiS->MergedFB) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"CRT1 can't be switched off in MergedFB mode\n");
- return FALSE;
- } else if(onoff == 2) {
- if(vbflags & CRT2_LCD) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "CRT2 type can't be LCD while CRT1 is LCD-via-CRT1\n");
- return FALSE;
- }
- }
- if(mode->Private) {
- mode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1;
- }
+ return FALSE;
}
#endif
- vbflags &= ~(DISPTYPE_CRT1 | SINGLE_MODE | MIRROR_MODE | CRT1_LCDA);
- crt1off = 1;
- if(onoff > 0) {
- vbflags |= DISPTYPE_CRT1;
- crt1off = 0;
- if(onoff == 2) {
- vbflags |= CRT1_LCDA;
- vbflags &= ~CRT2_LCD;
- }
- /* Remember: Dualhead not supported */
- if(vbflags & CRT2_ENABLE) vbflags |= MIRROR_MODE;
- else vbflags |= SINGLE_MODE;
+ pSiS->VBFlags &= ~(DISPTYPE_CRT1 | SINGLE_MODE | MIRROR_MODE);
+ pSiS->CRT1off = 1;
+ if(onoff) {
+ pSiS->VBFlags |= DISPTYPE_CRT1;
+ pSiS->CRT1off = 0;
+ if(pSiS->VBFlags & CRT2_ENABLE) pSiS->VBFlags |= MIRROR_MODE;
+ else pSiS->VBFlags |= SINGLE_MODE;
} else {
- vbflags |= SINGLE_MODE;
- }
-
- if(vbflags & CRT1_LCDA) {
- if(!SiS_CalcModeIndex(pScrn, mode, vbflags, pSiS->HaveCustomModes)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Current mode not suitable for LCD-via-CRT1\n");
- return FALSE;
- }
+ pSiS->VBFlags |= SINGLE_MODE;
}
- pSiS->CRT1off = crt1off;
- pSiS->VBFlags = pSiS->VBFlags_backup = vbflags;
+ pSiS->VBFlags_backup = pSiS->VBFlags;
/* Sync the accelerators */
if(!pSiS->NoAccel) {
- if(pSiS->AccelInfoPtr) {
- (*pSiS->AccelInfoPtr->Sync)(pScrn);
- }
+ if(pSiS->AccelInfoPtr) {
+ (*pSiS->AccelInfoPtr->Sync)(pScrn);
+ }
}
if(!(pScrn->SwitchMode(pScrn->scrnIndex, pScrn->currentMode, 0))) return FALSE;
+ /* if(!SISModeInit(xf86Screens[pScrn->scrnIndex], pScrn->currentMode)) return FALSE; */
SISAdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
return TRUE;
}
@@ -7546,18 +6871,18 @@ SISSetStartAddressCRT1(SISPtr pSiS, unsigned long base)
static void
SISSetStartAddressCRT2(SISPtr pSiS, unsigned long base)
{
- SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_UnLockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
outSISIDXREG(SISPART1, 0x06, GETVAR8(base));
outSISIDXREG(SISPART1, 0x05, GETBITS(base, 15:8));
outSISIDXREG(SISPART1, 0x04, GETBITS(base, 23:16));
if(pSiS->VGAEngine == SIS_315_VGA) {
setSISIDXREG(SISPART1, 0x02, 0x7F, ((base >> 24) & 0x01) << 7);
}
- SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext);
+ SiS_LockCRT2(pSiS->SiS_Pr, &pSiS->sishw_ext, pSiS->RelIO+0x30);
}
#ifdef SISMERGED
-static Bool
+Bool
InRegion(int x, int y, region r)
{
return (r.x0 <= x) && (x <= r.x1) && (r.y0 <= y) && (y <= r.y1);
@@ -7593,7 +6918,7 @@ SISAdjustFrameHW_CRT2(ScrnInfoPtr pScrn, int x, int y)
SISSetStartAddressCRT2(pSiS, base);
}
-static void
+void
SISMergePointerMoved(int scrnIndex, int x, int y)
{
ScrnInfoPtr pScrn1 = xf86Screens[scrnIndex];
@@ -7904,32 +7229,20 @@ SISEnterVT(int scrnIndex, int flags)
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
- if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- outSISIDXREG(SISCR,0x32,pSiS->myCR32);
- outSISIDXREG(SISCR,0x36,pSiS->myCR36);
- outSISIDXREG(SISCR,0x37,pSiS->myCR37);
- }
-
if(!SISModeInit(pScrn, pScrn->currentMode)) {
- SISErrorLog(pScrn, "SiSEnterVT: SISModeInit() failed\n");
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "SiSEnterVT: SISModeInit() failed\n");
+ return FALSE;
}
SISAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
#ifdef XF86DRI
- if(pSiS->directRenderingEnabled) {
+ /* this is to be done AFTER switching the mode */
+ if(pSiS->directRenderingEnabled)
DRIUnlock(screenInfo.screens[scrnIndex]);
- }
#endif
-#ifdef SISDUALHEAD
- if((!pSiS->DualHeadMode) || (!pSiS->SecondHead))
-#endif
- if(pSiS->ResetXv) {
- (pSiS->ResetXv)(pScrn);
- }
-
return TRUE;
}
@@ -7947,9 +7260,10 @@ SISLeaveVT(int scrnIndex, int flags)
#ifdef XF86DRI
ScreenPtr pScreen;
+ /* to be done before mode change */
if(pSiS->directRenderingEnabled) {
- pScreen = screenInfo.screens[scrnIndex];
- DRILock(pScreen, 0);
+ pScreen = screenInfo.screens[scrnIndex];
+ DRILock(pScreen, 0);
}
#endif
@@ -7961,12 +7275,12 @@ SISLeaveVT(int scrnIndex, int flags)
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
if(!pSiS->SecondHead) {
- pSiS->ForceCursorOff = TRUE;
- pSiS->CursorInfoPtr->HideCursor(pScrn);
- SISWaitVBRetrace(pScrn);
- pSiS->ForceCursorOff = FALSE;
+ pSiS->ForceCursorOff = TRUE;
+ pSiS->CursorInfoPtr->HideCursor(pScrn);
+ SISWaitVBRetrace(pScrn);
+ pSiS->ForceCursorOff = FALSE;
}
- } else {
+ } else {
#endif
pSiS->CursorInfoPtr->HideCursor(pScrn);
SISWaitVBRetrace(pScrn);
@@ -7995,7 +7309,7 @@ SISLeaveVT(int scrnIndex, int flags)
}
- /* We use (otherwise unused) bit 7 to indicate that we are running
+ /* We use this (otherwise unused) bit to indicate that we are running
* to keep sisfb to change the displaymode (this would result in
* lethal display corruption upon quitting X or changing to a VT
* until a reboot)
@@ -8071,23 +7385,19 @@ SISCloseScreen(int scrnIndex, ScreenPtr pScreen)
}
vgaHWLock(hwp);
+ }
+ if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
+ andSISIDXREG(SISCR,0x34,0x7f);
}
- /* We should restore the mode number in case vtsema = false as well,
- * but since we haven't register access then we can't do it. I think
- * I need to rework the save/restore stuff, like saving the video
- * status when returning to the X server and by that save me the
- * trouble if sisfb was started from a textmode VT while X was on.
- */
-
SISUnmapMem(pScrn);
vgaHWUnmapMem(pScrn);
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- pSiSEnt = pSiS->entityPrivate;
- pSiSEnt->refCount--;
+ pSiSEnt = pSiS->entityPrivate;
+ pSiSEnt->refCount--;
}
#endif
@@ -8101,6 +7411,11 @@ SISCloseScreen(int scrnIndex, ScreenPtr pScreen)
pSiS->AccelLinearScratch = NULL;
}
+ if(pSiS->RenderAccelArray) {
+ xfree(pSiS->RenderAccelArray);
+ pSiS->RenderAccelArray = NULL;
+ }
+
if(pSiS->AccelInfoPtr) {
XAADestroyInfoRec(pSiS->AccelInfoPtr);
pSiS->AccelInfoPtr = NULL;
@@ -8124,7 +7439,6 @@ SISCloseScreen(int scrnIndex, ScreenPtr pScreen)
if(pSiS->adaptor) {
xfree(pSiS->adaptor);
pSiS->adaptor = NULL;
- pSiS->ResetXv = pSiS->ResetXvGamma = NULL;
}
pScrn->vtSema = FALSE;
@@ -8154,7 +7468,7 @@ SISFreeScreen(int scrnIndex, int flags)
/* Checks if a mode is suitable for the selected chipset. */
-static ModeStatus
+static int
SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
@@ -8166,24 +7480,18 @@ SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
else
return(MODE_BAD);
}
-
if(pSiS->VGAEngine == SIS_300_VGA || pSiS->VGAEngine == SIS_315_VGA) {
#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- if(pSiS->SecondHead) {
- if(SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
- return(MODE_BAD);
- } else {
- if(SiS_CheckCalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
- return(MODE_BAD);
- }
+ if((pSiS->DualHeadMode) && (pSiS->SecondHead)) {
+ if(SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes) < 0x14)
+ return(MODE_BAD);
} else
#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
if(!mode->Private) {
if(!pSiS->CheckForCRT2) {
- if(SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
+ if(SiS_CalcModeIndex(pScrn, mode, pSiS->HaveCustomModes) < 0x14)
return(MODE_BAD);
} else {
if(SiS_CheckCalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes2) < 0x14)
@@ -8191,7 +7499,7 @@ SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
}
} else {
if(SiS_CalcModeIndex(pScrn, ((SiSMergedDisplayModePtr)mode->Private)->CRT1,
- pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
+ pSiS->HaveCustomModes) < 0x14)
return(MODE_BAD);
if(SiS_CheckCalcModeIndex(pScrn, ((SiSMergedDisplayModePtr)mode->Private)->CRT2,
@@ -8200,15 +7508,8 @@ SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
}
} else
#endif
- {
-
- if(pSiS->VBFlags & CRT1_LCDA) {
- if(SiS_CalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
- return(MODE_BAD);
- }
if(SiS_CheckCalcModeIndex(pScrn, mode, pSiS->VBFlags, pSiS->HaveCustomModes) < 0x14)
return(MODE_BAD);
- }
}
return(MODE_OK);
@@ -8221,74 +7522,70 @@ SISValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
static Bool
SISSaveScreen(ScreenPtr pScreen, int mode)
{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
if((pScrn != NULL) && pScrn->vtSema) {
SISPtr pSiS = SISPTR(pScrn);
+ /* enable access to extended sequencer registers */
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- if(pSiS->VBFlags & (CRT2_LCD | CRT1_LCDA)) {
-
- if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
- if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- if(!xf86IsUnblank(mode)) {
- pSiS->Blank = TRUE;
- SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
- } else {
- pSiS->Blank = FALSE;
- SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
- } else if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
- if(!pSiS->Blank) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- }
- if(!xf86IsUnblank(mode)) {
- pSiS->Blank = TRUE;
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
- } else {
- pSiS->Blank = FALSE;
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- }
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->Blank = TRUE;
+ SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ } else {
+ pSiS->Blank = FALSE;
+ SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
}
-
- } else if(pSiS->VGAEngine == SIS_315_VGA) {
-
+ } else if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
if(!pSiS->Blank) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- if(pSiS->sishw_ext.jChipType >= SIS_661) pSiS->LCDon &= 0x0f;
+ inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
}
-
- if(pSiS->VBFlags & VB_CHRONTEL) {
- if(!xf86IsUnblank(mode)) {
- pSiS->Blank = TRUE;
- SiS_Chrontel701xBLOff(pSiS->SiS_Pr);
- } else {
- pSiS->Blank = FALSE;
- SiS_Chrontel701xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
- } else if(pSiS->VBFlags & VB_LVDS) {
- if(!xf86IsUnblank(mode)) {
- pSiS->Blank = TRUE;
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
- } else {
- pSiS->Blank = FALSE;
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- }
- } else if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- if(!xf86IsUnblank(mode)) {
- pSiS->Blank = TRUE;
- SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
- } else {
- pSiS->Blank = FALSE;
- SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
+ if(!xf86IsUnblank(mode)) {
+ pSiS->Blank = TRUE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
+ } else {
+ pSiS->Blank = FALSE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
}
+ }
+
+ } else if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(!pSiS->Blank) {
+ inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ }
+
+ if(pSiS->VBFlags & VB_CHRONTEL) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->Blank = TRUE;
+ SiS_Chrontel701xBLOff(pSiS->SiS_Pr);
+ } else {
+ pSiS->Blank = FALSE;
+ SiS_Chrontel701xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
+ } else if(pSiS->VBFlags & VB_LVDS) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->Blank = TRUE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
+ } else {
+ pSiS->Blank = FALSE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ }
+ } else if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->Blank = TRUE;
+ SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ } else {
+ pSiS->Blank = FALSE;
+ SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
}
}
@@ -8304,91 +7601,84 @@ static Bool
SISSaveScreenDH(ScreenPtr pScreen, int mode)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- Bool checkit = FALSE;
if((pScrn != NULL) && pScrn->vtSema) {
- SISPtr pSiS = SISPTR(pScrn);
-
- if((pSiS->SecondHead) && ((!(pSiS->VBFlags & CRT1_LCDA)) || (pSiS->VBFlags & VB_301C))) {
-
- /* Slave head is always CRT1 */
- if(pSiS->VBFlags & CRT1_LCDA) pSiS->Blank = xf86IsUnblank(mode) ? FALSE : TRUE;
+ SISPtr pSiS = SISPTR(pScrn);
+ if(pSiS->SecondHead) {
- return vgaHWSaveScreen(pScreen, mode);
+ /* Slave head is always CRT1 */
+ return vgaHWSaveScreen(pScreen, mode);
- } else {
+ } else {
- /* Master head is always CRT2 */
- /* But we land here if CRT1 is LCDA, too */
+ /* Master head is always CRT2 */
- /* We can only blank LCD, not other CRT2 devices */
- if(!(pSiS->VBFlags & (CRT2_LCD|CRT1_LCDA))) return TRUE;
+ /* We can only blank LCD, not other CRT2 devices */
+ if(!(pSiS->VBFlags & CRT2_LCD)) return TRUE;
- /* enable access to extended sequencer registers */
+ /* enable access to extended sequencer registers */
#ifdef UNLOCK_ALWAYS
- sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
- if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- checkit = TRUE;
- if(!xf86IsUnblank(mode)) {
- SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
- } else {
- SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
- } else if(pSiS->VBFlags & (VB_LVDS|VB_30xBDH)) {
- if(!pSiS->BlankCRT2) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- }
- checkit = TRUE;
- if(!xf86IsUnblank(mode)) {
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
- } else {
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->BlankCRT2 = TRUE;
+ SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ } else {
+ pSiS->BlankCRT2 = FALSE;
+ SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
+ } else if(pSiS->VBFlags & (VB_LVDS|VB_30xBDH)) {
+ if(!pSiS->BlankCRT2) {
+ inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ }
+ if(!xf86IsUnblank(mode)) {
+ pSiS->BlankCRT2 = TRUE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
+ } else {
+ pSiS->BlankCRT2 = FALSE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ }
}
- }
- } else if(pSiS->VGAEngine == SIS_315_VGA) {
-
- if(!pSiS->BlankCRT2) {
- inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- if(pSiS->sishw_ext.jChipType >= SIS_661) pSiS->LCDon &= 0x0f;
- }
+ } else if(pSiS->VGAEngine == SIS_315_VGA) {
- if(pSiS->VBFlags & VB_CHRONTEL) {
- checkit = TRUE;
- if(!xf86IsUnblank(mode)) {
- SiS_Chrontel701xBLOff(pSiS->SiS_Pr);
- } else {
- SiS_Chrontel701xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
- }
- } else if(pSiS->VBFlags & VB_LVDS) {
- checkit = TRUE;
- if(!xf86IsUnblank(mode)) {
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
- } else {
- outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
- }
- } else if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- checkit = TRUE;
- if(!xf86IsUnblank(mode)) {
- SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
- } else {
- SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ if(!pSiS->BlankCRT2) {
+ inSISIDXREG(SISSR, 0x11, pSiS->LCDon);
}
- }
-
- }
- if(checkit) {
- if(!pSiS->SecondHead) pSiS->BlankCRT2 = xf86IsUnblank(mode) ? FALSE : TRUE;
- else if(pSiS->VBFlags & CRT1_LCDA) pSiS->Blank = xf86IsUnblank(mode) ? FALSE : TRUE;
- }
+ if(pSiS->VBFlags & VB_CHRONTEL) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->BlankCRT2 = TRUE;
+ SiS_Chrontel701xBLOff(pSiS->SiS_Pr);
+ } else {
+ pSiS->BlankCRT2 = FALSE;
+ SiS_Chrontel701xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
+ } else if(pSiS->VBFlags & VB_LVDS) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->BlankCRT2 = TRUE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon | 0x08);
+ } else {
+ pSiS->BlankCRT2 = FALSE;
+ outSISIDXREG(SISSR, 0x11, pSiS->LCDon);
+ }
+ } else if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ if(!xf86IsUnblank(mode)) {
+ pSiS->BlankCRT2 = TRUE;
+ SiS_SiS30xBLOff(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ } else {
+ pSiS->BlankCRT2 = FALSE;
+ SiS_SiS30xBLOn(pSiS->SiS_Pr,&pSiS->sishw_ext);
+ }
+ }
- }
+ }
+ }
}
return TRUE;
}
@@ -8476,7 +7766,7 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn)
*/
#ifdef SISVRAMQ
/* We use VRAM Cmd Queue, not MMIO or AGP */
- unsigned char tempCR55 = 0;
+ unsigned char tempCR55;
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
@@ -8484,15 +7774,13 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn)
pSiS->cmdQ_SharedWritePort = &(pSiSEnt->cmdQ_SharedWritePort_2D);
} else
#endif
- pSiS->cmdQ_SharedWritePort = &(pSiS->cmdQ_SharedWritePort_2D);
+ pSiS->cmdQ_SharedWritePort = &(pSiS->cmdQ_SharedWritePort_2D);
/* Set Command Queue Threshold to max value 11111b (?) */
outSISIDXREG(SISSR, 0x27, 0x1F);
/* No idea what this does */
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- inSISIDXREG(SISCR, 0x55, tempCR55) ;
- andSISIDXREG(SISCR, 0x55, 0x33) ;
- }
+ inSISIDXREG(SISCR, 0x55, tempCR55) ;
+ andSISIDXREG(SISCR, 0x55, 0x33) ;
/* Syncronous reset for Command Queue */
outSISIDXREG(SISSR, 0x26, 0x01);
MMIO_OUT32(pSiS->IOBase, 0x85c4, 0);
@@ -8521,9 +7809,7 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn)
#endif
temp += pSiS->cmdQueueOffset;
pSiS->cmdQueueBase = (unsigned long *)temp;
- if(pSiS->sishw_ext.jChipType <= SIS_330) {
- outSISIDXREG(SISCR, 0x55, tempCR55);
- }
+ outSISIDXREG(SISCR, 0x55, tempCR55);
#else
/* For MMIO */
/* Set Command Queue Threshold to max value 11111b */
@@ -8553,13 +7839,13 @@ SiSEnableTurboQueue(ScrnInfoPtr pScrn)
/* Things to do before a ModeSwitch. We set up the
* video bridge configuration and the TurboQueue.
*/
-void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
+void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned char CR30, CR31, CR32, CR33;
- unsigned char CR39 = 0, CR3B = 0;
- unsigned char CR17, CR38 = 0;
- unsigned char CR35 = 0, CR79 = 0;
+ unsigned char usScratchCR30, usScratchCR31;
+ unsigned char usScratchCR32, usScratchCR33;
+ unsigned char usScratchCR17, usScratchCR38 = 0;
+ unsigned char usScratchCR79 = 0;
unsigned long vbflag;
int temp = 0, i;
int crt1rateindex = 0;
@@ -8690,210 +7976,114 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL); /* Unlock Registers */
#endif
- inSISIDXREG(SISCR, 0x30, CR30);
- inSISIDXREG(SISCR, 0x31, CR31);
- CR32 = pSiS->newCR32;
- inSISIDXREG(SISCR, 0x33, CR33);
-
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
-
- inSISIDXREG(SISCR, 0x35, CR35);
- inSISIDXREG(SISCR, 0x38, CR38);
- inSISIDXREG(SISCR, 0x39, CR39);
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_PROBED, 4,
- "Before: CR30=0x%02x,CR31=0x%02x,CR32=0x%02x,CR33=0x%02x,CR35=0x%02x,CR38=0x%02x\n",
- CR30, CR31, CR32, CR33, CR35, CR38);
- CR38 &= ~0x07;
-
- } else {
-
- if(pSiS->Chipset != PCI_CHIP_SIS300) {
- switch(pSiS->VGAEngine) {
- case SIS_300_VGA: temp = 0x35; break;
- case SIS_315_VGA: temp = 0x38; break;
- }
- if(temp) inSISIDXREG(SISCR, temp, CR38);
- }
- if(pSiS->VGAEngine == SIS_315_VGA) {
- inSISIDXREG(SISCR, 0x79, CR79);
- CR38 &= ~0x3b; /* Clear LCDA/DualEdge and YPbPr bits */
+ /* The CR3x registers are for communicating with our BIOS emulation
+ * code (native code in init.c/init301.c) or the BIOS (via VESA)
+ */
+ inSISIDXREG(SISCR, 0x30, usScratchCR30); /* Bridge config */
+ inSISIDXREG(SISCR, 0x31, usScratchCR31); /* Bridge config */
+ usScratchCR32 = pSiS->newCR32; /* Bridge connection info (use our new value) */
+ inSISIDXREG(SISCR, 0x33, usScratchCR33); /* Refresh rate index */
+ if(pSiS->Chipset != PCI_CHIP_SIS300) {
+ switch(pSiS->VGAEngine) {
+ case SIS_300_VGA: temp = 0x35; break;
+ case SIS_315_VGA: temp = 0x38; break;
}
- inSISIDXREG(SISCR, 0x3b, CR3B);
- xf86DrvMsgVerb(pScrn->scrnIndex, X_PROBED, 4,
- "Before: CR30=0x%02x, CR31=0x%02x, CR32=0x%02x, CR33=0x%02x, CR%02x=0x%02x\n",
- CR30, CR31, CR32, CR33, temp, CR38);
+ }
+ if(temp) inSISIDXREG(SISCR, temp, usScratchCR38); /* PAL-M, PAL-N selection */
+
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ inSISIDXREG(SISCR, 0x79, usScratchCR79);
}
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "VBFlags=0x%lx\n", pSiS->VBFlags);
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "VBFlags=0x%x\n", pSiS->VBFlags);
- CR30 = 0x00;
- CR31 &= ~0x60; /* Clear VB_Drivermode & VB_OutputDisable */
- CR31 |= 0x04; /* Set VB_NotSimuMode (not for 30xB/1400x1050?) */
- CR35 = 0x00;
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_PROBED, 3,
+ "Before: CR30=0x%02x, CR31=0x%02x, CR32=0x%02x, CR33=0x%02x, CR%02x=0x%02x\n",
+ usScratchCR30, usScratchCR31, usScratchCR32, usScratchCR33, temp, usScratchCR38);
- if(pSiS->Chipset != PCI_CHIP_SIS660) {
- if(!pSiS->AllowHotkey) {
- CR31 |= 0x80; /* Disable hotkey-switch */
- }
- CR79 &= ~0x10; /* Enable Backlight control on 315 series */
+ usScratchCR30 = 0;
+ usScratchCR31 &= ~0x60; /* Clear VB_Drivermode & VB_OutputDisable */
+#if 0 /* For future use */
+ if( (pSiS->VBFlags & VB_LVDS) ||
+ (pSiS->VBFlags & VB_301) ||
+ ( (pSiS->VBFlags & (VB_301B | VB_301C | VB_302B |VB_301LV | VB_302LV)) &&
+ (!(pSiS->VBLCDFlags & VB_LCD_1400x1050)) ) ) {
+#endif
+ usScratchCR31 |= 0x04; /* Set VB_NotSimuMode (not for 30xB/1400x1050?) */
+#if 0
}
+#endif
- SiS_SetEnableDstn(pSiS->SiS_Pr, FALSE);
- SiS_SetEnableFstn(pSiS->SiS_Pr, FALSE);
-
- if((vbflag & CRT1_LCDA) && (viewmode == SIS_MODE_CRT1)) {
+ if(!pSiS->AllowHotkey) {
+ usScratchCR31 |= 0x80; /* Disable hotkey-switch */
+ }
- CR38 |= 0x02;
+ usScratchCR79 &= ~0x10; /* Enable Backlight control on 315/330 series */
- } else {
+ SiS_SetEnableDstn(pSiS->SiS_Pr, FALSE);
+ SiS_SetEnableFstn(pSiS->SiS_Pr, FALSE);
- switch(vbflag & (CRT2_TV|CRT2_LCD|CRT2_VGA)) {
+ switch(vbflag & (CRT2_TV|CRT2_LCD|CRT2_VGA)) {
+ case CRT2_TV:
+ if(vbflag & TV_CHSCART) {
+ usScratchCR30 |= 0x10;
+ usScratchCR38 &= ~0xC0;
+ usScratchCR38 |= 0x04;
+ usScratchCR31 |= 0x01;
+ } else if(vbflag & TV_CHHDTV) {
+ usScratchCR38 |= 0x08;
+ usScratchCR31 &= ~0x01;
+ } else if(vbflag & TV_HIVISION)
+ usScratchCR30 |= 0x80;
+ else if(vbflag & TV_SVIDEO)
+ usScratchCR30 |= 0x08;
+ else if(vbflag & TV_AVIDEO)
+ usScratchCR30 |= 0x04;
+ else if(vbflag & TV_SCART)
+ usScratchCR30 |= 0x10;
+ else
+ usScratchCR30 |= 0x08; /* default: SVIDEO */
+
+ if(!(vbflag & (TV_CHSCART | TV_CHHDTV))) {
+ if(vbflag & TV_PAL) {
+ usScratchCR31 |= 0x01;
+ usScratchCR38 &= ~0xC0;
+ if( (vbflag & VB_SISBRIDGE) ||
+ ((vbflag & VB_CHRONTEL) && (pSiS->ChrontelType == CHRONTEL_701x)) ) {
+ if(vbflag & TV_PALM) usScratchCR38 |= 0x40;
+ else if(vbflag & TV_PALN) usScratchCR38 |= 0x80;
+ }
+ } else
+ usScratchCR31 &= ~0x01;
+ }
- case CRT2_TV:
+ usScratchCR30 |= 0x01; /* Set SimuScanMode */
- CR38 &= ~0xC0; /* Clear Pal M/N bits */
-
- if((vbflag & VB_CHRONTEL) && (vbflag & TV_CHSCART)) { /* Chrontel */
- CR30 |= 0x10;
- CR38 |= 0x04;
- CR38 &= ~0x08;
- CR31 |= 0x01;
- } else if((vbflag & VB_CHRONTEL) && (vbflag & TV_CHYPBPR525I)) { /* Chrontel */
- CR38 |= 0x08;
- CR38 &= ~0x04;
- CR31 &= ~0x01;
- } else if(vbflag & TV_HIVISION) { /* SiS bridge */
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- CR38 |= 0x04;
- CR35 |= 0x60;
- } else {
- CR30 |= 0x80;
- if(pSiS->VGAEngine == SIS_315_VGA) {
- if(vbflag & (VB_301LV | VB_302LV | VB_301C)) {
- CR38 |= (0x08 | 0x30);
- }
- }
- }
- CR31 |= 0x01;
- CR35 |= 0x01;
- } else if(vbflag & TV_YPBPR) { /* SiS bridge */
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- CR38 |= 0x04;
- if(vbflag & TV_YPBPR525P) CR35 |= 0x20;
- else if(vbflag & TV_YPBPR750P) CR35 |= 0x40;
- else if(vbflag & TV_YPBPR1080I) CR35 |= 0x60;
- CR31 &= ~0x01;
- CR35 &= ~0x01;
- CR39 &= ~0x03;
- if((vbflag & TV_YPBPRAR) == TV_YPBPR43LB) CR39 |= 0x00;
- else if((vbflag & TV_YPBPRAR) == TV_YPBPR43) CR39 |= 0x01;
- else if((vbflag & TV_YPBPRAR) == TV_YPBPR169) CR39 |= 0x02;
- else CR39 |= 0x03;
- } else if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR) {
- CR30 |= 0x80;
- CR38 |= 0x08;
- if(vbflag & TV_YPBPR525P) CR38 |= 0x10;
- else if(vbflag & TV_YPBPR750P) CR38 |= 0x20;
- else if(vbflag & TV_YPBPR1080I) CR38 |= 0x30;
- CR31 &= ~0x01;
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPRAR) {
- CR3B &= ~0x03;
- if((vbflag & TV_YPBPRAR) == TV_YPBPR43LB) CR3B |= 0x00;
- else if((vbflag & TV_YPBPRAR) == TV_YPBPR43) CR3B |= 0x03;
- else if((vbflag & TV_YPBPRAR) == TV_YPBPR169) CR3B |= 0x01;
- else CR3B |= 0x03;
+ usScratchCR31 &= ~0x04; /* Clear NotSimuMode */
+ pSiS->SiS_Pr->SiS_CHOverScan = pSiS->UseCHOverScan;
+ if((pSiS->OptTVSOver == 1) && (pSiS->ChrontelType == CHRONTEL_700x)) {
+ pSiS->SiS_Pr->SiS_CHSOverScan = TRUE;
+ } else {
+ pSiS->SiS_Pr->SiS_CHSOverScan = FALSE;
}
- }
- } else { /* All */
- if(vbflag & TV_SCART) CR30 |= 0x10;
- if(vbflag & TV_SVIDEO) CR30 |= 0x08;
- if(vbflag & TV_AVIDEO) CR30 |= 0x04;
- if(!(CR30 & 0x1C)) CR30 |= 0x08; /* default: SVIDEO */
-
- if(vbflag & TV_PAL) {
- CR31 |= 0x01;
- CR35 |= 0x01;
- if( (vbflag & VB_SISBRIDGE) ||
- ((vbflag & VB_CHRONTEL) && (pSiS->ChrontelType == CHRONTEL_701x)) ) {
- if(vbflag & TV_PALM) {
- CR38 |= 0x40;
- CR35 |= 0x04;
- } else if(vbflag & TV_PALN) {
- CR38 |= 0x80;
- CR35 |= 0x08;
- }
- }
- } else {
- CR31 &= ~0x01;
- CR35 &= ~0x01;
- if(vbflag & TV_NTSCJ) {
- CR38 |= 0x40; /* TW, not BIOS */
- CR35 |= 0x02;
- }
- }
- if(vbflag & TV_SCART) {
- CR31 |= 0x01;
- CR35 |= 0x01;
- }
- }
-
- CR31 &= ~0x04; /* Clear NotSimuMode */
- pSiS->SiS_Pr->SiS_CHOverScan = pSiS->UseCHOverScan;
- if((pSiS->OptTVSOver == 1) && (pSiS->ChrontelType == CHRONTEL_700x)) {
- pSiS->SiS_Pr->SiS_CHSOverScan = TRUE;
- } else {
- pSiS->SiS_Pr->SiS_CHSOverScan = FALSE;
- }
#ifdef SIS_CP
- SIS_CP_DRIVER_CONFIG
-#endif
- break;
-
- case CRT2_LCD:
- CR30 |= 0x20;
- SiS_SetEnableDstn(pSiS->SiS_Pr, pSiS->DSTN);
- SiS_SetEnableFstn(pSiS->SiS_Pr, pSiS->FSTN);
- break;
-
- case CRT2_VGA:
- CR30 |= 0x40;
- break;
-
- default:
- CR30 |= 0x00;
- CR31 |= 0x20; /* VB_OUTPUT_DISABLE */
- if(pSiS->UseVESA) {
- crt1rateindex = SISSearchCRT1Rate(pScrn, mymode);
- }
- }
-
- }
-
- if(vbflag & CRT1_LCDA) {
- switch(viewmode) {
- case SIS_MODE_CRT1:
- CR38 |= 0x01;
- break;
- case SIS_MODE_CRT2:
- if(vbflag & (CRT2_TV|CRT2_VGA)) {
- CR30 |= 0x02;
- CR38 |= 0x01;
- } else {
- CR38 |= 0x03;
- }
- break;
- case SIS_MODE_SIMU:
- default:
- if(vbflag & (CRT2_TV|CRT2_LCD|CRT2_VGA)) {
- CR30 |= 0x01;
- }
- break;
- }
- } else {
- if(vbflag & (CRT2_TV|CRT2_LCD|CRT2_VGA)) {
- CR30 |= 0x01;
- }
+ SIS_CP_DRIVER_CONFIG
+#endif
+ break;
+ case CRT2_LCD:
+ usScratchCR30 |= 0x21; /* LCD + SimuScanMode */
+ SiS_SetEnableDstn(pSiS->SiS_Pr, pSiS->DSTN);
+ SiS_SetEnableFstn(pSiS->SiS_Pr, pSiS->FSTN);
+ break;
+ case CRT2_VGA:
+ usScratchCR30 |= 0x41; /* VGA2 + SimuScanMode */
+ break;
+ default:
+ usScratchCR30 |= 0x00;
+ usScratchCR31 |= 0x20; /* VB_OUTPUT_DISABLE */
+ if(pSiS->UseVESA) {
+ crt1rateindex = SISSearchCRT1Rate(pScrn, mymode);
+ }
}
/* for VESA: no DRIVERMODE, otherwise
@@ -8902,19 +8092,17 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
* -) CRT1 will have too low rate
*/
if(pSiS->UseVESA) {
- CR31 &= ~0x40; /* Clear Drivermode */
- CR31 |= 0x06; /* Set SlaveMode, Enable SimuMode in Slavemode */
+ usScratchCR31 &= ~0x40; /* Clear Drivermode */
#ifdef TWDEBUG
- CR31 |= 0x40; /* DEBUG (for non-slave mode VESA) */
+ usScratchCR31 |= 0x40; /* DEBUG (for non-slave mode VESA) */
crt1rateindex = SISSearchCRT1Rate(pScrn, mymode);
#endif
} else {
- CR31 |= 0x40; /* Set Drivermode */
- CR31 &= ~0x06; /* Disable SlaveMode, disable SimuMode in SlaveMode */
+ usScratchCR31 |= 0x40; /* Set Drivermode */
if(!pSiS->IsCustom) {
crt1rateindex = SISSearchCRT1Rate(pScrn, mymode);
} else {
- crt1rateindex = CR33;
+ crt1rateindex = usScratchCR33;
}
}
@@ -8922,76 +8110,56 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
if(pSiS->DualHeadMode) {
if(pSiS->SecondHead) {
/* CRT1 */
- CR33 &= 0xf0;
- if(!(vbflag & CRT1_LCDA)) {
- CR33 |= (crt1rateindex & 0x0f);
- }
+ usScratchCR33 &= 0xf0;
+ usScratchCR33 |= (crt1rateindex & 0x0f);
} else {
/* CRT2 */
- CR33 &= 0x0f;
+ usScratchCR33 &= 0x0f;
if(vbflag & CRT2_VGA) {
- CR33 |= ((crt1rateindex << 4) & 0xf0);
+ usScratchCR33 |= ((crt1rateindex << 4) & 0xf0);
}
}
} else
#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
- CR33 = 0;
- if(!(vbflag & CRT1_LCDA)) {
- CR33 |= (crt1rateindex & 0x0f);
- }
+ usScratchCR33 = crt1rateindex & 0x0f;
if(vbflag & CRT2_VGA) {
if(!pSiS->IsCustomCRT2) {
- CR33 |= (SISSearchCRT1Rate(pScrn, mymode2) << 4);
+ usScratchCR33 |= (SISSearchCRT1Rate(pScrn, mymode2) << 4);
}
}
} else
#endif
{
- CR33 = 0;
- if(!(vbflag & CRT1_LCDA)) {
- CR33 |= (crt1rateindex & 0x0f);
- }
if(vbflag & CRT2_VGA) {
- CR33 |= ((crt1rateindex & 0x0f) << 4);
+ usScratchCR33 = (crt1rateindex & 0x0f) | ((crt1rateindex & 0x0f) << 4);
+ } else {
+ usScratchCR33 = crt1rateindex & 0x0f;
}
if((!(pSiS->UseVESA)) && (vbflag & CRT2_ENABLE)) {
- if(pSiS->CRT1off) CR33 &= 0xf0;
+ if(pSiS->CRT1off) usScratchCR33 &= 0xf0;
}
}
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
+ outSISIDXREG(SISCR, 0x30, usScratchCR30);
+ outSISIDXREG(SISCR, 0x31, usScratchCR31);
- CR31 &= 0xfe; /* Clear PAL flag (now in CR35) */
- CR38 &= 0x07; /* Use only LCDA and HiVision/YPbPr bits */
- outSISIDXREG(SISCR, 0x30, CR30);
- outSISIDXREG(SISCR, 0x31, CR31);
- outSISIDXREG(SISCR, 0x33, CR33);
- outSISIDXREG(SISCR, 0x35, CR35);
- setSISIDXREG(SISCR, 0x38, 0xf8, CR38);
- outSISIDXREG(SISCR, 0x39, CR39);
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4,
- "After: CR30=0x%02x,CR31=0x%02x,CR33=0x%02x,CR35=0x%02x,CR38=%02x\n",
- CR30, CR31, CR33, CR35, CR38);
+ outSISIDXREG(SISCR, 0x33, usScratchCR33);
- } else {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ usScratchCR38 &= ~0x03; /* Clear LCDA/DualEdge bits */
+ outSISIDXREG(SISCR, 0x79, usScratchCR79);
+ }
- outSISIDXREG(SISCR, 0x30, CR30);
- outSISIDXREG(SISCR, 0x31, CR31);
- outSISIDXREG(SISCR, 0x33, CR33);
- if(temp) {
- outSISIDXREG(SISCR, temp, CR38);
- }
- if(pSiS->VGAEngine == SIS_315_VGA) {
- outSISIDXREG(SISCR, 0x3b, CR3B);
- outSISIDXREG(SISCR, 0x79, CR79);
- }
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4,
- "After: CR30=0x%02x,CR31=0x%02x,CR33=0x%02x,CR%02x=%02x\n",
- CR30, CR31, CR33, temp, CR38);
+ if(temp) {
+ outSISIDXREG(SISCR, temp, usScratchCR38);
}
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
+ "After: CR30=0x%02x, CR31=0x%02x, CR33=0x%02x, CR%02x=%02x\n",
+ usScratchCR30, usScratchCR31, usScratchCR33, temp, usScratchCR38);
+
pSiS->SiS_Pr->SiS_UseOEM = pSiS->OptUseOEM;
/* Enable TurboQueue */
@@ -9002,21 +8170,21 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
if((!pSiS->UseVESA) && (pSiS->VBFlags & CRT2_ENABLE)) {
/* Switch on CRT1 for modes that require the bridge in SlaveMode */
- andSISIDXREG(SISSR,0x1f,0x3f);
- inSISIDXREG(SISCR, 0x17, CR17);
- if(!(CR17 & 0x80)) {
+ inSISIDXREG(SISCR, 0x17, usScratchCR17);
+ if(!(usScratchCR17 & 0x80)) {
orSISIDXREG(SISCR, 0x17, 0x80);
outSISIDXREG(SISSR, 0x00, 0x01);
usleep(10000);
outSISIDXREG(SISSR, 0x00, 0x03);
}
}
+
}
/* Functions for adjusting various TV settings */
/* These are used by the PostSetMode() functions as well as
- * the display properties tool SiSCtrl.
+ * the (hopefully) upcoming display properties extension/tool.
*
* There is each a Set and a Get routine. The Set functions
* take a value of the same range as the corresponding option.
@@ -9041,8 +8209,7 @@ void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode)
*
* All the routines are dual head aware. It does not matter
* if the function is called from the CRT1 or CRT2 session.
- * The values will be in pSiSEnt anyway, and read from there
- * if we're running dual head.
+ * The values will be stored in pSiSEnt if we're running dual.
*/
void SiS_SetCHTVlumabandwidthcvbs(ScrnInfoPtr pScrn, int val)
@@ -9571,39 +8738,42 @@ void SiS_SetSISTVedgeenhance(ScrnInfoPtr pScrn, int val)
#ifdef SISDUALHEAD
if(pSiSEnt) pSiSEnt->sistvedgeenhance = val;
#endif
-
- if(!(pSiS->VBFlags & VB_301)) return;
+
if(!(pSiS->VBFlags & CRT2_TV)) return;
-
+ if(!(pSiS->VBFlags & VB_301)) return;
+
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
val /= 2;
if((val >= 0) && (val <= 7)) {
- setSISIDXREG(SISPART2,0x3A, 0x1F, (val << 5));
+ setSISIDXREG(SISPART2,0x3A, 0x1F, (val << 5));
}
}
int SiS_GetSISTVedgeenhance(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- int result = pSiS->sistvedgeenhance;
- unsigned char temp;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
-
- if(pSiSEnt && pSiS->DualHeadMode) result = pSiSEnt->sistvedgeenhance;
#endif
- if(!(pSiS->VBFlags & VB_301)) return result;
- if(!(pSiS->VBFlags & CRT2_TV)) return result;
-
+ if(!(pSiS->VBFlags & VB_301 && pSiS->VBFlags & CRT2_TV)) {
+#ifdef SISDUALHEAD
+ if(pSiSEnt && pSiS->DualHeadMode)
+ return (int)pSiSEnt->sistvedgeenhance;
+ else
+#endif
+ return (int)pSiS->sistvedgeenhance;
+ } else {
+ unsigned char temp;
#ifdef UNLOCK_ALWAYS
- sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
-#endif
- inSISIDXREG(SISPART2, 0x3a, temp);
- return(int)(((temp & 0xe0) >> 5) * 2);
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+#endif
+ inSISIDXREG(SISPART2, 0x3a, temp);
+ return(int)(((temp & 0xe0) >> 5) * 2);
+ }
}
void SiS_SetSISTVantiflicker(ScrnInfoPtr pScrn, int val)
@@ -9618,12 +8788,9 @@ void SiS_SetSISTVantiflicker(ScrnInfoPtr pScrn, int val)
if(pSiSEnt) pSiSEnt->sistvantiflicker = val;
#endif
- if(!(pSiS->VBFlags & CRT2_TV)) return;
+ if(!(pSiS->VBFlags & CRT2_TV)) return;
if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
- if(pSiS->VBFlags & TV_HIVISION) return;
- if((pSiS->VBFlags & TV_YPBPR) &&
- (pSiS->VBFlags & (TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I))) return;
-
+
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
@@ -9637,25 +8804,25 @@ void SiS_SetSISTVantiflicker(ScrnInfoPtr pScrn, int val)
int SiS_GetSISTVantiflicker(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- int result = pSiS->sistvantiflicker;
- unsigned char temp;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
-
- if(pSiSEnt && pSiS->DualHeadMode) result = pSiSEnt->sistvantiflicker;
#endif
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return result;
- if(!(pSiS->VBFlags & CRT2_TV)) return result;
- if(pSiS->VBFlags & TV_HIVISION) return result;
- if((pSiS->VBFlags & TV_YPBPR) &&
- (pSiS->VBFlags & (TV_YPBPR525P | TV_YPBPR750P | TV_YPBPR1080I))) return result;
-
+ if(!(pSiS->VBFlags & VB_SISBRIDGE && pSiS->VBFlags & CRT2_TV)) {
+#ifdef SISDUALHEAD
+ if(pSiSEnt && pSiS->DualHeadMode)
+ return (int)pSiSEnt->sistvantiflicker;
+ else
+#endif
+ return (int)pSiS->sistvantiflicker;
+ } else {
+ unsigned char temp;
#ifdef UNLOCK_ALWAYS
- sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
-#endif
- inSISIDXREG(SISPART2, 0x0a, temp);
- return(int)((temp & 0x70) >> 4);
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+#endif
+ inSISIDXREG(SISPART2, 0x0a, temp);
+ return(int)((temp & 0x70) >> 4);
+ }
}
void SiS_SetSISTVsaturation(ScrnInfoPtr pScrn, int val)
@@ -9672,7 +8839,6 @@ void SiS_SetSISTVsaturation(ScrnInfoPtr pScrn, int val)
if(!(pSiS->VBFlags & CRT2_TV)) return;
if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
- if(pSiS->VBFlags & VB_301) return;
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
@@ -9687,23 +8853,25 @@ void SiS_SetSISTVsaturation(ScrnInfoPtr pScrn, int val)
int SiS_GetSISTVsaturation(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- int result = pSiS->sistvsaturation;
- unsigned char temp;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
-
- if(pSiSEnt && pSiS->DualHeadMode) result = pSiSEnt->sistvsaturation;
#endif
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return result;
- if(pSiS->VBFlags & VB_301) return result;
- if(!(pSiS->VBFlags & CRT2_TV)) return result;
-
+ if(!(pSiS->VBFlags & VB_SISBRIDGE && pSiS->VBFlags & CRT2_TV)) {
+#ifdef SISDUALHEAD
+ if(pSiSEnt && pSiS->DualHeadMode)
+ return (int)pSiSEnt->sistvsaturation;
+ else
+#endif
+ return (int)pSiS->sistvsaturation;
+ } else {
+ unsigned char temp;
#ifdef UNLOCK_ALWAYS
- sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- inSISIDXREG(SISPART4, 0x21, temp);
- return(int)((temp & 0x07) * 2);
+ inSISIDXREG(SISPART4, 0x21, temp);
+ return(int)((temp & 0x07) * 2);
+ }
}
void SiS_SetSISTVcolcalib(ScrnInfoPtr pScrn, int val, Bool coarse)
@@ -9716,7 +8884,7 @@ void SiS_SetSISTVcolcalib(ScrnInfoPtr pScrn, int val, Bool coarse)
unsigned char temp;
#ifdef SISDUALHEAD
- if(pSiSEnt && pSiS->DualHeadMode) cbase = pSiSEnt->sistvccbase;
+ if(pSiSEnt) cbase = pSiSEnt->sistvccbase;
#endif
if(coarse) {
@@ -9725,7 +8893,7 @@ void SiS_SetSISTVcolcalib(ScrnInfoPtr pScrn, int val, Bool coarse)
#ifdef SISDUALHEAD
if(pSiSEnt) {
pSiSEnt->sistvcolcalibc = val;
- if(pSiS->DualHeadMode) cfine = pSiSEnt->sistvcolcalibf;
+ cfine = pSiSEnt->sistvcolcalibf;
}
#endif
} else {
@@ -9734,14 +8902,13 @@ void SiS_SetSISTVcolcalib(ScrnInfoPtr pScrn, int val, Bool coarse)
#ifdef SISDUALHEAD
if(pSiSEnt) {
pSiSEnt->sistvcolcalibf = val;
- if(pSiS->DualHeadMode) ccoarse = pSiSEnt->sistvcolcalibc;
+ ccoarse = pSiSEnt->sistvcolcalibc;
}
#endif
}
- if(!(pSiS->VBFlags & CRT2_TV)) return;
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
- if(pSiS->VBFlags & (TV_HIVISION | TV_YPBPR)) return;
+ if(!(pSiS->VBFlags & CRT2_TV)) return;
+ if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
@@ -9773,12 +8940,16 @@ int SiS_GetSISTVcolcalib(ScrnInfoPtr pScrn, Bool coarse)
SISEntPtr pSiSEnt = pSiS->entityPrivate;
if(pSiSEnt && pSiS->DualHeadMode)
- if(coarse) return (int)pSiSEnt->sistvcolcalibc;
- else return (int)pSiSEnt->sistvcolcalibf;
+ if(coarse)
+ return (int)pSiSEnt->sistvcolcalibc;
+ else
+ return (int)pSiSEnt->sistvcolcalibf;
else
#endif
- if(coarse) return (int)pSiS->sistvcolcalibc;
- else return (int)pSiS->sistvcolcalibf;
+ if(coarse)
+ return (int)pSiS->sistvcolcalibc;
+ else
+ return (int)pSiS->sistvcolcalibf;
}
void SiS_SetSISTVcfilter(ScrnInfoPtr pScrn, int val)
@@ -9793,9 +8964,8 @@ void SiS_SetSISTVcfilter(ScrnInfoPtr pScrn, int val)
if(pSiSEnt) pSiSEnt->sistvcfilter = pSiS->sistvcfilter;
#endif
- if(!(pSiS->VBFlags & CRT2_TV)) return;
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
- if(pSiS->VBFlags & (TV_HIVISION | TV_YPBPR)) return;
+ if(!(pSiS->VBFlags & CRT2_TV)) return;
+ if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
@@ -9807,23 +8977,25 @@ void SiS_SetSISTVcfilter(ScrnInfoPtr pScrn, int val)
int SiS_GetSISTVcfilter(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- int result = pSiS->sistvcfilter;
- unsigned char temp;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
-
- if(pSiSEnt && pSiS->DualHeadMode) result = pSiSEnt->sistvcfilter;
#endif
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return result;
- if(!(pSiS->VBFlags & CRT2_TV)) return result;
- if(pSiS->VBFlags & (TV_HIVISION | TV_YPBPR)) return result;
-
+ if(!(pSiS->VBFlags & VB_SISBRIDGE && pSiS->VBFlags & CRT2_TV)) {
+#ifdef SISDUALHEAD
+ if(pSiSEnt && pSiS->DualHeadMode)
+ return (int)pSiSEnt->sistvcfilter;
+ else
+#endif
+ return (int)pSiS->sistvcfilter;
+ } else {
+ unsigned char temp;
#ifdef UNLOCK_ALWAYS
- sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
+ sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- inSISIDXREG(SISPART2, 0x30, temp);
- return(int)((temp & 0x10) ? 1 : 0);
+ inSISIDXREG(SISPART2, 0x30, temp);
+ return(int)((temp & 0x10) ? 1 : 0);
+ }
}
void SiS_SetSISTVyfilter(ScrnInfoPtr pScrn, int val)
@@ -9840,16 +9012,15 @@ void SiS_SetSISTVyfilter(ScrnInfoPtr pScrn, int val)
if(pSiSEnt) pSiSEnt->sistvyfilter = pSiS->sistvyfilter;
#endif
- if(!(pSiS->VBFlags & CRT2_TV)) return;
- if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
- if(pSiS->VBFlags & (TV_HIVISION | TV_YPBPR)) return;
+ if(!(pSiS->VBFlags & CRT2_TV)) return;
+ if(!(pSiS->VBFlags & VB_SISBRIDGE)) return;
p35 = pSiS->p2_35; p36 = pSiS->p2_36;
p37 = pSiS->p2_37; p38 = pSiS->p2_38;
p48 = pSiS->p2_48; p49 = pSiS->p2_49;
p4a = pSiS->p2_4a; p30 = pSiS->p2_30;
#ifdef SISDUALHEAD
- if(pSiSEnt && pSiS->DualHeadMode) {
+ if(pSiSEnt) {
p35 = pSiSEnt->p2_35; p36 = pSiSEnt->p2_36;
p37 = pSiSEnt->p2_37; p38 = pSiSEnt->p2_38;
p48 = pSiSEnt->p2_48; p49 = pSiSEnt->p2_49;
@@ -9885,7 +9056,7 @@ void SiS_SetSISTVyfilter(ScrnInfoPtr pScrn, int val)
case 6:
case 7:
case 8:
- if(!(pSiS->VBFlags & (TV_PALM | TV_PALN | TV_NTSCJ))) {
+ if(!(pSiS->VBFlags & (TV_PALM | TV_PALN))) {
int yindex301 = -1, yindex301B = -1;
unsigned char p3d4_34;
@@ -10158,38 +9329,63 @@ void SiS_SetTVxposoffset(ScrnInfoPtr pScrn, int val)
if((val >= -32) && (val <= 32)) {
- unsigned char p2_1f,p2_20,p2_2b,p2_42,p2_43;
+ unsigned char p2_1f,p2_20,p2_2b,p2_43,p3d4_34;
unsigned short temp;
+ int myadd2, mysub;
p2_1f = pSiS->p2_1f;
p2_20 = pSiS->p2_20;
- p2_2b = pSiS->p2_2b;
- p2_42 = pSiS->p2_42;
- p2_43 = pSiS->p2_43;
#ifdef SISDUALHEAD
if(pSiSEnt && pSiS->DualHeadMode) {
p2_1f = pSiSEnt->p2_1f;
p2_20 = pSiSEnt->p2_20;
- p2_2b = pSiSEnt->p2_2b;
- p2_42 = pSiSEnt->p2_42;
- p2_43 = pSiSEnt->p2_43;
}
#endif
+ inSISIDXREG(SISCR,0x34,p3d4_34);
+ p3d4_34 &= 0x7f;
temp = p2_1f | ((p2_20 & 0xf0) << 4);
temp += (val * 2);
+
p2_1f = temp & 0xff;
p2_20 = (temp & 0xf00) >> 4;
- p2_2b = ((p2_2b & 0x0f) + (val * 2)) & 0x0f;
- temp = p2_43 | ((p2_42 & 0xf0) << 4);
- temp += (val * 2);
- p2_43 = temp & 0xff;
- p2_42 = (temp & 0xf00) >> 4;
+
+ if((pSiS->VBFlags & (TV_NTSC | TV_PALM)) &&
+ ((p3d4_34 == 0x64) || (p3d4_34 == 0x4a) || (p3d4_34 == 0x38))) {
+ temp += 1514;
+ myadd2 = 4;
+ mysub = 4;
+ } else {
+ temp += 1363;
+ myadd2 = 3;
+ if(pSiS->VBFlags & VB_301) myadd2 += 3;
+ mysub = 5;
+ }
+
+ p2_2b = ((temp & 0xf00) >> 4) | ((p2_1f - mysub) & 0x0f);
+ p2_43 = p2_1f + myadd2;
+
+#if 0
+ p2_1f += (val * 2);
+ if((pSiS->VBFlags & (TV_NTSC | TV_PALM)) &&
+ ((p3d4_34 == 0x64) || (p3d4_34 == 0x4a) || (p3d4_34 == 0x38))) {
+ p2_2b = ((p2_1f - 4) & 0x0f) | 0x70;
+ p2_2c = p2_1f - 22;
+ p2_2d = ((p2_2c - 4) & 0x0f) | 0xe0;
+ p2_43 = p2_1f + 4;
+ } else {
+ p2_2b = ((p2_1f - 5) & 0x0f) | 0x60;
+ p2_2c = p2_1f + 1;
+ p2_2d = ((p2_2c - 5) & 0x0f) | (pSiS->VBFlags & TV_PAL ? 0x80 : 0xf0);
+ p2_43 = p2_1f + 3;
+ if(pSiS->VBFlags & VB_301) p2_43 += 3;
+ }
+#endif
+
SISWaitRetraceCRT2(pScrn);
outSISIDXREG(SISPART2,0x1f,p2_1f);
setSISIDXREG(SISPART2,0x20,0x0F,p2_20);
- setSISIDXREG(SISPART2,0x2b,0xF0,p2_2b);
- setSISIDXREG(SISPART2,0x42,0x0F,p2_42);
+ outSISIDXREG(SISPART2,0x2b,p2_2b);
outSISIDXREG(SISPART2,0x43,p2_43);
}
}
@@ -10221,7 +9417,7 @@ void SiS_SetTVxposoffset(ScrnInfoPtr pScrn, int val)
temp3 += (val * 4);
while(temp3 > 0x03ff) {
temp3 -= 4;
- }
+ }
}
}
SiS6326SetTVReg(pScrn,0x3a,(temp1 & 0xff));
@@ -10263,7 +9459,7 @@ void SiS_SetTVyposoffset(ScrnInfoPtr pScrn, int val)
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
#endif
-
+
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
@@ -10301,7 +9497,7 @@ void SiS_SetTVyposoffset(ScrnInfoPtr pScrn, int val)
if((val >= -32) && (val <= 32)) {
char p2_01, p2_02;
- val /= 2; /* 4 */
+ val /= 4;
p2_01 = pSiS->p2_01;
p2_02 = pSiS->p2_02;
#ifdef SISDUALHEAD
@@ -10310,10 +9506,10 @@ void SiS_SetTVyposoffset(ScrnInfoPtr pScrn, int val)
p2_02 = pSiSEnt->p2_02;
}
#endif
- p2_01 += val; /* val * 2 */
- p2_02 += val; /* val * 2 */
+ p2_01 += (val * 2);
+ p2_02 += (val * 2);
while((p2_01 <= 0) || (p2_02 <= 0)) {
- p2_01 += 2;
+ p2_01 += 2;
p2_02 += 2;
}
SISWaitRetraceCRT2(pScrn);
@@ -10321,9 +9517,9 @@ void SiS_SetTVyposoffset(ScrnInfoPtr pScrn, int val)
outSISIDXREG(SISPART2,0x02,p2_02);
}
}
-
+
}
-
+
} else if(pSiS->Chipset == PCI_CHIP_SIS6326) {
if(pSiS->SiS6326Flags & SIS6326_TVDETECTED) {
@@ -10463,7 +9659,6 @@ int SiS_GetTVxscale(ScrnInfoPtr pScrn)
void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
{
SISPtr pSiS = SISPTR(pScrn);
- Bool usentsc = FALSE;
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;
#endif
@@ -10480,22 +9675,17 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
if(pSiSEnt) pSiSEnt->tvyscale = val;
#endif
+ if(pSiS->VBFlags & (TV_HIVISION | TV_HIVISION_LV)) return;
+
if(pSiS->VGAEngine == SIS_315_VGA || pSiS->VGAEngine == SIS_315_VGA) {
if((pSiS->VBFlags & CRT2_TV) && (pSiS->VBFlags & VB_SISBRIDGE)) {
- int srindex = -1, newvde, i = 0, j, vlimit, temp;
+ int srindex = -1;
+ int newvde, i=0, j, temp;
+ int vlimit = (pSiS->VBFlags & (TV_NTSC | TV_PALM)) ? 259 : 309;
unsigned char p3d4_34;
- if(pSiS->VBFlags & TV_HIVISION) return;
- if((pSiS->VBFlags & TV_YPBPR) &&
- (pSiS->VBFlags & (TV_YPBPR1080I | TV_YPBPR750P | TV_YPBPR525P))) return;
-
- if(pSiS->VBFlags & TV_YPBPR) usentsc = TRUE;
- else if(pSiS->VBFlags & (TV_NTSC | TV_PALM)) usentsc = TRUE;
-
- vlimit = usentsc ? 259 : 309;
-
inSISIDXREG(SISCR,0x34,p3d4_34);
switch((p3d4_34 & 0x7f)) {
@@ -10507,7 +9697,7 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
case 0x2e: /* 640x480 */
case 0x44:
case 0x62:
- srindex = usentsc ? 0 : 21;
+ srindex = (pSiS->VBFlags & (TV_NTSC | TV_PALM)) ? 0 : 21;
break;
case 0x31: /* 720x480 */
case 0x33:
@@ -10519,7 +9709,7 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
case 0x60:
case 0x61:
if(pSiS->VGAEngine == SIS_315_VGA) {
- srindex = usentsc ? 7 : 28;
+ srindex = (pSiS->VBFlags & (TV_NTSC | TV_PALM)) ? 7 : 28;
}
break;
#if 0
@@ -10530,7 +9720,7 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
case 0x30: /* 800x600 */
case 0x47:
case 0x63:
- srindex = usentsc ? 14 : 35;
+ srindex = (pSiS->VBFlags & (TV_NTSC | TV_PALM)) ? 14 : 35;
}
if(srindex >= 0) {
@@ -10558,7 +9748,6 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
unsigned char p2_46 = pSiS->p2_46;
unsigned char p2_47 = pSiS->p2_47;
unsigned char p1scaling[9], p4scaling[9];
- unsigned char *p2scaling;
for(i=0; i<9; i++) {
p1scaling[i] = pSiS->scalingp1[i];
@@ -10566,9 +9755,8 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
for(i=0; i<9; i++) {
p4scaling[i] = pSiS->scalingp4[i];
}
- p2scaling = &pSiS->scalingp2[0];
#ifdef SISDUALHEAD
- if(pSiSEnt && pSiS->DualHeadMode) {
+ if(pSiSEnt) {
p2_0a = pSiSEnt->p2_0a;
p2_2f = pSiSEnt->p2_2f;
p2_30 = pSiSEnt->p2_30;
@@ -10580,15 +9768,9 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
for(i=0; i<9; i++) {
p4scaling[i] = pSiSEnt->scalingp4[i];
}
- p2scaling = &pSiSEnt->scalingp2[0];
}
#endif
SISWaitRetraceCRT2(pScrn);
- if(pSiS->VBFlags & (VB_301C|VB_302ELV)) {
- for(i=0; i<64; i++) {
- outSISIDXREG(SISPART2,(0xc0 + i),p2scaling[i]);
- }
- }
for(i=0; i<9; i++) {
outSISIDXREG(SISPART1,SiSScalingP1Regs[i],p1scaling[i]);
}
@@ -10607,11 +9789,10 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
} else {
int so = (pSiS->VGAEngine == SIS_300_VGA) ? 12 : 0;
- int realvde, j, srindex301c, myypos, watchdog = 32;
+ int realvde;
unsigned long calctemp;
srindex += i;
- srindex301c = srindex * 64;
newvde = SiSTVVScale[srindex].ScaleVDE;
realvde = SiSTVVScale[srindex].RealVDE;
@@ -10619,24 +9800,10 @@ void SiS_SetTVyscale(ScrnInfoPtr pScrn, int val)
inSISIDXREG(SISPART2,0x01,temp);
temp = vlimit - (temp & 0x7f);
if((temp - (((newvde >> 1) - 2) + 9)) > 0) break;
- myypos = pSiS->tvypos - 1;
-#ifdef SISDUALHEAD
- if(pSiSEnt && pSiS->DualHeadMode) myypos = pSiSEnt->tvypos - 1;
-#endif
- SiS_SetTVyposoffset(pScrn, myypos);
- } while(watchdog--);
+ SiS_SetTVyposoffset(pScrn, pSiS->tvypos - 1);
+ } while(1);
SISWaitRetraceCRT2(pScrn);
-
- if(pSiS->VBFlags & (VB_301C|VB_302ELV)) {
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "301C scaler: Table index %d\n");
-#endif
- for(j=0; j<64; j++) {
- outSISIDXREG(SISPART2,(0xc0 + j), SiS301CScaling[srindex301c + j]);
- }
- }
-
if(!(pSiS->VBFlags & VB_301)) {
temp = (newvde >> 1) - 3;
setSISIDXREG(SISPART2,0x46,0x9f,((temp & 0x0300) >> 3));
@@ -10709,8 +9876,7 @@ int SiS_GetTVyscale(ScrnInfoPtr pScrn)
* -) Save TV registers for further processing
* -) Apply TV settings
*/
-static void
-SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
+void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
#ifdef SISDUALHEAD
@@ -10733,20 +9899,11 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
- if(pSiS->sishw_ext.jChipType >= SIS_661) {
- inSISIDXREG(SISSR,0x11,tmpreg);
- if(tmpreg & 0x20) {
- inSISIDXREG(SISSR,0x3e,tmpreg);
- tmpreg = (tmpreg + 1) & 0xff;
- outSISIDXREG(SISSR,0x3e,tmpreg);
- }
- }
-
if((!pSiS->UseVESA) && (pSiS->VBFlags & CRT2_ENABLE)) {
if(pSiS->VBFlags != pSiS->VBFlags_backup) {
- pSiS->VBFlags = pSiS->VBFlags_backup;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ pSiS->VBFlags = pSiS->VBFlags_backup;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"VBFlags restored to %0lx\n", pSiS->VBFlags);
}
@@ -10758,14 +9915,14 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
if(!pSiS->DualHeadMode) {
#endif
if(SiSBridgeIsInSlaveMode(pScrn)) {
- doit = FALSE;
- temp = pSiS->VBFlags;
- pSiS->VBFlags &= (~VB_DISPMODE_SINGLE);
- pSiS->VBFlags |= (VB_DISPMODE_MIRROR | DISPTYPE_DISP1);
- if(temp != pSiS->VBFlags) {
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "VBFlags changed to 0x%0lx\n", pSiS->VBFlags);
- }
+ doit = FALSE;
+ temp = pSiS->VBFlags;
+ pSiS->VBFlags &= (~VB_DISPMODE_SINGLE);
+ pSiS->VBFlags |= (VB_DISPMODE_MIRROR | DISPTYPE_DISP1);
+ if(temp != pSiS->VBFlags) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "VBFlags changed to 0x%0lx\n", pSiS->VBFlags);
+ }
}
#ifdef SISDUALHEAD
}
@@ -10773,11 +9930,11 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
if(pSiS->VGAEngine == SIS_315_VGA) {
- if((pSiS->CRT1off) && (doit)) {
- orSISIDXREG(SISCR,pSiS->myCR63,0x40);
+ if(pSiS->CRT1off) {
+ orSISIDXREG(SISCR,0x63,0x40);
orSISIDXREG(SISSR,0x1f,0xc0);
} else {
- andSISIDXREG(SISCR,pSiS->myCR63,0xBF);
+ andSISIDXREG(SISCR,0x63,0xBF);
andSISIDXREG(SISSR,0x1f,0x3f);
}
@@ -10790,13 +9947,11 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
flag = TRUE;
usScratchCR17 &= ~0x80;
}
- orSISIDXREG(SISSR,0x1f,0xc0);
} else {
if(!(usScratchCR17 & 0x80)) {
flag = TRUE;
usScratchCR17 |= 0x80;
}
- andSISIDXREG(SISSR,0x1f,0x3f);
}
/* Reset only if status changed */
if(flag) {
@@ -10806,6 +9961,20 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
outSISIDXREG(SISSR, 0x00, 0x03); /* End Reset */
}
}
+
+ /* For some reason, sending CRT1 into power-save while in slave mode
+ * on Chrontel TV, makes the chrontel lose sync... TODO: Test this
+ * on Chrontel 7019
+ */
+ if((pSiS->CRT1off) &&
+ (!((pSiS->VGAEngine == SIS_300_VGA) &&
+ (pSiS->VBFlags & VB_CHRONTEL) &&
+ (pSiS->VBFlags & CRT2_TV) &&
+ (!doit)))) {
+ orSISIDXREG(SISSR,0x1f,0xc0);
+ } else {
+ andSISIDXREG(SISSR,0x1f,0x3f);
+ }
}
}
@@ -10822,7 +9991,7 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
denum = (sr2c & 0x1f) + 1.0;
myclock = (int)((14318 * (divider / postscalar) * (num / denum)) / 1000);
- pSiS->MiscFlags &= ~(MISC_CRT1OVERLAY | MISC_CRT1OVERLAYGAMMA);
+ pSiS->MiscFlags &= ~MISC_CRT1OVERLAY;
switch(pSiS->sishw_ext.jChipType) {
case SIS_300:
case SIS_540:
@@ -10832,29 +10001,16 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
pSiS->MiscFlags |= MISC_CRT1OVERLAY;
}
break;
+ case SIS_315H:
+ case SIS_315:
+ case SIS_315PRO:
case SIS_550:
case SIS_650:
case SIS_740:
- if(myclock < 175) {
- pSiS->MiscFlags |= MISC_CRT1OVERLAY;
- if(myclock < 166) {
- pSiS->MiscFlags |= MISC_CRT1OVERLAYGAMMA;
- }
- }
- break;
- case SIS_315H:
- case SIS_315:
- case SIS_315PRO:
case SIS_330:
- case SIS_661:
- case SIS_741:
case SIS_660:
- case SIS_760:
if(myclock < 180) {
pSiS->MiscFlags |= MISC_CRT1OVERLAY;
- if(myclock < 166) {
- pSiS->MiscFlags |= MISC_CRT1OVERLAYGAMMA;
- }
}
break;
}
@@ -10863,63 +10019,34 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
if((!pSiS->DualHeadMode) || (pSiS->SecondHead))
#endif
xf86DrvMsgVerb(pScrn->scrnIndex, X_WARNING, 3,
- "Current dotclock (%dMhz) too high for video overlay on CRT1\n",
- myclock);
+ "Current dotclock does not permit usage of video overlay on CRT1\n");
}
}
/* Determine if the Panel Link scaler is active */
pSiS->MiscFlags &= ~MISC_PANELLINKSCALER;
- if(pSiS->VBFlags & (CRT2_LCD | CRT1_LCDA)) {
- if(pSiS->VGAEngine == SIS_300_VGA) {
- if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
+ if(pSiS->VBFlags & CRT2_LCD) {
+ if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
inSISIDXREG(SISPART1,0x1e,tmpreg);
tmpreg &= 0x3f;
if(tmpreg) pSiS->MiscFlags |= MISC_PANELLINKSCALER;
- }
- } else {
- if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH | CRT1_LCDA)) {
+ } else {
inSISIDXREG(SISPART1,0x35,tmpreg);
tmpreg &= 0x04;
if(!tmpreg) pSiS->MiscFlags |= MISC_PANELLINKSCALER;
}
- }
- }
-
- /* Determine if our very special TV mode is active */
- pSiS->MiscFlags &= ~MISC_TVNTSC1024;
- if((pSiS->VBFlags & VB_SISBRIDGE) && (pSiS->VBFlags & CRT2_TV) && (!(pSiS->VBFlags & TV_HIVISION))) {
- if( ((pSiS->VBFlags & TV_YPBPR) && (pSiS->VBFlags & TV_YPBPR525I)) ||
- ((!(pSiS->VBFlags & TV_YPBPR)) && (pSiS->VBFlags & (TV_NTSC | TV_PALM))) ) {
- inSISIDXREG(SISCR,0x34,tmpreg);
- tmpreg &= 0x7f;
- if((tmpreg == 0x64) || (tmpreg == 0x4a) || (tmpreg == 0x38)) {
- pSiS->MiscFlags |= MISC_TVNTSC1024;
- }
+
}
}
#ifdef SISVRAMQ
if(pSiS->VGAEngine == SIS_315_VGA) {
- int i;
/* Re-Enable command queue */
SiSEnableTurboQueue(pScrn);
- /* Get HWCursor register contents for backup */
- for(i = 0; i < 16; i++) {
- pSiS->HWCursorBackup[i] = MMIO_IN32(pSiS->IOBase, 0x8500 + (i << 2));
- }
- if(pSiS->sishw_ext.jChipType >= SIS_330) {
- /* Enable HWCursor protection (Y pos as trigger) */
- andSISIDXREG(SISCR, 0x5b, ~0x30);
- }
}
#endif
- /* Reset XV gamma correction */
- if(pSiS->ResetXvGamma) {
- (pSiS->ResetXvGamma)(pScrn);
- }
-
/* Apply TV settings given by options
Do this even in DualHeadMode:
- if this is called by SetModeCRT1, CRT2 mode has been reset by SetModeCRT1
@@ -10985,7 +10112,7 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
pSiS->tvy = SiS_GetCH700x(pSiS->SiS_Pr, 0x0b);
pSiS->tvy |= ((SiS_GetCH700x(pSiS->SiS_Pr, 0x08) & 0x01) << 8);
#ifdef SISDUALHEAD
- if(pSiSEnt) {
+ if(pSiSEnt && pSiS->DualHeadMode) {
pSiSEnt->tvx = pSiS->tvx;
pSiSEnt->tvy = pSiS->tvy;
}
@@ -11044,17 +10171,14 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
/* Backup default TV position, scale and colcalib registers */
inSISIDXREG(SISPART2,0x1f,pSiS->p2_1f);
inSISIDXREG(SISPART2,0x20,pSiS->p2_20);
- inSISIDXREG(SISPART2,0x2b,pSiS->p2_2b);
- inSISIDXREG(SISPART2,0x42,pSiS->p2_42);
- inSISIDXREG(SISPART2,0x43,pSiS->p2_43);
inSISIDXREG(SISPART2,0x01,pSiS->p2_01);
inSISIDXREG(SISPART2,0x02,pSiS->p2_02);
inSISIDXREG(SISPART2,0x44,pSiS->p2_44);
inSISIDXREG(SISPART2,0x45,pSiS->p2_45);
if(!(pSiS->VBFlags & VB_301)) {
- inSISIDXREG(SISPART2,0x46,pSiS->p2_46);
+ inSISIDXREG(SISPART2,0x46,pSiS->p2_46);
} else {
- pSiS->p2_46 = 0;
+ pSiS->p2_46 = 0;
}
inSISIDXREG(SISPART2,0x0a,pSiS->p2_0a);
inSISIDXREG(SISPART2,0x31,cbase);
@@ -11083,36 +10207,24 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
for(i=0; i<9; i++) {
inSISIDXREG(SISPART4,SiSScalingP4Regs[i],pSiS->scalingp4[i]);
}
- if(pSiS->VBFlags & (VB_301C | VB_302ELV)) {
- for(i=0; i<64; i++) {
- inSISIDXREG(SISPART2,(0xc0 + i),pSiS->scalingp2[i]);
- }
- }
#ifdef SISDUALHEAD
- if(pSiSEnt) {
- pSiSEnt->p2_1f = pSiS->p2_1f; pSiSEnt->p2_20 = pSiS->p2_20;
- pSiSEnt->p2_42 = pSiS->p2_42; pSiSEnt->p2_43 = pSiS->p2_43;
- pSiSEnt->p2_2b = pSiS->p2_2b;
- pSiSEnt->p2_01 = pSiS->p2_01; pSiSEnt->p2_02 = pSiS->p2_02;
- pSiSEnt->p2_44 = pSiS->p2_44; pSiSEnt->p2_45 = pSiS->p2_45;
- pSiSEnt->p2_46 = pSiS->p2_46; pSiSEnt->p2_0a = pSiS->p2_0a;
- pSiSEnt->sistvccbase = pSiS->sistvccbase;
- pSiSEnt->p2_35 = pSiS->p2_35; pSiSEnt->p2_36 = pSiS->p2_36;
- pSiSEnt->p2_37 = pSiS->p2_37; pSiSEnt->p2_38 = pSiS->p2_38;
- pSiSEnt->p2_48 = pSiS->p2_48; pSiSEnt->p2_49 = pSiS->p2_49;
- pSiSEnt->p2_4a = pSiS->p2_4a; pSiSEnt->p2_2f = pSiS->p2_2f;
- pSiSEnt->p2_30 = pSiS->p2_30; pSiSEnt->p2_47 = pSiS->p2_47;
- for(i=0; i<9; i++) {
- pSiSEnt->scalingp1[i] = pSiS->scalingp1[i];
- }
- for(i=0; i<9; i++) {
- pSiSEnt->scalingp4[i] = pSiS->scalingp4[i];
- }
- if(pSiS->VBFlags & (VB_301C | VB_302ELV)) {
- for(i=0; i<64; i++) {
- pSiSEnt->scalingp2[i] = pSiS->scalingp2[i];
- }
- }
+ if(pSiSEnt && pSiS->DualHeadMode) {
+ pSiSEnt->p2_1f = pSiS->p2_1f; pSiSEnt->p2_20 = pSiS->p2_20;
+ pSiSEnt->p2_01 = pSiS->p2_01; pSiSEnt->p2_02 = pSiS->p2_02;
+ pSiSEnt->p2_44 = pSiS->p2_44; pSiSEnt->p2_45 = pSiS->p2_45;
+ pSiSEnt->p2_46 = pSiS->p2_46; pSiSEnt->p2_0a = pSiS->p2_0a;
+ pSiSEnt->sistvccbase = pSiS->sistvccbase;
+ pSiSEnt->p2_35 = pSiS->p2_35; pSiSEnt->p2_36 = pSiS->p2_36;
+ pSiSEnt->p2_37 = pSiS->p2_37; pSiSEnt->p2_38 = pSiS->p2_38;
+ pSiSEnt->p2_48 = pSiS->p2_48; pSiSEnt->p2_49 = pSiS->p2_49;
+ pSiSEnt->p2_4a = pSiS->p2_4a; pSiSEnt->p2_2f = pSiS->p2_2f;
+ pSiSEnt->p2_30 = pSiS->p2_30; pSiSEnt->p2_47 = pSiS->p2_47;
+ for(i=0; i<9; i++) {
+ pSiSEnt->scalingp1[i] = pSiS->scalingp1[i];
+ }
+ for(i=0; i<9; i++) {
+ pSiSEnt->scalingp4[i] = pSiS->scalingp4[i];
+ }
}
#endif
if((val = mysistvantiflicker) != -1) {
@@ -11151,15 +10263,14 @@ SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
}
/* Post-set SiS6326 TV registers */
-static void
-SiS6326PostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
+void SiS6326PostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg)
{
SISPtr pSiS = SISPTR(pScrn);
unsigned char tmp;
int val;
if(!(pSiS->SiS6326Flags & SIS6326_TVDETECTED)) return;
-
+
#ifdef UNLOCK_ALWAYS
sisSaveUnlockExtRegisterLock(pSiS, NULL, NULL);
#endif
@@ -11269,7 +10380,7 @@ SiSBuildVesaModeList(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe)
m->next = pSiS->SISVESAModeList;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "BIOS supports VESA mode 0x%x: x:%i y:%i bpp:%i\n",
+ "BIOS reported VESA mode 0x%x: x:%i y:%i bpp:%i\n",
m->n, m->width, m->height, m->bpp);
pSiS->SISVESAModeList = m;
@@ -11350,24 +10461,144 @@ SiSCalcVESAModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
}
USHORT
-SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBFlags, BOOLEAN havecustommodes)
+SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN havecustommodes)
{
SISPtr pSiS = SISPTR(pScrn);
UShort i = (pSiS->CurrentLayout.bitsPerPixel+7)/8 - 1;
+ UShort ModeIndex = 0;
- if(!(VBFlags & CRT1_LCDA)) {
- if((havecustommodes) && (!(mode->type & M_T_DEFAULT))) {
- return 0xfe;
- }
- } else {
- if((mode->HDisplay > pSiS->LCDwidth) ||
- (mode->VDisplay > pSiS->LCDheight)) {
- return 0;
- }
+ if((havecustommodes) && (!(mode->type & M_T_DEFAULT)))
+ return 0xfe;
+
+ switch(mode->HDisplay)
+ {
+ case 320:
+ if(mode->VDisplay == 200) {
+ ModeIndex = ModeIndex_320x200[i];
+ } else if(mode->VDisplay == 240) {
+ if(pSiS->FSTN) ModeIndex = ModeIndex_320x240_FSTN[i];
+ else ModeIndex = ModeIndex_320x240[i];
+ }
+ break;
+ case 400:
+ if(mode->VDisplay == 300) {
+ ModeIndex = ModeIndex_400x300[i];
+ }
+ break;
+ case 512:
+ if(mode->VDisplay == 384) {
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ break;
+ case 720:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_720x480[i];
+ } else if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_720x576[i];
+ }
+ break;
+ case 768:
+ if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_768x576[i];
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ } else if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_800x480[i];
+ }
+ break;
+ case 848:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_848x480[i];
+ }
+ break;
+ case 856:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_856x480[i];
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1024x768[i];
+ } else if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_1024x576[i];
+ } else if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_1024x600[i];
+ }
+ }
+ break;
+ case 1152:
+ if(mode->VDisplay == 864) {
+ ModeIndex = ModeIndex_1152x864[i];
+ } else if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1152x768[i];
+ }
+ }
+ break;
+ case 1280:
+ if(mode->VDisplay == 960) {
+ ModeIndex = ModeIndex_1280x960[i];
+ } else if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_1280x1024[i];
+ } else if(mode->VDisplay == 720) {
+ ModeIndex = ModeIndex_1280x720[i];
+ } else if(mode->VDisplay == 768) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ ModeIndex = ModeIndex_300_1280x768[i];
+ } else {
+ ModeIndex = ModeIndex_310_1280x768[i];
+ }
+ }
+ break;
+ case 1360:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1360x768[i];
+ } else if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_300_1360x1024[i];
+ }
+ }
+ break;
+ case 1400:
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(mode->VDisplay == 1050) {
+ ModeIndex = ModeIndex_1400x1050[i];
+ }
+ }
+ break;
+ case 1600:
+ if(mode->VDisplay == 1200) {
+ ModeIndex = ModeIndex_1600x1200[i];
+ }
+ break;
+ case 1920:
+ if(mode->VDisplay == 1440) {
+ ModeIndex = ModeIndex_1920x1440[i];
+ }
+ break;
+ case 2048:
+ if(mode->VDisplay == 1536) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ ModeIndex = ModeIndex_300_2048x1536[i];
+ } else {
+ ModeIndex = ModeIndex_310_2048x1536[i];
+ }
+ }
+ break;
}
- return(SiS_GetModeID(pSiS->VGAEngine, VBFlags, mode->HDisplay, mode->VDisplay,
- i, pSiS->FSTN, pSiS->LCDwidth, pSiS->LCDheight));
+ return(ModeIndex);
}
USHORT
@@ -11383,7 +10614,7 @@ SiS_CheckCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBF
VBFlags,mode->HDisplay, mode->VDisplay);
#endif
- if(VBFlags & CRT2_LCD) { /* CRT2 is LCD */
+ if(VBFlags & CRT2_LCD) {
if(pSiS->SiS_Pr->CP_HaveCustomData) {
for(j=0; j<7; j++) {
@@ -11398,10 +10629,7 @@ SiS_CheckCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBF
if((pSiS->AddedPlasmaModes) && (mode->type & M_T_BUILTIN))
return 0xfe;
- if((havecustommodes) &&
- (pSiS->LCDwidth) && /* = test if LCD present */
- (!(mode->type & M_T_DEFAULT)) &&
- (!(mode->Flags & V_INTERLACE)))
+ if((havecustommodes) && (!(mode->type & M_T_DEFAULT)))
return 0xfe;
if( ((mode->HDisplay <= pSiS->LCDwidth) &&
@@ -11411,30 +10639,451 @@ SiS_CheckCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBF
((mode->HDisplay == 1024) && (mode->HDisplay == 768)) ||
((mode->HDisplay == 800) && (mode->HDisplay == 600)))) ) {
- ModeIndex = SiS_GetModeID_LCD(pSiS->VGAEngine, VBFlags, mode->HDisplay, mode->VDisplay, i,
- pSiS->FSTN, pSiS->SiS_Pr->SiS_CustomT, pSiS->LCDwidth, pSiS->LCDheight);
+ if(VBFlags & (VB_LVDS | VB_30xBDH)) { /* LCD on Panel link (LVDS, 301BDH) */
+
+ switch(mode->HDisplay)
+ {
+ case 320:
+ if(pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848) {
+ if(mode->VDisplay == 200) {
+ ModeIndex = ModeIndex_320x200[i];
+ } else if(mode->VDisplay == 240) {
+ if(!pSiS->FSTN) {
+ ModeIndex = ModeIndex_320x240[i];
+ } else if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_320x240_FSTN[i];
+ }
+ }
+ }
+ break;
+ case 400:
+ if(pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848) {
+ if(mode->VDisplay == 300) {
+ ModeIndex = ModeIndex_400x300[i];
+ }
+ }
+ break;
+ case 512:
+ if(pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848) {
+ if(mode->VDisplay == 384) {
+ if(pSiS->LCDwidth != 1024 || pSiS->LCDheight != 600) { /* not supported on 1024x600 panels */
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ }
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ if(pSiS->SiS_Pr->SiS_CustomT != CUT_PANEL848) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ }
+ break;
+ case 848:
+ if(mode->VDisplay == 480) {
+ if(pSiS->SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ ModeIndex = ModeIndex_848x480[i];
+ }
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1024x768[i];
+ } else if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 600) {
+ if(pSiS->LCDheight == 600) {
+ ModeIndex = ModeIndex_1024x600[i];
+ }
+ }
+ }
+ break;
+ case 1152:
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 768) {
+ if(pSiS->LCDheight == 768) {
+ ModeIndex = ModeIndex_1152x768[i];
+ }
+ }
+ }
+ break;
+ case 1280:
+ if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_1280x1024[i];
+ } else if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(pSiS->LCDheight == 768) {
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_310_1280x768[i];
+ }
+ }
+ }
+ break;
+ case 1360:
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(pSiS->SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
+ if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_300_1360x1024[i];
+ }
+ }
+ }
+ if(mode->VDisplay == 768) {
+ if(pSiS->SiS_Pr->SiS_CustomT == CUT_PANEL848) {
+ ModeIndex = ModeIndex_1360x768[i];
+ }
+ }
+ break;
+ case 1400:
+ if(mode->VDisplay == 1050) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_1400x1050[i];
+ }
+ }
+ break;
+ case 1600:
+ if(mode->VDisplay == 1200) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_1600x1200[i];
+ }
+ }
+ break;
+ }
+
+ } else { /* LCD on 301(B/LV) */
+
+ switch(mode->HDisplay)
+ {
+ case 320:
+ if(mode->VDisplay == 200) {
+ ModeIndex = ModeIndex_320x200[i];
+ } else if(mode->VDisplay == 240) {
+ ModeIndex = ModeIndex_320x240[i];
+ }
+ break;
+ case 400:
+ if(mode->VDisplay == 300) {
+ ModeIndex = ModeIndex_400x300[i];
+ }
+ break;
+ case 512:
+ if(mode->VDisplay == 384) {
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1024x768[i];
+ }
+ break;
+ case 1280:
+ if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_1280x1024[i];
+ } else if(mode->VDisplay == 768) {
+ if((pSiS->LCDheight != 1050) && (pSiS->LCDheight != 960)) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ ModeIndex = ModeIndex_300_1280x768[i];
+ } else {
+ ModeIndex = ModeIndex_310_1280x768[i];
+ }
+ }
+ } else if(mode->VDisplay == 960) {
+ if((pSiS->LCDheight != 1050) && (pSiS->LCDheight != 768)) {
+ ModeIndex = ModeIndex_1280x960[i];
+ }
+ }
+ break;
+ case 1400:
+ if(VBFlags & (VB_301C | VB_302B | VB_302LV)) {
+ if(mode->VDisplay == 1050) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_1400x1050[i];
+ }
+ }
+ }
+ break;
+ case 1600:
+ if(VBFlags & (VB_301C | VB_302B | VB_302LV)) {
+ if(mode->VDisplay == 1200) {
+ ModeIndex = ModeIndex_1600x1200[i];
+ }
+ }
+ break;
+ }
+
+ }
}
- } else if(VBFlags & CRT2_TV) { /* CRT2 is TV */
+ } else if(VBFlags & CRT2_TV) {
+
+ if(VBFlags & VB_CHRONTEL) { /* TV on Chrontel */
+
+ switch(mode->HDisplay)
+ {
+ case 512:
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(mode->VDisplay == 384) {
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_1024x768[i];
+ }
+ }
+ break;
+ }
- ModeIndex = SiS_GetModeID_TV(pSiS->VGAEngine, VBFlags, mode->HDisplay, mode->VDisplay, i);
+ } else { /* TV on 301(B/LV) */
+
+ switch(mode->HDisplay)
+ {
+ case 320: /* TEST */
+ if(mode->VDisplay == 200) {
+ ModeIndex = ModeIndex_320x200[i];
+ } else if(mode->VDisplay == 240) {
+ ModeIndex = ModeIndex_320x240[i];
+ }
+ break;
+ case 400: /* TEST */
+ if(mode->VDisplay == 300) {
+ ModeIndex = ModeIndex_400x300[i];
+ }
+ break;
+ case 512:
+ if(mode->VDisplay == 384) {
+ if((VBFlags & TV_PAL) && (!(VBFlags & TV_PALM)))
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ break;
+ case 720:
+ if(!(VBFlags & (TV_HIVISION | TV_HIVISION_LV))) {
+ if(mode->VDisplay == 480) {
+ if((VBFlags & TV_NTSC) || (VBFlags & TV_PALM))
+ ModeIndex = ModeIndex_720x480[i];
+ } else if(mode->VDisplay == 576) {
+ if((VBFlags & TV_PAL) && (!(VBFlags & TV_PALM)))
+ ModeIndex = ModeIndex_720x576[i];
+ }
+ }
+ break;
+ case 768:
+ if(!(VBFlags & (TV_HIVISION | TV_HIVISION_LV))) {
+ if(mode->VDisplay == 576) {
+ if((VBFlags & TV_PAL) && (!(VBFlags & TV_PALM)))
+ ModeIndex = ModeIndex_768x576[i];
+ }
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ } else if(VBFlags & (TV_HIVISION | TV_HIVISION_LV)) {
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_1024x576[i];
+ }
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ if(VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) {
+ ModeIndex = ModeIndex_1024x768[i];
+ }
+ } else if(VBFlags & (TV_HIVISION | TV_HIVISION_LV)) {
+ if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_1024x576[i];
+ }
+ }
+ break;
+ case 1280:
+ if(VBFlags & (TV_HIVISION | TV_HIVISION_LV)) {
+ if(mode->VDisplay == 720) {
+ ModeIndex = ModeIndex_1280x720[i];
+ } if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_1280x1024[i];
+ }
+ }
+ break;
+ }
+
+ }
} else if(VBFlags & CRT2_VGA) { /* CRT2 is VGA2 */
- if((pSiS->AddedPlasmaModes) && (mode->type & M_T_BUILTIN))
- return 0xfe;
+ if((pSiS->AddedPlasmaModes) && (mode->type & M_T_BUILTIN))
+ return 0xfe;
- if((havecustommodes) &&
- (!(mode->type & M_T_DEFAULT)) &&
- (!(mode->Flags & V_INTERLACE)))
- return 0xfe;
+ if((havecustommodes) && (!(mode->type & M_T_DEFAULT)))
+ return 0xfe;
- ModeIndex = SiS_GetModeID_VGA2(pSiS->VGAEngine, VBFlags, mode->HDisplay, mode->VDisplay, i);
+ switch(mode->HDisplay)
+ {
+ case 320:
+ if(mode->VDisplay == 200) {
+ ModeIndex = ModeIndex_320x200[i];
+ } else if(mode->VDisplay == 240) {
+ ModeIndex = ModeIndex_320x240[i];
+ }
+ break;
+ case 400:
+ if(mode->VDisplay == 300) {
+ ModeIndex = ModeIndex_400x300[i];
+ }
+ break;
+ case 512:
+ if(mode->VDisplay == 384) {
+ ModeIndex = ModeIndex_512x384[i];
+ }
+ break;
+ case 640:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_640x480[i];
+ } else if(mode->VDisplay == 400) {
+ ModeIndex = ModeIndex_640x400[i];
+ }
+ break;
+ case 720:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_720x480[i];
+ } else if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_720x576[i];
+ }
+ break;
+ case 768:
+ if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_768x576[i];
+ }
+ break;
+ case 800:
+ if(mode->VDisplay == 600) {
+ ModeIndex = ModeIndex_800x600[i];
+ } else if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_800x480[i];
+ }
+ break;
+ case 848:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_848x480[i];
+ }
+ break;
+ case 856:
+ if(mode->VDisplay == 480) {
+ ModeIndex = ModeIndex_856x480[i];
+ }
+ break;
+ case 1024:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1024x768[i];
+ } else if(mode->VDisplay == 576) {
+ ModeIndex = ModeIndex_1024x576[i];
+ }
+ break;
+ case 1152:
+ if(mode->VDisplay == 864) {
+ ModeIndex = ModeIndex_1152x864[i];
+ } else if(pSiS->VGAEngine == SIS_300_VGA) {
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1152x768[i];
+ }
+ }
+ break;
+ case 1280:
+ if(mode->VDisplay == 1024) {
+ ModeIndex = ModeIndex_1280x1024[i];
+ } else if(mode->VDisplay == 720) {
+ ModeIndex = ModeIndex_1280x720[i];
+ } else if(mode->VDisplay == 960) {
+ ModeIndex = ModeIndex_1280x960[i];
+ } else if(mode->VDisplay == 768) {
+ if(pSiS->VGAEngine == SIS_300_VGA) {
+ ModeIndex = ModeIndex_300_1280x768[i];
+ } else {
+ ModeIndex = ModeIndex_310_1280x768[i];
+ }
+ }
+ break;
+ case 1360:
+ if(mode->VDisplay == 768) {
+ ModeIndex = ModeIndex_1360x768[i];
+ }
+ break;
+ case 1400:
+ if(mode->VDisplay == 1050) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ ModeIndex = ModeIndex_1400x1050[i];
+ }
+ }
+ break;
+ case 1600:
+ if(mode->VDisplay == 1200) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B)) {
+ ModeIndex = ModeIndex_1600x1200[i];
+ }
+ }
+ }
+ break;
+ case 1920:
+ if(mode->VDisplay == 1440) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(pSiS->VBFlags & VB_301C) {
+ ModeIndex = ModeIndex_1920x1440[i];
+ }
+ }
+ }
+ break;
+ case 2048:
+ if(mode->VDisplay == 1536) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ if(pSiS->VBFlags & VB_301C) {
+ ModeIndex = ModeIndex_310_2048x1536[i];
+ }
+ }
+ }
+ break;
+ }
- } else { /* CRT1 only, no CRT2 */
+ } else { /* CRT1 only, no CRT2 */
- ModeIndex = SiS_CalcModeIndex(pScrn, mode, VBFlags, havecustommodes);
+ ModeIndex = SiS_CalcModeIndex(pScrn, mode, havecustommodes);
}
@@ -11573,9 +11222,9 @@ SISWaitRetraceCRT1(ScrnInfoPtr pScrn)
if(temp & 0xc0) return;
watchdog = 65536;
- while((inSISREG(SISINPSTAT) & 0x08) && --watchdog);
- watchdog = 65536;
while((!(inSISREG(SISINPSTAT) & 0x08)) && --watchdog);
+ watchdog = 65536;
+ while((inSISREG(SISINPSTAT) & 0x08) && --watchdog);
}
void
@@ -11585,17 +11234,12 @@ SISWaitRetraceCRT2(ScrnInfoPtr pScrn)
int watchdog;
unsigned char temp, reg;
- if(SiSBridgeIsInSlaveMode(pScrn)) {
- SISWaitRetraceCRT1(pScrn);
- return;
- }
-
switch(pSiS->VGAEngine) {
case SIS_300_VGA:
- reg = 0x25;
+ reg = 0x28;
break;
case SIS_315_VGA:
- reg = 0x30;
+ reg = 0x33;
break;
default:
return;
@@ -11604,12 +11248,12 @@ SISWaitRetraceCRT2(ScrnInfoPtr pScrn)
watchdog = 65536;
do {
inSISIDXREG(SISPART1, reg, temp);
- if(!(temp & 0x02)) break;
+ if(temp & 0x80) break;
} while(--watchdog);
watchdog = 65536;
do {
inSISIDXREG(SISPART1, reg, temp);
- if(temp & 0x02) break;
+ if(!(temp & 0x80)) break;
} while(--watchdog);
}
@@ -11617,23 +11261,23 @@ static void
SISWaitVBRetrace(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
-
+
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
if(pSiS->SecondHead)
- SISWaitRetraceCRT1(pScrn);
+ SISWaitRetraceCRT1(pScrn);
else
- SISWaitRetraceCRT2(pScrn);
+ SISWaitRetraceCRT2(pScrn);
} else {
#endif
if(pSiS->VBFlags & DISPTYPE_DISP1) {
- SISWaitRetraceCRT1(pScrn);
+ SISWaitRetraceCRT1(pScrn);
}
if(pSiS->VBFlags & DISPTYPE_DISP2) {
- if(!(SiSBridgeIsInSlaveMode(pScrn))) {
- SISWaitRetraceCRT2(pScrn);
- }
+ if(!(SiSBridgeIsInSlaveMode(pScrn))) {
+ SISWaitRetraceCRT2(pScrn);
+ }
}
#ifdef SISDUALHEAD
}
@@ -11654,24 +11298,24 @@ SiS_GetSetModeID(ScrnInfoPtr pScrn, unsigned char id)
unsigned char
SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value)
{
- unsigned char ret = 0;
-#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__))
+ unsigned char ret;
unsigned char *base;
base = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, 0, 0x2000);
if(!base) {
- SISErrorLog(pScrn, "(Could not map BIOS scratch area)\n");
- return 0;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "(Could not map BIOS scratch area)\n");
+ return 0;
}
ret = *(base + offset);
/* value != 0xff means: set register */
if(value != 0xff)
- *(base + offset) = value;
+ *(base + offset) = value;
xf86UnMapVidMem(pScrn->scrnIndex, base, 0x2000);
-#endif
+
return ret;
}
@@ -11697,16 +11341,15 @@ sisSaveUnlockExtRegisterLock(SISPtr pSiS, unsigned char *reg1, unsigned char *re
unsigned char val1, val2;
int i;
#endif
- SISErrorLog(pSiS->pScrn,
- "Failed to unlock sr registers (%p, %lx, 0x%02x; %ld)\n",
- (void *)pSiS, (unsigned long)pSiS->RelIO, val, mylockcalls);
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_ERROR,
+ "Failed to unlock sr registers (%p, %x, 0x%02x; %d)\n",
+ pSiS, pSiS->RelIO, val, mylockcalls);
#ifdef TWDEBUG
for(i = 0; i <= 0x3f; i++) {
inSISIDXREG(SISSR, i, val1);
inSISIDXREG(0x3c4, i, val2);
xf86DrvMsg(pSiS->pScrn->scrnIndex, X_INFO,
- "SR%02d: RelIO=0x%02x 0x3c4=0x%02x (%d)\n",
- i, val1, val2, mylockcalls);
+ "SR%02d: RelIO=0x%02x 0x3c4=0x%02x (%d)\n", i, val1, val2, mylockcalls);
}
#endif
if((pSiS->VGAEngine == SIS_OLD_VGA) || (pSiS->VGAEngine == SIS_530_VGA)) {
@@ -11725,9 +11368,9 @@ sisSaveUnlockExtRegisterLock(SISPtr pSiS, unsigned char *reg1, unsigned char *re
outSISIDXREG(SISCR, 0x80, 0x86);
inSISIDXREG(SISCR, 0x80, val);
if(val != 0xA1) {
- SISErrorLog(pSiS->pScrn,
- "Failed to unlock cr registers (%p, %lx, 0x%02x)\n",
- (void *)pSiS, (unsigned long)pSiS->RelIO, val);
+ xf86DrvMsg(pSiS->pScrn->scrnIndex, X_ERROR,
+ "Failed to unlock cr registers (%p, %x, 0x%02x)\n",
+ pSiS, pSiS->RelIO, val);
}
}
}
diff --git a/src/sis_driver.h b/src/sis_driver.h
index d76cde0..03d22f3 100644
--- a/src/sis_driver.h
+++ b/src/sis_driver.h
@@ -1,35 +1,64 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_driver.h,v 1.18 2003/09/08 14:20:39 twini Exp $ */
/*
* Global data and definitions
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
*/
+/* Mode numbers for 300/315/330 series */
+const UShort ModeIndex_320x200[] = {0x59, 0x41, 0x00, 0x4f};
+const UShort ModeIndex_320x240[] = {0x50, 0x56, 0x00, 0x53};
+const UShort ModeIndex_320x240_FSTN[] = {0x5a, 0x5b, 0x00, 0x00}; /* FSTN */
+const UShort ModeIndex_400x300[] = {0x51, 0x57, 0x00, 0x54};
+const UShort ModeIndex_512x384[] = {0x52, 0x58, 0x00, 0x5c};
+const UShort ModeIndex_640x400[] = {0x2f, 0x5d, 0x00, 0x5e};
+const UShort ModeIndex_640x480[] = {0x2e, 0x44, 0x00, 0x62};
+const UShort ModeIndex_720x480[] = {0x31, 0x33, 0x00, 0x35};
+const UShort ModeIndex_720x576[] = {0x32, 0x34, 0x00, 0x36};
+const UShort ModeIndex_768x576[] = {0x5f, 0x60, 0x00, 0x61};
+const UShort ModeIndex_800x480[] = {0x70, 0x7a, 0x00, 0x76};
+const UShort ModeIndex_800x600[] = {0x30, 0x47, 0x00, 0x63};
+const UShort ModeIndex_848x480[] = {0x39, 0x3b, 0x00, 0x3e};
+const UShort ModeIndex_856x480[] = {0x3f, 0x42, 0x00, 0x45};
+const UShort ModeIndex_1024x768[] = {0x38, 0x4a, 0x00, 0x64};
+const UShort ModeIndex_1024x576[] = {0x71, 0x74, 0x00, 0x77};
+const UShort ModeIndex_1024x600[] = {0x20, 0x21, 0x00, 0x22}; /* 300 series only */
+const UShort ModeIndex_1280x1024[] = {0x3a, 0x4d, 0x00, 0x65};
+const UShort ModeIndex_1280x960[] = {0x7c, 0x7d, 0x00, 0x7e};
+const UShort ModeIndex_1152x768[] = {0x23, 0x24, 0x00, 0x25}; /* 300 series only */
+const UShort ModeIndex_1152x864[] = {0x29, 0x2a, 0x00, 0x2b};
+const UShort ModeIndex_300_1280x768[] = {0x55, 0x5a, 0x00, 0x5b};
+const UShort ModeIndex_310_1280x768[] = {0x23, 0x24, 0x00, 0x25};
+const UShort ModeIndex_1280x720[] = {0x79, 0x75, 0x00, 0x78};
+const UShort ModeIndex_1360x768[] = {0x48, 0x4b, 0x00, 0x4e};
+const UShort ModeIndex_300_1360x1024[]= {0x67, 0x6f, 0x00, 0x72}; /* 300 series, BARCO only */
+const UShort ModeIndex_1400x1050[] = {0x26, 0x27, 0x00, 0x28}; /* 315 series only */
+const UShort ModeIndex_1600x1200[] = {0x3c, 0x3d, 0x00, 0x66};
+const UShort ModeIndex_1920x1440[] = {0x68, 0x69, 0x00, 0x6b};
+const UShort ModeIndex_300_2048x1536[]= {0x6c, 0x6d, 0x00, 0x00};
+const UShort ModeIndex_310_2048x1536[]= {0x6c, 0x6d, 0x00, 0x6e};
+
/* VESA */
/* The following is included because there are BIOSes out there that
* report incomplete mode lists. These are 630 BIOS versions <2.01.2x
@@ -84,16 +113,14 @@ static const struct _sis_vrate {
{1, 1152, 864, 75, TRUE}, {2, 1152, 864, 84, FALSE},
{1, 1280, 720, 60, TRUE}, {2, 1280, 720, 75, FALSE}, {3, 1280, 720, 85, TRUE},
{1, 1280, 768, 60, TRUE},
- {1, 1280, 800, 60, TRUE},
{1, 1280, 960, 60, TRUE}, {2, 1280, 960, 85, TRUE},
{1, 1280, 1024, 43, FALSE}, {2, 1280, 1024, 60, TRUE}, {3, 1280, 1024, 75, FALSE},
{4, 1280, 1024, 85, TRUE},
{1, 1360, 768, 60, TRUE},
{1, 1400, 1050, 60, TRUE}, {2, 1400, 1050, 75, TRUE},
- {1, 1600, 1200, 60, TRUE}, {2, 1600, 1200, 65, TRUE}, {3, 1600, 1200, 70, TRUE},
- {4, 1600, 1200, 75, TRUE}, {5, 1600, 1200, 85, TRUE}, {6, 1600, 1200, 100, TRUE},
+ {1, 1600, 1200, 60, TRUE}, {2, 1600, 1200, 65, TRUE}, {3, 1600, 1200, 70, TRUE},
+ {4, 1600, 1200, 75, TRUE}, {5, 1600, 1200, 85, TRUE}, {6, 1600, 1200, 100, TRUE},
{7, 1600, 1200, 120, TRUE},
- {1, 1680, 1050, 60, TRUE},
{1, 1920, 1440, 60, TRUE}, {2, 1920, 1440, 65, TRUE}, {3, 1920, 1440, 70, TRUE},
{4, 1920, 1440, 75, TRUE}, {5, 1920, 1440, 85, TRUE}, {6, 1920, 1440, 100, TRUE},
{1, 2048, 1536, 60, TRUE}, {2, 2048, 1536, 65, TRUE}, {3, 2048, 1536, 70, TRUE},
@@ -113,131 +140,56 @@ static const pdctable mypdctable[] = {
{ 0, 0, 0, "" , "" }
};
-/* These machines require setting/clearing a GPIO bit for enabling/
- * disabling communication with the Chrontel TV encoder
- */
static const chswtable mychswtable[] = {
{ 0x1631, 0x1002, "Mitachi", "0x1002" },
{ 0x1071, 0x7521, "Mitac" , "7521P" },
{ 0, 0, "" , "" }
};
-/* These machines require special timing/handling
- */
const customttable mycustomttable[] = {
{ SIS_630, "2.00.07", "09/27/2002-13:38:25",
0x3240A8,
{ 0x220, 0x227, 0x228, 0x229, 0x0ee },
{ 0x01, 0xe3, 0x9a, 0x6a, 0xef },
0x1039, 0x6300,
- "Barco", "iQ R200L/300/400", CUT_BARCO1366, "BARCO_1366"
+ "Barco", "iQ R200L/300/400", CUT_BARCO1366, "BARCO1366"
},
{ SIS_630, "2.00.07", "09/27/2002-13:38:25",
0x323FBD,
{ 0x220, 0x227, 0x228, 0x229, 0x0ee },
{ 0x00, 0x5a, 0x64, 0x41, 0xef },
0x1039, 0x6300,
- "Barco", "iQ G200L/300/400/500", CUT_BARCO1024, "BARCO_1024"
+ "Barco", "iQ G200L/300/400/500", CUT_BARCO1024, "BARCO1024"
},
{ SIS_650, "", "",
0,
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
0x0e11, 0x083c,
- "Inventec (Compaq)", "3017cl/3045US", CUT_COMPAQ12802, "COMPAQ_1280"
+ "Compaq (Inventec)", "Presario 3017cl/3045US", CUT_COMPAQ12802, "COMPAQ1280"
},
{ SIS_650, "", "",
- 0, /* Special 1024x768 / dual link */
+ 0,
{ 0x00c, 0, 0, 0, 0 },
{ 'e' , 0, 0, 0, 0 },
0x1558, 0x0287,
- "Clevo", "L285/L287 (Version 1)", CUT_CLEVO1024, "CLEVO_L28X_1"
+ "Clevo", "L285/L287 (Version 1)", CUT_CLEVO1024, "CLEVO1024"
},
{ SIS_650, "", "",
- 0, /* Special 1024x768 / single link */
+ 0,
{ 0x00c, 0, 0, 0, 0 },
{ 'y' , 0, 0, 0, 0 },
0x1558, 0x0287,
- "Clevo", "L285/L287 (Version 2)", CUT_CLEVO10242, "CLEVO_L28X_2"
- },
- { SIS_650, "", "",
- 0, /* Special 1400x1050 */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1558, 0x0400, /* possibly 401 and 402 as well; not panelsize specific? */
- "Clevo", "D400S/D410S/D400H/D410H", CUT_CLEVO1400, "CLEVO_D4X0"
- },
- { SIS_650, "", "",
- 0, /* Shift LCD in LCD-via-CRT1 mode */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1558, 0x2263,
- "Clevo", "D22ES/D27ES", CUT_UNIWILL1024, "CLEVO_D2X0ES"
- },
- { SIS_650, "", "",
- 0, /* Shift LCD in LCD-via-CRT1 mode */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1734, 0x101f,
- "Uniwill", "N243S9", CUT_UNIWILL1024, "UNIWILL_N243S9"
+ "Clevo", "L285/L287 (Version 2)", CUT_CLEVO10242, "CLEVO10242"
},
{ SIS_650, "", "",
- 0, /* Shift LCD in LCD-via-CRT1 mode */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1584, 0x5103,
- "Uniwill", "N35BS1", CUT_UNIWILL10242, "UNIWILL_N35BS1"
- },
- { SIS_650, "1.09.2c", "", /* Other versions, too? */
- 0, /* Shift LCD in LCD-via-CRT1 mode */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1019, 0x0f05,
- "ECS", "A928", CUT_UNIWILL1024, "ECS_A928"
- },
- { SIS_740, "1.11.27a", "",
0,
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
- 0x1043, 0x1612,
- "Asus", "L3000D/L3500D", CUT_ASUSL3000D, "ASUS_L3X00"
- },
- { SIS_650, "1.10.9k", "",
- 0, /* For EMI */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1025, 0x0028,
- "Acer", "Aspire 1700", CUT_ACER1280, "ACER_ASPIRE1700"
+ 0x1558, 0x0400, /* possibly 401 and 402 as well; not panelsize specific (?) */
+ "Clevo", "D400S/D410S/D400H/D410H", CUT_CLEVO1400, "CLEVO400"
},
- { SIS_650, "1.10.7w", "",
- 0, /* For EMI */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x14c0, 0x0012,
- "Compal", "??? (V1)", CUT_COMPAL1400_1, "COMPAL_1400_1"
- },
- { SIS_650, "1.10.7x", "", /* New BIOS on its way (from BG.) */
- 0, /* For EMI */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x14c0, 0x0012,
- "Compal", "??? (V2)", CUT_COMPAL1400_2, "COMPAL_1400_2"
- },
- { SIS_650, "1.10.8o", "",
- 0, /* For EMI (unknown) */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1043, 0x1612,
- "Asus", "A2H (V1)", CUT_ASUSA2H_1, "ASUS_A2H_1"
- },
- { SIS_650, "1.10.8q", "",
- 0, /* For EMI */
- { 0, 0, 0, 0, 0 },
- { 0, 0, 0, 0, 0 },
- 0x1043, 0x1612,
- "Asus", "A2H (V2)", CUT_ASUSA2H_2, "ASUS_A2H_2"
- },
- { 4321, "", "", /* never autodetected */
+ { 4321, "", "", /* This is hopefully NEVER autodetected */
0,
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -648,8 +600,6 @@ static DisplayModeRec SiS6326SIS1600x1200_60Mode = {
0.0 /* VRefresh */
};
-/* TV filters for SiS video bridges
- */
static const struct _SiSTVFilter301 {
unsigned char filter[7][4];
} SiSTVFilter301[] = {
@@ -772,8 +722,6 @@ static const struct _SiSTVFilter301B {
{0x01,0xff,0xfb,0xfb,0x0c,0x25,0x32} }}
};
-/* TV scaling data for SiS video bridges
- */
typedef struct _SiSTVVScale {
unsigned short ScaleVDE;
int sindex;
@@ -900,6 +848,13 @@ static const MySiSTVVScale SiSTVVScale[] = {
0x0429, 0x036E, 0x00F2, 0x0291, 0x0275, 0x0279,
0x0001, 0x0082, 0x008F, 0x0429, 0x0291, 0x024E }
},
+#if 0
+ { 0x01B8, 0, 768, /* NTSC 1024 - v-scaling not supported */
+ { 0x044B, 0x041A, 0x002D, 0x0329, 0x030A, 0x030D,
+ 0x0000, 0x0001, 0x0001, 0x044B, 0x032A, 0x02D2 }
+ },
+#endif
+
{ 0x0230, 3, 480, /* PAL 640 */
{ 0x0371, 0x02AE, 0x00EA, 0x01FF, 0x01E8, 0x01EB,
0x0000, 0x0007, 0x0010, 0x0371, 0x0200, 0x0032,
@@ -1025,6 +980,12 @@ static const MySiSTVVScale SiSTVVScale[] = {
0x0437, 0x0372, 0x00FE, 0x0296, 0x0277, 0x027B,
0x0000, 0x0003, 0x0004, 0x0437, 0x0296, 0x01BA }
},
+#if 0
+ { 0x0208, 0, 768, /* PAL 1024 - v-scaling not supported */
+ { 0x0491, 0x0422, 0x0046, 0x0333, 0x030D, 0x0311,
+ 0x0000, 0x0001, 0x0001, 0x0491, 0x0334, 0x02AE }
+ }
+#endif
};
unsigned const char SiSScalingP1Regs[] = {
@@ -1034,313 +995,11 @@ unsigned const char SiSScalingP4Regs[] = {
0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b
};
-static const unsigned char SiS301CScaling[] = {
-
- /* NTSC/PAL-M/525ip 640x480 */
-
- 0x03,0x1C,0x03,0x7E,0x01,0x1C,0x05,0x7E,0x00,0x1C,0x06,0x7E,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7D,0x19,0x0D,0x7D,0x7D,0x18,0x0F,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x0F,0x18,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7E,0x06,0x1C,0x00,0x7E,0x05,0x1C,0x01,
-
- 0x03,0x1B,0x03,0x7F,0x02,0x1B,0x05,0x7E,0x00,0x1B,0x07,0x7E,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7D,0x19,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7E,0x07,0x1B,0x00,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x19,0x0A,0x7D,
- 0x7F,0x19,0x0C,0x7C,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
- 0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
- 0x7D,0x0C,0x19,0x7E,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
-
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x19,0x0A,0x7C,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x10,0x7C,0x7D,0x15,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x15,0x7D,0x7D,0x10,0x16,0x7D,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x18,0x05,0x7E,0x04,0x19,0x07,0x7C,0x02,0x18,0x08,0x7E,0x01,0x18,0x0A,0x7D,
- 0x00,0x17,0x0C,0x7D,0x7F,0x17,0x0E,0x7C,0x7E,0x15,0x0F,0x7E,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x18,0x03,0x7D,0x07,0x19,0x03,
-
- 0x05,0x18,0x05,0x7E,0x04,0x18,0x07,0x7D,0x03,0x18,0x09,0x7C,0x02,0x17,0x0A,0x7D,
- 0x01,0x17,0x0C,0x7C,0x00,0x16,0x0E,0x7C,0x7F,0x15,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7E,0x12,0x12,0x7E,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x16,0x7F,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x17,0x02,0x7D,0x09,0x18,0x02,0x7D,0x07,0x18,0x04,
-
- /* NTSC/PAL-M/525ip 720x480 */
-
- 0x03,0x1C,0x03,0x7E,0x01,0x1C,0x05,0x7E,0x00,0x1C,0x06,0x7E,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7D,0x19,0x0D,0x7D,0x7D,0x18,0x0F,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x0F,0x18,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7E,0x06,0x1C,0x00,0x7E,0x05,0x1C,0x01,
-
- 0x03,0x1B,0x03,0x7F,0x02,0x1B,0x05,0x7E,0x00,0x1B,0x07,0x7E,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7D,0x19,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7E,0x07,0x1B,0x00,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x19,0x0A,0x7D,
- 0x7F,0x19,0x0C,0x7C,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
- 0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
- 0x7D,0x0C,0x19,0x7E,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
-
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x19,0x0A,0x7C,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x10,0x7C,0x7D,0x15,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x15,0x7D,0x7D,0x10,0x16,0x7D,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x18,0x05,0x7E,0x04,0x19,0x07,0x7C,0x02,0x18,0x08,0x7E,0x01,0x18,0x0A,0x7D,
- 0x00,0x17,0x0C,0x7D,0x7F,0x17,0x0E,0x7C,0x7E,0x15,0x0F,0x7E,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x18,0x03,0x7D,0x07,0x19,0x03,
-
- 0x05,0x18,0x05,0x7E,0x04,0x18,0x07,0x7D,0x03,0x18,0x09,0x7C,0x02,0x17,0x0A,0x7D,
- 0x01,0x17,0x0C,0x7C,0x00,0x16,0x0E,0x7C,0x7F,0x15,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7E,0x12,0x12,0x7E,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x16,0x7F,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x17,0x02,0x7D,0x09,0x18,0x02,0x7D,0x07,0x18,0x04,
-
- /* NTSC/PAL-M/525i 800x600 */
-
- 0x07,0x15,0x07,0x7D,0x05,0x15,0x08,0x7E,0x04,0x15,0x09,0x7E,0x03,0x15,0x0B,0x7D,
- 0x02,0x14,0x0C,0x7E,0x01,0x14,0x0D,0x7E,0x00,0x13,0x0F,0x7E,0x00,0x12,0x10,0x7E,
- 0x7F,0x11,0x11,0x7F,0x7E,0x10,0x12,0x00,0x7E,0x0F,0x13,0x00,0x7E,0x0D,0x14,0x01,
- 0x7D,0x0C,0x14,0x03,0x7D,0x0B,0x15,0x03,0x7D,0x09,0x15,0x05,0x7D,0x08,0x15,0x06,
-
- 0x07,0x15,0x07,0x7D,0x06,0x15,0x08,0x7D,0x05,0x15,0x09,0x7D,0x04,0x14,0x0B,0x7D,
- 0x03,0x14,0x0C,0x7D,0x02,0x13,0x0D,0x7E,0x01,0x13,0x0E,0x7E,0x00,0x12,0x10,0x7E,
- 0x7F,0x11,0x11,0x7F,0x7F,0x10,0x12,0x7F,0x7E,0x0E,0x13,0x01,0x7E,0x0D,0x13,0x02,
- 0x7E,0x0C,0x14,0x02,0x7D,0x0B,0x14,0x04,0x7D,0x09,0x15,0x05,0x7D,0x08,0x15,0x06,
-
- 0x07,0x14,0x07,0x7E,0x06,0x14,0x08,0x7E,0x05,0x14,0x0A,0x7D,0x04,0x14,0x0B,0x7D,
- 0x03,0x13,0x0C,0x7E,0x02,0x13,0x0D,0x7E,0x01,0x12,0x0E,0x7F,0x00,0x11,0x0F,0x00,
- 0x00,0x10,0x10,0x00,0x7F,0x0F,0x11,0x01,0x7F,0x0E,0x12,0x01,0x7E,0x0D,0x13,0x02,
- 0x7E,0x0C,0x13,0x03,0x7E,0x0B,0x14,0x03,0x7D,0x0A,0x14,0x05,0x7D,0x08,0x14,0x07,
-
- 0x07,0x14,0x07,0x7E,0x06,0x14,0x09,0x7D,0x05,0x14,0x0A,0x7D,0x04,0x13,0x0B,0x7E,
- 0x03,0x13,0x0C,0x7E,0x02,0x12,0x0D,0x7F,0x01,0x12,0x0E,0x7F,0x01,0x11,0x0F,0x7F,
- 0x00,0x10,0x10,0x00,0x7F,0x0F,0x11,0x01,0x7F,0x0E,0x12,0x01,0x7E,0x0D,0x12,0x03,
- 0x7E,0x0C,0x13,0x03,0x7E,0x0B,0x13,0x04,0x7E,0x0A,0x14,0x04,0x7D,0x09,0x14,0x06,
-
- 0x08,0x13,0x08,0x7D,0x07,0x13,0x09,0x7D,0x05,0x13,0x0A,0x7E,0x04,0x13,0x0B,0x7E,
- 0x04,0x12,0x0C,0x7E,0x03,0x12,0x0D,0x7E,0x02,0x11,0x0E,0x7F,0x01,0x10,0x0F,0x00,
- 0x00,0x10,0x10,0x00,0x00,0x0F,0x10,0x01,0x7F,0x0E,0x11,0x02,0x7F,0x0D,0x12,0x02,
- 0x7E,0x0C,0x12,0x04,0x7E,0x0B,0x13,0x04,0x7E,0x0A,0x13,0x05,0x7E,0x09,0x13,0x06,
-
- 0x08,0x13,0x08,0x7D,0x07,0x13,0x09,0x7D,0x06,0x12,0x0A,0x7E,0x05,0x12,0x0B,0x7E,
- 0x04,0x12,0x0C,0x7E,0x03,0x11,0x0D,0x7F,0x02,0x11,0x0E,0x7F,0x01,0x10,0x0E,0x01,
- 0x01,0x0F,0x0F,0x01,0x00,0x0E,0x10,0x02,0x00,0x0E,0x11,0x01,0x7F,0x0D,0x11,0x03,
- 0x7F,0x0C,0x12,0x03,0x7E,0x0B,0x12,0x05,0x7E,0x0A,0x12,0x06,0x7E,0x09,0x13,0x06,
-
- 0x08,0x12,0x08,0x7E,0x07,0x12,0x09,0x7E,0x06,0x12,0x0A,0x7E,0x05,0x12,0x0B,0x7E,
- 0x04,0x11,0x0C,0x7F,0x03,0x11,0x0D,0x7F,0x02,0x10,0x0D,0x01,0x02,0x10,0x0E,0x00,
- 0x01,0x0F,0x0F,0x01,0x00,0x0E,0x10,0x02,0x00,0x0D,0x10,0x03,0x7F,0x0D,0x11,0x03,
- 0x7F,0x0C,0x11,0x04,0x7F,0x0B,0x12,0x04,0x7E,0x0A,0x12,0x06,0x7E,0x09,0x12,0x07,
-
- /* PAL/PAL-N 640x480 */
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- 0x00,0x20,0x00,0x00,0x7F,0x20,0x02,0x7F,0x7D,0x20,0x04,0x7F,0x7D,0x1F,0x06,0x7E,
- 0x7C,0x1D,0x09,0x7E,0x7C,0x1B,0x0B,0x7E,0x7C,0x19,0x0E,0x7D,0x7C,0x17,0x11,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x11,0x17,0x7C,0x7D,0x0E,0x19,0x7C,0x7E,0x0B,0x1B,0x7C,
- 0x7E,0x09,0x1D,0x7C,0x7F,0x06,0x1F,0x7C,0x7F,0x04,0x20,0x7D,0x00,0x02,0x20,0x7E,
-
- /* PAL/PAL-N 720x576, 768x576 */
-
- 0x03,0x1C,0x03,0x7E,0x01,0x1C,0x05,0x7E,0x00,0x1C,0x07,0x7D,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7D,0x19,0x0D,0x7D,0x7D,0x18,0x0F,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x0F,0x18,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7E,0x07,0x1C,0x7F,0x7E,0x05,0x1C,0x01,
-
- 0x03,0x1B,0x03,0x7F,0x02,0x1B,0x05,0x7E,0x01,0x1B,0x07,0x7D,0x7F,0x1B,0x09,0x7D,
- 0x7E,0x1A,0x0B,0x7D,0x7E,0x19,0x0D,0x7C,0x7D,0x17,0x10,0x7C,0x7C,0x16,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x16,0x7C,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x19,0x7E,
- 0x7D,0x0B,0x1A,0x7E,0x7D,0x09,0x1B,0x7F,0x7D,0x07,0x1B,0x01,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x02,0x1B,0x05,0x7E,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1B,0x02,
-
- 0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
- 0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
-
- 0x04,0x19,0x04,0x7F,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x19,0x0A,0x7C,
- 0x7F,0x18,0x0C,0x7D,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x10,0x7C,0x7D,0x15,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x15,0x7D,0x7C,0x10,0x16,0x7E,0x7C,0x0E,0x17,0x7F,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x18,0x05,0x7E,0x04,0x18,0x07,0x7D,0x03,0x18,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x17,0x0C,0x7D,0x7F,0x16,0x0E,0x7D,0x7F,0x15,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x16,0x7F,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x18,0x03,0x7D,0x07,0x18,0x04,
-
- /* PAL/PAL-N 800x600 */
-
- 0x04,0x1A,0x04,0x7E,0x02,0x1A,0x05,0x7F,0x01,0x1A,0x07,0x7E,0x00,0x1A,0x09,0x7D,
- 0x7F,0x19,0x0B,0x7D,0x7E,0x18,0x0D,0x7D,0x7D,0x17,0x10,0x7C,0x7D,0x15,0x12,0x7C,
- 0x7C,0x14,0x14,0x7C,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0D,0x18,0x7F,
- 0x7D,0x0B,0x19,0x7F,0x7D,0x09,0x1A,0x00,0x7D,0x07,0x1A,0x02,0x7E,0x05,0x1A,0x03,
-
- 0x04,0x1A,0x04,0x7E,0x03,0x1A,0x06,0x7D,0x01,0x1A,0x08,0x7D,0x00,0x19,0x0A,0x7D,
- 0x7F,0x19,0x0C,0x7C,0x7E,0x18,0x0E,0x7C,0x7E,0x17,0x10,0x7B,0x7D,0x15,0x12,0x7C,
- 0x7D,0x13,0x13,0x7D,0x7C,0x12,0x15,0x7D,0x7C,0x10,0x17,0x7D,0x7C,0x0E,0x18,0x7E,
- 0x7D,0x0C,0x19,0x7E,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x1A,0x01,0x7E,0x06,0x1A,0x02,
-
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x19,0x0A,0x7C,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x10,0x7C,0x7D,0x15,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x15,0x7D,0x7C,0x10,0x16,0x7E,0x7C,0x0E,0x17,0x7F,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x19,0x00,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x19,0x05,0x7D,0x03,0x19,0x06,0x7E,0x02,0x19,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x18,0x0C,0x7C,0x7F,0x17,0x0E,0x7C,0x7E,0x16,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x16,0x7E,0x7D,0x0E,0x17,0x7E,
- 0x7D,0x0C,0x18,0x7F,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x19,0x02,0x7D,0x06,0x19,0x04,
-
- 0x05,0x18,0x05,0x7E,0x04,0x18,0x07,0x7D,0x03,0x18,0x08,0x7D,0x01,0x18,0x0A,0x7D,
- 0x00,0x17,0x0C,0x7D,0x7F,0x16,0x0E,0x7D,0x7F,0x15,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7D,0x13,0x13,0x7D,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x16,0x7F,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x18,0x01,0x7D,0x08,0x18,0x03,0x7D,0x07,0x18,0x04,
-
- 0x06,0x18,0x06,0x7C,0x04,0x18,0x07,0x7D,0x03,0x18,0x09,0x7C,0x02,0x17,0x0A,0x7D,
- 0x01,0x17,0x0C,0x7C,0x00,0x16,0x0E,0x7C,0x7F,0x15,0x0F,0x7D,0x7E,0x14,0x11,0x7D,
- 0x7E,0x12,0x12,0x7E,0x7D,0x11,0x14,0x7E,0x7D,0x0F,0x15,0x7F,0x7D,0x0E,0x16,0x7F,
- 0x7D,0x0C,0x17,0x00,0x7D,0x0A,0x17,0x02,0x7D,0x09,0x18,0x02,0x7D,0x07,0x18,0x04,
-
- 0x06,0x17,0x06,0x7D,0x05,0x17,0x07,0x7D,0x03,0x17,0x09,0x7D,0x02,0x17,0x0A,0x7D,
- 0x01,0x16,0x0C,0x7D,0x00,0x15,0x0E,0x7D,0x7F,0x14,0x0F,0x7E,0x7F,0x13,0x11,0x7D,
- 0x7E,0x12,0x12,0x7E,0x7E,0x11,0x13,0x7E,0x7D,0x0F,0x14,0x00,0x7D,0x0E,0x15,0x00,
- 0x7D,0x0C,0x16,0x01,0x7D,0x0A,0x17,0x02,0x7D,0x09,0x17,0x03,0x7D,0x07,0x17,0x05
-};
-
-
-/* Mandatory functions */
-static void SISIdentify(int flags);
-static Bool SISProbe(DriverPtr drv, int flags);
-static Bool SISPreInit(ScrnInfoPtr pScrn, int flags);
-static Bool SISScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv);
-static Bool SISEnterVT(int scrnIndex, int flags);
-static void SISLeaveVT(int scrnIndex, int flags);
-static Bool SISCloseScreen(int scrnIndex, ScreenPtr pScreen);
-static Bool SISSaveScreen(ScreenPtr pScreen, int mode);
-static Bool SISSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
-static void SISAdjustFrame(int scrnIndex, int x, int y, int flags);
-#ifdef SISDUALHEAD
-static Bool SISSaveScreenDH(ScreenPtr pScreen, int mode);
-#endif
-
-/* Optional functions */
-static void SISFreeScreen(int scrnIndex, int flags);
-static ModeStatus SISValidMode(int scrnIndex, DisplayModePtr mode,
- Bool verbose, int flags);
-
-/* Internally used functions */
-static Bool SISMapMem(ScrnInfoPtr pScrn);
-static Bool SISUnmapMem(ScrnInfoPtr pScrn);
-static void SISSave(ScrnInfoPtr pScrn);
-static void SISRestore(ScrnInfoPtr pScrn);
-static void SISVESARestore(ScrnInfoPtr pScrn);
-static Bool SISModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
-static void SISModifyModeInfo(DisplayModePtr mode);
-static void SiSPreSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int viewmode);
-static void SiSPostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg);
-static void SiS6326PostSetMode(ScrnInfoPtr pScrn, SISRegPtr sisReg);
-static Bool SiSSetVESAMode(ScrnInfoPtr pScrn, DisplayModePtr pMode);
-static void SiSBuildVesaModeList(ScrnInfoPtr pScrn, vbeInfoPtr pVbe, VbeInfoBlock *vbe);
-static UShort SiSCalcVESAModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode);
-static void SISVESASaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function);
-static void SISBridgeRestore(ScrnInfoPtr pScrn);
-static void SiSEnableTurboQueue(ScrnInfoPtr pScrn);
-unsigned char SISSearchCRT1Rate(ScrnInfoPtr pScrn, DisplayModePtr mode);
-static void SISWaitVBRetrace(ScrnInfoPtr pScrn);
-void SISWaitRetraceCRT1(ScrnInfoPtr pScrn);
-void SISWaitRetraceCRT2(ScrnInfoPtr pScrn);
-static Bool InRegion(int x, int y, region r);
-#ifdef SISMERGED
-static void SISMergePointerMoved(int scrnIndex, int x, int y);
-#endif
-BOOLEAN SiSBridgeIsInSlaveMode(ScrnInfoPtr pScrn);
-USHORT SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode,
- unsigned long VBFlags, BOOLEAN hcm);
-USHORT SiS_CheckCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode,
- unsigned long VBFlags, BOOLEAN hcm);
-unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
-#ifdef DEBUG
-static void SiSDumpModeInfo(ScrnInfoPtr pScrn, DisplayModePtr mode);
-#endif
-extern USHORT SiS_GetModeID(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay,
- int Depth, BOOL FSTN, int LCDwith, int LCDheight);
-extern USHORT SiS_GetModeID_LCD(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth,
- BOOLEAN FSTN, USHORT CustomT, int LCDwith, int LCDheight);
-extern USHORT SiS_GetModeID_TV(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth);
-extern USHORT SiS_GetModeID_VGA2(int VGAEngine, ULONG VBFlags, int HDisplay, int VDisplay, int Depth);
-extern int SiSTranslateToVESA(ScrnInfoPtr pScrn, int modenumber);
-extern BOOLEAN SiSDetermineROMLayout661(SiS_Private *SiS_Pr, PSIS_HW_INFO HwInfo);
-extern BOOLEAN SiSBIOSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension,
- ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
-extern BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension,
- ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch);
-extern void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr);
-extern void SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension,USHORT ModeNo);
-extern void SiS_GetVBType(SiS_Private *SiS_Pr, PSIS_HW_INFO);
-extern DisplayModePtr SiSBuildBuiltInModeList(ScrnInfoPtr pScrn, BOOLEAN includelcdmodes,
- BOOLEAN isfordvi);
-extern BOOLEAN SiSBIOSSetModeCRT1(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension,
- ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
-extern BOOLEAN SiSBIOSSetModeCRT2(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension,
- ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN IsCustom);
+USHORT SiS_CalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, BOOLEAN hcm);
+USHORT SiS_CheckCalcModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode, unsigned long VBFlags, BOOLEAN hcm);
+unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
-/* For power management for 315 series */
-extern void SiS_Chrontel701xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension);
-extern void SiS_Chrontel701xBLOff(SiS_Private *SiS_Pr);
-extern void SiS_SiS30xBLOn(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension);
-extern void SiS_SiS30xBLOff(SiS_Private *SiS_Pr, PSIS_HW_INFO HwDeviceExtension);
+void SISMergePointerMoved(int scrnIndex, int x, int y);
diff --git a/src/sis_opt.c b/src/sis_opt.c
index b3dc1e7..b0e0677 100644
--- a/src/sis_opt.c
+++ b/src/sis_opt.c
@@ -1,37 +1,31 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_opt.c,v 1.31 2003/09/04 15:32:44 twini Exp $ */
/*
* SiS driver option evaluation
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Based on code by ? (included in XFree86 4.1)
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the supplier not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The supplier makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * "NoAccel", "NoXVideo", "SWCursor", "HWCursor" and "Rotate" option portions
- * Copyright (C) 1999-2004 The XFree86 Project, Inc. Licensed under the terms
- * of the XFree86 license (http://www.xfree86.org/current/LICENSE1.html).
+ * THE SUPPLIER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Authors: Thomas Winischhofer <thomas@winischhofer.net>
- * ?
+ * ?
*/
#include "xf86.h"
@@ -46,18 +40,15 @@ extern const customttable mycustomttable[];
typedef enum {
OPTION_SW_CURSOR,
OPTION_HW_CURSOR,
+/* OPTION_PCI_RETRY, */
OPTION_NOACCEL,
OPTION_TURBOQUEUE,
OPTION_FAST_VRAM,
OPTION_NOHOSTBUS,
+/* OPTION_SET_MEMCLOCK, */
OPTION_RENDER,
- OPTION_FORCE_CRT1TYPE,
OPTION_FORCE_CRT2TYPE,
- OPTION_YPBPRAR,
OPTION_SHADOW_FB,
- OPTION_DRI,
- OPTION_AGP_SIZE,
- OPTION_AGP_SIZE2,
OPTION_ROTATE,
OPTION_NOXVIDEO,
OPTION_VESA,
@@ -65,10 +56,6 @@ typedef enum {
OPTION_FORCECRT1,
OPTION_XVONCRT2,
OPTION_PDC,
- OPTION_PDCA,
- OPTION_PDCS,
- OPTION_PDCAS,
- OPTION_EMI,
OPTION_TVSTANDARD,
OPTION_USEROMDATA,
OPTION_NOINTERNALMODES,
@@ -107,10 +94,8 @@ typedef enum {
OPTION_RESTOREBYSET,
OPTION_NODDCFORCRT2,
OPTION_FORCECRT2REDETECTION,
- OPTION_SENSEYPBPR,
OPTION_CRT1GAMMA,
OPTION_CRT2GAMMA,
- OPTION_XVGAMMA,
OPTION_XVDEFCONTRAST,
OPTION_XVDEFBRIGHTNESS,
OPTION_XVDEFHUE,
@@ -125,12 +110,10 @@ typedef enum {
OPTION_XVINSIDECHROMAKEY,
OPTION_XVYUVCHROMAKEY,
OPTION_SCALELCD,
- OPTION_CENTERLCD,
OPTION_SPECIALTIMING,
OPTION_LVDSHL,
OPTION_ENABLEHOTKEY,
OPTION_MERGEDFB,
- OPTION_MERGEDFBAUTO,
OPTION_CRT2HSYNC,
OPTION_CRT2VREFRESH,
OPTION_CRT2POS,
@@ -142,10 +125,13 @@ typedef enum {
OPTION_NOSISXINERAMA,
OPTION_NOSISXINERAMA2,
OPTION_CRT2ISSCRN0,
- OPTION_MERGEDDPI,
OPTION_ENABLESISCTRL,
- OPTION_STOREDBRI,
- OPTION_STOREDPBRI,
+ OPTION_STOREDBRIR,
+ OPTION_STOREDBRIG,
+ OPTION_STOREDBRIB,
+ OPTION_STOREDPBRIR,
+ OPTION_STOREDPBRIG,
+ OPTION_STOREDPBRIB,
#ifdef SIS_CP
SIS_CP_OPT_OPTIONS
#endif
@@ -155,31 +141,22 @@ typedef enum {
static const OptionInfoRec SISOptions[] = {
{ OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE },
+/* { OPTION_PCI_RETRY, "PciRetry", OPTV_BOOLEAN, {0}, FALSE }, */
{ OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_TURBOQUEUE, "TurboQueue", OPTV_BOOLEAN, {0}, FALSE },
+/* { OPTION_SET_MEMCLOCK, "SetMClk", OPTV_FREQ, {0}, -1 }, */
{ OPTION_FAST_VRAM, "FastVram", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_NOHOSTBUS, "NoHostBus", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_RENDER, "RenderAcceleration", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_FORCE_CRT1TYPE, "ForceCRT1Type", OPTV_STRING, {0}, FALSE },
- { OPTION_FORCE_CRT2TYPE, "ForceCRT2Type", OPTV_STRING, {0}, FALSE },
- { OPTION_YPBPRAR, "YPbPrAspectRatio", OPTV_STRING, {0}, FALSE },
+ { OPTION_FORCE_CRT2TYPE, "ForceCRT2Type", OPTV_ANYSTR, {0}, FALSE },
{ OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_AGP_SIZE2, "GARTSize", OPTV_INTEGER, {0}, FALSE },
- { OPTION_ROTATE, "Rotate", OPTV_STRING, {0}, FALSE },
+ { OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE },
{ OPTION_NOXVIDEO, "NoXvideo", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_VESA, "Vesa", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_MAXXFBMEM, "MaxXFBMem", OPTV_INTEGER, {0}, -1 },
{ OPTION_FORCECRT1, "ForceCRT1", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_XVONCRT2, "XvOnCRT2", OPTV_BOOLEAN, {0}, FALSE },
{ OPTION_PDC, "PanelDelayCompensation", OPTV_INTEGER, {0}, -1 },
- { OPTION_PDCA, "PanelDelayCompensation1",OPTV_INTEGER, {0}, -1 },
- { OPTION_PDCS, "PDC", OPTV_INTEGER, {0}, -1 },
- { OPTION_PDCAS, "PDC1", OPTV_INTEGER, {0}, -1 },
- { OPTION_EMI, "EMI", OPTV_INTEGER, {0}, -1 },
- { OPTION_LVDSHL, "LVDSHL", OPTV_INTEGER, {0}, -1 },
- { OPTION_SPECIALTIMING, "SpecialTiming", OPTV_STRING, {0}, -1 },
{ OPTION_TVSTANDARD, "TVStandard", OPTV_STRING, {0}, -1 },
{ OPTION_USEROMDATA, "UseROMData", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_NOINTERNALMODES, "NoInternalModes", OPTV_BOOLEAN, {0}, FALSE },
@@ -214,16 +191,12 @@ static const OptionInfoRec SISOptions[] = {
{ OPTION_SIS6326FSCADJUST, "SIS6326FSCAdjust", OPTV_INTEGER, {0}, -1 },
{ OPTION_USERGBCURSOR, "UseColorHWCursor", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_USERGBCURSORBLEND, "ColorHWCursorBlending", OPTV_BOOLEAN, {0}, -1 },
- { OPTION_USERGBCURSORBLENDTH, "ColorHWCursorBlendThreshold", OPTV_INTEGER,{0},-1 },
+ { OPTION_USERGBCURSORBLENDTH, "ColorHWCursorBlendThreshold", OPTV_INTEGER, {0}, -1 },
{ OPTION_RESTOREBYSET, "RestoreBySetMode", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_NODDCFORCRT2, "NoCRT2Detection", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_FORCECRT2REDETECTION, "ForceCRT2ReDetection", OPTV_BOOLEAN, {0}, -1 },
- { OPTION_SENSEYPBPR, "SenseYPbPr", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_CRT1GAMMA, "CRT1Gamma", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_CRT2GAMMA, "CRT2Gamma", OPTV_BOOLEAN, {0}, -1 },
- { OPTION_STOREDBRI, "StoredGammaBrightness", OPTV_STRING, {0}, -1 },
- { OPTION_STOREDPBRI, "StoredGammaPreBrightness",OPTV_STRING, {0}, -1 },
- { OPTION_XVGAMMA, "XvGamma", OPTV_STRING, {0}, -1 },
{ OPTION_XVDEFCONTRAST, "XvDefaultContrast", OPTV_INTEGER, {0}, -1 },
{ OPTION_XVDEFBRIGHTNESS, "XvDefaultBrightness", OPTV_INTEGER, {0}, -1 },
{ OPTION_XVDEFHUE, "XvDefaultHue", OPTV_INTEGER, {0}, -1 },
@@ -238,25 +211,30 @@ static const OptionInfoRec SISOptions[] = {
{ OPTION_XVDISABLECOLORKEY, "XvDisableColorKey", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_XVMEMCPY, "XvUseMemcpy", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_SCALELCD, "ScaleLCD", OPTV_BOOLEAN, {0}, -1 },
- { OPTION_CENTERLCD, "CenterLCD", OPTV_BOOLEAN, {0}, -1 },
{ OPTION_ENABLEHOTKEY, "EnableHotkey", OPTV_BOOLEAN, {0}, -1 },
+ { OPTION_SPECIALTIMING, "SpecialTiming", OPTV_STRING, {0}, -1 },
+ { OPTION_LVDSHL, "LVDSHL", OPTV_INTEGER, {0}, -1 },
{ OPTION_ENABLESISCTRL, "EnableSiSCtrl", OPTV_BOOLEAN, {0}, -1 },
+ { OPTION_STOREDBRIR, "StoredGammaBrightnessRed", OPTV_INTEGER, {0}, -1 },
+ { OPTION_STOREDBRIG, "StoredGammaBrightnessGreen", OPTV_INTEGER, {0}, -1 },
+ { OPTION_STOREDBRIB, "StoredGammaBrightnessBlue", OPTV_INTEGER, {0}, -1 },
+ { OPTION_STOREDPBRIR, "StoredGammaPreBrightnessRed", OPTV_INTEGER, {0}, -1 },
+ { OPTION_STOREDPBRIG, "StoredGammaPreBrightnessGreen", OPTV_INTEGER, {0}, -1 },
+ { OPTION_STOREDPBRIB, "StoredGammaPreBrightnessBlue", OPTV_INTEGER, {0}, -1 },
#ifdef SISMERGED
{ OPTION_MERGEDFB, "MergedFB", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_MERGEDFB2, "TwinView", OPTV_BOOLEAN, {0}, FALSE }, /* alias */
- { OPTION_MERGEDFBAUTO, "MergedFBAuto", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_CRT2HSYNC, "CRT2HSync", OPTV_STRING, {0}, FALSE },
- { OPTION_CRT2HSYNC2, "SecondMonitorHorizSync", OPTV_STRING, {0}, FALSE }, /* alias */
- { OPTION_CRT2VREFRESH, "CRT2VRefresh", OPTV_STRING, {0}, FALSE },
- { OPTION_CRT2VREFRESH2, "SecondMonitorVertRefresh", OPTV_STRING, {0}, FALSE }, /* alias */
- { OPTION_CRT2POS, "CRT2Position", OPTV_STRING, {0}, FALSE },
- { OPTION_CRT2POS2, "TwinViewOrientation", OPTV_STRING, {0}, FALSE }, /* alias */
- { OPTION_METAMODES, "MetaModes", OPTV_STRING, {0}, FALSE },
- { OPTION_MERGEDDPI, "MergedDPI", OPTV_STRING, {0}, FALSE },
+ { OPTION_CRT2HSYNC, "CRT2HSync", OPTV_ANYSTR, {0}, FALSE },
+ { OPTION_CRT2VREFRESH, "CRT2VRefresh", OPTV_ANYSTR, {0}, FALSE },
+ { OPTION_CRT2POS, "CRT2Position", OPTV_ANYSTR, {0}, FALSE },
+ { OPTION_METAMODES, "MetaModes", OPTV_ANYSTR, {0}, FALSE },
+ { OPTION_MERGEDFB2, "TwinView", OPTV_BOOLEAN, {0}, FALSE }, /* alias */
+ { OPTION_CRT2HSYNC2, "SecondMonitorHorizSync", OPTV_ANYSTR, {0}, FALSE }, /* alias */
+ { OPTION_CRT2VREFRESH2, "SecondMonitorVertRefresh", OPTV_ANYSTR, {0}, FALSE }, /* alias */
+ { OPTION_CRT2POS2, "TwinViewOrientation", OPTV_ANYSTR, {0}, FALSE }, /* alias */
#ifdef SISXINERAMA
{ OPTION_NOSISXINERAMA, "NoMergedXinerama", OPTV_BOOLEAN, {0}, FALSE },
- { OPTION_NOSISXINERAMA2, "NoTwinviewXineramaInfo", OPTV_BOOLEAN, {0}, FALSE }, /* alias */
- { OPTION_CRT2ISSCRN0, "MergedXineramaCRT2IsScreen0",OPTV_BOOLEAN,{0},FALSE },
+ { OPTION_CRT2ISSCRN0, "MergedXineramaCRT2IsScreen0", OPTV_BOOLEAN, {0}, FALSE },
+ { OPTION_NOSISXINERAMA2, "NoTwinviewXineramaInfo", OPTV_BOOLEAN, {0}, FALSE }, /* alias */
#endif
#endif
#ifdef SIS_CP
@@ -270,6 +248,7 @@ SiSOptions(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
MessageType from;
+/* double temp; */
char *strptr;
static const char *mybadparm = "\"%s\" is is not a valid parameter for option \"%s\"\n";
static const char *disabledstr = "disabled";
@@ -280,7 +259,8 @@ SiSOptions(ScrnInfoPtr pScrn)
xf86CollectOptions(pScrn, NULL);
/* Process the options */
- if(!(pSiS->Options = xalloc(sizeof(SISOptions)))) return;
+ if(!(pSiS->Options = xalloc(sizeof(SISOptions))))
+ return;
memcpy(pSiS->Options, SISOptions, sizeof(SISOptions));
@@ -290,6 +270,7 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->newFastVram = -1;
pSiS->NoHostBus = FALSE;
+/* pSiS->UsePCIRetry = TRUE; */
pSiS->TurboQueue = TRUE;
#ifdef SISVRAMQ
/* TODO: Option (315 series VRAM command queue) */
@@ -300,8 +281,6 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->HWCursor = TRUE;
pSiS->Rotate = FALSE;
pSiS->ShadowFB = FALSE;
- pSiS->loadDRI = FALSE;
- pSiS->agpWantedPages = AGP_PAGES;
pSiS->VESA = -1;
pSiS->NoXvideo = FALSE;
pSiS->maxxfbmem = 0;
@@ -311,8 +290,6 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->XvOnCRT2 = FALSE;
pSiS->NoYV12 = -1;
pSiS->PDC = -1;
- pSiS->PDCA = -1;
- pSiS->EMI = -1;
pSiS->OptTVStand = -1;
pSiS->OptROMUsage = -1;
pSiS->noInternalModes = FALSE;
@@ -342,25 +319,19 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->tvypos = 0;
pSiS->tvxscale = 0;
pSiS->tvyscale = 0;
- pSiS->NonDefaultPAL = pSiS->NonDefaultNTSC = -1;
+ pSiS->NonDefaultPAL = -1;
pSiS->chtvtype = -1;
pSiS->restorebyset = TRUE;
pSiS->nocrt2ddcdetection = FALSE;
- pSiS->forcecrt2redetection = TRUE; /* default changed since 13/09/2003 */
- pSiS->SenseYPbPr = TRUE;
- pSiS->ForceCRT1Type = CRT1_VGA;
+ pSiS->forcecrt2redetection = FALSE;
pSiS->ForceCRT2Type = CRT2_DEFAULT;
- pSiS->ForceYPbPrAR = TV_YPBPR169;
pSiS->ForceTVType = -1;
pSiS->CRT1gamma = TRUE;
- pSiS->CRT1gammaGiven = FALSE;
pSiS->CRT2gamma = TRUE;
- pSiS->XvGamma = FALSE;
- pSiS->XvGammaGiven = FALSE;
pSiS->enablesisctrl = FALSE;
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
pSiS->XvDefBri = 10;
- pSiS->XvDefCon = 2;
+ pSiS->XvDefCon = 5;
} else {
pSiS->XvDefBri = 0;
pSiS->XvDefCon = 4;
@@ -370,7 +341,6 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->XvDefDisableGfx = FALSE;
pSiS->XvDefDisableGfxLR = FALSE;
pSiS->UsePanelScaler = -1;
- pSiS->CenterLCD = -1;
pSiS->XvUseMemcpy = TRUE;
pSiS->XvUseChromaKey = FALSE;
pSiS->XvDisableColorKey = FALSE;
@@ -378,19 +348,16 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->XvYUVChromaKey = FALSE;
pSiS->XvChromaMin = 0x000101fe;
pSiS->XvChromaMax = 0x000101ff;
- pSiS->XvGammaRed = pSiS->XvGammaGreen = pSiS->XvGammaBlue =
- pSiS->XvGammaRedDef = pSiS->XvGammaGreenDef = pSiS->XvGammaBlueDef = 1000;
pSiS->GammaBriR = pSiS->GammaBriG = pSiS->GammaBriB = 1000;
pSiS->GammaPBriR = pSiS->GammaPBriG = pSiS->GammaPBriB = 1000;
pSiS->HideHWCursor = FALSE;
pSiS->HWCursorIsVisible = FALSE;
#ifdef SISMERGED
- pSiS->MergedFB = pSiS->MergedFBAuto = FALSE;
+ pSiS->MergedFB = FALSE;
pSiS->CRT2Position = sisRightOf;
pSiS->CRT2HSync = NULL;
pSiS->CRT2VRefresh = NULL;
pSiS->MetaModes = NULL;
- pSiS->MergedFBXDPI = pSiS->MergedFBYDPI = 0;
#ifdef SISXINERAMA
pSiS->UseSiSXinerama = TRUE;
pSiS->CRT2IsScrn0 = FALSE;
@@ -417,14 +384,6 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->HWCursor = FALSE;
}
- /* DRI only supported on 300 series,
- * so don't load DRI by default on
- * others.
- */
- if(pSiS->VGAEngine == SIS_300_VGA) {
- pSiS->loadDRI = TRUE;
- }
-
#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
pSiS->OptUseColorCursor = 0;
#else
@@ -436,7 +395,6 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->OptUseColorCursor = 1;
}
#endif
-
if(pSiS->VGAEngine == SIS_300_VGA) {
pSiS->AllowHotkey = 0;
} else if(pSiS->VGAEngine == SIS_315_VGA) {
@@ -445,8 +403,28 @@ SiSOptions(ScrnInfoPtr pScrn)
/* Collect the options */
- /* FastVRAM (5597/5598, 6326 and 530/620 only)
- */
+#if 0
+ /* PCI retry - What the heck is/was this for? */
+ from = X_DEFAULT;
+ if(xf86GetOptValBool(pSiS->Options, OPTION_PCI_RETRY, &pSiS->UsePCIRetry)) {
+ from = X_CONFIG;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "PCI retry %s\n",
+ pSiS->UsePCIRetry ? enabledstr : disabledstr);
+#endif
+
+ /* Mem clock */
+#if 0 /* This is not used */
+ if(xf86GetOptValFreq(pSiS->Options, OPTION_SET_MEMCLOCK, OPTUNITS_MHZ,
+ &temp)) {
+ pSiS->MemClock = (int)(temp * 1000.0);
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Memory clock set to %.3f MHz\n", pSiS->MemClock/1000.0);
+ }
+#endif
+
+ /* FastVRAM (5597/5598, 6326 and 530/620 only)
+ */
if((pSiS->VGAEngine == SIS_OLD_VGA) || (pSiS->VGAEngine == SIS_530_VGA)) {
from = X_DEFAULT;
if(xf86GetOptValBool(pSiS->Options, OPTION_FAST_VRAM, &pSiS->newFastVram)) {
@@ -459,8 +437,8 @@ SiSOptions(ScrnInfoPtr pScrn)
(pSiS->newFastVram ? "enabled (for read and write)" : disabledstr));
}
- /* NoHostBus (5597/5598 only)
- */
+ /* NoHostBus (5597/5598 only)
+ */
if((pSiS->Chipset == PCI_CHIP_SIS5597)) {
from = X_DEFAULT;
if(xf86GetOptValBool(pSiS->Options, OPTION_NOHOSTBUS, &pSiS->NoHostBus)) {
@@ -470,19 +448,19 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->NoHostBus ? disabledstr : enabledstr);
}
- /* MaxXFBMem
- * This options limits the amount of video memory X uses for screen
- * and off-screen buffers. This option should be used if using DRI
- * is intended. The kernel framebuffer driver required for DRM will
- * start its memory heap at 12MB if it detects more than 16MB, at 8MB if
- * between 8 and 16MB are available, otherwise at 4MB. So, if the amount
- * of memory X uses, a clash between the framebuffer's memory heap
- * and X is avoided. The amount is to be specified in KB.
- */
+ /* MaxXFBMem
+ * This options limits the amount of video memory X uses for screen
+ * and off-screen buffers. This option should be used if using DRI
+ * is intended. The kernel framebuffer driver required for DRM will
+ * start its memory heap at 12MB if it detects more than 16MB, at 8MB if
+ * between 8 and 16MB are available, otherwise at 4MB. So, if the amount
+ * of memory X uses, a clash between the framebuffer's memory heap
+ * and X is avoided. The amount is to be specified in KB.
+ */
if(xf86GetOptValULong(pSiS->Options, OPTION_MAXXFBMEM,
&pSiS->maxxfbmem)) {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "MaxXFBMem: Framebuffer memory shall be limited to %ld KB\n",
+ "MaxXFBMem: Framebuffer memory shall be limited to %d KB\n",
pSiS->maxxfbmem);
pSiS->maxxfbmem *= 1024;
}
@@ -492,7 +470,7 @@ SiSOptions(ScrnInfoPtr pScrn)
*/
if(xf86ReturnOptValBool(pSiS->Options, OPTION_NOACCEL, FALSE)) {
pSiS->NoAccel = TRUE;
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
pSiS->NoXvideo = TRUE;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "2D Acceleration and Xv disabled\n");
#else
@@ -606,26 +584,9 @@ SiSOptions(ScrnInfoPtr pScrn)
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
Bool val;
if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFB, &val)) {
- if(val) {
- pSiS->MergedFB = TRUE;
- pSiS->MergedFBAuto = FALSE;
- }
+ if(val) pSiS->MergedFB = TRUE;
} else if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFB2, &val)) {
- if(val) {
- pSiS->MergedFB = TRUE;
- pSiS->MergedFBAuto = FALSE;
- }
- }
-
- if(xf86GetOptValBool(pSiS->Options, OPTION_MERGEDFBAUTO, &val)) {
- if(!pSiS->MergedFB) {
- if(val) {
- pSiS->MergedFB = pSiS->MergedFBAuto = TRUE;
- }
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Option \"MergedFB\" overrules option \"MergedFBAuto\"\n");
- }
+ if(val) pSiS->MergedFB = TRUE;
}
if(pSiS->MergedFB) {
@@ -670,32 +631,29 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->MetaModes = xalloc(strlen(strptr) + 1);
if(pSiS->MetaModes) memcpy(pSiS->MetaModes, strptr, strlen(strptr) + 1);
}
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2HSYNC);
- if(!strptr) {
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2HSYNC2);
- }
- if(strptr) {
- pSiS->CRT2HSync = xalloc(strlen(strptr) + 1);
- if(pSiS->CRT2HSync) memcpy(pSiS->CRT2HSync, strptr, strlen(strptr) + 1);
- }
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2VREFRESH);
- if(!strptr) {
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2VREFRESH2);
- }
- if(strptr) {
- pSiS->CRT2VRefresh = xalloc(strlen(strptr) + 1);
- if(pSiS->CRT2VRefresh) memcpy(pSiS->CRT2VRefresh, strptr, strlen(strptr) + 1);
- }
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_MERGEDDPI);
- if(strptr) {
- int val1 = 0, val2 = 0;
- sscanf(strptr, "%d %d", &val1, &val2);
- if(val1 && val2) {
- pSiS->MergedFBXDPI = val1;
- pSiS->MergedFBYDPI = val2;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "MergedDPI");
+ if(pSiS->MetaModes) {
+ strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2HSYNC);
+ if(!strptr) {
+ strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2HSYNC2);
}
+ if(strptr) {
+ pSiS->CRT2HSync = xalloc(strlen(strptr) + 1);
+ if(pSiS->CRT2HSync) memcpy(pSiS->CRT2HSync, strptr, strlen(strptr) + 1);
+ }
+ strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2VREFRESH);
+ if(!strptr) {
+ strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CRT2VREFRESH2);
+ }
+ if(strptr) {
+ pSiS->CRT2VRefresh = xalloc(strlen(strptr) + 1);
+ if(pSiS->CRT2VRefresh) memcpy(pSiS->CRT2VRefresh, strptr, strlen(strptr) + 1);
+ }
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Option \"MergedFB\" (alias \"TwinView\") requires Option \"MetaModes\".\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "MergedFB (alias TwinView) mode disabled.\n");
+ pSiS->MergedFB = FALSE;
}
#ifdef SISXINERAMA
if(pSiS->MergedFB) {
@@ -715,9 +673,9 @@ SiSOptions(ScrnInfoPtr pScrn)
}
#endif
- /* Some options can only be specified in the Master Head's Device
- * section. Here we give the user a hint in the log.
- */
+ /* Some options can only be specified in the Master Head's Device
+ * section. Here we give the user a hint in the log.
+ */
#ifdef SISDUALHEAD
if((pSiS->DualHeadMode) && (pSiS->SecondHead)) {
static const char *mystring = "Option \"%s\" is only accepted in Master Head's device section\n";
@@ -752,34 +710,14 @@ SiSOptions(ScrnInfoPtr pScrn)
if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT2REDETECTION, &val)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT2ReDetection");
}
- if(xf86GetOptValBool(pSiS->Options, OPTION_SENSEYPBPR, &val)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "SenseYPbPr");
- }
- if(xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT1TYPE)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT1Type");
- }
if(xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT2TYPE)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ForceCRT2Type");
}
- if(xf86GetOptValString(pSiS->Options, OPTION_YPBPRAR)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "YPbPrAspectRatio");
- }
if(xf86GetOptValBool(pSiS->Options, OPTION_SCALELCD, &val)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "ScaleLCD");
}
- if(xf86GetOptValBool(pSiS->Options, OPTION_CENTERLCD, &val)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "CenterLCD");
- }
- if((xf86GetOptValInteger(pSiS->Options, OPTION_PDC, &vali)) ||
- (xf86GetOptValInteger(pSiS->Options, OPTION_PDCS, &vali))) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "PanelDelayCompensation (PDC)");
- }
- if((xf86GetOptValInteger(pSiS->Options, OPTION_PDCA, &vali)) ||
- (xf86GetOptValInteger(pSiS->Options, OPTION_PDCAS, &vali))) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "PanelDelayCompensation1 (PDC1)");
- }
- if(xf86GetOptValInteger(pSiS->Options, OPTION_EMI, &vali)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "EMI");
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_PDC, &vali)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "PanelDelayCompensation");
}
if(xf86GetOptValString(pSiS->Options, OPTION_SPECIALTIMING)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "SpecialTiming");
@@ -821,6 +759,9 @@ SiSOptions(ScrnInfoPtr pScrn)
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"TV related options are only accepted in Master Head's device section");
}
+ if(xf86GetOptValBool(pSiS->Options, OPTION_CRT1GAMMA, &val)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "CRT1Gamma");
+ }
if(xf86GetOptValBool(pSiS->Options, OPTION_CRT2GAMMA, &val)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mystring, "CRT2Gamma");
}
@@ -929,6 +870,19 @@ SiSOptions(ScrnInfoPtr pScrn)
val ? enabledstr : disabledstr);
}
+ /* ForceCRT1 (300/315/330 series only)
+ * This option can be used to force CRT1 to be switched on/off. Its
+ * intention is mainly for old monitors that can't be detected
+ * automatically. This is only useful on machines with a video bridge.
+ * In normal cases, this option won't be necessary.
+ */
+ if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT1, &val)) {
+ pSiS->forceCRT1 = val ? 1 : 0;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "CRT1 shall be forced to %s\n",
+ val ? "ON" : "OFF");
+ }
+
/* NoCRT2DDCDetection (315/330 series only)
* If set to true, this disables CRT2 detection using DDC. This is
* to avoid problems with not entirely DDC compiant LCD panels or
@@ -956,55 +910,6 @@ SiSOptions(ScrnInfoPtr pScrn)
} else pSiS->forcecrt2redetection = FALSE;
}
- /* SenseYPbPr (315/330 series only)
- * If set to true, the driver will sense for YPbPr TV. This is
- * inconvenient for folks connecting SVideo and CVBS at the same
- * time, because this condition will be detected as YPbPr (since
- * the TV output pins are shared). "False" will not sense for
- * YPbPr and detect SVideo or CVBS only.
- */
- if(xf86GetOptValBool(pSiS->Options, OPTION_SENSEYPBPR, &val)) {
- if(val) pSiS->SenseYPbPr = TRUE;
- else pSiS->SenseYPbPr = FALSE;
- }
-
-
- /* ForceCRT1Type (315/330 series only)
- * Used for forcing the driver to initialize CRT1 as
- * VGA (analog) or LCDA (for simultanious LCD and TV
- * display) - on M650/651 and 661 or later with 301C/30xLV only!
- */
- if(pSiS->VGAEngine == SIS_315_VGA) {
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_FORCE_CRT1TYPE);
- if(strptr != NULL) {
- if(!xf86NameCmp(strptr,"VGA")) {
- pSiS->ForceCRT1Type = CRT1_VGA;
- } else if( (!xf86NameCmp(strptr,"LCD")) ||
- (!xf86NameCmp(strptr,"LCDA")) ||
- (!xf86NameCmp(strptr,"LCD-A")) ) {
- pSiS->ForceCRT1Type = CRT1_LCDA;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "ForceCRT1Type");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Valid parameters are \"VGA\" or \"LCD\"\n");
- }
- }
- }
-
- /* ForceCRT1 (300/315/330 series only)
- * This option can be used to force CRT1 to be switched on/off. Its
- * intention is mainly for old monitors that can't be detected
- * automatically. This is only useful on machines with a video bridge.
- * In normal cases, this option won't be necessary.
- */
- if(xf86GetOptValBool(pSiS->Options, OPTION_FORCECRT1, &val)) {
- pSiS->forceCRT1 = val ? 1 : 0;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "CRT1 shall be forced to %s\n",
- val ? "ON" : "OFF");
- if(!pSiS->forceCRT1) pSiS->ForceCRT1Type = CRT1_VGA;
- }
-
/* ForceCRT2Type (300/315/330 series only)
* Used for forcing the driver to initialize a given
* CRT2 device type.
@@ -1014,81 +919,35 @@ SiSOptions(ScrnInfoPtr pScrn)
if(strptr != NULL) {
if(!xf86NameCmp(strptr,"TV"))
pSiS->ForceCRT2Type = CRT2_TV;
- else if( (!xf86NameCmp(strptr,"SVIDEO")) ||
- (!xf86NameCmp(strptr,"SVHS")) ) {
+ else if(!xf86NameCmp(strptr,"SVIDEO")) {
pSiS->ForceCRT2Type = CRT2_TV;
pSiS->ForceTVType = TV_SVIDEO;
- } else if( (!xf86NameCmp(strptr,"COMPOSITE")) ||
- (!xf86NameCmp(strptr,"CVBS")) ) {
+ } else if(!xf86NameCmp(strptr,"COMPOSITE")) {
pSiS->ForceCRT2Type = CRT2_TV;
pSiS->ForceTVType = TV_AVIDEO;
- } else if( (!xf86NameCmp(strptr,"COMPOSITE SVIDEO")) || /* Ugly, but shorter than a parsing function */
- (!xf86NameCmp(strptr,"COMPOSITE+SVIDEO")) ||
- (!xf86NameCmp(strptr,"SVIDEO+COMPOSITE")) ||
- (!xf86NameCmp(strptr,"SVIDEO COMPOSITE")) ) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = (TV_SVIDEO | TV_AVIDEO);
} else if(!xf86NameCmp(strptr,"SCART")) {
pSiS->ForceCRT2Type = CRT2_TV;
pSiS->ForceTVType = TV_SCART;
- } else if((!xf86NameCmp(strptr,"LCD")) || (!xf86NameCmp(strptr,"DVI-D"))) {
- if(pSiS->ForceCRT1Type == CRT1_VGA) {
- pSiS->ForceCRT2Type = CRT2_LCD;
- } else {
- pSiS->ForceCRT2Type = 0;
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Can't set both CRT1 and CRT2 type to LCD; CRT2 disabled\n");
- }
- } else if((!xf86NameCmp(strptr,"VGA")) || (!xf86NameCmp(strptr,"DVI-A")))
+ } else if((!xf86NameCmp(strptr,"LCD")) || (!xf86NameCmp(strptr,"DVI-D")))
+ pSiS->ForceCRT2Type = CRT2_LCD;
+ else if((!xf86NameCmp(strptr,"VGA")) || (!xf86NameCmp(strptr,"DVI-A")))
pSiS->ForceCRT2Type = CRT2_VGA;
else if(!xf86NameCmp(strptr,"NONE"))
pSiS->ForceCRT2Type = 0;
- else if((!xf86NameCmp(strptr,"DSTN")) && (pSiS->Chipset == PCI_CHIP_SIS550)) {
- if(pSiS->ForceCRT1Type == CRT1_VGA) {
+ else if(pSiS->Chipset == PCI_CHIP_SIS550) {
+ if(!xf86NameCmp(strptr,"DSTN")) {
pSiS->ForceCRT2Type = CRT2_LCD;
pSiS->DSTN = TRUE;
- }
- } else if((!xf86NameCmp(strptr,"FSTN")) && (pSiS->Chipset == PCI_CHIP_SIS550)) {
- if(pSiS->ForceCRT1Type == CRT1_VGA) {
+ } else if(!xf86NameCmp(strptr,"FSTN")) {
pSiS->ForceCRT2Type = CRT2_LCD;
pSiS->FSTN = TRUE;
}
-#ifdef ENABLE_YPBPR
- } else if(!xf86NameCmp(strptr,"HIVISION")) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = TV_HIVISION;
- } else if((!xf86NameCmp(strptr,"YPBPR1080I")) && (pSiS->VGAEngine == SIS_315_VGA)) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = TV_YPBPR;
- pSiS->ForceYPbPrType = TV_YPBPR1080I;
- } else if(((!xf86NameCmp(strptr,"YPBPR525I")) || (!xf86NameCmp(strptr,"YPBPR480I"))) &&
- (pSiS->VGAEngine == SIS_315_VGA)) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = TV_YPBPR;
- pSiS->ForceYPbPrType = TV_YPBPR525I;
- } else if(((!xf86NameCmp(strptr,"YPBPR525P")) || (!xf86NameCmp(strptr,"YPBPR480P"))) &&
- (pSiS->VGAEngine == SIS_315_VGA)) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = TV_YPBPR;
- pSiS->ForceYPbPrType = TV_YPBPR525P;
- } else if(((!xf86NameCmp(strptr,"YPBPR750P")) || (!xf86NameCmp(strptr,"YPBPR720P"))) &&
- (pSiS->VGAEngine == SIS_315_VGA)) {
- pSiS->ForceCRT2Type = CRT2_TV;
- pSiS->ForceTVType = TV_YPBPR;
- pSiS->ForceYPbPrType = TV_YPBPR750P;
-#endif
} else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "ForceCRT2Type");
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Valid parameters are \"LCD\" (=\"DVI-D\"), \"TV\", \"SVIDEO\", \"COMPOSITE\",\n"
- "\t\"SVIDEO+COMPOSITE\", \"SCART\", \"VGA\" (=\"DVI-A\") or \"NONE\"; on the SiS550\n"
- "\talso \"DSTN\" and \"FSTN\""
-#ifdef ENABLE_YPBPR
- "; on SiS 301/301B bridges also \"HIVISION\", and on\n"
- "\tSiS315/330 series with 301C/30xLV bridge also \"YPBPR480I\", \"YPBPR480P\",\n"
- "\t\"YPBPR720P\" and \"YPBPR1080I\""
-#endif
- "\n");
+ "\t\"SCART\", \"VGA\" (=\"DVI-A\") or \"NONE\", on the SiS550 also \"DSTN\"\n"
+ "\tand \"FSTN\"\n");
}
if(pSiS->ForceCRT2Type != CRT2_DEFAULT)
@@ -1096,23 +955,6 @@ SiSOptions(ScrnInfoPtr pScrn)
"CRT2 type shall be %s\n", strptr);
}
- if(pSiS->ForceTVType == TV_YPBPR) {
- strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_YPBPRAR);
- if(strptr != NULL) {
- if(!xf86NameCmp(strptr,"4:3LB"))
- pSiS->ForceYPbPrAR = TV_YPBPR43LB;
- else if(!xf86NameCmp(strptr,"4:3"))
- pSiS->ForceYPbPrAR = TV_YPBPR43;
- else if(!xf86NameCmp(strptr,"16:9"))
- pSiS->ForceYPbPrAR = TV_YPBPR169;
- else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "YPbPrAspectRatio");
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Valid parameters are \"4:3LB\", \"4:3\" and \"16:9\"\n");
- }
- }
- }
-
strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_SPECIALTIMING);
if(strptr != NULL) {
int i = 0;
@@ -1173,24 +1015,8 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->UsePanelScaler ? disabledstr : enabledstr);
}
- /* CenterLCD (300/315/330 + SiS video bridge only)
- * If LCD shall not be scaled, this selects whether 1:1 data
- * will be sent to the output, or the image shall be centered
- * on the LCD. For LVDS panels, screen will always be centered,
- * since these have no built-in scaler. For TMDS, this is
- * selectable. Non-centered means that the driver will pass
- * 1:1 data to the output and that the panel will have to
- * scale by itself (if supported by the panel).
- */
- if(xf86GetOptValBool(pSiS->Options, OPTION_CENTERLCD, &val)) {
- pSiS->CenterLCD = val ? 1 : 0;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Non-scaled LCD output will %sbe centered\n",
- pSiS->CenterLCD ? "not " : "");
- }
-
/* PanelDelayCompensation (300/315/330 series only)
- * This might be required if the LCD panel shows "small waves"
- * or wrong colors.
+ * This might be required if the LCD panel shows "small waves".
* The parameter is an integer, (on 300 series usually either
* 4, 32 or 24; on 315 series + LV bridge usually 3 or 51)
* Why this option? Simply because SiS did poor BIOS design.
@@ -1198,49 +1024,20 @@ SiSOptions(ScrnInfoPtr pScrn)
* particular machine. For most panels, the driver is able
* to detect the correct value. However, some panels require
* a different setting. For 300 series, the value given must
- * be within the mask 0x3c. For 661 and later, if must be
- * within the range of 0 to 31.
+ * be within the mask 0x3c.
*/
- {
- int val = -1;
- xf86GetOptValInteger(pSiS->Options, OPTION_PDC, &val);
- xf86GetOptValInteger(pSiS->Options, OPTION_PDCS, &val);
- if(val != -1) {
- pSiS->PDC = val;
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_PDC, &pSiS->PDC)) {
if((pSiS->VGAEngine == SIS_300_VGA) && (pSiS->PDC & ~0x3c)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Illegal PanelDelayCompensation parameter\n");
pSiS->PDC = -1;
} else {
- if(pSiS->VGAEngine == SIS_315_VGA) pSiS->PDC &= 0x1f;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Panel delay compensation shall be %d (for LCD=CRT2)\n",
+ "Panel delay compensation shall be %d\n",
pSiS->PDC);
}
}
- /* PanelDelayCompensation1 (315 series only)
- * Same as above, but for LCD-via-CRT1 ("LCDA")
- */
- if(pSiS->VGAEngine == SIS_315_VGA) {
- val = -1;
- xf86GetOptValInteger(pSiS->Options, OPTION_PDCA, &val);
- xf86GetOptValInteger(pSiS->Options, OPTION_PDCAS, &val);
- if(val != -1) {
- pSiS->PDCA = val;
- if(pSiS->PDCA > 0x1f) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Illegal PanelDelayCompensation1 (PDC1) parameter (0 <= PDC1 <= 31\n");
- pSiS->PDCA = -1;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Panel delay compensation shall be %d (for LCD=CRT1)\n",
- pSiS->PDCA);
- }
- }
- }
- }
-
/* LVDSHL (300/315/330 series + 30xLV bridge only)
* This might be required if the LCD panel is too dark.
* The parameter is an integer from 0 to 3.
@@ -1257,28 +1054,6 @@ SiSOptions(ScrnInfoPtr pScrn)
}
}
- /* EMI (315/330 series + 302LV/302ELV bridge only)
- * This might be required if the LCD panel loses sync on
- * mode switches. So far, this problem should not show up
- * due to the auto-detection (from reading the values set
- * by the BIOS; however, the BIOS values are wrong sometimes
- * such as in the case of some Compal machines with a
- * 1400x1050, or some Inventec(Compaq) machines with a
- * 1280x1024 panel.
- * The parameter is an integer from 0 to 0x60ffffff.
- */
- if(xf86GetOptValInteger(pSiS->Options, OPTION_EMI, &pSiS->EMI)) {
- if((pSiS->EMI < 0) || (pSiS->EMI > 0x60ffffff)) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Illegal EMI parameter, valid is 0 through 0x60ffffff\n");
- pSiS->EMI = -1;
- } else {
- pSiS->EMI &= 0x60ffffff;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "EMI will be 0x%04x\n", pSiS->EMI);
- }
- }
-
}
@@ -1301,51 +1076,46 @@ SiSOptions(ScrnInfoPtr pScrn)
(!xf86NameCmp(strptr,"PAL-N"))) {
pSiS->OptTVStand = 1;
pSiS->NonDefaultPAL = 0;
- } else if((!xf86NameCmp(strptr,"NTSCJ")) ||
- (!xf86NameCmp(strptr,"NTSC-J"))) {
- pSiS->OptTVStand = 0;
- pSiS->NonDefaultNTSC = 1;
} else if(!xf86NameCmp(strptr,"NTSC"))
pSiS->OptTVStand = 0;
else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "TVStandard");
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Valid parameters are \"PAL\", \"PALM\", \"PALN\", \"NTSC\", \"NTSCJ\"\n");
+ "Valid parameters are \"PAL\", \"PALM\", \"PALN\" or \"NTSC\"\n");
}
if(pSiS->OptTVStand != -1) {
static const char *tvstdstr = "TV standard shall be %s\n";
if(pSiS->Chipset == PCI_CHIP_SIS6326) {
pSiS->NonDefaultPAL = -1;
- pSiS->NonDefaultNTSC = -1;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, tvstdstr,
pSiS->OptTVStand ? "PAL" : "NTSC");
} else {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, tvstdstr,
(pSiS->OptTVStand ?
( (pSiS->NonDefaultPAL == -1) ? "PAL" :
- ((pSiS->NonDefaultPAL) ? "PALM" : "PALN") ) :
- (pSiS->NonDefaultNTSC == -1) ? "NTSC" : "NTSCJ"));
+ ((pSiS->NonDefaultPAL) ? "PALM" : "PALN") )
+ : "NTSC"));
}
}
}
}
- /* CHTVType (315/330 series + Chrontel only)
+ /* CHTVType (315/330 series only)
* Used for telling the driver if the TV output shall
- * be 525i YPbPr or SCART.
+ * be i480 HDTV or SCART.
*/
if(pSiS->VGAEngine == SIS_315_VGA) {
strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_CHTVTYPE);
if(strptr != NULL) {
if(!xf86NameCmp(strptr,"SCART"))
pSiS->chtvtype = 1;
- else if(!xf86NameCmp(strptr,"YPBPR525I"))
+ else if(!xf86NameCmp(strptr,"HDTV"))
pSiS->chtvtype = 0;
else {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, mybadparm, strptr, "CHTVType");
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Valid parameters are \"SCART\" or \"YPBPR525I\"\n");
+ "Valid parameters are \"SCART\" or \"HDTV\"\n");
}
if(pSiS->chtvtype != -1)
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
@@ -1353,15 +1123,15 @@ SiSOptions(ScrnInfoPtr pScrn)
}
}
- /* CHTVOverscan (300/315/330 series only)
- * CHTVSuperOverscan (300/315/330 series only)
- * These options are for overriding the BIOS option for
- * TV Overscan. Some BIOS don't even have such an option.
- * SuperOverscan is only supported with PAL.
- * Both options are only effective on machines with a
- * CHRONTEL TV encoder. SuperOverscan is only available
- * on the 700x.
- */
+ /* CHTVOverscan (300/315/330 series only)
+ * CHTVSuperOverscan (300/315/330 series only)
+ * These options are for overriding the BIOS option for
+ * TV Overscan. Some BIOS don't even have such an option.
+ * SuperOverscan is only supported with PAL.
+ * Both options are only effective on machines with a
+ * CHRONTEL TV encoder. SuperOverscan is only available
+ * on the 700x.
+ */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
Bool val;
if(xf86GetOptValBool(pSiS->Options, OPTION_CHTVOVERSCAN, &val)) {
@@ -1377,8 +1147,8 @@ SiSOptions(ScrnInfoPtr pScrn)
}
}
- /* Various parameters for TV output via SiS bridge, Chrontel or SiS6326
- */
+ /* Various parameters for TV output via SiS bridge, Chrontel or SiS6326
+ */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
int tmp = 0;
xf86GetOptValInteger(pSiS->Options, OPTION_CHTVLUMABANDWIDTHCVBS,
@@ -1506,8 +1276,21 @@ SiSOptions(ScrnInfoPtr pScrn)
}
}
- /* CRT2Gamma - enable/disable gamma correction for CRT2
- */
+ /* CRT1Gamma - disable gamma correction for CRT1
+ */
+ {
+ Bool val;
+ from = X_DEFAULT;
+ if(xf86GetOptValBool(pSiS->Options, OPTION_CRT1GAMMA, &val)) {
+ from = X_CONFIG;
+ pSiS->CRT1gamma = val;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "CRT1 gamma correction is %s\n",
+ pSiS->CRT1gamma ? enabledstr : disabledstr);
+ }
+
+ /* CRT2Gamma - disable gamma correction for CRT2
+ */
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
Bool val;
if(xf86GetOptValBool(pSiS->Options, OPTION_CRT2GAMMA, &val)) {
@@ -1521,22 +1304,13 @@ SiSOptions(ScrnInfoPtr pScrn)
} /* DualHead */
- /* CRT1Gamma - enable/disable gamma correction for CRT1
- */
- {
- Bool val;
- if(xf86GetOptValBool(pSiS->Options, OPTION_CRT1GAMMA, &val)) {
- pSiS->CRT1gamma = val;
- pSiS->CRT1gammaGiven = TRUE;
- }
- }
-
- /* VESA - DEPRECATED
- * This option is for forcing the driver to use
- * the VESA BIOS extension for mode switching.
- */
+ /* VESA - DEPRECATED
+ * This option is for forcing the driver to use
+ * the VESA BIOS extension for mode switching.
+ */
{
Bool val;
+
if(xf86GetOptValBool(pSiS->Options, OPTION_VESA, &val)) {
pSiS->VESA = val ? 1 : 0;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
@@ -1544,7 +1318,6 @@ SiSOptions(ScrnInfoPtr pScrn)
val ? enabledstr : disabledstr);
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"*** Option \"VESA\" is deprecated. *** \n");
- if(pSiS->VESA) pSiS->ForceCRT1Type = CRT1_VGA;
}
}
@@ -1558,10 +1331,10 @@ SiSOptions(ScrnInfoPtr pScrn)
* generated out of the known and supported modes. Use
* this option to disable this. NOT RECOMMENDED.
*/
- from = X_DEFAULT;
- if(xf86GetOptValBool(pSiS->Options, OPTION_NOINTERNALMODES, &pSiS->noInternalModes))
+ from = X_DEFAULT;
+ if(xf86GetOptValBool(pSiS->Options, OPTION_NOINTERNALMODES, &pSiS->noInternalModes))
from = X_CONFIG;
- xf86DrvMsg(pScrn->scrnIndex, from, "Usage of built-in modes is %s\n",
+ xf86DrvMsg(pScrn->scrnIndex, from, "Usage of built-in modes is %s\n",
pSiS->noInternalModes ? disabledstr : enabledstr);
}
@@ -1579,7 +1352,7 @@ SiSOptions(ScrnInfoPtr pScrn)
}
if(pSiS->ShadowFB) {
pSiS->NoAccel = TRUE;
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
pSiS->NoXvideo = TRUE;
xf86DrvMsg(pScrn->scrnIndex, from,
"Using \"Shadow Frame Buffer\" - 2D acceleration and Xv disabled\n");
@@ -1611,7 +1384,7 @@ SiSOptions(ScrnInfoPtr pScrn)
pSiS->ShadowFB = TRUE;
pSiS->NoAccel = TRUE;
pSiS->HWCursor = FALSE;
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
pSiS->NoXvideo = TRUE;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
"Rotating screen %sclockwise; (2D acceleration and Xv disabled)\n",
@@ -1632,38 +1405,10 @@ SiSOptions(ScrnInfoPtr pScrn)
}
}
-#ifdef XF86DRI
- /* DRI */
- from = X_DEFAULT;
- if(xf86GetOptValBool(pSiS->Options, OPTION_DRI, &pSiS->loadDRI)) {
- from = X_CONFIG;
- }
- xf86DrvMsg(pScrn->scrnIndex, from, "DRI %s\n",
- pSiS->loadDRI ? enabledstr : disabledstr);
-
- /* AGPSize */
- {
- int vali;
- Bool gotit = FALSE;
- if(xf86GetOptValInteger(pSiS->Options, OPTION_AGP_SIZE, &vali)) {
- gotit = TRUE;
- } else if(xf86GetOptValInteger(pSiS->Options, OPTION_AGP_SIZE2, &vali)) {
- gotit = TRUE;
- }
- if(gotit) {
- if((vali >= 8) && (vali <= 512)) {
- pSiS->agpWantedPages = (vali * 1024 * 1024) / AGP_PAGE_SIZE;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr, "AGPSize (alias GARTSize)", 8, 512);
- }
- }
- }
-#endif
-
- /* NoXVideo
- * Set this to TRUE to disable Xv hardware video acceleration
- */
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+ /* NoXVideo
+ * Set this to TRUE to disable Xv hardware video acceleration
+ */
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
if((!pSiS->NoAccel) && (!pSiS->NoXvideo)) {
#else
if(!pSiS->NoXvideo) {
@@ -1787,102 +1532,40 @@ SiSOptions(ScrnInfoPtr pScrn)
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Xv will %suse memcpy()\n",
val ? "" : "not ");
}
- /* XvGamma - enable/disable gamma correction for Xv
- * Supported for CRT1 only
- */
- if(pSiS->VGAEngine == SIS_315_VGA) {
- if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_XVGAMMA))) {
- if( (!xf86NameCmp(strptr,"off")) ||
- (!xf86NameCmp(strptr,"false")) ||
- (!xf86NameCmp(strptr,"no")) ||
- (!xf86NameCmp(strptr,"0")) ) {
- pSiS->XvGamma = FALSE;
- pSiS->XvGammaGiven = TRUE;
- } else if( (!xf86NameCmp(strptr,"on")) ||
- (!xf86NameCmp(strptr,"true")) ||
- (!xf86NameCmp(strptr,"yes")) ||
- (!xf86NameCmp(strptr,"1")) ) {
- pSiS->XvGamma = pSiS->XvGammaGiven = TRUE;
- } else {
- float val1 = 0.0, val2 = 0.0, val3 = 0.0;
- Bool valid = FALSE;
- int result = sscanf(strptr, "%f %f %f", &val1, &val2, &val3);
- if(result == 1) {
- if((val1 >= 0.1) && (val1 <= 10.0)) {
- pSiS->XvGammaGreen = pSiS->XvGammaBlue = pSiS->XvGammaRed =
- pSiS->XvGammaGreenDef = pSiS->XvGammaBlueDef = pSiS->XvGammaRedDef = (int)(val1 * 1000);
- valid = TRUE;
- }
- } else if(result == 3) {
- if((val1 >= 0.1) && (val1 <= 10.0) &&
- (val2 >= 0.1) && (val2 <= 10.0) &&
- (val3 >= 0.1) && (val3 <= 10.0)) {
- pSiS->XvGammaRed = pSiS->XvGammaRedDef = (int)(val1 * 1000);
- pSiS->XvGammaGreen = pSiS->XvGammaGreenDef = (int)(val2 * 1000);
- pSiS->XvGammaBlue = pSiS->XvGammaBlueDef = (int)(val3 * 1000);
- valid = TRUE;
- }
- }
- if(valid) {
- pSiS->XvGamma = pSiS->XvGammaGiven = TRUE;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "XvGamma expects either a boolean, or 1 or 3 real numbers (0.1 - 10.0)\n");
- }
- }
- }
- }
}
}
if((pSiS->VGAEngine == SIS_300_VGA) || (pSiS->VGAEngine == SIS_315_VGA)) {
- if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_STOREDBRI))) {
- float val1 = 0.0, val2 = 0.0, val3 = 0.0;
- Bool valid = FALSE;
- int result = sscanf(strptr, "%f %f %f", &val1, &val2, &val3);
- if(result == 1) {
- if((val1 >= 0.1) && (val1 <= 10.0)) {
- valid = TRUE;
- pSiS->GammaBriR = pSiS->GammaBriG = pSiS->GammaBriB = (int)(val1 * 1000);
- }
- } else if(result == 3) {
- if((val1 >= 0.1) && (val1 <= 10.0) &&
- (val2 >= 0.1) && (val2 <= 10.0) &&
- (val3 >= 0.1) && (val3 <= 10.0)) {
- valid = TRUE;
- pSiS->GammaBriR = (int)(val1 * 1000);
- pSiS->GammaBriG = (int)(val2 * 1000);
- pSiS->GammaBriB = (int)(val3 * 1000);
- }
- }
- if(!valid) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "StoredGammaBrightness expects 1 or 3 real numbers (0.1 - 10.0)\n");
- }
+ int tmp;
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDBRIR, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaBriR = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaBrightnessRed", 100, 10000);
}
- if((strptr = (char *)xf86GetOptValString(pSiS->Options, OPTION_STOREDPBRI))) {
- float val1 = 0.0, val2 = 0.0, val3 = 0.0;
- Bool valid = FALSE;
- int result = sscanf(strptr, "%f %f %f", &val1, &val2, &val3);
- if(result == 1) {
- if((val1 >= 0.1) && (val1 <= 10.0)) {
- valid = TRUE;
- pSiS->GammaPBriR = pSiS->GammaPBriG = pSiS->GammaPBriB = (int)(val1 * 1000);
- }
- } else if(result == 3) {
- if((val1 >= 0.1) && (val1 <= 10.0) &&
- (val2 >= 0.1) && (val2 <= 10.0) &&
- (val3 >= 0.1) && (val3 <= 10.0)) {
- valid = TRUE;
- pSiS->GammaPBriR = (int)(val1 * 1000);
- pSiS->GammaPBriG = (int)(val2 * 1000);
- pSiS->GammaPBriB = (int)(val3 * 1000);
- }
- }
- if(!valid) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "\"StoredGammaPreBrightness\" expects 1 or 3 real numbers (0.1 - 10.0)\n");
- }
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDBRIG, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaBriG = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaBrightnessGreen", 100, 10000);
+ }
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDBRIB, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaBriB = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaBrightnessBlue", 100, 10000);
+ }
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDPBRIR, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaPBriR = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaPreBrightnessRed", 100, 10000);
+ }
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDPBRIG, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaPBriG = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaPreBrightnessGreen", 100, 10000);
+ }
+ if(xf86GetOptValInteger(pSiS->Options, OPTION_STOREDPBRIB, &tmp)) {
+ if((tmp >= 100) && (tmp <= 10000)) pSiS->GammaPBriB = tmp;
+ else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, ilrangestr,
+ "StoredGammaPreBrightnessBlue", 100, 10000);
}
}
diff --git a/src/sis_regs.h b/src/sis_regs.h
index b4f29fa..a1ee303 100644
--- a/src/sis_regs.h
+++ b/src/sis_regs.h
@@ -1,38 +1,30 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_regs.h,v 1.22 2003/09/04 15:32:44 twini Exp $ */
/*
- * Register definitions for old and 300 series
+ * 2D Acceleration for SiS300, SiS540, SiS630, SiS730, SiS530, SiS620
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 1998,1999 by Alan Hourihane, Wigan, England.
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Old series register definitions
- * Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
- *
- * Authors: Thomas Winischhofer <thomas@winischhofer.net>
- * Alan Hourihane
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
*/
+
/* For general use --------------------------------------------------------------- */
@@ -72,16 +64,16 @@
outSISIDXREG(base,idx,__Temp); \
} while (0)
-#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l))
-#define GENMASK(mask) BITMASK(1?mask,0?mask)
+#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l))
+#define GENMASK(mask) BITMASK(1?mask,0?mask)
#define GETBITS(var,mask) (((var) & GENMASK(mask)) >> (0?mask))
#define SETBITS(val,mask) ((val) << (0?mask))
#define SETBIT(n) (1<<(n))
-#define GETBITSTR(val,from,to) ((GETBITS(val,from)) << (0?to))
-#define SETVARBITS(var,val,from,to) (((var)&(~(GENMASK(to)))) | \
- GETBITSTR(val,from,to))
+#define GETBITSTR(val,from,to) ((GETBITS(val,from)) << (0?to))
+#define SETVARBITS(var,val,from,to) (((var)&(~(GENMASK(to)))) | \
+ GETBITSTR(val,from,to))
#define GETVAR8(var) ((var)&0xFF)
#define SETVAR8(var,val) (var) = GETVAR8(val)
@@ -319,7 +311,7 @@
/* TW: The following registers only exist on the 315 series */
-/* TW: Bit 16:24 of Y_U_V buf start address */
+/* TW: Bit 16:24 of Y_U_V buf start address (?) */
#define Index_VI_Y_Buf_Start_Over 0x6B
#define Index_VI_U_Buf_Start_Over 0x6C
#define Index_VI_V_Buf_Start_Over 0x6D
diff --git a/src/sis_setup.c b/src/sis_setup.c
index 884e03a..150ad12 100644
--- a/src/sis_setup.c
+++ b/src/sis_setup.c
@@ -1,34 +1,28 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_setup.c,v 1.18 2003/08/27 23:32:50 twini Exp $ */
/*
* Basic hardware and memory detection
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
- *
- * Ideas and methods for old series based on code by Can-Ru Yeou, SiS Inc.
+ * Author: Thomas Winischhofer <thomas@winischhofer.net>
*
*/
@@ -64,8 +58,8 @@ static const char *dramTypeStr[] = {
"SDR SDRAM",
"SGRAM",
"ESDRAM",
- "DDR SDRAM", /* for 550/650/etc */
- "DDR SDRAM", /* for 550/650/etc */
+ "DDR SDRAM", /* for 550/650 */
+ "DDR SDRAM", /* for 550/650 */
"VCM" /* for 630 */
"" };
@@ -116,7 +110,7 @@ sisOldSetup(ScrnInfoPtr pScrn)
int ramtype[4] = { 5, 0, 1, 3 };
int config;
int temp, i;
- unsigned char sr23, sr33, sr37;
+ unsigned char sr23, sr33, sr34, sr37;
#if 0
unsigned char newsr13, newsr28, newsr29;
#endif
@@ -199,6 +193,7 @@ sisOldSetup(ScrnInfoPtr pScrn)
if(pSiS->oldChipset >= OC_SIS82204) {
inSISIDXREG(SISSR, 0x23, sr23);
inSISIDXREG(SISSR, 0x33, sr33);
+ inSISIDXREG(SISSR, 0x34, sr34);
if(pSiS->oldChipset >= OC_SIS530A) sr33 &= ~0x08;
if(sr33 & 0x09) { /* 5597: Sync DRAM timing | One cycle EDO ram; */
pSiS->Flags |= (sr33 & SYNCDRAM); /* 6326: Enable SGRam timing | One cycle EDO ram */
@@ -272,7 +267,7 @@ sis300Setup(ScrnInfoPtr pScrn)
unsigned int config, pciconfig, sr3a, ramtype;
unsigned char temp;
int cpubuswidth;
- MessageType from = X_PROBED;
+ int from = X_PROBED;
pSiS->MemClock = SiSMclk(pSiS);
@@ -464,7 +459,7 @@ sis315Setup(ScrnInfoPtr pScrn)
pSiS->BusWidth);
}
-/* For 550, 65x, 740, 661, 741, 660, 760 */
+/* For 550, 65x, 74x, 660 */
static void
sis550Setup(ScrnInfoPtr pScrn)
{
@@ -479,82 +474,27 @@ sis550Setup(ScrnInfoPtr pScrn)
if(pSiS->Chipset == PCI_CHIP_SIS660) {
- if(pSiS->sishw_ext.jChipType >= SIS_660) {
-
- /* UMA - shared fb */
- pSiS->ChipFlags &= ~SiSCF_760UMA;
- pciconfig = pciReadByte(0x00000000, 0x4c);
- if(pciconfig & 0xe0) {
- pScrn->videoRam = ((1 << (pciconfig & 0xe0) >> 5) - 2) * 32768;
- pSiS->ChipFlags |= SiSCF_760UMA;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "%dK shared video RAM\n",
- pScrn->videoRam);
- } else pScrn->videoRam = 0;
-
- /* LFB - local framebuffer */
- pciconfig = (pciReadByte(0x00000800, 0xcd) >> 1) & 0x03;
- if(pciconfig == 0x01) pScrn->videoRam += 32768;
- else if(pciconfig == 0x03) pScrn->videoRam += 65536;
-
- if((pScrn->videoRam < 32768) || (pScrn->videoRam > 131072)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal video Ram size (%d) detected, using BIOS setting\n",
- pScrn->videoRam);
- } else {
- pSiS->BusWidth = 64;
- ramtype = 8;
- alldone = TRUE;
- }
+ /* TODO - this is entirely guessed */
- } else {
-
- int dimmnum, maxmem;
-
- if(pSiS->sishw_ext.jChipType == SIS_741) {
- dimmnum = 4;
- maxmem = 131072;
- } else { /* 661 */
- dimmnum = 3;
- maxmem = 65536;
- }
-
- pciconfig = pciReadByte(0x00000000, 0x64);
- if(pciconfig & 0x80) {
- pScrn->videoRam = (1 << (((pciconfig & 0x70) >> 4) - 1)) * 32768;
- if((pScrn->videoRam < 32768) || (pScrn->videoRam > maxmem)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
- "Illegal video RAM size (%d) detected, using BIOS setting\n",
- pScrn->videoRam);
+ pciconfig = pciReadByte(0x00000000, 0x64);
+ if(pciconfig & 0x80) {
+ pScrn->videoRam = (1 << (((pciconfig & 0x70) >> 4) + 22)) / 1024;
+ pSiS->BusWidth = 64;
+ for(i=0; i<=3; i++) {
+ if(pciconfig & (1 << i)) {
+ temp = pciReadByte(0x00000000, 0x60 + i);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "DIMM%d is %s SDRAM\n",
+ i, (temp & 0x40) ? "DDR" : "SDR");
} else {
- pSiS->BusWidth = 64;
- for(i=0; i<=(dimmnum - 1); i++) {
- if(pciconfig & (1 << i)) {
- temp = pciReadByte(0x00000000, 0x60 + i);
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "DIMM%d is %s SDRAM\n",
- i, (temp & 0x40) ? "DDR" : "SDR");
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "DIMM%d is not installed\n", i);
- }
- }
- pciconfig = pciReadByte(0x00000000, 0x7c);
- if(pciconfig & 0x02) ramtype = 8;
- else ramtype = 4;
- if(pSiS->sishw_ext.jChipType == SIS_741) {
- /* Is this really correct? */
- ramtype = 12 - ramtype;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "SiS741 PCI RamType %d\n", ramtype);
- /* For now, we don't trust it */
- inSISIDXREG(SISSR, 0x79, config);
- ramtype = (config & 0x01) ? 8 : 4;
- }
- alldone = TRUE;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "DIMM%d is not installed\n", i);
}
- }
-
+ }
+ pciconfig = pciReadByte(0x00000000, 0x7c);
+ if(pciconfig & 0x02) ramtype = 8;
+ else ramtype = 4;
+ alldone = TRUE;
}
} else if(pSiS->Chipset == PCI_CHIP_SIS650) {
@@ -597,37 +537,16 @@ sis550Setup(ScrnInfoPtr pScrn)
}
if(!alldone) {
-
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- inSISIDXREG(SISCR, 0x79, config);
- pSiS->BusWidth = (config & 0x04) ? 128 : 64;
- ramtype = (config & 0x01) ? 8 : 4;
- if(pSiS->sishw_ext.jChipType >= SIS_660) {
- pScrn->videoRam = 0;
- if(config & 0xf0) {
- pScrn->videoRam = (1 << ((config & 0xf0) >> 4)) * 1024;
- }
- inSISIDXREG(SISCR, 0x78, config);
- config &= 0x30;
- if(config) {
- if(config == 0x10) pScrn->videoRam += 32768;
- else pScrn->videoRam += 65536;
- }
- } else {
- pScrn->videoRam = (1 << ((config & 0xf0) >> 4)) * 1024;
- }
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Shared Memory Area is disabled - awaiting doom\n");
+ inSISIDXREG(SISSR, 0x14, config);
+ pScrn->videoRam = (((config & 0x3F) + 1) * 4) * 1024;
+ if(pSiS->Chipset == PCI_CHIP_SIS650) {
+ ramtype = (((config & 0x80) >> 7) << 2) + 4;
+ pSiS->BusWidth = 64; /* (config & 0x40) ? 128 : 64; */
} else {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "Shared Memory Area is disabled - awaiting doom\n");
- inSISIDXREG(SISSR, 0x14, config);
- pScrn->videoRam = (((config & 0x3F) + 1) * 4) * 1024;
- if(pSiS->Chipset == PCI_CHIP_SIS650) {
- ramtype = (((config & 0x80) >> 7) << 2) + 4;
- pSiS->BusWidth = 64; /* (config & 0x40) ? 128 : 64; */
- } else {
- ramtype = 4;
- pSiS->BusWidth = 64;
- }
+ ramtype = 4;
+ pSiS->BusWidth = 64;
}
}
@@ -643,7 +562,7 @@ sis550Setup(ScrnInfoPtr pScrn)
"DRAM bus width: %d bit\n",
pSiS->BusWidth);
- /* DDR -> Mclk * 2 - needed for bandwidth calculation */
+ /* TW: DDR -> Mclk * 2 - needed for bandwidth calculation */
if(ramtype == 8) pSiS->MemClock *= 2;
}
@@ -669,7 +588,7 @@ SiSSetup(ScrnInfoPtr pScrn)
break;
case PCI_CHIP_SIS550:
case PCI_CHIP_SIS650: /* + 740 */
- case PCI_CHIP_SIS660: /* + 661,741,760 */
+ case PCI_CHIP_SIS660: /* + 760 */
sis550Setup(pScrn);
break;
case PCI_CHIP_SIS5597:
diff --git a/src/sis_shadow.c b/src/sis_shadow.c
index e2c4a11..0e206b7 100644
--- a/src/sis_shadow.c
+++ b/src/sis_shadow.c
@@ -1,30 +1,28 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_shadow.c,v 1.7 2003/05/21 15:15:04 twini Exp $ */
/*
- * Copyright (C) 1999-2004 by The XFree86 Project, Inc.
- * based on code written by Mark Vojkovich
- *
- * Licensed under the following terms:
+ * Copyright (c) 1999, The XFree86 Project Inc.
+ * based on code written by Mark Vojkovich <markv@valinux.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appears in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * and that the name of the copyright holder not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. The copyright holder makes no representations
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
* about the suitability of this software for any purpose. It is provided
- * "as is" without expressed or implied warranty.
+ * "as is" without express or implied warranty.
*
* THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
- * TW: This module doesn't use CurrentLayout, because it is never
- * active when DGA is active and vice versa.
+ * TW: This module doesn't use CurrentLayout, because it is never
+ * active when DGA is active and vice versa.
*/
#include "xf86.h"
diff --git a/src/sis_vb.c b/src/sis_vb.c
index c2f578d..319df6a 100644
--- a/src/sis_vb.c
+++ b/src/sis_vb.c
@@ -1,30 +1,26 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vb.c,v 1.19 2003/09/05 09:38:37 twini Exp $ */
/*
* Video bridge detection and configuration for 300, 315 and 330 series
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
* Author: Thomas Winischhofer <thomas@winischhofer.net>
*
@@ -40,8 +36,7 @@
#include "sis_vb.h"
#include "sis_dac.h"
-extern void SISWaitRetraceCRT1(ScrnInfoPtr pScrn);
-extern unsigned char SiS_GetSetBIOSScratch(ScrnInfoPtr pScrn, USHORT offset, unsigned char value);
+extern void SISWaitRetraceCRT1(ScrnInfoPtr pScrn);
static const SiS_LCD_StStruct SiS300_LCD_Type[]=
{
@@ -83,47 +78,32 @@ static const SiS_LCD_StStruct SiS315_LCD_Type[]=
{ VB_LCD_CUSTOM, 0, 0, LCD_CUSTOM, } /* f */
};
-static const SiS_LCD_StStruct SiS661_LCD_Type[]=
-{
- { VB_LCD_1024x768, 1024, 768, LCD_1024x768 }, /* 0 - invalid */
- { VB_LCD_800x600, 800, 600, LCD_800x600 }, /* 1 */
- { VB_LCD_1024x768, 1024, 768, LCD_1024x768 }, /* 2 */
- { VB_LCD_1280x1024,1280, 1024, LCD_1280x1024 }, /* 3 */
- { VB_LCD_640x480, 640, 480, LCD_640x480 }, /* 4 */
- { VB_LCD_1024x600, 1024, 600, LCD_1024x600 }, /* 5 */
- { VB_LCD_1152x864, 1152, 864, LCD_1152x864 }, /* 6 */
- { VB_LCD_1280x960, 1280, 960, LCD_1280x960 }, /* 7 */
- { VB_LCD_1152x768, 1152, 768, LCD_1152x768 }, /* 8 */
- { VB_LCD_1400x1050,1400, 1050, LCD_1400x1050 }, /* 9 */
- { VB_LCD_1280x768, 1280, 768, LCD_1280x768 }, /* a */
- { VB_LCD_1600x1200,1600, 1200, LCD_1600x1200 }, /* b */
- { VB_LCD_1280x800, 1280, 800, LCD_1280x800 }, /* c */
- { VB_LCD_1680x1050,1680, 1050, LCD_1680x1050 }, /* d */
- { VB_LCD_1280x720, 1280, 720, LCD_1280x720 }, /* e */
- { VB_LCD_CUSTOM, 0, 0, LCD_CUSTOM, } /* f */
-};
-
static Bool
-TestDDC1(ScrnInfoPtr pScrn)
+SISTestMonitorType(ScrnInfoPtr pScrn, int r, int g, int b)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned short old;
- int count = 48;
-
- old = SiS_ReadDDC1Bit(pSiS->SiS_Pr);
- do {
- if(old != SiS_ReadDDC1Bit(pSiS->SiS_Pr)) break;
- } while(count--);
- return (count == -1) ? FALSE : TRUE;
+ unsigned short testval = (r * 77) + (g * 151) + (b * 28);
+
+ if((testval & 0xff) > 0x80) testval += 0x100;
+ testval >>= 8;
+
+ outSISREG(SISCOLIDX,0x00);
+ outSISREG(SISCOLDATA,testval);
+ outSISREG(SISCOLDATA,testval);
+ outSISREG(SISCOLDATA,testval);
+
+ while(!(inSISREG(SISINPSTAT) & 0x01)) {}
+ while(inSISREG(SISINPSTAT) & 0x01) {}
+
+ return((inSISREG(SISMISCW) & 0x10) ? TRUE : FALSE);
}
static int
-SiS_SISDetectCRT1(ScrnInfoPtr pScrn)
+SISDetectCRT1(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned short temp = 0xffff;
- unsigned char SR1F, CR63=0, CR17;
- int i, ret = 0;
+ unsigned char SR1F,CR63=0,CR17,pel;
+ int i, ret=0;
Bool mustwait = FALSE;
inSISIDXREG(SISSR,0x1F,SR1F);
@@ -132,9 +112,9 @@ SiS_SISDetectCRT1(ScrnInfoPtr pScrn)
if(SR1F & 0xc0) mustwait = TRUE;
if(pSiS->VGAEngine == SIS_315_VGA) {
- inSISIDXREG(SISCR,pSiS->myCR63,CR63);
+ inSISIDXREG(SISCR,0x63,CR63);
CR63 &= 0x40;
- andSISIDXREG(SISCR,pSiS->myCR63,0xBF);
+ andSISIDXREG(SISCR,0x63,0xBF);
}
inSISIDXREG(SISCR,0x17,CR17);
@@ -150,28 +130,34 @@ SiS_SISDetectCRT1(ScrnInfoPtr pScrn)
for(i=0; i < 10; i++) SISWaitRetraceCRT1(pScrn);
}
- i = 3;
- do {
- temp = SiS_HandleDDC(pSiS->SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 0, 0, NULL);
- } while(((temp == 0) || (temp == 0xffff)) && i--);
+ pel = inSISREG(SISPEL);
+ outSISREG(SISPEL,0xff);
- if((temp == 0) || (temp == 0xffff)) {
- if(TestDDC1(pScrn)) temp = 1;
+ outSISREG(SISCOLIDX,0x00);
+ for(i = 0; i < (256 * 3); i++) {
+ outSISREG(SISCOLDATA,0x00);
}
- if((temp) && (temp != 0xffff)) {
- orSISIDXREG(SISCR,0x32,0x20);
- ret = 1;
- }
+ SISWaitRetraceCRT1(pScrn);
+ SISWaitRetraceCRT1(pScrn);
+
+ if(SISTestMonitorType(pScrn, 0x0f, 0x0f, 0x0f)) ret |= 1;
+ if(SISTestMonitorType(pScrn, 0x0f, 0x0f, 0x0f)) ret |= 1;
+
+ SISTestMonitorType(pScrn, 0x00, 0x00, 0x00);
+
+ outSISREG(SISPEL,pel);
if(pSiS->VGAEngine == SIS_315_VGA) {
- setSISIDXREG(SISCR,pSiS->myCR63,0xBF,CR63);
+ setSISIDXREG(SISCR,0x63,0xBF,CR63);
}
setSISIDXREG(SISCR,0x17,0x7F,CR17);
outSISIDXREG(SISSR,0x1F,SR1F);
+ if(ret) orSISIDXREG(SISCR,0x32,0x20);
+
return ret;
}
@@ -184,49 +170,49 @@ void SISCRT1PreInit(ScrnInfoPtr pScrn)
unsigned char OtherDevices = 0;
if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) {
- pSiS->CRT1off = 0;
- return;
+ pSiS->CRT1off = 0;
+ return;
}
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- pSiS->CRT1off = 0;
- return;
+ pSiS->CRT1off = 0;
+ return;
}
#endif
#ifdef SISMERGED
- if((pSiS->MergedFB) && (!(pSiS->MergedFBAuto))) {
- pSiS->CRT1off = 0;
- return;
+ if(pSiS->MergedFB) {
+ pSiS->CRT1off = 0;
+ return;
}
#endif
inSISIDXREG(SISCR, 0x32, CR32);
if(CR32 & 0x20) CRT1Detected = 1;
- else CRT1Detected = SiS_SISDetectCRT1(pScrn);
+ else CRT1Detected = SISDetectCRT1(pScrn);
if(CR32 & 0x5F) OtherDevices = 1;
if(pSiS->CRT1off == -1) {
if(!CRT1Detected) {
- /* No CRT1 detected. */
+ /* BIOS detected no CRT1. */
/* If other devices exist, switch it off */
if(OtherDevices) pSiS->CRT1off = 1;
else pSiS->CRT1off = 0;
} else {
- /* CRT1 detected, leave/switch it on */
+ /* BIOS detected CRT1, leave/switch it on */
pSiS->CRT1off = 0;
}
}
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "%sCRT1 (VGA) connection detected\n",
+ "%sCRT1 connection detected\n",
CRT1Detected ? "" : "No ");
}
@@ -234,34 +220,27 @@ void SISCRT1PreInit(ScrnInfoPtr pScrn)
void SISLCDPreInit(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned char CR32, CR36, CR37, CR7D=0, tmp;
+ unsigned char CR32, CR36, CR37;
- pSiS->LCDwidth = 0;
-
- if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return;
+ if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) {
+ return;
+ }
inSISIDXREG(SISCR, 0x32, CR32);
if(CR32 & 0x08) pSiS->VBFlags |= CRT2_LCD;
- /* If no panel has been detected by the BIOS during booting,
- * we try to detect it ourselves at this point. We do that
- * if forcecrt2redetection was given, too.
- * This is useful on machines with DVI connectors where the
- * panel was connected after booting. This is only supported
- * on the 315/330 series and the 301/30xB/C bridge (because the
- * 30xLV don't seem to have a DDC port and operate only LVDS
- * panels which mostly don't support DDC). We only do this if
- * there was no secondary VGA detected by the BIOS, because LCD
- * and VGA2 share the same DDC channel and might be misdetected
- * as the wrong type (especially if the LCD panel only supports
+ /* TW: If no panel has been detected by the BIOS during booting,
+ * we try to detect it ourselves at this point. This is useful
+ * on machines with DVI connectors where the panel was
+ * connected after booting. This is only supported on the
+ * 315/330 series and the 301/30xB bridge (because the 30xLV/LVX
+ * don't seem to have a DDC port and operates only LVDS panels
+ * which mostly don't support DDC). We only do this if there was no
+ * secondary VGA detected by the BIOS, because LCD and VGA2
+ * share the same DDC channel and might be misdetected as the
+ * wrong type (especially if the LCD panel only supports
* EDID Version 1).
- *
- * By default, CRT2 redetection is forced since 12/09/2003, as
- * I encountered numerous panels which deliver more or less
- * bogus DDC data confusing the BIOS. Since our DDC detection
- * is waaaay better, we prefer it instead of the primitive
- * and buggy BIOS method.
*/
#ifdef SISDUALHEAD
if((!pSiS->DualHeadMode) || (!pSiS->SecondHead)) {
@@ -277,7 +256,7 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
if(!(pSiS->nocrt2ddcdetection)) {
if((!(pSiS->VBFlags & CRT2_LCD)) && (!(CR32 & 0x10))) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "%s LCD/plasma panel, sensing via DDC\n",
+ "%s LCD/Plasma panel, sensing via DDC\n",
pSiS->forcecrt2redetection ?
"Forced re-detection of" : "BIOS detected no");
if(SiS_SenseLCDDDC(pSiS->SiS_Pr, pSiS)) {
@@ -290,7 +269,7 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
pSiS->postVBCR32 |= 0x08;
} else {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "No LCD/plasma panel detected\n");
+ "No LCD/Plasma panel detected\n");
}
}
}
@@ -304,7 +283,6 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
if(pSiS->VBFlags & CRT2_LCD) {
inSISIDXREG(SISCR, 0x36, CR36);
inSISIDXREG(SISCR, 0x37, CR37);
- inSISIDXREG(SISCR, 0x7D, CR7D);
if(pSiS->SiS_Pr->SiS_CustomT == CUT_BARCO1366) {
pSiS->VBLCDFlags |= VB_LCD_BARCO1366;
pSiS->LCDwidth = 1360;
@@ -321,11 +299,12 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
pSiS->LCDwidth = pSiS->SiS_Pr->CP_MaxX = 848;
pSiS->LCDheight = pSiS->SiS_Pr->CP_MaxY = 480;
pSiS->VBLCDFlags |= VB_LCD_EXPANDING;
+ pSiS->sishw_ext.ulCRT2LCDType = LCD_848x480;
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
"Assuming LCD/plasma panel (848x480, expanding, RGB24)\n");
} else {
if((pSiS->VGAEngine == SIS_315_VGA) && (!CR36)) {
- /* Old 650/301LV BIOS version "forgot" to set CR36, CR37 */
+ /* TW: Old 650/301LV BIOS version "forgot" to set CR36, CR37 */
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"BIOS-provided LCD information invalid, probing myself...\n");
if(pSiS->VBFlags & VB_LVDS) pSiS->SiS_Pr->SiS_IF_DEF_LVDS = 1;
@@ -338,6 +317,7 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
pSiS->VBLCDFlags |= VB_LCD_CUSTOM;
pSiS->LCDheight = pSiS->SiS_Pr->CP_MaxY;
pSiS->LCDwidth = pSiS->SiS_Pr->CP_MaxX;
+ pSiS->sishw_ext.ulCRT2LCDType = LCD_CUSTOM;
if(CR37 & 0x10) pSiS->VBLCDFlags |= VB_LCD_EXPANDING;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"Detected non-standard LCD/Plasma panel (max. X %d Y %d, preferred %dx%d, RGB%d)\n",
@@ -349,51 +329,37 @@ void SISLCDPreInit(ScrnInfoPtr pScrn)
pSiS->VBLCDFlags |= SiS300_LCD_Type[(CR36 & 0x0f)].VBLCD_lcdflag;
pSiS->LCDheight = SiS300_LCD_Type[(CR36 & 0x0f)].LCDheight;
pSiS->LCDwidth = SiS300_LCD_Type[(CR36 & 0x0f)].LCDwidth;
+ pSiS->sishw_ext.ulCRT2LCDType = SiS300_LCD_Type[(CR36 & 0x0f)].LCDtype;
if(CR37 & 0x10) pSiS->VBLCDFlags |= VB_LCD_EXPANDING;
- } else if((pSiS->sishw_ext.jChipType >= SIS_661) || (pSiS->ROM661New)) {
- pSiS->VBLCDFlags |= SiS661_LCD_Type[(CR36 & 0x0f)].VBLCD_lcdflag;
- pSiS->LCDheight = SiS661_LCD_Type[(CR36 & 0x0f)].LCDheight;
- pSiS->LCDwidth = SiS661_LCD_Type[(CR36 & 0x0f)].LCDwidth;
- if(CR37 & 0x10) pSiS->VBLCDFlags |= VB_LCD_EXPANDING;
- if(pSiS->sishw_ext.jChipType < SIS_661) {
- if(!(pSiS->SiS_Pr->PanelSelfDetected)) {
- inSISIDXREG(SISCR,0x35,tmp);
- CR37 &= 0xfc;
- CR37 |= (tmp & 0x01);
- }
- }
- } else {
+ } else {
pSiS->VBLCDFlags |= SiS315_LCD_Type[(CR36 & 0x0f)].VBLCD_lcdflag;
pSiS->LCDheight = SiS315_LCD_Type[(CR36 & 0x0f)].LCDheight;
pSiS->LCDwidth = SiS315_LCD_Type[(CR36 & 0x0f)].LCDwidth;
+ pSiS->sishw_ext.ulCRT2LCDType = SiS315_LCD_Type[(CR36 & 0x0f)].LCDtype;
if(CR37 & 0x10) pSiS->VBLCDFlags |= VB_LCD_EXPANDING;
}
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected LCD/plasma panel (%dx%d, %d, %sexp., RGB%d [%02x%02x%02x])\n",
+ "Detected LCD/Plasma panel (%dx%d, type %d, %sexpanding, RGB%d)\n",
pSiS->LCDwidth, pSiS->LCDheight,
- ((pSiS->VGAEngine == SIS_315_VGA) &&
- (pSiS->Chipset != PCI_CHIP_SIS660)) ?
- ((CR36 & 0x0f) - 1) : ((CR36 & 0xf0) >> 4),
+ (pSiS->VGAEngine == SIS_315_VGA) ? ((CR36 & 0x0f) - 1) : ((CR36 & 0xf0) >> 4),
(CR37 & 0x10) ? "" : "non-",
- (CR37 & 0x01) ? 18 : 24,
- CR36, CR37, CR7D);
+ (CR37 & 0x01) ? 18 : 24);
}
}
}
-
}
/* Detect CRT2-TV connector type and PAL/NTSC flag */
void SISTVPreInit(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned char SR16, SR38, CR32, CR35=0, CR38=0, CR79, CR39;
+ unsigned char SR16, SR38, CR32, CR38=0, CR79;
int temp = 0;
- if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return;
+ if(!(pSiS->VBFlags & VB_VIDEOBRIDGE))
+ return;
inSISIDXREG(SISCR, 0x32, CR32);
- inSISIDXREG(SISCR, 0x35, CR35);
inSISIDXREG(SISSR, 0x16, SR16);
inSISIDXREG(SISSR, 0x38, SR38);
switch(pSiS->VGAEngine) {
@@ -414,64 +380,27 @@ void SISTVPreInit(ScrnInfoPtr pScrn)
CR32, SR16, SR38);
#endif
- if(CR32 & 0x47) pSiS->VBFlags |= CRT2_TV;
-
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR) {
- if(CR32 & 0x80) pSiS->VBFlags |= CRT2_TV;
- } else {
- CR32 &= 0x7f;
- }
+ if(CR32 & 0x47)
+ pSiS->VBFlags |= CRT2_TV;
- if(CR32 & 0x01)
- pSiS->VBFlags |= TV_AVIDEO;
+ if(CR32 & 0x04)
+ pSiS->VBFlags |= TV_SCART;
else if(CR32 & 0x02)
pSiS->VBFlags |= TV_SVIDEO;
- else if(CR32 & 0x04)
- pSiS->VBFlags |= TV_SCART;
- else if((CR32 & 0x40) && (pSiS->SiS_SD_Flags & SiS_SD_SUPPORTHIVISION))
- pSiS->VBFlags |= (TV_HIVISION | TV_PAL);
- else if((CR32 & 0x80) && (pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR)) {
- pSiS->VBFlags |= TV_YPBPR;
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- if(CR38 & 0x04) {
- switch(CR35 & 0xE0) {
- case 0x20: pSiS->VBFlags |= TV_YPBPR525P; break;
- case 0x40: pSiS->VBFlags |= TV_YPBPR750P; break;
- case 0x60: pSiS->VBFlags |= TV_YPBPR1080I; break;
- default: pSiS->VBFlags |= TV_YPBPR525I;
- }
- } else pSiS->VBFlags |= TV_YPBPR525I;
- inSISIDXREG(SISCR,0x39,CR39);
- CR39 &= 0x03;
- if(CR39 == 0x00) pSiS->VBFlags |= TV_YPBPR43LB;
- else if(CR39 == 0x01) pSiS->VBFlags |= TV_YPBPR43;
- else if(CR39 == 0x02) pSiS->VBFlags |= TV_YPBPR169;
- else pSiS->VBFlags |= TV_YPBPR43;
- } else if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPR) {
- if(CR38 & 0x08) {
- switch(CR38 & 0x30) {
- case 0x10: pSiS->VBFlags |= TV_YPBPR525P; break;
- case 0x20: pSiS->VBFlags |= TV_YPBPR750P; break;
- case 0x30: pSiS->VBFlags |= TV_YPBPR1080I; break;
- default: pSiS->VBFlags |= TV_YPBPR525I;
- }
- } else pSiS->VBFlags |= TV_YPBPR525I;
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTYPBPRAR) {
- inSISIDXREG(SISCR,0x3B,CR39);
- CR39 &= 0x03;
- if(CR39 == 0x00) pSiS->VBFlags |= TV_YPBPR43LB;
- else if(CR39 == 0x01) pSiS->VBFlags |= TV_YPBPR169;
- else if(CR39 == 0x03) pSiS->VBFlags |= TV_YPBPR43;
- }
- }
- } else if((CR38 & 0x04) && (pSiS->VBFlags & VB_CHRONTEL))
+ else if(CR32 & 0x01)
+ pSiS->VBFlags |= TV_AVIDEO;
+ else if(CR32 & 0x40)
+ pSiS->VBFlags |= (TV_SVIDEO | TV_HIVISION);
+ else if((CR38 & 0x04) && (pSiS->VBFlags & (VB_301LV | VB_302LV)))
+ pSiS->VBFlags |= TV_HIVISION_LV;
+ else if((CR38 & 0x04) && (pSiS->VBFlags & VB_CHRONTEL))
pSiS->VBFlags |= (TV_CHSCART | TV_PAL);
else if((CR38 & 0x08) && (pSiS->VBFlags & VB_CHRONTEL))
- pSiS->VBFlags |= (TV_CHYPBPR525I | TV_NTSC);
-
- if(pSiS->VBFlags & (TV_SCART | TV_SVIDEO | TV_AVIDEO)) {
+ pSiS->VBFlags |= (TV_CHHDTV | TV_NTSC);
+
+ if(pSiS->VBFlags & (TV_SCART | TV_SVIDEO | TV_AVIDEO | TV_HIVISION | TV_HIVISION_LV)) {
if(pSiS->VGAEngine == SIS_300_VGA) {
- /* Should be SR38, but this does not work. */
+ /* TW: Should be SR38, but this does not work. */
if(SR16 & 0x20)
pSiS->VBFlags |= TV_PAL;
else
@@ -488,7 +417,7 @@ void SISTVPreInit(ScrnInfoPtr pScrn)
else if(CR38 & 0x80) pSiS->VBFlags |= TV_PALN;
} else
pSiS->VBFlags |= TV_NTSC;
- } else if(pSiS->Chipset == PCI_CHIP_SIS650) {
+ } else if((pSiS->Chipset == PCI_CHIP_SIS650) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
inSISIDXREG(SISCR, 0x79, CR79);
if(CR79 & 0x20) {
pSiS->VBFlags |= TV_PAL;
@@ -496,15 +425,6 @@ void SISTVPreInit(ScrnInfoPtr pScrn)
else if(CR38 & 0x80) pSiS->VBFlags |= TV_PALN;
} else
pSiS->VBFlags |= TV_NTSC;
- } else if(pSiS->Chipset == PCI_CHIP_SIS660) {
- if(SR38 & 0x01) {
- pSiS->VBFlags |= TV_PAL;
- if(CR35 & 0x04) pSiS->VBFlags |= TV_PALM;
- else if(CR35 & 0x08) pSiS->VBFlags |= TV_PALN;
- } else {
- pSiS->VBFlags |= TV_NTSC;
- if(CR35 & 0x02) pSiS->VBFlags |= TV_NTSCJ;
- }
} else { /* 315, 330 */
if(SR38 & 0x01) {
pSiS->VBFlags |= TV_PAL;
@@ -514,29 +434,15 @@ void SISTVPreInit(ScrnInfoPtr pScrn)
pSiS->VBFlags |= TV_NTSC;
}
}
-
- if(pSiS->VBFlags & (TV_SCART|TV_SVIDEO|TV_AVIDEO)) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected default TV standard %s\n",
- (pSiS->VBFlags & TV_NTSC) ?
- ((pSiS->VBFlags & TV_NTSCJ) ? "NTSCJ" : "NTSC") :
- ((pSiS->VBFlags & TV_PALM) ? "PALM" :
- ((pSiS->VBFlags & TV_PALN) ? "PALN" : "PAL")));
- }
-
- if(pSiS->VBFlags & TV_HIVISION) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "BIOS reports HiVision TV\n");
- }
-
- if((pSiS->VBFlags & VB_CHRONTEL) && (pSiS->VBFlags & (TV_CHSCART|TV_CHYPBPR525I))) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Chrontel: %s forced\n",
- (pSiS->VBFlags & TV_CHSCART) ? "SCART (PAL)" : "YPbPr (480i)");
- }
-
- if(pSiS->VBFlags & TV_YPBPR) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected YPbPr TV (by default %s)\n",
- (pSiS->VBFlags & TV_YPBPR525I) ? "480i" :
- ((pSiS->VBFlags & TV_YPBPR525P) ? "480p" :
- ((pSiS->VBFlags & TV_YPBPR750P) ? "720p" : "1080i")));
+
+ if(pSiS->VBFlags & (TV_SCART | TV_SVIDEO | TV_AVIDEO | TV_HIVISION | TV_HIVISION_LV | TV_CHSCART | TV_CHHDTV)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "%sTV standard %s\n",
+ (pSiS->VBFlags & (TV_CHSCART | TV_CHHDTV)) ? "Using " : "Detected default ",
+ (pSiS->VBFlags & TV_NTSC) ?
+ ((pSiS->VBFlags & TV_CHHDTV) ? "480i HDTV" : "NTSC") :
+ ((pSiS->VBFlags & TV_PALM) ? "PALM" :
+ ((pSiS->VBFlags & TV_PALN) ? "PALN" : "PAL")));
}
}
@@ -546,11 +452,12 @@ void SISCRT2PreInit(ScrnInfoPtr pScrn)
SISPtr pSiS = SISPTR(pScrn);
unsigned char CR32;
- if(!(pSiS->VBFlags & VB_VIDEOBRIDGE)) return;
+ if(!(pSiS->VBFlags & VB_VIDEOBRIDGE))
+ return;
/* CRT2-VGA not supported on LVDS and 30xLV */
- if(pSiS->VBFlags & (VB_LVDS|VB_301LV|VB_302LV|VB_302ELV))
- return;
+ if(pSiS->VBFlags & (VB_LVDS|VB_301LV|VB_302LV))
+ return;
inSISIDXREG(SISCR, 0x32, CR32);
@@ -577,7 +484,7 @@ void SISCRT2PreInit(ScrnInfoPtr pScrn)
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"%s secondary VGA, sensing via DDC\n",
pSiS->forcecrt2redetection ?
- "Forced re-detection of" : "BIOS detected no");
+ "Forced redetection of" : "BIOS detected no");
if(SiS_SenseVGA2DDC(pSiS->SiS_Pr, pSiS)) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"DDC error during secondary VGA detection\n");
@@ -596,9 +503,8 @@ void SISCRT2PreInit(ScrnInfoPtr pScrn)
}
}
}
-#ifdef SISDUALHEAD
+
}
-#endif
}
diff --git a/src/sis_vga.c b/src/sis_vga.c
index 9ce8b78..0e0ce37 100644
--- a/src/sis_vga.c
+++ b/src/sis_vga.c
@@ -1,36 +1,33 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_vga.c,v 1.28 2003/09/04 15:32:45 twini Exp $ */
/*
* Mode setup and basic video bridge detection
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 2001, 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Init() function for old series (except for TV and FIFO calculation) based
+ * on code which was Copyright 1998,1999 by Alan Hourihane, Wigan, England.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Authors: Thomas Winischhofer <thomas@winischhofer.net>
+ * ...
*
- * Init() function for old series (except for TV and FIFO calculation)
- * previously based on code which is Copyright (C) 1998,1999 by Alan
- * Hourihane, Wigan, England
*/
#include "xf86.h"
@@ -44,13 +41,18 @@
#include "sis_regs.h"
#include "sis_dac.h"
+#if 0
+#define TV6326TEST
+#endif
+
static Bool SISInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
static Bool SIS300Init(ScrnInfoPtr pScrn, DisplayModePtr mode);
-static int SISDoSense(ScrnInfoPtr pScrn, unsigned short type, unsigned short test);
-static void SISSense30x(ScrnInfoPtr pScrn);
-static int SIS6326DoSense(ScrnInfoPtr pScrn, int tempbh, int tempbl, int tempch, int tempcl);
-static void SISSense6326(ScrnInfoPtr pScrn);
-static void SiS6326TVDelay(ScrnInfoPtr pScrn, int delay);
+/* To be used internally only */
+int SISDoSense(ScrnInfoPtr pScrn, int tempbl, int tempbh, int tempcl, int tempch);
+void SISSense30x(ScrnInfoPtr pScrn);
+int SIS6326DoSense(ScrnInfoPtr pScrn, int tempbh, int tempbl, int tempch, int tempcl);
+void SISSense6326(ScrnInfoPtr pScrn);
+static void SiS6326TVDelay(ScrnInfoPtr pScrn, int delay);
const CARD8 SiS6326TVRegs1[14] = {
0x00,0x01,0x02,0x03,0x04,0x11,0x12,0x13,0x21,0x26,0x27,0x3a,0x3c,0x43
@@ -65,6 +67,17 @@ const CARD8 SiS6326TVRegs1_NTSC[6][14] = {
{0x83,0x5d,0x21,0xbe,0x75,0x03,0x00,0x09,0x08,0x42,0x10,0x4d,0x61,0x79} /* 640x480u */
};
+#ifdef TV6326TEST
+const CARD8 SiS6326TVRegs1_NTSC_2[6][3] = {
+ { 0x00,0x00,0x00},
+ { 0x00,0x00,0x00},
+ { 0x24,0x92,0x49},
+ { 0x24,0x92,0x49}, /* 8a50 */
+ { 0x24,0x92,0x49}, /* 640x400, 640x480 */ /* 8afc */
+ { 0x21,0xbe,0x75} /* 640x480u */ /* n/a */
+};
+#endif
+
const CARD8 SiS6326TVRegs2_NTSC[6][54] = {
{0x11, 0x17, 0x03, 0x09, 0x94, 0x02, 0x05, 0x06, 0x09, 0x50, 0x0C,
0x0C, 0x06, 0x0D, 0x04, 0x0A, 0x94, 0x06, 0x0D, 0x04, 0x0A, 0x94,
@@ -107,6 +120,17 @@ const CARD8 SiS6326TVRegs1_PAL[6][14] = {
{0x81,0x63,0xa4,0x03,0xd9,0x01,0x00,0x09,0x10,0x9f,0x10,0xaa,0x71,0x59} /* 720x540 */
};
+#ifdef TV6326TEST
+const CARD8 SiS6326TVRegs1_PAL_2[6][3] = {
+ { 0x00,0x00,0x00},
+ { 0x00,0x00,0x00},
+ { 0xa4,0x07,0xd9}, /* 640x480 */ /* 887e */
+ { 0xa4,0x08,0x19}, /* 800x600 */ /* 8828 */
+ { 0xa1,0x7e,0xa3}, /* 800x600u */ /* n/a */
+ { 0xa4,0x07,0xd9} /* 720x540 */ /* n/a */
+};
+#endif
+
const CARD8 SiS6326TVRegs2_PAL[6][54] = {
{0x15, 0x4E, 0x35, 0x6E, 0x94, 0x02, 0x04, 0x38, 0x3A, 0x50, 0x3D,
0x70, 0x06, 0x3E, 0x35, 0x6D, 0x94, 0x05, 0x3F, 0x36, 0x6E, 0x94,
@@ -140,6 +164,7 @@ const CARD8 SiS6326TVRegs2_PAL[6][54] = {
0x6A, 0x5A, 0x73, 0xA0, 0xC1, 0x95, 0x73, 0xB6, 0x03, 0xA0}
};
+
const CARD8 SiS6326CR[9][15] = {
{0x79,0x63,0x64,0x1d,0x6a,0x93,0x00,0x6f,0xf0,0x58,0x8a,0x57,0x57,0x70,0x20}, /* PAL 800x600 */
{0x79,0x4f,0x50,0x95,0x60,0x93,0x00,0x6f,0xba,0x14,0x86,0xdf,0xe0,0x30,0x00}, /* PAL 640x480 */
@@ -215,7 +240,7 @@ SISInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
pReg->sisRegs3C4[0x06] &= 0x01;
}
- /* set interlace */
+ /* set interlace */
if(!(mode->Flags & V_INTERLACE)) {
offset = pSiS->CurrentLayout.displayWidth >> 3;
} else {
@@ -782,6 +807,11 @@ SISInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
for(i=0; i<14; i++) {
pReg->sis6326tv[SiS6326TVRegs1[i]] = SiS6326TVRegs1_PAL[index][i];
}
+#ifdef TV6326TEST
+ for(i=0, j=2; i<3; i++, j++) {
+ pReg->sis6326tv[j] = SiS6326TVRegs1_PAL_2[index][i];
+ }
+#endif
fsc = (SiS6326TVRegs1_PAL[index][2] << 16) |
(SiS6326TVRegs1_PAL[index][3] << 8) |
(SiS6326TVRegs1_PAL[index][4]);
@@ -792,6 +822,11 @@ SISInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
for(i=0; i<14; i++) {
pReg->sis6326tv[SiS6326TVRegs1[i]] = SiS6326TVRegs1_NTSC[index][i];
}
+#ifdef TV6326TEST
+ for(i=0, j=2; i<3; i++, j++) {
+ pReg->sis6326tv[j] = SiS6326TVRegs1_NTSC_2[index][i];
+ }
+#endif
fsc = (SiS6326TVRegs1_NTSC[index][2] << 16) |
(SiS6326TVRegs1_NTSC[index][3] << 8) |
(SiS6326TVRegs1_NTSC[index][4]);
@@ -849,8 +884,11 @@ SIS300Init(ScrnInfoPtr pScrn, DisplayModePtr mode)
SISRegPtr pReg = &pSiS->ModeReg;
unsigned short temp;
DisplayModePtr realmode = mode;
+#ifdef SISMERGED
+ DisplayModePtr realmode2 = NULL;
+#endif
- PDEBUG(xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "SIS300Init()\n"));
+ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "SIS300Init()\n");
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4,
"virtualX = %d depth = %d Logical width = %d\n",
@@ -860,6 +898,7 @@ SIS300Init(ScrnInfoPtr pScrn, DisplayModePtr mode)
#ifdef SISMERGED
if(pSiS->MergedFB) {
realmode = ((SiSMergedDisplayModePtr)mode->Private)->CRT1;
+ realmode2 = ((SiSMergedDisplayModePtr)mode->Private)->CRT2;
}
#endif
@@ -871,10 +910,15 @@ SIS300Init(ScrnInfoPtr pScrn, DisplayModePtr mode)
((pSiS->CurrentLayout.bitsPerPixel + 7) / 8);
pSiS->scrnPitch = pSiS->scrnPitch2 = pSiS->scrnOffset;
- if(!(pSiS->VBFlags & CRT1_LCDA)) {
- if(realmode->Flags & V_INTERLACE) pSiS->scrnPitch <<= 1;
- }
- /* CRT2 mode can never be interlaced */
+
+ if(realmode->Flags & V_INTERLACE) pSiS->scrnPitch <<= 1;
+
+#ifdef SISMERGED
+ if(pSiS->MergedFB) {
+ if(realmode2->Flags & V_INTERLACE) pSiS->scrnPitch2 <<= 1;
+ } else
+#endif
+ pSiS->scrnPitch2 = pSiS->scrnPitch;
#ifdef UNLOCK_ALWAYS
outSISIDXREG(SISSR, 0x05, 0x86);
@@ -933,204 +977,253 @@ SIS300Init(ScrnInfoPtr pScrn, DisplayModePtr mode)
return(TRUE);
}
-static int
-SISDoSense(ScrnInfoPtr pScrn, unsigned short type, unsigned short test)
+int
+SISDoSense(ScrnInfoPtr pScrn, int tempbl, int tempbh, int tempcl, int tempch)
{
- SISPtr pSiS = SISPTR(pScrn);
- int temp, mytest, result, i, j;
-
-#ifdef TWDEBUG
- xf86DrvMsg(0, X_INFO, "Sense: %x %x\n", type, test);
-#endif
-
- for(j = 0; j < 10; j++) {
- result = 0;
- for(i = 0; i < 3; i++) {
- mytest = test;
- outSISIDXREG(SISPART4,0x11,(type & 0x00ff));
- temp = (type >> 8) | (mytest & 0x00ff);
- setSISIDXREG(SISPART4,0x10,0xe0,temp);
- SiS_DDC2Delay(pSiS->SiS_Pr, 0x1500);
- mytest >>= 8;
- mytest &= 0x7f;
- inSISIDXREG(SISPART4,0x03,temp);
- temp ^= 0x0e;
- temp &= mytest;
- if(temp == mytest) result++;
-#if 1
- outSISIDXREG(SISPART4,0x11,0x00);
- andSISIDXREG(SISPART4,0x10,0xe0);
- SiS_DDC2Delay(pSiS->SiS_Pr, 0x1000);
-#endif
- }
- if((result == 0) || (result >= 2)) break;
- }
- return(result);
+ SISPtr pSiS = SISPTR(pScrn);
+ int temp;
+
+ outSISIDXREG(SISPART4,0x11,tempbl);
+ temp = tempbh | tempcl;
+ setSISIDXREG(SISPART4,0x10,0xe0,temp);
+ SiS_DDC2Delay(pSiS->SiS_Pr, 0x1000);
+ tempch &= 0x7f;
+ inSISIDXREG(SISPART4,0x03,temp);
+ temp ^= 0x0e;
+ temp &= tempch;
+ return((temp == tempch));
}
-#define GETROMWORD(w) (pSiS->BIOS[w] | (pSiS->BIOS[w+1] << 8))
-
/* Sense connected devices on 30x */
-static void
-SISSense30x(ScrnInfoPtr pScrn)
+void SISSense30x(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
- unsigned char backupP4_0d,backupP2_00,backupP2_4d,biosflag=0;
- unsigned short svhs=0, svhs_c=0;
- unsigned short cvbs=0, cvbs_c=0;
- unsigned short vga2=0, vga2_c=0;
- int myflag, result; /* , i; */
+ unsigned char backupP4_0d,backupP2_00,biosflag;
+ unsigned char svhs_bl, svhs_bh;
+ unsigned char svhs_cl, svhs_ch;
+ unsigned char cvbs_bl, cvbs_bh;
+ unsigned char cvbs_cl, cvbs_ch;
+ unsigned char vga2_bl, vga2_bh;
+ unsigned char vga2_cl, vga2_ch;
+ int myflag, result=0, i, j, haveresult;
+ unsigned short temp;
inSISIDXREG(SISPART4,0x0d,backupP4_0d);
outSISIDXREG(SISPART4,0x0d,(backupP4_0d | 0x04));
- SiS_DDC2Delay(pSiS->SiS_Pr, 0x2000);
inSISIDXREG(SISPART2,0x00,backupP2_00);
- outSISIDXREG(SISPART2,0x00,((backupP2_00 | 0x1c) & 0xfc));
-
- inSISIDXREG(SISPART2,0x4d,backupP2_4d);
- if(pSiS->VBFlags & (VB_301C|VB_301LV|VB_302LV|VB_302ELV)) {
- outSISIDXREG(SISPART2,0x4d,(backupP2_4d & ~0x10));
- }
-
- SISDoSense(pScrn, 0, 0);
-
- if(pSiS->VBFlags & VB_301) {
- svhs = 0x00b9; cvbs = 0x00b3; vga2 = 0x00d1;
- inSISIDXREG(SISPART4,0x01,myflag);
- if(myflag & 0x04) {
- svhs = 0x00dd; cvbs = 0x00ee; vga2 = 0x00fd;
- }
- } else if(pSiS->VBFlags & (VB_301B | VB_302B)) {
- svhs = 0x016b; cvbs = 0x0174; vga2 = 0x0190;
- } else if(pSiS->VBFlags & (VB_301LV | VB_302LV)) {
- svhs = 0x0200; cvbs = 0x0100;
- } else if(pSiS->VBFlags & (VB_301C | VB_302ELV)) {
- svhs = 0x016b; cvbs = 0x0110; vga2 = 0x0190;
- } else return;
-
- vga2_c = 0x0e08; svhs_c = 0x0404; cvbs_c = 0x0804;
- if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- svhs_c = 0x0408; cvbs_c = 0x0808;
- }
- biosflag = 2;
-
- if(pSiS->Chipset == PCI_CHIP_SIS300) {
- inSISIDXREG(SISSR,0x3b,myflag);
- if(!(myflag & 0x01)) vga2 = vga2_c = 0;
- }
-
- if(pSiS->sishw_ext.UseROM) {
- if(pSiS->VGAEngine == SIS_300_VGA) {
- if(pSiS->VBFlags & VB_301) {
- inSISIDXREG(SISPART4,0x01,myflag);
- if(!(myflag & 0x04)) {
- vga2 = GETROMWORD(0xf8); svhs = GETROMWORD(0xfa); cvbs = GETROMWORD(0xfc);
- }
- }
- biosflag = pSiS->BIOS[0xfe];
- } else if(pSiS->Chipset == PCI_CHIP_SIS660) {
- if(pSiS->ROM661New) {
- biosflag = 2;
- vga2 = GETROMWORD(0x63); svhs = cvbs = GETROMWORD(0x65);
- if(pSiS->BIOS[0x5d] & 0x04) biosflag |= 0x01;
- }
- } else if(!pSiS->ROM661New) {
-#if 0 /* eg. 1.15.23 has wrong values here */
- myflag = 0;
- if(pSiS->VBFlags & VB_301) {
- if(pSiS->Chipset == PCI_CHIP_SIS330) {
- myflag = 0xe5; i = 0x11b;
- } else {
- myflag = 0xbd; i = 0xf3
- }
- } else if(pSiS->VBFlags & (VB_301B|VB_302B|VB_301LV|VB_302LV)) {
- if(pSiS->Chipset == PCI_CHIP_SIS330) {
- myflag = 0xeb; i = 0x11b;
- } else {
- myflag = 0xc3; i = 0xf3
+ outSISIDXREG(SISPART2,0x00,(backupP2_00 | 0x1c));
+
+ SISDoSense(pScrn, 0, 0, 0, 0);
+
+ if((pSiS->VGAEngine == SIS_315_VGA) ||
+ (pSiS->Chipset == PCI_CHIP_SIS300)) {
+ if(pSiS->sishw_ext.UseROM) {
+ if(pSiS->VGAEngine == SIS_300_VGA) temp = 0xfe;
+ else {
+ temp = 0xf3;
+ if((pSiS->Chipset == PCI_CHIP_SIS330) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ temp = 0x11b;
}
}
- if(myflag) {
- biosflag = pSiS->BIOS[i]; vga2 = GETROMWORD(myflag);
- svhs = GETROMWORD(myflag+2); cvbs = GETROMWORD(myflag+4);
+ if(pSiS->BIOS[temp] & 0x08) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "SiS30x: Video bridge has DVI-I TMDS/VGA combo connector\n");
+ orSISIDXREG(SISCR, 0x32, 0x80);
+ } else {
+ andSISIDXREG(SISCR, 0x32, 0x7f);
}
-#endif
}
}
+
+ if(pSiS->VGAEngine == SIS_300_VGA) {
- if(pSiS->VBFlags & (VB_301LV|VB_302LV|VB_302ELV)) {
- vga2 = vga2_c = 0;
- }
+ if(pSiS->sishw_ext.UseROM) {
+ vga2_bh = pSiS->BIOS[0xf9]; vga2_bl = pSiS->BIOS[0xf8];
+ svhs_bh = pSiS->BIOS[0xfb]; svhs_bl = pSiS->BIOS[0xfa];
+ cvbs_bh = pSiS->BIOS[0xfd]; cvbs_bl = pSiS->BIOS[0xfc];
+ biosflag = pSiS->BIOS[0xfe];
+ } else {
+ vga2_bh = 0x00; vga2_bl = 0xd1;
+ svhs_bh = 0x00; svhs_bl = 0xb9;
+ cvbs_bh = 0x00; cvbs_bl = 0xb3;
+ biosflag = 0;
+ }
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) {
+ vga2_bh = 0x01; vga2_bl = 0x90;
+ svhs_bh = 0x01; svhs_bl = 0x6b;
+ cvbs_bh = 0x01; cvbs_bl = 0x74;
+ }
+ inSISIDXREG(SISPART4,0x01,myflag);
+ if(myflag & 0x04) {
+ vga2_bh = 0x00; vga2_bl = 0xfd;
+ svhs_bh = 0x00; svhs_bl = 0xdd;
+ cvbs_bh = 0x00; cvbs_bl = 0xee;
+ }
+ vga2_ch = 0x0e; vga2_cl = 0x08;
+ svhs_ch = 0x04; svhs_cl = 0x04;
+ cvbs_ch = 0x08; cvbs_cl = 0x04;
+
+ if(pSiS->Chipset == PCI_CHIP_SIS300) {
+ inSISIDXREG(SISSR,0x3b,myflag);
+ if(!(myflag & 0x01)) {
+ vga2_bh = 0x00; vga2_bl = 0x00;
+ vga2_ch = 0x00; vga2_cl = 0x00;
+ }
+ }
+
+ } else {
+
+ if(pSiS->sishw_ext.UseROM) {
+ if((pSiS->Chipset == PCI_CHIP_SIS330) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ vga2_bh = pSiS->BIOS[0xe6]; vga2_bl = pSiS->BIOS[0xe5];
+ svhs_bh = pSiS->BIOS[0xe8]; svhs_bl = pSiS->BIOS[0xe7];
+ cvbs_bh = pSiS->BIOS[0xea]; cvbs_bl = pSiS->BIOS[0xe9];
+ biosflag = pSiS->BIOS[0x11b];
+ } else {
+ vga2_bh = pSiS->BIOS[0xbe]; vga2_bl = pSiS->BIOS[0xbd];
+ svhs_bh = pSiS->BIOS[0xc0]; svhs_bl = pSiS->BIOS[0xbf];
+ cvbs_bh = pSiS->BIOS[0xc2]; cvbs_bl = pSiS->BIOS[0xc1];
+ biosflag = pSiS->BIOS[0xf3];
+ }
+ } else {
+ vga2_bh = 0x00; vga2_bl = 0xd1;
+ svhs_bh = 0x00; svhs_bl = 0xb9;
+ cvbs_bh = 0x00; cvbs_bl = 0xb3;
+ biosflag = 0;
+ }
+
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) {
+ if(pSiS->sishw_ext.UseROM) {
+ if((pSiS->Chipset == PCI_CHIP_SIS330) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ vga2_bh = pSiS->BIOS[0xec]; vga2_bl = pSiS->BIOS[0xeb];
+ svhs_bh = pSiS->BIOS[0xee]; svhs_bl = pSiS->BIOS[0xed];
+ cvbs_bh = pSiS->BIOS[0xf0]; cvbs_bl = pSiS->BIOS[0xef];
+ } else {
+ vga2_bh = pSiS->BIOS[0xc4]; vga2_bl = pSiS->BIOS[0xc3];
+ svhs_bh = pSiS->BIOS[0xc6]; svhs_bl = pSiS->BIOS[0xc5];
+ cvbs_bh = pSiS->BIOS[0xc8]; cvbs_bl = pSiS->BIOS[0xc7];
+ }
+ } else {
+ if(pSiS->VBFlags & (VB_301B|VB_301C|VB_302B)) {
+ vga2_bh = 0x01; vga2_bl = 0x90;
+ svhs_bh = 0x01; svhs_bl = 0x6b;
+ cvbs_bh = 0x01; cvbs_bl = 0x74;
+ } else {
+ vga2_bh = 0x00; vga2_bl = 0x00;
+ svhs_bh = 0x02; svhs_bl = 0x00;
+ cvbs_bh = 0x01; cvbs_bl = 0x00;
+ }
+ }
+ }
+
+ if(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B)) {
+ inSISIDXREG(SISPART4,0x01,myflag);
+ if(myflag & 0x04) {
+ vga2_bh = 0x00; vga2_bl = 0xfd;
+ svhs_bh = 0x00; svhs_bl = 0xdd;
+ cvbs_bh = 0x00; cvbs_bl = 0xee;
+ }
+ }
+
+ if(pSiS->VBFlags & (VB_301LV|VB_302LV)) {
+ /* TW: No VGA2 or SCART on LV bridges */
+ vga2_bh = 0x00; vga2_bl = 0x00;
+ vga2_ch = 0x00; vga2_cl = 0x00;
+ svhs_ch = 0x04; svhs_cl = 0x08;
+ cvbs_ch = 0x08; cvbs_cl = 0x08;
+ } else {
+ vga2_ch = 0x0e; vga2_cl = 0x08;
+ svhs_ch = 0x04; svhs_cl = 0x04;
+ cvbs_ch = 0x08; cvbs_cl = 0x04;
+ }
+
+ }
andSISIDXREG(SISCR, 0x32, ~0x14);
pSiS->postVBCR32 &= ~0x14;
-
- if(vga2_c || vga2) {
- if(SISDoSense(pScrn, vga2, vga2_c)) {
- if(biosflag & 0x01) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ if(vga2_ch || vga2_cl || vga2_bh || vga2_bl) {
+#ifdef TWDEBUG
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "SiS30x: Scanning for VGA2/SCART (%x %x %x %x)\n",
+ vga2_bh, vga2_bl, vga2_ch, vga2_cl);
+#endif
+
+ haveresult = 0;
+ for(j = 0; j < 10; j++) {
+ result = 0;
+ for(i = 0; i < 3; i++) {
+ if(SISDoSense(pScrn, vga2_bl, vga2_bh, vga2_cl, vga2_ch))
+ result++;
+ }
+ if((result == 0) || (result >= 2)) break;
+ }
+ if(result) {
+ if(biosflag & 0x01) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"SiS30x: Detected TV connected to SCART output\n");
- pSiS->VBFlags |= TV_SCART;
- orSISIDXREG(SISCR, 0x32, 0x04);
- pSiS->postVBCR32 |= 0x04;
- } else {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ pSiS->VBFlags |= TV_SCART;
+ orSISIDXREG(SISCR, 0x32, 0x04);
+ pSiS->postVBCR32 |= 0x04;
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
"SiS30x: Detected secondary VGA connection\n");
- pSiS->VBFlags |= VGA2_CONNECTED;
- orSISIDXREG(SISCR, 0x32, 0x10);
- pSiS->postVBCR32 |= 0x10;
- }
+ pSiS->VBFlags |= VGA2_CONNECTED;
+ orSISIDXREG(SISCR, 0x32, 0x10);
+ pSiS->postVBCR32 |= 0x10;
+ }
}
if(biosflag & 0x01) pSiS->SiS_SD_Flags |= SiS_SD_VBHASSCART;
}
- andSISIDXREG(SISCR, 0x32, 0x3f);
- pSiS->postVBCR32 &= 0x3f;
-
- if((pSiS->VGAEngine == SIS_315_VGA) && (pSiS->VBFlags & (VB_301C|VB_301LV|VB_302LV|VB_302ELV))) {
- if(pSiS->SenseYPbPr) {
- outSISIDXREG(SISPART2,0x4d,(backupP2_4d | 0x10));
- SiS_DDC2Delay(pSiS->SiS_Pr, 0x2000);
- if((result = SISDoSense(pScrn, svhs, 0x0604))) {
- if((result = SISDoSense(pScrn, cvbs, 0x0804))) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "SiS30x: Detected TV connected to YPbPr component output\n");
- orSISIDXREG(SISCR,0x32,0x80);
- pSiS->VBFlags |= TV_YPBPR;
- pSiS->postVBCR32 |= 0x80;
- }
- }
- outSISIDXREG(SISPART2,0x4d,backupP2_4d);
- }
- }
+#ifdef TWDEBUG
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "SiS30x: Scanning for TV (%x %x %x %x; %x %x %x %x)\n",
+ svhs_bh, svhs_bl, svhs_ch, svhs_cl,
+ cvbs_bh, cvbs_bl, cvbs_ch, cvbs_cl);
+#endif
andSISIDXREG(SISCR, 0x32, ~0x03);
pSiS->postVBCR32 &= ~0x03;
- if(!(pSiS->VBFlags & TV_YPBPR)) {
-
- if((result = SISDoSense(pScrn, svhs, svhs_c))) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "SiS30x: Detected TV connected to SVIDEO output\n");
- pSiS->VBFlags |= TV_SVIDEO;
- orSISIDXREG(SISCR, 0x32, 0x02);
- pSiS->postVBCR32 |= 0x02;
+ haveresult = 0;
+ for(j = 0; j < 10; j++) {
+ result = 0;
+ for(i = 0; i < 3; i++) {
+ if(SISDoSense(pScrn, svhs_bl, svhs_bh, svhs_cl, svhs_ch))
+ result++;
}
+ if((result == 0) || (result >= 2)) break;
+ }
+ if(result) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "SiS30x: Detected TV connected to SVIDEO output\n");
+ pSiS->VBFlags |= TV_SVIDEO;
+ orSISIDXREG(SISCR, 0x32, 0x02);
+ pSiS->postVBCR32 |= 0x02;
+ }
- if((biosflag & 0x02) || (!result)) {
- if(SISDoSense(pScrn, cvbs, cvbs_c)) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "SiS30x: Detected TV connected to COMPOSITE output\n");
- pSiS->VBFlags |= TV_AVIDEO;
- orSISIDXREG(SISCR, 0x32, 0x01);
- pSiS->postVBCR32 |= 0x01;
+ if((biosflag & 0x02) || (!(result))) {
+
+ haveresult = 0;
+ for(j = 0; j < 10; j++) {
+ result = 0;
+ for(i = 0; i < 3; i++) {
+ if(SISDoSense(pScrn, cvbs_bl, cvbs_bh, cvbs_cl, cvbs_ch))
+ result++;
}
+ if((result == 0) || (result >= 2)) break;
+ }
+ if(result) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "SiS30x: Detected TV connected to COMPOSITE output\n");
+ pSiS->VBFlags |= TV_AVIDEO;
+ orSISIDXREG(SISCR, 0x32, 0x01);
+ pSiS->postVBCR32 |= 0x01;
}
-
}
- SISDoSense(pScrn, 0, 0);
+ SISDoSense(pScrn, 0, 0, 0, 0);
outSISIDXREG(SISPART2,0x00,backupP2_00);
outSISIDXREG(SISPART4,0x0d,backupP4_0d);
@@ -1146,10 +1239,9 @@ SiS6326TVDelay(ScrnInfoPtr pScrn, int delay)
for(i=0; i<delay; i++) {
inSISIDXREG(SISSR, 0x05, temp);
}
- (void)temp;
}
-static int
+int
SIS6326DoSense(ScrnInfoPtr pScrn, int tempbh, int tempbl, int tempch, int tempcl)
{
unsigned char temp;
@@ -1169,7 +1261,7 @@ SIS6326DoSense(ScrnInfoPtr pScrn, int tempbh, int tempbl, int tempch, int tempcl
return(tempcl);
}
-static void
+void
SISSense6326(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
@@ -1202,19 +1294,18 @@ SISSense6326(ScrnInfoPtr pScrn)
}
}
-/* Detect video bridge and set VBFlags accordingly */
+/* TW: Detect video bridge and set VBFlags accordingly */
void SISVGAPreInit(ScrnInfoPtr pScrn)
{
SISPtr pSiS = SISPTR(pScrn);
int temp,temp1,temp2, i;
int upperlimitlvds, lowerlimitlvds;
int upperlimitch, lowerlimitch;
- int chronteltype, chrontelidreg, upperlimitvb;
+ int chronteltype, chrontelidreg;
unsigned char test[3];
- static const char *detectvb = "Detected %s video bridge (ID %d; Revision 0x%x)\n";
#if 0
unsigned char sr17=0;
-#endif
+#endif
static const char *ChrontelTypeStr[] = {
"7004",
"7005",
@@ -1263,39 +1354,42 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
inSISIDXREG(SISPART4, 0x00, temp);
temp &= 0x0F;
- if(temp == 1) {
+ if (temp == 1) {
inSISIDXREG(SISPART4, 0x01, temp1);
temp1 &= 0xff;
if(temp1 >= 0xE0) {
- inSISIDXREG(SISPART4, 0x39, temp2);
- if(temp2 == 0xff) {
- pSiS->VBFlags |= VB_302LV;
- pSiS->sishw_ext.ujVBChipID = VB_CHIP_302LV;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS302LV", 1, temp1);
- } else {
- pSiS->VBFlags |= VB_302ELV;
- pSiS->sishw_ext.ujVBChipID = VB_CHIP_302ELV;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS302ELV", 1, temp1);
- }
+ pSiS->VBFlags |= VB_302LV;
+ pSiS->sishw_ext.ujVBChipID = VB_CHIP_302LV;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS302LV video bridge (ID 1; Revision 0x%x)\n",
+ temp1);
} else if(temp1 >= 0xD0) {
pSiS->VBFlags |= VB_301LV;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_301LV;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS301LV", 1, temp1);
- } else if(temp1 >= 0xC0) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301LV video bridge (ID 1; Revision 0x%x)\n",
+ temp1);
+ } else if(temp1 >= 0xC0) { /* guessed */
pSiS->VBFlags |= VB_301C;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_301C;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS301C", 1, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301C video bridge (ID 1; Revision 0x%x)\n",
+ temp1);
} else if(temp1 >= 0xB0) {
pSiS->VBFlags |= VB_301B;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_301B;
inSISIDXREG(SISPART4, 0x23, temp2);
if(!(temp2 & 0x02)) pSiS->VBFlags |= VB_30xBDH;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb,
- (temp2 & 0x02) ? "SiS301B" : "SiS301B-DH", 1, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301B%s video bridge (Revision 0x%x)\n",
+ (temp2 & 0x02) ? "" : " (DH)",
+ temp1);
} else {
pSiS->VBFlags |= VB_301;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_301;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS301", 1, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301 video bridge (Revision 0x%x)\n",
+ temp1);
}
SISSense30x(pScrn);
@@ -1307,55 +1401,66 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
if(temp1 >= 0xE0) {
pSiS->VBFlags |= VB_302LV;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_302LV;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS302LV", 2, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS302LV video bridge (ID 2; Revision 0x%x)\n",
+ temp1);
} else if(temp1 >= 0xD0) {
pSiS->VBFlags |= VB_301LV;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_301LV;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "SiS301LV", 2, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301LV video bridge (ID 2; Revision 0x%x)\n",
+ temp1);
} else {
pSiS->VBFlags |= VB_302B;
pSiS->sishw_ext.ujVBChipID = VB_CHIP_302B;
inSISIDXREG(SISPART4, 0x23, temp2);
if(!(temp & 0x02)) pSiS->VBFlags |= VB_30xBDH;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb,
- (temp2 & 0x02) ? "SiS302B" : "SiS302B-DH", 2, temp1);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS302B%s video bridge (Revision 0x%x)\n",
+ (temp2 & 0x02) ? "" : " (DH)",
+ temp1);
}
SISSense30x(pScrn);
} else if (temp == 3) {
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, detectvb, "unsupported SiS303", temp, 0);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS303 video bridge - not supported\n");
} else {
pSiS->sishw_ext.ujVBChipID = VB_CHIP_UNKNOWN;
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- inSISIDXREG(SISCR, 0x38, temp);
- temp = (temp >> 5) & 0x07;
- } else {
- inSISIDXREG(SISCR, 0x37, temp);
- temp = (temp >> 1) & 0x07;
+ inSISIDXREG(SISCR, 0x37, temp);
+ temp = (temp >> 1) & 0x07;
+#if 0 /* TW: This does not seem to be used on any machine */
+ if ( (temp == 0) || (temp == 1)) {
+ pSiS->VBFlags |= VB_301; /* TW: 301 ? */
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected SiS301 video bridge (Irregular bridge type %d)\n", temp);
}
+#endif
if(pSiS->VGAEngine == SIS_300_VGA) {
lowerlimitlvds = 2; upperlimitlvds = 4;
lowerlimitch = 4; upperlimitch = 5;
chronteltype = 1; chrontelidreg = 0x25;
- upperlimitvb = upperlimitlvds;
} else {
lowerlimitlvds = 2; upperlimitlvds = 3;
lowerlimitch = 3; upperlimitch = 3;
chronteltype = 2; chrontelidreg = 0x4b;
- upperlimitvb = upperlimitlvds;
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- upperlimitvb = 4;
- }
}
if((temp >= lowerlimitlvds) && (temp <= upperlimitlvds)) {
pSiS->VBFlags |= VB_LVDS;
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected LVDS transmitter (External chip ID %d)\n", temp);
+ "Detected LVDS transmitter (Bridge type %d)\n", temp);
+ if(pSiS->Chipset == PCI_CHIP_SIS650) {
+ inSISIDXREG(SISCR, 0x38, temp1);
+ if(temp1 & 0x02) {
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "[LVDS: LCD channel A]\n");
+ }
+ }
}
if((temp >= lowerlimitch) && (temp <= upperlimitch)) {
/* Set global for init301.c */
@@ -1399,7 +1504,7 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
default: temp2 = 8; pSiS->ChrontelType = CHRONTEL_701x; break;
}
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected Chrontel %s TV encoder (ID 0x%02x; chip ID %d)\n",
+ "Detected Chrontel %s TV encoder (ID 0x%02x; bridge type %d)\n",
ChrontelTypeStr[temp2], temp1, temp);
/* Sense connected TV's */
@@ -1496,10 +1601,10 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
break;
case 0x04:
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Chrontel: Detected TV connected to SCART or YPBPR output\n");
+ "Chrontel: Detected TV connected to SCART output or 480i HDTV\n");
if(pSiS->chtvtype == -1) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Chrontel: Use CHTVType option to select either SCART or YPBPR525I\n");
+ "Chrontel: Use CHTVType option to select either SCART or HDTV\n");
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Chrontel: Using SCART by default\n");
pSiS->chtvtype = 1;
@@ -1507,7 +1612,7 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
if(pSiS->chtvtype)
pSiS->VBFlags |= TV_CHSCART;
else
- pSiS->VBFlags |= TV_CHYPBPR525I;
+ pSiS->VBFlags |= TV_CHHDTV;
break;
default:
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
@@ -1535,17 +1640,11 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
SiS_SetChrontelGPIO(pSiS->SiS_Pr, 0x00);
}
}
- if((pSiS->Chipset == PCI_CHIP_SIS660) && (temp == 4)) {
- pSiS->VBFlags |= VB_CONEXANT;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected Conexant video bridge - UNSUPPORTED\n");
- }
- if((pSiS->VGAEngine == SIS_300_VGA) && (temp == 3)) {
- pSiS->VBFlags |= VB_TRUMPION;
+ if ((pSiS->VGAEngine == SIS_300_VGA) && (temp == 3)) {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Detected Trumpion Zurac (I/II/III) LVDS scaler\n");
+ "Detected Trumpion Zurac (I/II/III) LVDS scaler - UNSUPPORTED\n");
}
- if(temp > upperlimitvb) {
+ if (temp > upperlimitlvds) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Detected unknown bridge type (%d)\n", temp);
}
@@ -1601,12 +1700,11 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
* relevant registers ourselves.
*/
if(pSiS->VGAEngine == SIS_315_VGA) {
-
- if(pSiS->VBFlags & (VB_301C | VB_302B | VB_301LV | VB_302LV | VB_302ELV)) {
- if(pSiS->sisfblcda != 0xff) {
+ if(pSiS->VBFlags & (VB_302B | VB_301LV | VB_302LV)) {
+ if(pSiS->sisfblcda != 0xff) {
if((pSiS->sisfblcda & 0x03) == 0x03) {
pSiS->SiS_Pr->SiS_UseLCDA = TRUE;
- pSiS->ChipFlags |= SiSCF_UseLCDA;
+ pSiS->VBFlags |= VB_USELCDA;
}
} else {
inSISIDXREG(SISCR,0x34,temp);
@@ -1614,22 +1712,32 @@ void SISVGAPreInit(ScrnInfoPtr pScrn)
inSISIDXREG(SISCR,0x38,temp);
if((temp & 0x03) == 0x03) {
pSiS->SiS_Pr->SiS_UseLCDA = TRUE;
- pSiS->ChipFlags |= SiSCF_UseLCDA;
+ pSiS->VBFlags |= VB_USELCDA;
pSiS->SiS_Pr->Backup = TRUE;
} else {
- orSISIDXREG(SISPART1,0x2f,0x01); /* Unlock CRT2 */
- inSISIDXREG(SISPART1,0x13,temp);
- if(temp & 0x04) {
+ inSISIDXREG(SISCR,0x35,temp);
+ if(temp & 0x01) {
pSiS->SiS_Pr->SiS_UseLCDA = TRUE;
- pSiS->ChipFlags |= SiSCF_UseLCDA;
+ pSiS->VBFlags |= VB_USELCDA;
pSiS->SiS_Pr->Backup = TRUE;
+ } else {
+ inSISIDXREG(SISCR,0x30,temp);
+ if(temp & 0x20) {
+ orSISIDXREG(SISPART1,0x2f,0x01); /* Unlock CRT2 */
+ inSISIDXREG(SISPART1,0x13,temp);
+ if(temp & 0x04) {
+ pSiS->SiS_Pr->SiS_UseLCDA = TRUE;
+ pSiS->VBFlags |= VB_USELCDA;
+ pSiS->SiS_Pr->Backup = TRUE;
+ }
+ }
}
}
}
}
- if(pSiS->ChipFlags & SiSCF_UseLCDA) {
+ if(pSiS->VBFlags & VB_USELCDA) {
xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "BIOS uses LCDA for low resolution and text modes\n");
+ "Bridge uses LCDA for low resolution and text modes\n");
if(pSiS->SiS_Pr->Backup == TRUE) {
inSISIDXREG(SISCR,0x34,pSiS->SiS_Pr->Backup_Mode);
inSISIDXREG(SISPART1,0x14,pSiS->SiS_Pr->Backup_14);
diff --git a/src/sis_video.c b/src/sis_video.c
index 85d75b5..df172d2 100644
--- a/src/sis_video.c
+++ b/src/sis_video.c
@@ -1,39 +1,39 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/sis_video.c,v 1.27 2003/09/04 15:32:45 twini Exp $ */
/*
* Xv driver for SiS 300, 315 and 330 series.
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria.
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria.
+ * All Rights Reserved.
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1) Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2) Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3) The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * Basic structure based on the mga Xv driver by Mark Vojkovich
+ * and i810 Xv driver by Jonathan Bian <jonathan.bian@intel.com>.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * Formerly based on a mostly non-working fragment for the 630 by
+ * Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * Formerly based on a mostly non-working code fragment for the 630 by
- * Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan which is
- * Copyright (C) 2000 Silicon Integrated Systems Corp, Inc.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Authors:
+ * Thomas Winischhofer <thomas@winischhofer.net>:
+ * (Original code fragment for 630 by
+ * Sung-Ching Lin <sclin@sis.com.tw>)
*
- * Basic structure based on the mga Xv driver by Mark Vojkovich
- * and i810 Xv driver by Jonathan Bian <jonathan.bian@intel.com>.
*
* All comments in this file are by Thomas Winischhofer.
*
@@ -45,11 +45,11 @@
* SiS650/740: Full register range, one overlay (used for both CRT1 and CRT2 alt.)
* SiSM650/651: Full register range, two overlays (one used for CRT1, one for CRT2)
* SiS330: Full register range, one overlay (used for both CRT1 and CRT2 alt.)
- * SiS661/741/760: Full register range, two overlays (one used for CRT1, one for CRT2)
+ * SiS660: ? Full register range, two overlays (one used for CRT1, one for CRT2) ?
*
* Help for reading the code:
- * 315/550/650/740/M650/651/330/661/741/760 = SIS_315_VGA
- * 300/630/730 = SIS_300_VGA
+ * 315/550/650/740/M650/651/330/660 = SIS_315_VGA
+ * 300/630/730 = SIS_300_VGA
* For chipsets with 2 overlays, hasTwoOverlays will be true
*
* Notes on display modes:
@@ -58,14 +58,14 @@
* DISPMODE is either SINGLE1 or SINGLE2, hence you need to check dualHeadMode flag
* DISPMODE is _never_ MIRROR.
* a) Chipsets with 2 overlays:
- * 315/330 series: Only half sized overlays available (width 960), 660: 1536
+ * 315/330 series: Only half sized overlays available (width 960)
* Overlay 1 is used on CRT1, overlay 2 for CRT2.
* b) Chipsets with 1 overlay:
* Full size overlays available.
* Overlay is used for either CRT1 or CRT2
* -) merged fb mode:
* a) Chipsets with 2 overlays:
- * 315/330 series: Only half sized overlays available (width 960), 660: 1536
+ * 315/330 series: Only half sized overlays available (width 960)
* DISPMODE is always MIRROR. Overlay 1 is used for CRT1, overlay 2 for CRT2.
* b) Chipsets with 1 overlay:
* Full size overlays available.
@@ -73,7 +73,7 @@
* CRT1 or CRT2 (automatically, where it is located)
* -) mirror mode (without dualhead or mergedfb)
* a) Chipsets with 2 overlays:
- * 315/330 series: Only half sized overlays available (width 960), 660: 1536
+ * 315/330 series: Only half sized overlays available (width 960)
* DISPMODE is MIRROR. Overlay 1 is used for CRT1, overlay 2 for CRT2.
* b) Chipsets with 1 overlay:
* Full size overlays available.
@@ -145,15 +145,11 @@ extern BOOLEAN SiSBridgeIsInSlaveMode(ScrnInfoPtr pScrn);
#define LINEBUFLIMIT1 384 /* Limits at which line buffers must be merged */
#define LINEBUFLIMIT2 720
-#define LINEBUFLIMIT3 576
#ifdef SISDUALHEAD
#define HEADOFFSET (pSiS->dhmOffset)
#endif
-#define GET_PORT_PRIVATE(pScrn) \
- (SISPortPrivPtr)((SISPTR(pScrn))->adaptor->pPortPrivates[0].ptr)
-
/* Note on "MIRROR":
* When using VESA on machines with an enabled video bridge, this means
* a real mirror. CRT1 and CRT2 have the exact same resolution and
@@ -164,6 +160,137 @@ extern BOOLEAN SiSBridgeIsInSlaveMode(ScrnInfoPtr pScrn);
* refresh rate.
*/
+/****************************************************************************
+ * Raw register access : These routines directly interact with the sis's
+ * control aperature. Must not be called until after
+ * the board's pci memory has been mapped.
+ ****************************************************************************/
+
+#if 0
+static CARD32 _sisread(SISPtr pSiS, CARD32 reg)
+{
+ return *(pSiS->IOBase + reg);
+}
+
+static void _siswrite(SISPtr pSiS, CARD32 reg, CARD32 data)
+{
+ *(pSiS->IOBase + reg) = data;
+}
+#endif
+
+static CARD8 getsrreg(SISPtr pSiS, CARD8 reg)
+{
+ CARD8 ret;
+ inSISIDXREG(SISSR, reg, ret);
+ return(ret);
+}
+
+static CARD8 getvideoreg(SISPtr pSiS, CARD8 reg)
+{
+ CARD8 ret;
+ inSISIDXREG(SISVID, reg, ret);
+ return(ret);
+}
+
+static __inline void setvideoreg(SISPtr pSiS, CARD8 reg, CARD8 data)
+{
+ outSISIDXREG(SISVID, reg, data);
+}
+
+static __inline void setvideoregmask(SISPtr pSiS, CARD8 reg, CARD8 data, CARD8 mask)
+{
+ CARD8 old;
+ inSISIDXREG(SISVID, reg, old);
+ data = (data & mask) | (old & (~mask));
+ outSISIDXREG(SISVID, reg, data);
+}
+
+static void setsrregmask(SISPtr pSiS, CARD8 reg, CARD8 data, CARD8 mask)
+{
+ CARD8 old;
+
+ inSISIDXREG(SISSR, reg, old);
+ data = (data & mask) | (old & (~mask));
+ outSISIDXREG(SISSR, reg, data);
+}
+
+/* VBlank */
+static CARD8 vblank_active_CRT1(SISPtr pSiS)
+{
+ return (inSISREG(SISINPSTAT) & 0x08);
+}
+
+static CARD8 vblank_active_CRT2(SISPtr pSiS)
+{
+ CARD8 ret;
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ inSISIDXREG(SISPART1, Index_310_CRT2_FC_VR, ret);
+ } else {
+ inSISIDXREG(SISPART1, Index_CRT2_FC_VR, ret);
+ }
+ return((ret & 0x02) ^ 0x02);
+}
+
+/* Scanline - unused */
+#if 0
+static CARD32 get_scanline_CRT1(SISPtr pSiS)
+{
+ CARD32 line;
+
+ _siswrite (pSiS, REG_PRIM_CRT_COUNTER, 0x00000001);
+ line = _sisread (pSiS, REG_PRIM_CRT_COUNTER);
+
+ return ((line >> 16) & 0x07FF);
+}
+
+static CARD32 get_scanline_CRT2(SISPtr pSiS)
+{
+ CARD32 line;
+
+ line = (CARD32)(getsisreg(pSiS, SISPART1, Index_CRT2_FC_VCount1) & 0x70) * 16
+ + getsisreg(pSiS, SISPART1, Index_CRT2_FC_VCount);
+
+ return line;
+}
+#endif
+
+void SISInitVideo(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
+ XF86VideoAdaptorPtr newAdaptor = NULL;
+ int num_adaptors;
+
+ newAdaptor = SISSetupImageVideo(pScreen);
+ if(newAdaptor)
+ SISInitOffscreenImages(pScreen);
+
+ num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
+
+ if(newAdaptor) {
+ if(!num_adaptors) {
+ num_adaptors = 1;
+ adaptors = &newAdaptor;
+ } else {
+ /* need to free this someplace */
+ newAdaptors = xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr*));
+ if(newAdaptors) {
+ memcpy(newAdaptors, adaptors, num_adaptors *
+ sizeof(XF86VideoAdaptorPtr));
+ newAdaptors[num_adaptors] = newAdaptor;
+ adaptors = newAdaptors;
+ num_adaptors++;
+ }
+ }
+ }
+
+ if(num_adaptors)
+ xf86XVScreenInit(pScreen, adaptors, num_adaptors);
+
+ if(newAdaptors)
+ xfree(newAdaptors);
+}
+
/* client libraries expect an encoding */
static XF86VideoEncodingRec DummyEncoding =
{
@@ -192,9 +319,6 @@ static char sisxvsetdefaults[] = "XV_SET_DEFAULTS";
static char sisxvswitchcrt[] = "XV_SWITCHCRT";
static char sisxvtvxposition[] = "XV_TVXPOSITION";
static char sisxvtvyposition[] = "XV_TVYPOSITION";
-static char sisxvgammared[] = "XV_GAMMA_RED";
-static char sisxvgammagreen[] = "XV_GAMMA_GREEN";
-static char sisxvgammablue[] = "XV_GAMMA_BLUE";
static char sisxvdisablegfx[] = "XV_DISABLE_GRAPHICS";
static char sisxvdisablegfxlr[] = "XV_DISABLE_GRAPHICS_LR";
static char sisxvdisablecolorkey[] = "XV_DISABLE_COLORKEY";
@@ -238,25 +362,11 @@ static char sisxvsdstorebrib[] = "XV_SD_STOREDGAMMABRIB";
static char sisxvsdstorepbrir[] = "XV_SD_STOREDGAMMAPBRIR";
static char sisxvsdstorepbrig[] = "XV_SD_STOREDGAMMAPBRIG";
static char sisxvsdstorepbrib[] = "XV_SD_STOREDGAMMAPBRIB";
-static char sisxvsdstorebrir2[] = "XV_SD_STOREDGAMMABRIR2";
-static char sisxvsdstorebrig2[] = "XV_SD_STOREDGAMMABRIG2";
-static char sisxvsdstorebrib2[] = "XV_SD_STOREDGAMMABRIB2";
-static char sisxvsdstorepbrir2[] = "XV_SD_STOREDGAMMAPBRIR2";
-static char sisxvsdstorepbrig2[] = "XV_SD_STOREDGAMMAPBRIG2";
-static char sisxvsdstorepbrib2[] = "XV_SD_STOREDGAMMAPBRIB2";
static char sisxvsdhidehwcursor[] = "XV_SD_HIDEHWCURSOR";
-static char sisxvsdpanelmode[] = "XV_SD_PANELMODE";
-#ifdef TWDEBUG
-static char sisxvsetreg[] = "XV_SD_SETREG";
-#endif
#ifndef SIS_CP
-#define NUM_ATTRIBUTES_300 57
-#ifdef TWDEBUG
-#define NUM_ATTRIBUTES_315 64
-#else
-#define NUM_ATTRIBUTES_315 63
-#endif
+#define NUM_ATTRIBUTES_300 50
+#define NUM_ATTRIBUTES_315 53
#endif
static XF86AttributeRec SISAttributes_300[NUM_ATTRIBUTES_300] =
@@ -311,13 +421,6 @@ static XF86AttributeRec SISAttributes_300[NUM_ATTRIBUTES_300] =
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrir},
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrig},
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrib},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrir2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrig2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrib2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrir2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrig2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrib2},
- {XvSettable | XvGettable, 0, 15, sisxvsdpanelmode},
#ifdef SIS_CP
SIS_CP_VIDEO_ATTRIBUTES
#endif
@@ -334,14 +437,12 @@ static XF86AttributeRec SISAttributes_315[NUM_ATTRIBUTES_315] =
{XvSettable , 0, 0, sisxvsetdefaults},
{XvSettable | XvGettable, -32, 32, sisxvtvxposition},
{XvSettable | XvGettable, -32, 32, sisxvtvyposition},
- {XvSettable | XvGettable, 100, 10000, sisxvgammared},
- {XvSettable | XvGettable, 100, 10000, sisxvgammagreen},
- {XvSettable | XvGettable, 100, 10000, sisxvgammablue},
{XvSettable | XvGettable, 0, 1, sisxvdisablegfx},
{XvSettable | XvGettable, 0, 1, sisxvdisablegfxlr},
{XvSettable | XvGettable, 0, 1, sisxvdisablecolorkey},
{XvSettable | XvGettable, 0, 1, sisxvusechromakey},
{XvSettable | XvGettable, 0, 1, sisxvinsidechromakey},
+/* {XvSettable | XvGettable, 0, 1, sisxvyuvchromakey}, - NO, Chromakey format = Source format */
{XvSettable | XvGettable, 0, (1 << 24) - 1, sisxvchromamin},
{XvSettable | XvGettable, 0, (1 << 24) - 1, sisxvchromamax},
{ XvGettable, 0, 0xffffffff, sisxvqueryvbflags},
@@ -369,7 +470,7 @@ static XF86AttributeRec SISAttributes_315[NUM_ATTRIBUTES_315] =
{XvSettable | XvGettable, 0, 15, sisxvsdchlumaflickerfilter},
{XvSettable | XvGettable, 0, 1, sisxvsdchcvbscolor},
{XvSettable | XvGettable, 0, 3, sisxvsdchoverscan},
- {XvSettable | XvGettable, 0, 7, sisxvsdenablegamma},
+ {XvSettable | XvGettable, 0, 3, sisxvsdenablegamma},
{XvSettable | XvGettable, -16, 16, sisxvsdtvxscale},
{XvSettable | XvGettable, -4, 3, sisxvsdtvyscale},
{ XvGettable, 0, 0xffffffff, sisxvsdgetscreensize},
@@ -379,17 +480,7 @@ static XF86AttributeRec SISAttributes_315[NUM_ATTRIBUTES_315] =
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrir},
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrig},
{XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrib},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrir2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrig2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorebrib2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrir2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrig2},
- {XvSettable | XvGettable, 100, 10000, sisxvsdstorepbrib2},
{XvSettable | XvGettable, 0, 1, sisxvsdhidehwcursor},
- {XvSettable | XvGettable, 0, 15, sisxvsdpanelmode},
-#ifdef TWDEBUG
- {XvSettable , 0, 0xffffffff, sisxvsetreg},
-#endif
#ifdef SIS_CP
SIS_CP_VIDEO_ATTRIBUTES
#endif
@@ -509,74 +600,6 @@ static XF86ImageRec SISImages[NUM_IMAGES_330] =
};
typedef struct {
- FBLinearPtr linear;
- CARD32 bufAddr[2];
-
- unsigned char currentBuf;
-
- short drw_x, drw_y, drw_w, drw_h;
- short src_x, src_y, src_w, src_h;
- int id;
- short srcPitch, height;
-
- char brightness;
- unsigned char contrast;
- char hue;
- short saturation;
-
- RegionRec clip;
- CARD32 colorKey;
- Bool autopaintColorKey;
-
- Bool disablegfx;
- Bool disablegfxlr;
-
- Bool usechromakey;
- Bool insidechromakey, yuvchromakey;
- CARD32 chromamin, chromamax;
-
- CARD32 videoStatus;
- BOOLEAN overlayStatus;
- Time offTime;
- Time freeTime;
-
- CARD32 displayMode;
- Bool bridgeIsSlave;
-
- Bool hasTwoOverlays; /* Chipset has two overlays */
- Bool dualHeadMode; /* We're running in DHM */
-
- Bool NoOverlay;
- Bool PrevOverlay;
-
- Bool AllowSwitchCRT;
- int crtnum; /* 0=CRT1, 1=CRT2 */
-
- Bool needToScale; /* Need to scale video */
-
- int shiftValue; /* 315/330 series need word addr/pitch, 300 series double word */
-
- short linebufMergeLimit;
- CARD8 linebufmask;
-
- short oldx1, oldx2, oldy1, oldy2;
-#ifdef SISMERGED
- short oldx1_2, oldx2_2, oldy1_2, oldy2_2;
-#endif
- int mustwait;
-
- Bool grabbedByV4L; /* V4L stuff */
- int pitch;
- int offset;
-
- int modeflags; /* Flags field of current display mode */
-
- int tvxpos, tvypos;
- Bool updatetvxpos, updatetvypos;
-
-} SISPortPrivRec, *SISPortPrivPtr;
-
-typedef struct {
int pixelFormat;
CARD16 pitch;
@@ -629,7 +652,7 @@ typedef struct {
CARD8 contrastCtrl;
CARD8 contrastFactor;
- CARD8 (*VBlankActiveFunc)(SISPtr, SISPortPrivPtr);
+ CARD8 (*VBlankActiveFunc)(SISPtr);
#if 0
CARD32 (*GetScanLineFunc)(SISPtr pSiS);
#endif
@@ -651,206 +674,79 @@ typedef struct {
CARD32 MPEG_Y; /* MPEG Y Buffer Addr */
CARD32 MPEG_UV; /* MPEG UV Buffer Addr */
#endif
-
+
} SISOverlayRec, *SISOverlayPtr;
+typedef struct {
+ FBLinearPtr linear;
+ CARD32 bufAddr[2];
+ unsigned char currentBuf;
-/****************************************************************************
- * Raw register access : These routines directly interact with the sis's
- * control aperature. Must not be called until after
- * the board's pci memory has been mapped.
- ****************************************************************************/
-
-#if 0
-static CARD32 _sisread(SISPtr pSiS, CARD32 reg)
-{
- return *(pSiS->IOBase + reg);
-}
-
-static void _siswrite(SISPtr pSiS, CARD32 reg, CARD32 data)
-{
- *(pSiS->IOBase + reg) = data;
-}
-#endif
-
-static CARD8 getsrreg(SISPtr pSiS, CARD8 reg)
-{
- CARD8 ret;
- inSISIDXREG(SISSR, reg, ret);
- return(ret);
-}
-
-static CARD8 getvideoreg(SISPtr pSiS, CARD8 reg)
-{
- CARD8 ret;
- inSISIDXREG(SISVID, reg, ret);
- return(ret);
-}
-
-static __inline void setvideoreg(SISPtr pSiS, CARD8 reg, CARD8 data)
-{
- outSISIDXREG(SISVID, reg, data);
-}
-
-static __inline void setvideoregmask(SISPtr pSiS, CARD8 reg, CARD8 data, CARD8 mask)
-{
- CARD8 old;
- inSISIDXREG(SISVID, reg, old);
- data = (data & mask) | (old & (~mask));
- outSISIDXREG(SISVID, reg, data);
-}
-
-static void setsrregmask(SISPtr pSiS, CARD8 reg, CARD8 data, CARD8 mask)
-{
- CARD8 old;
-
- inSISIDXREG(SISSR, reg, old);
- data = (data & mask) | (old & (~mask));
- outSISIDXREG(SISSR, reg, data);
-}
-
-/* VBlank */
-static CARD8 vblank_active_CRT1(SISPtr pSiS, SISPortPrivPtr pPriv)
-{
- return(inSISREG(SISINPSTAT) & 0x08);
-}
-
-static CARD8 vblank_active_CRT2(SISPtr pSiS, SISPortPrivPtr pPriv)
-{
- CARD8 ret;
-
- if(pPriv->bridgeIsSlave) return(vblank_active_CRT1(pSiS, pPriv));
-
- if(pSiS->VGAEngine == SIS_315_VGA) {
- inSISIDXREG(SISPART1, 0x30, ret);
- } else {
- inSISIDXREG(SISPART1, 0x25, ret);
- }
- return((ret & 0x02) ^ 0x02);
-}
-
-/* Scanline - unused */
-#if 0
-static CARD32 get_scanline_CRT1(SISPtr pSiS)
-{
- CARD32 line;
-
- _siswrite (pSiS, REG_PRIM_CRT_COUNTER, 0x00000001);
- line = _sisread (pSiS, REG_PRIM_CRT_COUNTER);
-
- return ((line >> 16) & 0x07FF);
-}
-
-static CARD32 get_scanline_CRT2(SISPtr pSiS)
-{
- CARD32 line;
+ short drw_x, drw_y, drw_w, drw_h;
+ short src_x, src_y, src_w, src_h;
+ int id;
+ short srcPitch, height;
+
+ char brightness;
+ unsigned char contrast;
+ char hue;
+ char saturation;
- line = (CARD32)(getsisreg(pSiS, SISPART1, Index_CRT2_FC_VCount1) & 0x70) * 16
- + getsisreg(pSiS, SISPART1, Index_CRT2_FC_VCount);
+ RegionRec clip;
+ CARD32 colorKey;
+ Bool autopaintColorKey;
- return line;
-}
-#endif
+ Bool disablegfx;
+ Bool disablegfxlr;
-static void
-SiSComputeXvGamma(SISPtr pSiS)
-{
- int num = 255, i;
- double red = 1.0 / (double)((double)pSiS->XvGammaRed / 1000);
- double green = 1.0 / (double)((double)pSiS->XvGammaGreen / 1000);
- double blue = 1.0 / (double)((double)pSiS->XvGammaBlue / 1000);
+ Bool usechromakey;
+ Bool insidechromakey, yuvchromakey;
+ CARD32 chromamin, chromamax;
- for(i = 0; i <= num; i++) {
- pSiS->XvGammaRampRed[i] =
- (red == 1.0) ? i : (CARD8)(pow((double)i / (double)num, red) * (double)num + 0.5);
+ CARD32 videoStatus;
+ BOOLEAN overlayStatus;
+ Time offTime;
+ Time freeTime;
- pSiS->XvGammaRampGreen[i] =
- (green == 1.0) ? i : (CARD8)(pow((double)i / (double)num, green) * (double)num + 0.5);
+ CARD32 displayMode;
+ Bool bridgeIsSlave;
- pSiS->XvGammaRampBlue[i] =
- (blue == 1.0) ? i : (CARD8)(pow((double)i / (double)num, blue) * (double)num + 0.5);
- }
-}
+ Bool hasTwoOverlays; /* Chipset has two overlays */
+ Bool dualHeadMode; /* We're running in DHM */
+
+ Bool NoOverlay;
+ Bool PrevOverlay;
+
+ Bool AllowSwitchCRT;
+ int crtnum; /* 0=CRT1, 1=CRT2 */
-static void
-SiSSetXvGamma(SISPtr pSiS)
-{
- int i;
- unsigned char backup = getsrreg(pSiS, 0x1f);
- setsrregmask(pSiS, 0x1f, 0x08, 0x18);
- for(i = 0; i <= 255; i++) {
- MMIO_OUT32(pSiS->IOBase, 0x8570,
- (i << 24) |
- (pSiS->XvGammaRampBlue[i] << 16) |
- (pSiS->XvGammaRampGreen[i] << 8) |
- pSiS->XvGammaRampRed[i]);
- }
- setsrregmask(pSiS, 0x1f, backup, 0xff);
-}
+ Bool needToScale; /* Need to scale video */
-static void
-SiSUpdateXvGamma(SISPtr pSiS, SISPortPrivPtr pPriv)
-{
- unsigned char sr7 = getsrreg(pSiS, 0x07);
+ int shiftValue; /* 315/330 series need word addr/pitch, 300 series double word */
- if(!pSiS->XvGamma) return;
- if(!(pSiS->MiscFlags & MISC_CRT1OVERLAYGAMMA)) return;
+ short linebufMergeLimit;
+ CARD8 linebufmask;
-#ifdef SISDUALHEAD
- if((pPriv->dualHeadMode) && (!pSiS->SecondHead)) return;
+ short oldx1, oldx2, oldy1, oldy2;
+#ifdef SISMERGED
+ short oldx1_2, oldx2_2, oldy1_2, oldy2_2;
#endif
+ int mustwait;
- if(!(sr7 & 0x04)) return;
-
- SiSComputeXvGamma(pSiS);
- SiSSetXvGamma(pSiS);
-}
-
-static void
-SISResetXvGamma(ScrnInfoPtr pScrn)
-{
- SISPtr pSiS = SISPTR(pScrn);
- SISPortPrivPtr pPriv = GET_PORT_PRIVATE(pScrn);
-
- SiSUpdateXvGamma(pSiS, pPriv);
-}
-
-void SISInitVideo(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
- XF86VideoAdaptorPtr newAdaptor = NULL;
- int num_adaptors;
-
- newAdaptor = SISSetupImageVideo(pScreen);
- if(newAdaptor)
- SISInitOffscreenImages(pScreen);
+ Bool grabbedByV4L; /* V4L stuff */
+ int pitch;
+ int offset;
- num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
+ int modeflags; /* Flags field of current display mode */
- if(newAdaptor) {
- if(!num_adaptors) {
- num_adaptors = 1;
- adaptors = &newAdaptor;
- } else {
- /* need to free this someplace */
- newAdaptors = xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr*));
- if(newAdaptors) {
- memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr));
- newAdaptors[num_adaptors] = newAdaptor;
- adaptors = newAdaptors;
- num_adaptors++;
- }
- }
- }
+ int tvxpos, tvypos;
+ Bool updatetvxpos, updatetvypos;
- if(num_adaptors)
- xf86XVScreenInit(pScreen, adaptors, num_adaptors);
+} SISPortPrivRec, *SISPortPrivPtr;
- if(newAdaptors)
- xfree(newAdaptors);
-}
+#define GET_PORT_PRIVATE(pScrn) \
+ (SISPortPrivPtr)((SISPTR(pScrn))->adaptor->pPortPrivates[0].ptr)
static void
SISSetPortDefaults(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
@@ -893,19 +789,12 @@ SISSetPortDefaults(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
#ifdef SIS_CP
SIS_CP_VIDEO_DEF
#endif
- if(pPriv->dualHeadMode) {
-#ifdef SISDUALHEAD
+ if(pPriv->dualHeadMode)
pPriv->crtnum =
pSiSEnt->curxvcrtnum =
pSiSEnt->XvOnCRT2 ? 1 : 0;
-#endif
- } else
+ else
pPriv->crtnum = pSiS->XvOnCRT2 ? 1 : 0;
-
- pSiS->XvGammaRed = pSiS->XvGammaRedDef;
- pSiS->XvGammaGreen = pSiS->XvGammaGreenDef;
- pSiS->XvGammaBlue = pSiS->XvGammaBlueDef;
- SiSUpdateXvGamma(pSiS, pPriv);
}
static void
@@ -960,20 +849,16 @@ SISResetVideo(ScrnInfoPtr pScrn)
setvideoreg(pSiS, Index_VI_Play_Threshold_Low, 0x00);
setvideoreg(pSiS, Index_VI_Play_Threshold_High, 0x00);
- if(pSiS->Chipset == PCI_CHIP_SIS330) {
+ if((pSiS->Chipset == PCI_CHIP_SIS330) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ /* What does this do? */
setvideoregmask(pSiS, Index_VI_Key_Overlay_OP, 0x00, 0x10);
- } else if(pSiS->Chipset == PCI_CHIP_SIS660) {
- setvideoregmask(pSiS, Index_VI_Key_Overlay_OP, 0x00, 0xE0);
- }
- if(pSiS->sishw_ext.jChipType == SIS_661) {
- setvideoregmask(pSiS, Index_VI_V_Buf_Start_Over, 0x2c, 0x3c);
}
- if((pSiS->ChipFlags & SiSCF_Is65x) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ if(pSiS->ChipFlags & SiSCF_Is65x) {
setvideoregmask(pSiS, Index_VI_Control_Misc2, 0x00, 0x04);
}
- /* Initialize second overlay (CRT2) - only for 300, 630/730, 550, M650/651, 661/741/660/760 */
+ /* Initialize second overlay (CRT2) ---- only for 300, 630/730, 550, M650/651/652/653, 660 */
if(pPriv->hasTwoOverlays) {
if(pSiS->VGAEngine == SIS_300_VGA) {
@@ -993,6 +878,8 @@ SISResetVideo(ScrnInfoPtr pScrn)
/* Select RGB chroma key format */
if(pSiS->VGAEngine == SIS_300_VGA) {
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x40);
+ } else {
+ /* setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x01, 0x01); */
}
/* Reset scale control and contrast */
@@ -1008,15 +895,10 @@ SISResetVideo(ScrnInfoPtr pScrn)
setvideoreg(pSiS, Index_VI_Play_Threshold_Low, 0x00);
setvideoreg(pSiS, Index_VI_Play_Threshold_High, 0x00);
- if(pSiS->Chipset == PCI_CHIP_SIS330) {
+ if((pSiS->Chipset == PCI_CHIP_SIS330) || (pSiS->Chipset == PCI_CHIP_SIS660)) {
+ /* What does this do? */
setvideoregmask(pSiS, Index_VI_Key_Overlay_OP, 0x00, 0x10);
- } else if(pSiS->Chipset == PCI_CHIP_SIS660) {
- setvideoregmask(pSiS, Index_VI_Key_Overlay_OP, 0x00, 0xE0);
}
- if(pSiS->sishw_ext.jChipType == SIS_661) {
- setvideoregmask(pSiS, Index_VI_V_Buf_Start_Over, 0x24, 0x3c);
- }
-
}
/* set default properties for overlay 1 (CRT1) -------------------------- */
@@ -1030,18 +912,13 @@ SISResetVideo(ScrnInfoPtr pScrn)
/* set default properties for overlay 2(CRT2) -------------------------- */
if(pPriv->hasTwoOverlays) {
- setvideoregmask(pSiS, Index_VI_Control_Misc2, 0x01, 0x01);
- setvideoregmask(pSiS, Index_VI_Contrast_Enh_Ctrl, 0x04, 0x07);
- setvideoreg(pSiS, Index_VI_Brightness, 0x20);
- if(pSiS->VGAEngine == SIS_315_VGA) {
- setvideoreg(pSiS, Index_VI_Hue, 0x00);
- setvideoreg(pSiS, Index_VI_Saturation, 0x00);
- }
- }
-
- /* Reset Xv gamma correction */
- if(pSiS->VGAEngine == SIS_315_VGA) {
- SiSUpdateXvGamma(pSiS, pPriv);
+ setvideoregmask(pSiS, Index_VI_Control_Misc2, 0x01, 0x01);
+ setvideoregmask(pSiS, Index_VI_Contrast_Enh_Ctrl, 0x04, 0x07);
+ setvideoreg(pSiS, Index_VI_Brightness, 0x20);
+ if(pSiS->VGAEngine == SIS_315_VGA) {
+ setvideoreg(pSiS, Index_VI_Hue, 0x00);
+ setvideoreg(pSiS, Index_VI_Saturation, 0x00);
+ }
}
}
@@ -1063,27 +940,27 @@ set_dispmode(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
if( (pSiS->VBFlags & VB_DISPMODE_MIRROR) ||
((pPriv->bridgeIsSlave) && (pSiS->VBFlags & DISPTYPE_DISP2)) ) {
- if(pPriv->hasTwoOverlays)
- pPriv->displayMode = DISPMODE_MIRROR; /* CRT1+CRT2 (2 overlays) */
- else if(pPriv->crtnum)
- pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
- else
- pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
+ if(pPriv->hasTwoOverlays)
+ pPriv->displayMode = DISPMODE_MIRROR; /* CRT1+CRT2 (2 overlays) */
+ else if(pPriv->crtnum)
+ pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
+ else
+ pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
} else {
#ifdef SISDUALHEAD
- if(pSiS->DualHeadMode) {
- pPriv->dualHeadMode = TRUE;
- if(pSiS->SecondHead)
- pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
- else
- pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
- } else
+ if(pSiS->DualHeadMode) {
+ pPriv->dualHeadMode = TRUE;
+ if(pSiS->SecondHead)
+ pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
+ else
+ pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
+ } else
#endif
- if(pSiS->VBFlags & DISPTYPE_DISP1) {
- pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
- } else {
- pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
- }
+ if(pSiS->VBFlags & DISPTYPE_DISP1) {
+ pPriv->displayMode = DISPMODE_SINGLE1; /* CRT1 only */
+ } else {
+ pPriv->displayMode = DISPMODE_SINGLE2; /* CRT2 only */
+ }
}
}
@@ -1212,28 +1089,16 @@ set_maxencoding(SISPtr pSiS, SISPortPrivPtr pPriv)
*/
#ifdef SISDUALHEAD
if(pSiS->DualHeadMode) {
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- DummyEncoding.width = 1536;
- } else {
- DummyEncoding.width >>= 1;
- }
+ DummyEncoding.width >>= 1;
} else
#endif
#ifdef SISMERGED
if(pSiS->MergedFB) {
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- DummyEncoding.width = 1536;
- } else {
- DummyEncoding.width >>= 1;
- }
+ DummyEncoding.width >>= 1;
} else
#endif
if(pPriv->displayMode == DISPMODE_MIRROR) {
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- DummyEncoding.width = 1536;
- } else {
- DummyEncoding.width >>= 1;
- }
+ DummyEncoding.width >>= 1;
}
}
}
@@ -1321,11 +1186,7 @@ SISSetupImageVideo(ScreenPtr pScreen)
pPriv->PrevOverlay = FALSE;
/* gotta uninit this someplace */
-#if defined(REGION_NULL)
- REGION_NULL(pScreen, &pPriv->clip);
-#else
- REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);
-#endif
+ REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);
pSiS->adaptor = adapt;
@@ -1341,9 +1202,6 @@ SISSetupImageVideo(ScreenPtr pScreen)
pSiS->xvDisableGfxLR = MAKE_ATOM(sisxvdisablegfxlr);
pSiS->xvTVXPosition = MAKE_ATOM(sisxvtvxposition);
pSiS->xvTVYPosition = MAKE_ATOM(sisxvtvyposition);
- pSiS->xvGammaRed = MAKE_ATOM(sisxvgammared);
- pSiS->xvGammaGreen = MAKE_ATOM(sisxvgammagreen);
- pSiS->xvGammaBlue = MAKE_ATOM(sisxvgammablue);
pSiS->xvDisableColorkey = MAKE_ATOM(sisxvdisablecolorkey);
pSiS->xvUseChromakey = MAKE_ATOM(sisxvusechromakey);
pSiS->xvInsideChromakey = MAKE_ATOM(sisxvinsidechromakey);
@@ -1385,22 +1243,12 @@ SISSetupImageVideo(ScreenPtr pScreen)
pSiS->xv_PBR = MAKE_ATOM(sisxvsdstorepbrir);
pSiS->xv_PBG = MAKE_ATOM(sisxvsdstorepbrig);
pSiS->xv_PBB = MAKE_ATOM(sisxvsdstorepbrib);
- pSiS->xv_BRR2 = MAKE_ATOM(sisxvsdstorebrir2);
- pSiS->xv_BRG2 = MAKE_ATOM(sisxvsdstorebrig2);
- pSiS->xv_BRB2 = MAKE_ATOM(sisxvsdstorebrib2);
- pSiS->xv_PBR2 = MAKE_ATOM(sisxvsdstorepbrir2);
- pSiS->xv_PBG2 = MAKE_ATOM(sisxvsdstorepbrig2);
- pSiS->xv_PBB2 = MAKE_ATOM(sisxvsdstorepbrib2);
pSiS->xv_SHC = MAKE_ATOM(sisxvsdhidehwcursor);
- pSiS->xv_PMD = MAKE_ATOM(sisxvsdpanelmode);
-#ifdef TWDEBUG
- pSiS->xv_STR = MAKE_ATOM(sisxvsetreg);
-#endif
#ifdef SIS_CP
SIS_CP_VIDEO_ATOMS
#endif
- pSiS->xv_sisdirectunlocked = 0;
+ pSiS->xv_sisdirectunlocked = FALSE;
pSiS->xv_sd_result = 0;
/* 300 series require double words for addresses and pitches,
@@ -1423,13 +1271,13 @@ SISSetupImageVideo(ScreenPtr pScreen)
* All chipsets have a certain number of linebuffers, each of a certain
* size. The number of buffers is per overlay.
* Chip number size max video size
- * 300 2 ? 720x576
- * 630/730 2 ? 720x576
+ * 300 2 ? ?
+ * 630/730 2 ? ?
* 315 2 960? 1920x1080
* 650/740 2 960 ("120x128") 1920x1080
* M650/651.. 4 480 1920x1080
- * 330 2 960 1920x1080
- * 661/741/760 4 768 1920x1080
+ * 330 2 960? 1920x1080?
+ * 660 ? ? ?
* The unit of size is unknown; I just know that a size of 480 limits
* the video source width to 384. Beyond that, line buffers must be
* merged (otherwise the video output is garbled).
@@ -1439,13 +1287,10 @@ SISSetupImageVideo(ScreenPtr pScreen)
* either only CRT1 or only CRT2 is used.
* If both overlays are going to be used (such as in modes were both
* CRT1 and CRT2 are active), we are limited to the half of the
- * maximum width, or 1536 on 661/741/760.
+ * maximum width.
*/
pPriv->linebufMergeLimit = LINEBUFLIMIT1;
- if(pSiS->Chipset == PCI_CHIP_SIS660) {
- pPriv->linebufMergeLimit = LINEBUFLIMIT3;
- }
set_maxencoding(pSiS, pPriv);
@@ -1468,10 +1313,6 @@ SISSetupImageVideo(ScreenPtr pScreen)
set_disptype_regs(pScrn, pPriv);
SISResetVideo(pScrn);
- pSiS->ResetXv = SISResetVideo;
- if(pSiS->VGAEngine == SIS_315_VGA) {
- pSiS->ResetXvGamma = SISResetXvGamma;
- }
return adapt;
}
@@ -1591,22 +1432,16 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
} else if(attribute == pSiS->xvChromaMax) {
pPriv->chromamax = value;
} else if(attribute == pSiS->xv_USD) {
- if(pSiS->enablesisctrl) {
- if(value == SIS_DIRECTKEY) {
- pSiS->xv_sisdirectunlocked++;
- } else if(pSiS->xv_sisdirectunlocked) {
- pSiS->xv_sisdirectunlocked--;
- }
- } else {
- pSiS->xv_sisdirectunlocked = 0;
- }
+ if((pSiS->enablesisctrl) && (value == SIS_DIRECTKEY))
+ pSiS->xv_sisdirectunlocked = TRUE;
+ else
+ pSiS->xv_sisdirectunlocked = FALSE;
} else if(attribute == pSiS->xv_SVF) {
#ifdef SISDUALHEAD
if(!pPriv->dualHeadMode)
#endif
if(pSiS->xv_sisdirectunlocked) {
SISSwitchCRT2Type(pScrn, (unsigned long)value);
- set_dispmode(pScrn, pPriv);
set_allowswitchcrt(pSiS, pPriv);
set_maxencoding(pSiS, pPriv);
}
@@ -1616,7 +1451,6 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
#endif
if(pSiS->xv_sisdirectunlocked) {
SISSwitchCRT1Status(pScrn, (unsigned long)value);
- set_dispmode(pScrn, pPriv);
set_allowswitchcrt(pSiS, pPriv);
set_maxencoding(pSiS, pPriv);
}
@@ -1682,30 +1516,26 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
}
} else if(attribute == pSiS->xv_CMD) {
if(pSiS->xv_sisdirectunlocked) {
- int result = 0;
pSiS->xv_sd_result = (value & 0xffffff00);
- result = SISCheckModeIndexForCRT2Type(pScrn, (unsigned short)(value & 0xff),
- (unsigned short)((value >> 8) & 0xff),
- FALSE);
- pSiS->xv_sd_result |= (result & 0xff);
+ if(SISCheckModeIndexForCRT2Type(pScrn, (unsigned short)(value & 0xff),
+ (unsigned short)((value >> 8) & 0xff),
+ FALSE)) {
+ pSiS->xv_sd_result |= 0x01;
+ }
}
} else if(attribute == pSiS->xv_SGA) {
if(pSiS->xv_sisdirectunlocked) {
- Bool backup = pSiS->XvGamma;
- pSiS->CRT1gamma = (value & 0x01) ? TRUE : FALSE;
- pSiS->CRT2gamma = (value & 0x02) ? TRUE : FALSE;
- pSiS->XvGamma = (value & 0x04) ? TRUE : FALSE;
#ifdef SISDUALHEAD
if(pPriv->dualHeadMode) {
- pSiSEnt->CRT1gamma = pSiS->CRT1gamma;
- pSiSEnt->CRT2gamma = pSiS->CRT2gamma;
+ pSiSEnt->CRT1gamma = (value & 0x01) ? TRUE : FALSE;
+ pSiSEnt->CRT2gamma = (value & 0x02) ? TRUE : FALSE;
+ } else {
+#endif
+ pSiS->CRT1gamma = (value & 0x01) ? TRUE : FALSE;
+ pSiS->CRT2gamma = (value & 0x02) ? TRUE : FALSE;
+#ifdef SISDUALHEAD
}
#endif
- if(pSiS->VGAEngine == SIS_315_VGA) {
- if(backup != pSiS->XvGamma) {
- SiSUpdateXvGamma(pSiS, pPriv);
- }
- }
}
} else if(attribute == pSiS->xv_TXS) {
if((value < -16) || (value > 16))
@@ -1755,54 +1585,6 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
if(pSiS->xv_sisdirectunlocked) {
pSiS->GammaPBriB = value;
}
- } else if(attribute == pSiS->xv_BRR2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaBriR = value;
-#endif
- }
- } else if(attribute == pSiS->xv_BRG2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaBriG = value;
-#endif
- }
- } else if(attribute == pSiS->xv_BRB2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaBriB = value;
-#endif
- }
- } else if(attribute == pSiS->xv_PBR2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaPBriR = value;
-#endif
- }
- } else if(attribute == pSiS->xv_PBG2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaPBriG = value;
-#endif
- }
- } else if(attribute == pSiS->xv_PBB2) {
- if((value < 100) || (value > 10000))
- return BadValue;
- if(pSiS->xv_sisdirectunlocked) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) pSiSEnt->GammaPBriB = value;
-#endif
- }
} else if(attribute == pSiS->xv_SHC) {
if(pSiS->xv_sisdirectunlocked) {
Bool VisibleBackup = pSiS->HWCursorIsVisible;
@@ -1818,35 +1600,6 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
pSiS->HWCursorIsVisible = VisibleBackup;
}
}
- } else if(attribute == pSiS->xv_PMD) {
- if(pSiS->xv_sisdirectunlocked) {
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) {
- if(value & 0x01) pSiS->SiS_Pr->UsePanelScaler = -1;
- else if(value & 0x02) pSiS->SiS_Pr->UsePanelScaler = 1;
- else pSiS->SiS_Pr->UsePanelScaler = 0;
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) {
- if(value & 0x04) pSiS->SiS_Pr->CenterScreen = -1;
- else if(value & 0x08) pSiS->SiS_Pr->CenterScreen = 1;
- else pSiS->SiS_Pr->CenterScreen = 0;
- }
- }
- }
-#ifdef TWDEBUG
- } else if(attribute == pSiS->xv_STR) {
- unsigned short port;
- switch((value & 0xff000000) >> 24) {
- case 0x00: port = SISSR; break;
- case 0x01: port = SISPART1; break;
- case 0x02: port = SISPART2; break;
- case 0x03: port = SISPART3; break;
- case 0x04: port = SISPART4; break;
- case 0x05: port = SISCR; break;
- case 0x06: port = SISVID; break;
- default: return BadValue;
- }
- outSISIDXREG(port,((value & 0x00ff0000) >> 16), ((value & 0x0000ff00) >> 8));
- return Success;
-#endif
#ifdef SIS_CP
SIS_CP_VIDEO_SETATTRIBUTE
#endif
@@ -1862,35 +1615,20 @@ SISSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
}
} else if(attribute == pSiS->xvHue) {
if((value < -8) || (value > 7))
- return BadValue;
+ return BadValue;
pPriv->hue = value;
} else if(attribute == pSiS->xvSaturation) {
if((value < -7) || (value > 7))
- return BadValue;
+ return BadValue;
pPriv->saturation = value;
- } else if(attribute == pSiS->xvGammaRed) {
- if((value < 100) || (value > 10000))
- return BadValue;
- pSiS->XvGammaRed = value;
- SiSUpdateXvGamma(pSiS, pPriv);
- } else if(attribute == pSiS->xvGammaGreen) {
- if((value < 100) || (value > 10000))
- return BadValue;
- pSiS->XvGammaGreen = value;
- SiSUpdateXvGamma(pSiS, pPriv);
- } else if(attribute == pSiS->xvGammaBlue) {
- if((value < 100) || (value > 10000))
- return BadValue;
- pSiS->XvGammaBlue = value;
- SiSUpdateXvGamma(pSiS, pPriv);
} else return BadMatch;
} else return BadMatch;
return Success;
}
-static int
+static int
SISGetPortAttribute(
- ScrnInfoPtr pScrn,
+ ScrnInfoPtr pScrn,
Atom attribute,
INT32 *value,
pointer data
@@ -1899,7 +1637,7 @@ SISGetPortAttribute(
SISPtr pSiS = SISPTR(pScrn);
#ifdef SISDUALHEAD
SISEntPtr pSiSEnt = pSiS->entityPrivate;;
-#endif
+#endif
if(attribute == pSiS->xvBrightness) {
*value = pPriv->brightness;
@@ -1946,7 +1684,7 @@ SISGetPortAttribute(
} else if(attribute == pSiS->xv_GSF) {
*value = pSiS->SiS_SD_Flags;
} else if(attribute == pSiS->xv_USD) {
- *value = pSiS->xv_sisdirectunlocked;
+ *value = pSiS->xv_sisdirectunlocked ? 1 : 0;
} else if(attribute == pSiS->xv_TAF) {
*value = SiS_GetSISTVantiflicker(pScrn);
} else if(attribute == pSiS->xv_TSA) {
@@ -1974,7 +1712,6 @@ SISGetPortAttribute(
} else if(attribute == pSiS->xv_CMDR) {
*value = pSiS->xv_sd_result;
} else if(attribute == pSiS->xv_OVR) {
- /* Changing of CRT2 settings not supported in DHM! */
*value = 0;
if(pSiS->OptTVSOver == 1) *value = 3;
else if(pSiS->UseCHOverScan == 1) *value = 2;
@@ -1991,7 +1728,6 @@ SISGetPortAttribute(
if(pSiS->CRT2gamma) *value |= 0x02;
#ifdef SISDUALHEAD
}
- if(pSiS->XvGamma) *value |= 0x04;
#endif
} else if(attribute == pSiS->xv_TXS) {
*value = SiS_GetTVxscale(pScrn);
@@ -2011,58 +1747,8 @@ SISGetPortAttribute(
*value = pSiS->GammaPBriG;
} else if(attribute == pSiS->xv_PBB) {
*value = pSiS->GammaPBriB;
- } else if(attribute == pSiS->xv_BRR2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriR;
- else
-#endif
- *value = pSiS->GammaBriR;
- } else if(attribute == pSiS->xv_BRG2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriG;
- else
-#endif
- *value = pSiS->GammaBriG;
- } else if(attribute == pSiS->xv_BRB2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaBriB;
- else
-#endif
- *value = pSiS->GammaBriB;
- } else if(attribute == pSiS->xv_PBR2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaPBriR;
- else
-#endif
- *value = pSiS->GammaPBriR;
- } else if(attribute == pSiS->xv_PBG2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaPBriG;
- else
-#endif
- *value = pSiS->GammaPBriG;
- } else if(attribute == pSiS->xv_PBB2) {
-#ifdef SISDUALHEAD
- if(pPriv->dualHeadMode) *value = pSiSEnt->GammaPBriB;
- else
-#endif
- *value = pSiS->GammaPBriB;
} else if(attribute == pSiS->xv_SHC) {
*value = pSiS->HideHWCursor ? 1 : 0;
- } else if(attribute == pSiS->xv_PMD) {
- *value = 0;
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTSCALE) {
- switch(pSiS->SiS_Pr->UsePanelScaler) {
- case -1: *value |= 0x01; break;
- case 1: *value |= 0x02; break;
- }
- if(pSiS->SiS_SD_Flags & SiS_SD_SUPPORTCENTER) {
- switch(pSiS->SiS_Pr->CenterScreen) {
- case -1: *value |= 0x04; break;
- case 1: *value |= 0x08; break;
- }
- }
- }
#ifdef SIS_CP
SIS_CP_VIDEO_GETATTRIBUTE
#endif
@@ -2078,12 +1764,6 @@ SISGetPortAttribute(
*value = pPriv->hue;
} else if(attribute == pSiS->xvSaturation) {
*value = pPriv->saturation;
- } else if(attribute == pSiS->xvGammaRed) {
- *value = pSiS->XvGammaRed;
- } else if(attribute == pSiS->xvGammaGreen) {
- *value = pSiS->XvGammaGreen;
- } else if(attribute == pSiS->xvGammaBlue) {
- *value = pSiS->XvGammaBlue;
} else return BadMatch;
} else return BadMatch;
return Success;
@@ -2115,10 +1795,12 @@ SiSHandleSiSDirectCommand(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv, sisdirectcomm
break;
case SDC_CMD_CHECKMODEFORCRT2:
j = sdcbuf->sdc_parm[0];
- sdcbuf->sdc_parm[0] = SISCheckModeIndexForCRT2Type(pScrn,
- (unsigned short)(j & 0xff),
- (unsigned short)((j >> 8) & 0xff),
- FALSE) & 0xff;
+ sdcbuf->sdc_parm[0] = 0;
+ if(SISCheckModeIndexForCRT2Type(pScrn, (unsigned short)(j & 0xff),
+ (unsigned short)((j >> 8) & 0xff),
+ FALSE)) {
+ sdcbuf->sdc_parm[0] = 1;
+ }
break;
default:
sdcbuf->sdc_header = SDC_RESULT_UNDEFCMD;
@@ -2158,17 +1840,16 @@ calc_scale_factor(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
int origdstH = dstH;
int modeflags = pOverlay->currentmode->Flags;
- /* Stretch image due to panel link scaling */
- if(pSiS->VBFlags & (CRT2_LCD | CRT1_LCDA)) {
+ /* TW: Stretch image due to panel link scaling */
+ if(pSiS->VBFlags & CRT2_LCD) {
if(pPriv->bridgeIsSlave) {
if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
if(pSiS->MiscFlags & MISC_PANELLINKSCALER) {
dstH = (dstH * LCDheight) / pOverlay->SCREENheight;
}
}
- } else if((iscrt2 && (pSiS->VBFlags & CRT2_LCD)) ||
- (!iscrt2 && (pSiS->VBFlags & CRT1_LCDA))) {
- if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH | CRT1_LCDA)) {
+ } else if(iscrt2) {
+ if(pSiS->VBFlags & (VB_LVDS | VB_30xBDH)) {
if(pSiS->MiscFlags & MISC_PANELLINKSCALER) {
dstH = (dstH * LCDheight) / pOverlay->SCREENheight;
if(pPriv->displayMode == DISPMODE_MIRROR) flag = 1;
@@ -2182,16 +1863,16 @@ calc_scale_factor(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
* Interlace mode vice versa.
*/
if(modeflags & V_DBLSCAN) {
- dstH = origdstH << 1;
- flag = 0;
- if((pSiS->sishw_ext.jChipType >= SIS_315H) &&
- (pSiS->sishw_ext.jChipType <= SIS_550)) {
- dstW <<= 1;
- }
+ dstH = origdstH << 1;
+ flag = 0;
+ if((pSiS->sishw_ext.jChipType >= SIS_315H) &&
+ (pSiS->sishw_ext.jChipType <= SIS_550)) {
+ dstW <<= 1;
+ }
}
if(modeflags & V_INTERLACE) {
- dstH = origdstH >> 1;
- flag = 0;
+ dstH = origdstH >> 1;
+ flag = 0;
}
#if 0
@@ -2201,80 +1882,80 @@ calc_scale_factor(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
if(dstW < OVERLAY_MIN_WIDTH) dstW = OVERLAY_MIN_WIDTH;
if(dstW == srcW) {
- pOverlay->HUSF = 0x00;
- pOverlay->IntBit = 0x05;
- pOverlay->wHPre = 0;
+ pOverlay->HUSF = 0x00;
+ pOverlay->IntBit = 0x05;
+ pOverlay->wHPre = 0;
} else if(dstW > srcW) {
- dstW += 2;
- pOverlay->HUSF = (srcW << 16) / dstW;
- pOverlay->IntBit = 0x04;
- pOverlay->wHPre = 0;
+ dstW += 2;
+ pOverlay->HUSF = (srcW << 16) / dstW;
+ pOverlay->IntBit = 0x04;
+ pOverlay->wHPre = 0;
} else {
- int tmpW = dstW;
+ int tmpW = dstW;
- /* It seems, the hardware can't scale below factor .125 (=1/8) if the
- pitch isn't a multiple of 256.
- TODO: Test this on the 315 series!
- */
- if((srcPitch % 256) || (srcPitch < 256)) {
- if(((dstW * 1000) / srcW) < 125) dstW = tmpW = ((srcW * 125) / 1000) + 1;
- }
+ /* It seems, the hardware can't scale below factor .125 (=1/8) if the
+ pitch isn't a multiple of 256.
+ TODO: Test this on the 315 series!
+ */
+ if((srcPitch % 256) || (srcPitch < 256)) {
+ if(((dstW * 1000) / srcW) < 125) dstW = tmpW = ((srcW * 125) / 1000) + 1;
+ }
- I = 0;
- pOverlay->IntBit = 0x01;
- while(srcW >= tmpW) {
- tmpW <<= 1;
- I++;
- }
- pOverlay->wHPre = (CARD8)(I - 1);
- dstW <<= (I - 1);
- if((srcW % dstW))
- pOverlay->HUSF = ((srcW - dstW) << 16) / dstW;
- else
- pOverlay->HUSF = 0x00;
+ I = 0;
+ pOverlay->IntBit = 0x01;
+ while (srcW >= tmpW) {
+ tmpW <<= 1;
+ I++;
+ }
+ pOverlay->wHPre = (CARD8)(I - 1);
+ dstW <<= (I - 1);
+ if((srcW % dstW))
+ pOverlay->HUSF = ((srcW - dstW) << 16) / dstW;
+ else
+ pOverlay->HUSF = 0x00;
}
if(dstH < OVERLAY_MIN_HEIGHT) dstH = OVERLAY_MIN_HEIGHT;
if(dstH == srcH) {
- pOverlay->VUSF = 0x00;
- pOverlay->IntBit |= 0x0A;
+ pOverlay->VUSF = 0x00;
+ pOverlay->IntBit |= 0x0A;
} else if(dstH > srcH) {
- dstH += 0x02;
- pOverlay->VUSF = (srcH << 16) / dstH;
- pOverlay->IntBit |= 0x08;
+ dstH += 0x02;
+ pOverlay->VUSF = (srcH << 16) / dstH;
+ pOverlay->IntBit |= 0x08;
} else {
+ CARD32 realI;
- I = srcH / dstH;
- pOverlay->IntBit |= 0x02;
+ I = realI = srcH / dstH;
+ pOverlay->IntBit |= 0x02;
- if(I < 2) {
- pOverlay->VUSF = ((srcH - dstH) << 16) / dstH;
- /* TW: Needed for LCD-scaling modes */
- if((flag) && (mult = (srcH / origdstH)) >= 2) {
- pOverlay->pitch /= mult;
- }
- } else {
+ if(I < 2) {
+ pOverlay->VUSF = ((srcH - dstH) << 16) / dstH;
+ /* TW: Needed for LCD-scaling modes */
+ if((flag) && (mult = (srcH / origdstH)) >= 2)
+ pOverlay->pitch /= mult;
+ } else {
#if 0
- if(((pOverlay->bobEnable & 0x08) == 0x00) &&
- (((srcPitch * I)>>2) > 0xFFF)){
- pOverlay->bobEnable |= 0x08;
- srcPitch >>= 1;
- }
+ if(((pOverlay->bobEnable & 0x08) == 0x00) &&
+ (((srcPitch * I)>>2) > 0xFFF)){
+ pOverlay->bobEnable |= 0x08;
+ srcPitch >>= 1;
+ }
#endif
- if(((srcPitch * I)>>2) > 0xFFF) {
- I = (0xFFF*2/srcPitch);
- pOverlay->VUSF = 0xFFFF;
- } else {
- dstH = I * dstH;
- if(srcH % dstH)
- pOverlay->VUSF = ((srcH - dstH) << 16) / dstH;
- else
- pOverlay->VUSF = 0x00;
+ if(((srcPitch * I)>>2) > 0xFFF) {
+ I = (0xFFF*2/srcPitch);
+ pOverlay->VUSF = 0xFFFF;
+ } else {
+ dstH = I * dstH;
+ if(srcH % dstH)
+ pOverlay->VUSF = ((srcH - dstH) << 16) / dstH;
+ else
+ pOverlay->VUSF = 0x00;
+ }
+ /* set video frame buffer offset */
+ pOverlay->pitch = (CARD16)(srcPitch*I);
}
- /* set video frame buffer offset */
- pOverlay->pitch = (CARD16)(srcPitch*I);
- }
- }
+ }
}
#ifdef SISMERGED
@@ -2309,16 +1990,16 @@ calc_scale_factor_2(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
* Interlace mode vice versa.
*/
if(modeflags & V_DBLSCAN) {
- dstH = origdstH << 1;
- flag = 0;
- if((pSiS->sishw_ext.jChipType >= SIS_315H) &&
- (pSiS->sishw_ext.jChipType <= SIS_550)) {
- dstW <<= 1;
- }
+ dstH = origdstH << 1;
+ flag = 0;
+ if((pSiS->sishw_ext.jChipType >= SIS_315H) &&
+ (pSiS->sishw_ext.jChipType <= SIS_550)) {
+ dstW <<= 1;
+ }
}
if(modeflags & V_INTERLACE) {
- dstH = origdstH >> 1;
- flag = 0;
+ dstH = origdstH >> 1;
+ flag = 0;
}
#if 0
@@ -2328,80 +2009,80 @@ calc_scale_factor_2(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
if(dstW < OVERLAY_MIN_WIDTH) dstW = OVERLAY_MIN_WIDTH;
if(dstW == srcW) {
- pOverlay->HUSF2 = 0x00;
- pOverlay->IntBit2 = 0x05;
- pOverlay->wHPre2 = 0;
+ pOverlay->HUSF2 = 0x00;
+ pOverlay->IntBit2 = 0x05;
+ pOverlay->wHPre2 = 0;
} else if(dstW > srcW) {
- dstW += 2;
- pOverlay->HUSF2 = (srcW << 16) / dstW;
- pOverlay->IntBit2 = 0x04;
- pOverlay->wHPre2 = 0;
+ dstW += 2;
+ pOverlay->HUSF2 = (srcW << 16) / dstW;
+ pOverlay->IntBit2 = 0x04;
+ pOverlay->wHPre2 = 0;
} else {
- int tmpW = dstW;
+ int tmpW = dstW;
- /* It seems, the hardware can't scale below factor .125 (=1/8) if the
- pitch isn't a multiple of 256.
- TODO: Test this on the 315 series!
- */
- if((srcPitch % 256) || (srcPitch < 256)) {
- if(((dstW * 1000) / srcW) < 125) dstW = tmpW = ((srcW * 125) / 1000) + 1;
- }
+ /* It seems, the hardware can't scale below factor .125 (=1/8) if the
+ pitch isn't a multiple of 256.
+ TODO: Test this on the 315 series!
+ */
+ if((srcPitch % 256) || (srcPitch < 256)) {
+ if(((dstW * 1000) / srcW) < 125) dstW = tmpW = ((srcW * 125) / 1000) + 1;
+ }
- I = 0;
- pOverlay->IntBit2 = 0x01;
- while(srcW >= tmpW) {
- tmpW <<= 1;
- I++;
- }
- pOverlay->wHPre2 = (CARD8)(I - 1);
- dstW <<= (I - 1);
- if((srcW % dstW))
- pOverlay->HUSF2 = ((srcW - dstW) << 16) / dstW;
- else
- pOverlay->HUSF2 = 0x00;
+ I = 0;
+ pOverlay->IntBit2 = 0x01;
+ while (srcW >= tmpW) {
+ tmpW <<= 1;
+ I++;
+ }
+ pOverlay->wHPre2 = (CARD8)(I - 1);
+ dstW <<= (I - 1);
+ if((srcW % dstW))
+ pOverlay->HUSF2 = ((srcW - dstW) << 16) / dstW;
+ else
+ pOverlay->HUSF2 = 0x00;
}
if(dstH < OVERLAY_MIN_HEIGHT) dstH = OVERLAY_MIN_HEIGHT;
if(dstH == srcH) {
- pOverlay->VUSF2 = 0x00;
- pOverlay->IntBit2 |= 0x0A;
+ pOverlay->VUSF2 = 0x00;
+ pOverlay->IntBit2 |= 0x0A;
} else if(dstH > srcH) {
- dstH += 0x02;
- pOverlay->VUSF2 = (srcH << 16) / dstH;
- pOverlay->IntBit2 |= 0x08;
+ dstH += 0x02;
+ pOverlay->VUSF2 = (srcH << 16) / dstH;
+ pOverlay->IntBit2 |= 0x08;
} else {
+ CARD32 realI;
- I = srcH / dstH;
- pOverlay->IntBit2 |= 0x02;
+ I = realI = srcH / dstH;
+ pOverlay->IntBit2 |= 0x02;
- if(I < 2) {
- pOverlay->VUSF2 = ((srcH - dstH) << 16) / dstH;
- /* Needed for LCD-scaling modes */
- if(flag && ((mult = (srcH / origdstH)) >= 2)) {
- pOverlay->pitch2 /= mult;
- }
- } else {
+ if(I < 2) {
+ pOverlay->VUSF2 = ((srcH - dstH) << 16) / dstH;
+ /* Needed for LCD-scaling modes */
+ if(flag && ((mult = (srcH / origdstH)) >= 2))
+ pOverlay->pitch2 /= mult;
+ } else {
#if 0
- if(((pOverlay->bobEnable & 0x08) == 0x00) &&
- (((srcPitch * I)>>2) > 0xFFF)){
- pOverlay->bobEnable |= 0x08;
- srcPitch >>= 1;
- }
+ if(((pOverlay->bobEnable & 0x08) == 0x00) &&
+ (((srcPitch * I)>>2) > 0xFFF)){
+ pOverlay->bobEnable |= 0x08;
+ srcPitch >>= 1;
+ }
#endif
- if(((srcPitch * I)>>2) > 0xFFF) {
- I = (0xFFF*2/srcPitch);
- pOverlay->VUSF2 = 0xFFFF;
- } else {
- dstH = I * dstH;
- if(srcH % dstH)
- pOverlay->VUSF2 = ((srcH - dstH) << 16) / dstH;
- else
- pOverlay->VUSF2 = 0x00;
+ if(((srcPitch * I)>>2) > 0xFFF) {
+ I = (0xFFF*2/srcPitch);
+ pOverlay->VUSF2 = 0xFFFF;
+ } else {
+ dstH = I * dstH;
+ if(srcH % dstH)
+ pOverlay->VUSF2 = ((srcH - dstH) << 16) / dstH;
+ else
+ pOverlay->VUSF2 = 0x00;
+ }
+ /* set video frame buffer offset */
+ pOverlay->pitch2 = (CARD16)(srcPitch*I);
}
- /* set video frame buffer offset */
- pOverlay->pitch2 = (CARD16)(srcPitch*I);
- }
- }
+ }
}
#endif
@@ -2413,9 +2094,9 @@ calc_line_buf_size(CARD32 srcW, CARD8 wHPre, CARD32 pixelFormat)
CARD32 line = srcW;
if( (pixelFormat == PIXEL_FMT_YV12) ||
- (pixelFormat == PIXEL_FMT_I420) ||
- (pixelFormat == PIXEL_FMT_NV12) ||
- (pixelFormat == PIXEL_FMT_NV21) )
+ (pixelFormat == PIXEL_FMT_I420) ||
+ (pixelFormat == PIXEL_FMT_NV12) ||
+ (pixelFormat == PIXEL_FMT_NV21) )
{
preHIDF = wHPre & 0x07;
switch (preHIDF)
@@ -2449,9 +2130,9 @@ calc_line_buf_size(CARD32 srcW, CARD8 wHPre, CARD32 pixelFormat)
}
} else { /* YUV2, UYVY */
if((line & 0xffffff8) == line)
- I = (line >> 3);
+ I = (line >> 3);
else
- I = (line >> 3) + 1;
+ I = (line >> 3) + 1;
return((CARD8)(I - 1));
}
}
@@ -2732,12 +2413,12 @@ set_brightness(SISPtr pSiS, CARD8 brightness)
static __inline void
set_contrast(SISPtr pSiS, CARD8 contrast)
{
- setvideoregmask(pSiS, Index_VI_Contrast_Enh_Ctrl, contrast, 0x07);
+ setvideoregmask(pSiS, Index_VI_Contrast_Enh_Ctrl, contrast ^ 0x07, 0x07);
}
/* 315 series and later only */
static __inline void
-set_saturation(SISPtr pSiS, short saturation)
+set_saturation(SISPtr pSiS, char saturation)
{
CARD8 temp = 0;
@@ -2755,15 +2436,15 @@ set_saturation(SISPtr pSiS, short saturation)
static __inline void
set_hue(SISPtr pSiS, CARD8 hue)
{
- setvideoregmask(pSiS, Index_VI_Hue, (hue & 0x08) ? (hue ^ 0x07) : hue, 0x0F);
+ setvideoreg(pSiS, Index_VI_Hue, (hue & 0x08) ? (hue ^ 0x07) : hue);
}
static __inline void
set_disablegfx(SISPtr pSiS, Bool mybool, SISOverlayPtr pOverlay)
{
- /* This is not supported on M65x, 65x (x>0) or later */
+ /* This is not supported on M65x or 65x (x>0) */
/* For CRT1 ONLY!!! */
- if((!(pSiS->ChipFlags & SiSCF_Is65x)) && (pSiS->Chipset != PCI_CHIP_SIS660)) {
+ if(!(pSiS->ChipFlags & SiSCF_Is65x)) {
setvideoregmask(pSiS, Index_VI_Control_Misc2, mybool ? 0x04 : 0x00, 0x04);
if(mybool) pOverlay->keyOP = VI_ROP_Always;
}
@@ -2789,8 +2470,9 @@ set_overlay(SISPtr pSiS, SISOverlayPtr pOverlay, SISPortPrivPtr pPriv, int index
CARD8 h_over=0, v_over=0;
CARD16 top, bottom, left, right;
CARD16 screenX, screenY;
- int modeflags, watchdog;
+ int modeflags;
CARD8 data;
+ CARD32 watchdog;
CARD32 PSY;
#ifdef SISMERGED
@@ -2851,14 +2533,10 @@ set_overlay(SISPtr pSiS, SISOverlayPtr pOverlay, SISPortPrivPtr pPriv, int index
/* We don't have to wait for vertical retrace in all cases */
if(pPriv->mustwait) {
- if((pSiS->VGAEngine == SIS_315_VGA) && (index)) {
- /* overlay 2 needs special treatment */
- setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
- }
watchdog = WATCHDOG_DELAY;
- while(pOverlay->VBlankActiveFunc(pSiS, pPriv) && --watchdog);
+ while (pOverlay->VBlankActiveFunc(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!pOverlay->VBlankActiveFunc(pSiS, pPriv)) && --watchdog);
+ while ((!pOverlay->VBlankActiveFunc(pSiS)) && --watchdog);
if(!watchdog) xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Xv: Waiting for vertical retrace timed-out\n");
}
@@ -2870,8 +2548,8 @@ set_overlay(SISPtr pSiS, SISOverlayPtr pOverlay, SISPortPrivPtr pPriv, int index
setvideoreg(pSiS, Index_VI_Control_Misc1, data | 0x20);
/* Is this required? (seems so) */
- if((pSiS->Chipset == SIS_315_VGA) && !index)
- setvideoregmask(pSiS, Index_VI_Control_Misc3, 0x00, (1 << index));
+ if(pSiS->Chipset == SIS_315_VGA)
+ setvideoregmask(pSiS, Index_VI_Control_Misc3, 0x00, (1 << index));
/* Set Y buf pitch */
setvideoreg(pSiS, Index_VI_Disp_Y_Buf_Pitch_Low, (CARD8)(pitch));
@@ -2933,11 +2611,7 @@ set_overlay(SISPtr pSiS, SISOverlayPtr pOverlay, SISPortPrivPtr pPriv, int index
if(pSiS->VGAEngine == SIS_315_VGA) {
setvideoreg (pSiS, Index_VI_Disp_UV_Buf_Pitch_High, (CARD8)(uvpitch >> 12));
setvideoreg (pSiS, Index_VI_U_Buf_Start_Over, ((CARD8)(PSU >> 24) & 0x03));
- if(pSiS->sishw_ext.jChipType == SIS_661) {
- setvideoregmask (pSiS, Index_VI_V_Buf_Start_Over, ((CARD8)(PSV >> 24) & 0x03), 0xc3);
- } else {
- setvideoreg (pSiS, Index_VI_V_Buf_Start_Over, ((CARD8)(PSV >> 24) & 0x03));
- }
+ setvideoreg (pSiS, Index_VI_V_Buf_Start_Over, ((CARD8)(PSV >> 24) & 0x03));
}
}
@@ -2964,12 +2638,6 @@ set_overlay(SISPtr pSiS, SISOverlayPtr pOverlay, SISPortPrivPtr pPriv, int index
}
#endif
- if((pSiS->VGAEngine == SIS_315_VGA) && (index)){
- /* Trigger register copy for 315/330 series */
- /* setvideoreg(pSiS, Index_VI_Control_Misc3, (1 << index)); */
- setvideoregmask(pSiS, Index_VI_Control_Misc3, (1 << index), (1 << index));
- }
-
/* set destination window position */
setvideoreg(pSiS, Index_VI_Win_Hor_Disp_Start_Low, (CARD8)left);
setvideoreg(pSiS, Index_VI_Win_Hor_Disp_End_Low, (CARD8)right);
@@ -3024,14 +2692,14 @@ close_overlay(SISPtr pSiS, SISPortPrivPtr pPriv)
setvideoregmask(pSiS, Index_VI_Control_Misc1, 0x00, 0x01);
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT2(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT2(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT2(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT2(pSiS)) && --watchdog);
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT2(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT2(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT2(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT2(pSiS)) && --watchdog);
#ifdef SIS_CP
SIS_CP_RESET_CP
@@ -3055,14 +2723,14 @@ close_overlay(SISPtr pSiS, SISPortPrivPtr pPriv)
setvideoregmask(pSiS, Index_VI_Control_Misc2, 0x00, 0x05);
setvideoregmask(pSiS, Index_VI_Control_Misc1, 0x00, 0x01);
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT1(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT1(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT1(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT1(pSiS)) && --watchdog);
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT1(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT1(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT1(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT1(pSiS)) && --watchdog);
}
}
@@ -3083,9 +2751,10 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
int index = 0, iscrt2 = 0;
#ifdef SISMERGED
unsigned char temp;
+ CARD32 watchdog;
unsigned short screen2width=0;
int srcOffsetX2=0, srcOffsetY2=0;
- int sx2=0, sy2=0, watchdog;
+ int sx2=0, sy2=0;
#endif
pPriv->NoOverlay = FALSE;
@@ -3117,21 +2786,15 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
set_dispmode(pScrn, pPriv);
/* Check if overlay is supported with current mode */
-#ifdef SISMERGED
- if(!pSiS->MergedFB) {
-#endif
- if(pPriv->displayMode & (DISPMODE_SINGLE1 | DISPMODE_MIRROR)) {
- if(!(pSiS->MiscFlags & MISC_CRT1OVERLAY)) {
- if(pPriv->overlayStatus) {
- close_overlay(pSiS, pPriv);
- }
- pPriv->NoOverlay = TRUE;
- return;
- }
+ if(pPriv->displayMode & (DISPMODE_SINGLE1 | DISPMODE_MIRROR)) {
+ if(!(pSiS->MiscFlags & MISC_CRT1OVERLAY)) {
+ if(pPriv->overlayStatus) {
+ close_overlay(pSiS, pPriv);
+ }
+ pPriv->NoOverlay = TRUE;
+ return;
}
-#ifdef SISMERGED
}
-#endif
memset(&overlay, 0, sizeof(overlay));
@@ -3176,16 +2839,12 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
overlay.dstBox.x2 = pPriv->drw_x + pPriv->drw_w - pScrn->frameX0;
overlay.dstBox.y1 = pPriv->drw_y - pScrn->frameY0;
overlay.dstBox.y2 = pPriv->drw_y + pPriv->drw_h - pScrn->frameY0;
- /* xf86DrvMsg(0, X_INFO, "DV(1): %d %d %d %d\n",
- overlay.dstBox.x1,overlay.dstBox.x2,overlay.dstBox.y1,overlay.dstBox.y2); */
#ifdef SISMERGED
}
#endif
- /* Note: x2/y2 is actually real coordinate + 1 */
-
- if((overlay.dstBox.x1 >= overlay.dstBox.x2) ||
- (overlay.dstBox.y1 >= overlay.dstBox.y2)) {
+ if((overlay.dstBox.x1 > overlay.dstBox.x2) ||
+ (overlay.dstBox.y1 > overlay.dstBox.y2)) {
#ifdef SISMERGED
if(pSiS->MergedFB) overlay.DoFirst = FALSE;
else
@@ -3193,7 +2852,7 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
return;
}
- if((overlay.dstBox.x2 <= 0) || (overlay.dstBox.y2 <= 0)) {
+ if((overlay.dstBox.x2 < 0) || (overlay.dstBox.y2 < 0)) {
#ifdef SISMERGED
if(pSiS->MergedFB) overlay.DoFirst = FALSE;
else
@@ -3209,17 +2868,6 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
return;
}
-#ifdef SISMERGED
- if(pSiS->MergedFB) {
- /* Check if dotclock is within limits for CRT1 */
- if(pPriv->displayMode & (DISPMODE_SINGLE1 | DISPMODE_MIRROR)) {
- if(!(pSiS->MiscFlags & MISC_CRT1OVERLAY)) {
- overlay.DoFirst = FALSE;
- }
- }
- }
-#endif
-
if(overlay.dstBox.x1 < 0) {
srcOffsetX = pPriv->src_w * (-overlay.dstBox.x1) / pPriv->drw_w;
overlay.dstBox.x1 = 0;
@@ -3231,11 +2879,11 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
#ifdef SISMERGED
if(pSiS->MergedFB) {
- if((overlay.dstBox2.x1 >= overlay.dstBox2.x2) ||
- (overlay.dstBox2.y1 >= overlay.dstBox2.y2))
+ if((overlay.dstBox2.x1 > overlay.dstBox2.x2) ||
+ (overlay.dstBox2.y1 > overlay.dstBox2.y2))
overlay.DoSecond = FALSE;
- if((overlay.dstBox2.x2 <= 0) || (overlay.dstBox2.y2 <= 0))
+ if((overlay.dstBox2.x2 < 0) || (overlay.dstBox2.y2 < 0))
overlay.DoSecond = FALSE;
if((overlay.dstBox2.x1 >= screen2width) || (overlay.dstBox2.y1 >= overlay.SCREENheight2))
@@ -3258,19 +2906,19 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
if(temp & 0x02) {
watchdog = WATCHDOG_DELAY;
if(pPriv->hasTwoOverlays) {
- while(vblank_active_CRT1(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT1(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT1(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT1(pSiS)) && --watchdog);
} else {
temp = getsrreg(pSiS, 0x06);
if(!(temp & 0x40)) {
- while(vblank_active_CRT1(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT1(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT1(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT1(pSiS)) && --watchdog);
} else {
- while(vblank_active_CRT2(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT2(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT2(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT2(pSiS)) && --watchdog);
}
}
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
@@ -3281,9 +2929,9 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
temp = getvideoreg(pSiS,Index_VI_Control_Misc0);
if(temp & 0x02) {
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT2(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT2(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT2(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT2(pSiS)) && --watchdog);
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
}
}
@@ -3293,6 +2941,10 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
}
#endif
+ /* xf86DrvMsg(0, X_INFO, "DV(2): %d %d %d %d | %d %d %d %d\n",
+ overlay.dstBox.x1,overlay.dstBox.x2,overlay.dstBox.y1,overlay.dstBox.y2,
+ overlay.dstBox2.x1,overlay.dstBox2.x2,overlay.dstBox2.y1,overlay.dstBox2.y2); */
+
switch(pPriv->id) {
case PIXEL_FMT_YV12:
@@ -3430,7 +3082,6 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
pPriv->mustwait = 1;
pPriv->oldx1 = overlay.dstBox.x1; pPriv->oldx2 = overlay.dstBox.x2;
pPriv->oldy1 = overlay.dstBox.y1; pPriv->oldy2 = overlay.dstBox.y2;
-
}
#ifdef SISMERGED
}
@@ -3457,9 +3108,9 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
temp = getvideoreg(pSiS,Index_VI_Control_Misc0);
if(temp & 0x02) {
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT1(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT1(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT1(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT1(pSiS)) && --watchdog);
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
}
} else if(!overlay.DoSecond) {
@@ -3468,9 +3119,9 @@ SISDisplayVideo(ScrnInfoPtr pScrn, SISPortPrivPtr pPriv)
temp = getvideoreg(pSiS,Index_VI_Control_Misc0);
if(temp & 0x02) {
watchdog = WATCHDOG_DELAY;
- while(vblank_active_CRT2(pSiS, pPriv) && --watchdog);
+ while(vblank_active_CRT2(pSiS) && --watchdog);
watchdog = WATCHDOG_DELAY;
- while((!vblank_active_CRT2(pSiS, pPriv)) && --watchdog);
+ while((!vblank_active_CRT2(pSiS)) && --watchdog);
setvideoregmask(pSiS, Index_VI_Control_Misc0, 0x00, 0x02);
}
}
@@ -3559,7 +3210,7 @@ MIRROR:
#endif
calc_scale_factor(&overlay, pScrn, pPriv, index, iscrt2);
- /* Select overlay 1 (used for CRT1/or CRT2) or overlay 2 (used for CRT2) */
+ /* Select video1 (used for CRT1/or CRT2) or video2 (used for CRT2) */
setvideoregmask(pSiS, Index_VI_Control_Misc2, index, 0x01);
/* set format */
@@ -3627,7 +3278,7 @@ MIRROR:
/* set overlay parameters */
set_overlay(pSiS, &overlay, pPriv, index, iscrt2);
- if((pSiS->VGAEngine == SIS_315_VGA) && !index) {
+ if(pSiS->VGAEngine == SIS_315_VGA) {
/* Trigger register copy for 315 series */
setvideoregmask(pSiS, Index_VI_Control_Misc3, (1 << index), (1 << index));
}
@@ -3719,23 +3370,24 @@ SISStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
SISPortPrivPtr pPriv = (SISPortPrivPtr)data;
SISPtr pSiS = SISPTR(pScrn);
- if(pPriv->grabbedByV4L) return;
+ if(pPriv->grabbedByV4L)
+ return;
REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
if(shutdown) {
if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
- close_overlay(pSiS, pPriv);
- pPriv->mustwait = 1;
+ close_overlay(pSiS, pPriv);
+ pPriv->mustwait = 1;
}
SISFreeOverlayMemory(pScrn);
pPriv->videoStatus = 0;
pSiS->VideoTimerCallback = NULL;
} else {
if(pPriv->videoStatus & CLIENT_VIDEO_ON) {
- pPriv->videoStatus = OFF_TIMER | CLIENT_VIDEO_ON;
- pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
- pSiS->VideoTimerCallback = SISVideoTimerCallback;
+ pPriv->videoStatus = OFF_TIMER | CLIENT_VIDEO_ON;
+ pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
+ pSiS->VideoTimerCallback = SISVideoTimerCallback;
}
}
}
@@ -3765,7 +3417,8 @@ SISPutImage(
}
#endif
- if(pPriv->grabbedByV4L) return Success;
+ if(pPriv->grabbedByV4L)
+ return Success;
pPriv->drw_x = drw_x;
pPriv->drw_y = drw_y;
@@ -3864,9 +3517,12 @@ SISPutImage(
#endif
(pPriv->PrevOverlay != pPriv->NoOverlay))) {
/* We always paint the colorkey for V4L */
- if(!pPriv->grabbedByV4L) {
+ if(!pPriv->grabbedByV4L)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
- }
+#else
+ REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
+#endif
/* draw these */
pPriv->PrevOverlay = pPriv->NoOverlay;
if((pPriv->NoOverlay) && (!pSiS->NoAccel)) {
@@ -3876,7 +3532,7 @@ SISPutImage(
0x00422418, 0x18244200, 0, 0);
} else {
if(!pSiS->disablecolorkeycurrent) {
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0)
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,0,0)
XAAFillSolidRects(pScrn, pPriv->colorKey, GXcopy, ~0,
REGION_NUM_RECTS(clipBoxes),
REGION_RECTS(clipBoxes));
@@ -4005,8 +3661,8 @@ SISVideoTimerCallback(ScrnInfoPtr pScrn, Time now)
}
} else
pSiS->VideoTimerCallback = SISVideoTimerCallback;
- }
- }
+ }
+ }
}
/* Offscreen surface stuff */
@@ -4069,9 +3725,9 @@ SISStopSurface (XF86SurfacePtr surface)
SISPtr pSiS = SISPTR(surface->pScrn);
if(pPriv->grabbedByV4L && pPriv->videoStatus) {
- close_overlay(pSiS, pPriv);
- pPriv->mustwait = 1;
- pPriv->videoStatus = 0;
+ close_overlay(pSiS, pPriv);
+ pPriv->mustwait = 1;
+ pPriv->videoStatus = 0;
}
return Success;
}
@@ -4082,9 +3738,9 @@ SISFreeSurface (XF86SurfacePtr surface)
SISPortPrivPtr pPriv = (SISPortPrivPtr)(surface->devPrivate.ptr);
if(pPriv->grabbedByV4L) {
- SISStopSurface(surface);
- SISFreeOverlayMemory(surface->pScrn);
- pPriv->grabbedByV4L = FALSE;
+ SISStopSurface(surface);
+ SISFreeOverlayMemory(surface->pScrn);
+ pPriv->grabbedByV4L = FALSE;
}
return Success;
}
@@ -4132,7 +3788,8 @@ SISDisplaySurface (
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Xv: DisplaySurface called\n");
#endif
- if(!pPriv->grabbedByV4L) return Success;
+ if(!pPriv->grabbedByV4L)
+ return Success;
pPriv->drw_x = drw_x;
pPriv->drw_y = drw_y;
@@ -4382,8 +4039,9 @@ set_subpict_scale_factor(SISOverlayPtr pOverlay, ScrnInfoPtr pScrn,
pOverlay->SubPictVUSF = (srcH << 16) / dstH;
/* pOverlay->SubPictIntBit |= 0x00; */
} else {
+ CARD32 realI;
- I = srcH / dstH;
+ I = realI = srcH / dstH;
pOverlay->SubPictIntBit |= 0x02;
if(I < 2) {
diff --git a/src/vgatypes.h b/src/vgatypes.h
index 634190b..a5ec310 100644
--- a/src/vgatypes.h
+++ b/src/vgatypes.h
@@ -1,59 +1,40 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vgatypes.h,v 1.9 2003/08/26 20:40:24 twini Exp $ */
/*
* General type definitions for universal mode switching modules
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * Authors: Thomas Winischhofer <thomas@winischhofer.net>
+ * Silicon Integrated Systems
*
*/
-
#ifndef _VGATYPES_
#define _VGATYPES_
#ifdef LINUX_XF86
-#include "xf86Version.h"
#include "xf86Pci.h"
#endif
@@ -61,6 +42,10 @@
#include <linux/ioctl.h>
#endif
+#ifndef TC
+#define far
+#endif
+
#ifndef FALSE
#define FALSE 0
#endif
@@ -97,6 +82,25 @@ typedef unsigned short USHORT;
typedef unsigned long ULONG;
#endif
+#ifndef PUCHAR
+typedef UCHAR far *PUCHAR;
+#endif
+
+#ifndef PUSHORT
+typedef USHORT far *PUSHORT;
+#endif
+
+#ifndef PULONG
+typedef ULONG far *PULONG;
+#endif
+
+#ifndef PVOID
+typedef void far *PVOID;
+#endif
+#ifndef VOID
+typedef void VOID;
+#endif
+
#ifndef BOOLEAN
typedef UCHAR BOOLEAN;
#endif
@@ -105,26 +109,17 @@ typedef UCHAR BOOLEAN;
typedef UCHAR bool;
#endif
-#ifdef LINUX_KERNEL
-typedef unsigned long SISIOADDRESS;
-#endif
-
-#ifdef LINUX_XF86
-#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,0,0,0)
-typedef unsigned long IOADDRESS;
-typedef unsigned long SISIOADDRESS;
-#else
-typedef IOADDRESS SISIOADDRESS;
-#endif
+#ifndef VBIOS_VER_MAX_LENGTH
+#define VBIOS_VER_MAX_LENGTH 4
#endif
-#ifndef LINUX_KERNEL /* For the linux kernel, this is defined in sisfb.h */
+#ifndef LINUX_KERNEL /* For kernel, this is defined in sisfb.h */
#ifndef SIS_CHIP_TYPE
typedef enum _SIS_CHIP_TYPE {
SIS_VGALegacy = 0,
#ifdef LINUX_XF86
- SIS_530,
- SIS_OLD,
+ SIS_530, /* TW */
+ SIS_OLD, /* TW */
#endif
SIS_300,
SIS_630,
@@ -137,8 +132,6 @@ typedef enum _SIS_CHIP_TYPE {
SIS_650,
SIS_740,
SIS_330,
- SIS_661,
- SIS_741,
SIS_660,
SIS_760,
MAX_SIS_CHIP
@@ -156,7 +149,6 @@ typedef enum _SIS_VB_CHIP_TYPE {
VB_CHIP_302B,
VB_CHIP_302LV,
VB_CHIP_301C,
- VB_CHIP_302ELV,
VB_CHIP_UNKNOWN, /* other video bridge or no video bridge */
MAX_VB_CHIP
} SIS_VB_CHIP_TYPE;
@@ -182,9 +174,6 @@ typedef enum _SIS_LCD_TYPE {
LCD_640x480_2, /* FSTN, DSTN */
LCD_640x480_3, /* FSTN, DSTN */
LCD_848x480,
- LCD_1280x800,
- LCD_1680x1050,
- LCD_1280x720,
LCD_CUSTOM,
LCD_UNKNOWN
} SIS_LCD_TYPE;
@@ -198,52 +187,64 @@ typedef struct _SIS_DSReg
} SIS_DSReg, *PSIS_DSReg;
#endif
-#ifndef SIS_HW_INFO
+#ifndef SIS_HW_DEVICE_INFO
-typedef struct _SIS_HW_INFO SIS_HW_INFO, *PSIS_HW_INFO;
+typedef struct _SIS_HW_DEVICE_INFO SIS_HW_DEVICE_INFO, *PSIS_HW_DEVICE_INFO;
-typedef BOOLEAN (*PSIS_QUERYSPACE) (PSIS_HW_INFO, ULONG, ULONG, ULONG *);
+typedef BOOLEAN (*PSIS_QUERYSPACE) (PSIS_HW_DEVICE_INFO, ULONG, ULONG, ULONG *);
-struct _SIS_HW_INFO
+struct _SIS_HW_DEVICE_INFO
{
-#ifdef LINUX_XF86
- PCITAG PciTag; /* PCI Tag */
-#endif
-
- UCHAR *pjVirtualRomBase; /* ROM image */
-
- BOOLEAN UseROM; /* Use the ROM image if provided */
+ PVOID pDevice; /* The pointer to the physical device data structure
+ in each OS or NULL for unused. */
+ UCHAR *pjVirtualRomBase; /* base virtual address of VBIOS ROM Space */
+ /* or base virtual address of ROM image file. */
+ /* if NULL, then read from pjROMImage; */
+ /* Note:ROM image file is the file of VBIOS ROM */
+
+ BOOLEAN UseROM; /* TW: Use the ROM image if provided */
+
+ UCHAR *pjCustomizedROMImage;/* base virtual address of ROM image file. */
+ /* wincE:ROM image file is the file for OEM */
+ /* customized table */
+ /* Linux: not used */
+ /* NT : not used */
+ /* Note : pjCustomizedROMImage=NULL if no ROM image file */
UCHAR *pjVideoMemoryAddress;/* base virtual memory address */
/* of Linear VGA memory */
ULONG ulVideoMemorySize; /* size, in bytes, of the memory on the board */
-
- SISIOADDRESS ulIOAddress; /* base I/O address of VGA ports (0x3B0) */
-
+ ULONG ulIOAddress; /* base I/O address of VGA ports (0x3B0) */
UCHAR jChipType; /* Used to Identify SiS Graphics Chip */
/* defined in the data structure type */
/* "SIS_CHIP_TYPE" */
UCHAR jChipRevision; /* Used to Identify SiS Graphics Chip Revision */
-
UCHAR ujVBChipID; /* the ID of video bridge */
/* defined in the data structure type */
/* "SIS_VB_CHIP_TYPE" */
-#ifdef LINUX_KERNEL
- BOOLEAN Is301BDH;
- ULONG ulCRT2LCDType; /* defined in the data structure type */
- /* "SIS_LCD_TYPE" */
-#endif
USHORT usExternalChip; /* NO VB or other video bridge (other than */
/* SiS video bridge) */
+ /* if ujVBChipID = VB_CHIP_UNKNOWN, */
+ /* then bit0=1 : LVDS,bit1=1 : trumpion, */
+ /* bit2=1 : CH7005 & no video bridge if */
+ /* usExternalChip = 0. */
+ /* Note: CR37[3:1]: */
+ /* 001:SiS 301 */
+ /* 010:LVDS */
+ /* 011:Trumpion LVDS Scaling Chip */
+ /* 100:LVDS(LCD-out)+Chrontel 7005 */
+ /* 101:Single Chrontel 7005 */
+ /* TW: This has changed on 315 series! */
+ ULONG ulCRT2LCDType; /* defined in the data structure type */
+ /* "SIS_LCD_TYPE" */
+
BOOLEAN bIntegratedMMEnabled;/* supporting integration MM enable */
BOOLEAN bSkipDramSizing; /* True: Skip video memory sizing. */
-
-#ifdef LINUX_KERNEL
PSIS_DSReg pSR; /* restore SR registers in initial function. */
/* end data :(idx, val) = (FF, FF). */
/* Note : restore SR registers if */
@@ -253,61 +254,145 @@ struct _SIS_HW_INFO
/* end data :(idx, val) = (FF, FF) */
/* Note : restore cR registers if */
/* bSkipDramSizing = TRUE */
+
+ PSIS_QUERYSPACE pQueryVGAConfigSpace; /* Get/Set VGA Configuration */
+ /* space */
+
+ PSIS_QUERYSPACE pQueryNorthBridgeSpace;/* Get/Set North Bridge */
+ /* space */
+
+ UCHAR szVBIOSVer[VBIOS_VER_MAX_LENGTH];
+
+ UCHAR pdc; /* TW: PanelDelayCompensation */
+
+#ifdef LINUX_KERNEL
+ BOOLEAN Is301BDH;
+#endif
+
+#ifdef LINUX_XF86
+ PCITAG PciTag; /* PCI Tag for Linux XF86 */
#endif
};
#endif
-/* Addtional IOCTL for communication sisfb <> X driver */
-/* If changing this, sisfb.h must also be changed (for sisfb) */
+
+/* TW: Addtional IOCTL for communication sisfb <> X driver */
+/* If changing this, sisfb.h must also be changed (for sisfb) */
#ifdef LINUX_XF86 /* We don't want the X driver to depend on the kernel source */
-/* ioctl for identifying and giving some info (esp. memory heap start) */
+/* TW: ioctl for identifying and giving some info (esp. memory heap start) */
#define SISFB_GET_INFO 0x80046ef8 /* Wow, what a terrible hack... */
-/* Structure argument for SISFB_GET_INFO ioctl */
+/* TW: Structure argument for SISFB_GET_INFO ioctl */
typedef struct _SISFB_INFO sisfb_info, *psisfb_info;
struct _SISFB_INFO {
- CARD32 sisfb_id; /* for identifying sisfb */
+ unsigned long sisfb_id; /* for identifying sisfb */
#ifndef SISFB_ID
#define SISFB_ID 0x53495346 /* Identify myself with 'SISF' */
#endif
- CARD32 chip_id; /* PCI ID of detected chip */
- CARD32 memory; /* video memory in KB which sisfb manages */
- CARD32 heapstart; /* heap start (= sisfb "mem" argument) in KB */
- CARD8 fbvidmode; /* current sisfb mode */
+ int chip_id; /* PCI ID of detected chip */
+ int memory; /* video memory in KB which sisfb manages */
+ int heapstart; /* heap start (= sisfb "mem" argument) in KB */
+ unsigned char fbvidmode; /* current sisfb mode */
- CARD8 sisfb_version;
- CARD8 sisfb_revision;
- CARD8 sisfb_patchlevel;
+ unsigned char sisfb_version;
+ unsigned char sisfb_revision;
+ unsigned char sisfb_patchlevel;
- CARD8 sisfb_caps; /* sisfb's capabilities */
+ unsigned char sisfb_caps; /* sisfb's capabilities */
- CARD32 sisfb_tqlen; /* turbo queue length (in KB) */
+ int sisfb_tqlen; /* turbo queue length (in KB) */
- CARD32 sisfb_pcibus; /* The card's PCI ID */
- CARD32 sisfb_pcislot;
- CARD32 sisfb_pcifunc;
+ unsigned int sisfb_pcibus; /* The card's PCI ID */
+ unsigned int sisfb_pcislot;
+ unsigned int sisfb_pcifunc;
- CARD8 sisfb_lcdpdc;
+ unsigned char sisfb_lcdpdc;
+
+ unsigned char sisfb_lcda;
- CARD8 sisfb_lcda;
+ unsigned long sisfb_vbflags;
+ unsigned long sisfb_currentvbflags;
- CARD32 sisfb_vbflags;
- CARD32 sisfb_currentvbflags;
+ int sisfb_scalelcd;
+ unsigned long sisfb_specialtiming;
- CARD32 sisfb_scalelcd;
- CARD32 sisfb_specialtiming;
+ char reserved[219]; /* for future use */
+};
+#endif
- CARD8 sisfb_haveemi;
- CARD8 sisfb_emi30,sisfb_emi31,sisfb_emi32,sisfb_emi33;
- CARD8 sisfb_haveemilcd;
+#ifndef BUS_DATA_TYPE
+typedef enum _BUS_DATA_TYPE {
+ ConfigurationSpaceUndefined = -1,
+ Cmos,
+ EisaConfiguration,
+ Pos,
+ CbusConfiguration,
+ PCIConfiguration,
+ VMEConfiguration,
+ NuBusConfiguration,
+ PCMCIAConfiguration,
+ MPIConfiguration,
+ MPSAConfiguration,
+ PNPISAConfiguration,
+ MaximumBusDataType
+} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+#endif
- CARD8 sisfb_lcdpdca;
+#ifndef PCI_TYPE0_ADDRESSES
+#define PCI_TYPE0_ADDRESSES 6
+#endif
- CARD8 reserved[212]; /* for future use */
-};
+#ifndef PCI_TYPE1_ADDRESSES
+#define PCI_TYPE1_ADDRESSES 2
+#endif
+
+#ifndef PCI_COMMON_CONFIG
+typedef struct _PCI_COMMON_CONFIG {
+ USHORT VendorID; /* (ro) */
+ USHORT DeviceID; /* (ro) */
+ USHORT Command; /* Device control */
+ USHORT Status;
+ UCHAR RevisionID; /* (ro) */
+ UCHAR ProgIf; /* (ro) */
+ UCHAR SubClass; /* (ro) */
+ UCHAR BaseClass; /* (ro) */
+ UCHAR CacheLineSize; /* (ro+) */
+ UCHAR LatencyTimer; /* (ro+) */
+ UCHAR HeaderType; /* (ro) */
+ UCHAR BIST; /* Built in self test */
+
+ union {
+ struct _PCI_HEADER_TYPE_0 {
+ ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
+ ULONG CIS;
+ USHORT SubVendorID;
+ USHORT SubSystemID;
+ ULONG ROMBaseAddress;
+ ULONG Reserved2[2];
+
+ UCHAR InterruptLine; /* */
+ UCHAR InterruptPin; /* (ro) */
+ UCHAR MinimumGrant; /* (ro) */
+ UCHAR MaximumLatency; /* (ro) */
+ } type0;
+
+
+ } u;
+
+ UCHAR DeviceSpecific[192];
+
+} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
+#endif
+
+#ifndef FIELD_OFFSET
+#define FIELD_OFFSET(type, field) ((LONG)&(((type *)0)->field))
+#endif
+
+#ifndef PCI_COMMON_HDR_LENGTH
+#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific))
#endif
#endif
diff --git a/src/vstruct.h b/src/vstruct.h
index 262ec3f..5f71368 100644
--- a/src/vstruct.h
+++ b/src/vstruct.h
@@ -1,51 +1,34 @@
-/* $XFree86$ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/vstruct.h,v 1.14 2003/09/04 15:32:45 twini Exp $ */
/*
* General structure definitions for universal mode switching modules
*
- * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
+ * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria
*
- * If distributed as part of the Linux kernel, the following license terms
- * apply:
+ * If distributed as part of the linux kernel, the contents of this file
+ * is entirely covered by the GPL.
*
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License as published by
- * * the Free Software Foundation; either version 2 of the named License,
- * * or any later version.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * along with this program; if not, write to the Free Software
- * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ * Otherwise, the following terms apply:
*
- * Otherwise, the following license terms apply:
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holder not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The copyright holder makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
*
- * * Redistribution and use in source and binary forms, with or without
- * * modification, are permitted provided that the following conditions
- * * are met:
- * * 1) Redistributions of source code must retain the above copyright
- * * notice, this list of conditions and the following disclaimer.
- * * 2) Redistributions in binary form must reproduce the above copyright
- * * notice, this list of conditions and the following disclaimer in the
- * * documentation and/or other materials provided with the distribution.
- * * 3) The name of the author may not be used to endorse or promote products
- * * derived from this software without specific prior written permission.
- * *
- * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
- * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
*
- * Author: Thomas Winischhofer <thomas@winischhofer.net>
+ * Authors: Thomas Winischhofer <thomas@winischhofer.net>
+ * Silicon Integrated Systems
*
*/
@@ -129,7 +112,6 @@ typedef struct _SiS_StStruct
UCHAR VB_StTVFlickerIndex;
UCHAR VB_StTVEdgeIndex;
UCHAR VB_StTVYFilterIndex;
- UCHAR St_PDC;
} SiS_StStruct;
typedef struct _SiS_VBModeStruct
@@ -161,12 +143,12 @@ typedef struct _SiS_ExtStruct
{
UCHAR Ext_ModeID;
USHORT Ext_ModeFlag;
+ USHORT Ext_ModeInfo;
USHORT Ext_VESAID;
UCHAR Ext_RESINFO;
UCHAR VB_ExtTVFlickerIndex;
UCHAR VB_ExtTVEdgeIndex;
UCHAR VB_ExtTVYFilterIndex;
- UCHAR VB_ExtTVYFilterIndexROM661;
UCHAR REFindex;
} SiS_ExtStruct;
@@ -176,11 +158,9 @@ typedef struct _SiS_Ext2Struct
UCHAR Ext_CRT1CRTC;
UCHAR Ext_CRTVCLK;
UCHAR Ext_CRT2CRTC;
- UCHAR Ext_CRT2CRTC_NS;
UCHAR ModeID;
USHORT XRes;
USHORT YRes;
- UCHAR Ext_PDC;
} SiS_Ext2Struct;
typedef struct _SiS_Part2PortTblStruct
@@ -199,6 +179,12 @@ typedef struct _SiS_MCLKDataStruct
USHORT CLOCK;
} SiS_MCLKDataStruct;
+typedef struct _SiS_ECLKDataStruct
+{
+ UCHAR SR2E,SR2F,SR30;
+ USHORT CLOCK;
+} SiS_ECLKDataStruct;
+
typedef struct _SiS_VCLKDataStruct
{
UCHAR SR2B,SR2C;
@@ -225,84 +211,65 @@ typedef struct _SiS_ModeResInfoStruct
UCHAR YChar;
} SiS_ModeResInfoStruct;
-
-
typedef UCHAR DRAM4Type[4];
-/* Defines for SiS_CustomT */
-/* Never change these for sisfb compatibility */
-#define CUT_NONE 0
-#define CUT_FORCENONE 1
-#define CUT_BARCO1366 2
-#define CUT_BARCO1024 3
-#define CUT_COMPAQ1280 4
-#define CUT_COMPAQ12802 5
-#define CUT_PANEL848 6
-#define CUT_CLEVO1024 7
-#define CUT_CLEVO10242 8
-#define CUT_CLEVO1400 9
-#define CUT_CLEVO14002 10
-#define CUT_UNIWILL1024 11
-#define CUT_ASUSL3000D 12
-#define CUT_UNIWILL10242 13
-#define CUT_ACER1280 14
-#define CUT_COMPAL1400_1 15
-#define CUT_COMPAL1400_2 16
-#define CUT_ASUSA2H_1 17
-#define CUT_ASUSA2H_2 18
+/* Defines for SiS_Customt */
+#define CUT_NONE 0
+#define CUT_FORCENONE 1
+#define CUT_BARCO1366 2
+#define CUT_BARCO1024 3
+#define CUT_COMPAQ1280 4
+#define CUT_COMPAQ12802 5
+#define CUT_PANEL848 6
+#define CUT_CLEVO1024 7
+#define CUT_CLEVO10242 8
+#define CUT_CLEVO1400 9
+#define CUT_CLEVO14002 10
typedef struct _SiS_Private
{
#ifdef LINUX_KERNEL
- SISIOADDRESS RelIO;
+ USHORT RelIO;
#endif
- SISIOADDRESS SiS_P3c4;
- SISIOADDRESS SiS_P3d4;
- SISIOADDRESS SiS_P3c0;
- SISIOADDRESS SiS_P3ce;
- SISIOADDRESS SiS_P3c2;
- SISIOADDRESS SiS_P3ca;
- SISIOADDRESS SiS_P3c6;
- SISIOADDRESS SiS_P3c7;
- SISIOADDRESS SiS_P3c8;
- SISIOADDRESS SiS_P3c9;
- SISIOADDRESS SiS_P3cb;
- SISIOADDRESS SiS_P3cd;
- SISIOADDRESS SiS_P3da;
- SISIOADDRESS SiS_Part1Port;
- SISIOADDRESS SiS_Part2Port;
- SISIOADDRESS SiS_Part3Port;
- SISIOADDRESS SiS_Part4Port;
- SISIOADDRESS SiS_Part5Port;
- SISIOADDRESS SiS_VidCapt;
- SISIOADDRESS SiS_VidPlay;
+ USHORT SiS_P3c4;
+ USHORT SiS_P3d4;
+ USHORT SiS_P3c0;
+ USHORT SiS_P3ce;
+ USHORT SiS_P3c2;
+ USHORT SiS_P3ca;
+ USHORT SiS_P3c6;
+ USHORT SiS_P3c7;
+ USHORT SiS_P3c8;
+ USHORT SiS_P3c9;
+ USHORT SiS_P3cb;
+ USHORT SiS_P3cd;
+ USHORT SiS_P3da;
+ USHORT SiS_Part1Port;
+ USHORT SiS_Part2Port;
+ USHORT SiS_Part3Port;
+ USHORT SiS_Part4Port;
+ USHORT SiS_Part5Port;
+ USHORT SiS_VidCapt;
+ USHORT SiS_VidPlay;
USHORT SiS_IF_DEF_LVDS;
- USHORT SiS_IF_DEF_CH70xx;
- USHORT SiS_IF_DEF_CONEX;
USHORT SiS_IF_DEF_TRUMPION;
USHORT SiS_IF_DEF_DSTN;
USHORT SiS_IF_DEF_FSTN;
+ USHORT SiS_IF_DEF_CH70xx;
+ USHORT SiS_IF_DEF_HiVision;
USHORT SiS_SysFlags;
UCHAR SiS_VGAINFO;
#ifndef LINUX_KERNEL
USHORT SiS_CP1, SiS_CP2, SiS_CP3, SiS_CP4;
#endif
BOOLEAN SiS_UseROM;
- BOOLEAN SiS_ROMNew;
- BOOLEAN PanelSelfDetected;
- int SiS_CHOverScan;
+ int SiS_CHOverScan;
BOOLEAN SiS_CHSOverScan;
BOOLEAN SiS_ChSW;
BOOLEAN SiS_UseLCDA;
- int SiS_UseOEM;
- ULONG SiS_CustomT;
- USHORT SiS_Backup70xx;
- BOOLEAN HaveEMI;
- BOOLEAN HaveEMILCD;
- BOOLEAN OverruleEMI;
- UCHAR EMI_30,EMI_31,EMI_32,EMI_33;
- SHORT PDC, PDCA;
- UCHAR SiS_MyCR63;
+ int SiS_UseOEM;
+ ULONG SiS_CustomT;
+ USHORT SiS_Backup70xx;
USHORT SiS_CRT1Mode;
USHORT SiS_flag_clearbuffer;
int SiS_RAMType;
@@ -310,14 +277,12 @@ typedef struct _SiS_Private
UCHAR SiS_DataBusWidth;
USHORT SiS_ModeType;
USHORT SiS_VBInfo;
- USHORT SiS_TVMode;
USHORT SiS_LCDResInfo;
USHORT SiS_LCDTypeInfo;
USHORT SiS_LCDInfo;
- USHORT SiS_LCDInfo661;
USHORT SiS_VBType;
USHORT SiS_VBExtInfo;
- USHORT SiS_YPbPr;
+ USHORT SiS_HiVision;
USHORT SiS_SelectCRT2Rate;
USHORT SiS_SetFlag;
USHORT SiS_RVBHCFACT;
@@ -341,19 +306,32 @@ typedef struct _SiS_Private
USHORT SiS_DDC_Port;
USHORT SiS_DDC_Index;
USHORT SiS_DDC_Data;
- USHORT SiS_DDC_NData;
USHORT SiS_DDC_Clk;
- USHORT SiS_DDC_NClk;
+ USHORT SiS_DDC_DataShift;
USHORT SiS_DDC_DeviceAddr;
USHORT SiS_DDC_ReadAddr;
USHORT SiS_DDC_SecAddr;
- USHORT SiS_ChrontelInit;
- BOOLEAN SiS_SensibleSR11;
- USHORT SiS661LCD2TableSize;
-
+ USHORT SiS_Panel800x600;
+ USHORT SiS_Panel1024x768;
+ USHORT SiS_Panel1280x1024;
+ USHORT SiS_Panel1600x1200;
+ USHORT SiS_Panel1280x960;
+ USHORT SiS_Panel1400x1050;
+ USHORT SiS_Panel320x480;
+ USHORT SiS_Panel1152x768;
+ USHORT SiS_Panel1280x768;
+ USHORT SiS_Panel1024x600;
+ USHORT SiS_Panel640x480;
+ USHORT SiS_Panel640x480_2;
+ USHORT SiS_Panel640x480_3;
+ USHORT SiS_Panel1152x864;
+ USHORT SiS_PanelCustom;
+ USHORT SiS_PanelBarco1366;
+ USHORT SiS_PanelMax;
USHORT SiS_PanelMinLVDS;
USHORT SiS_PanelMin301;
-
+ USHORT SiS_ChrontelInit;
+
const SiS_StStruct *SiS_SModeIDTable;
SiS_StandTableStruct *SiS_StandTable;
const SiS_ExtStruct *SiS_EModeIDTable;
@@ -362,10 +340,12 @@ typedef struct _SiS_Private
const SiS_CRT1TableStruct *SiS_CRT1Table;
const SiS_MCLKDataStruct *SiS_MCLKData_0;
const SiS_MCLKDataStruct *SiS_MCLKData_1;
- SiS_VCLKDataStruct *SiS_VCLKData;
- SiS_VBVCLKDataStruct *SiS_VBVCLKData;
+ const SiS_ECLKDataStruct *SiS_ECLKData;
+ const SiS_VCLKDataStruct *SiS_VCLKData;
+ const SiS_VBVCLKDataStruct *SiS_VBVCLKData;
const SiS_StResInfoStruct *SiS_StResInfo;
const SiS_ModeResInfoStruct *SiS_ModeResInfo;
+ const UCHAR *SiS_ScreenOffset;
const UCHAR *pSiS_OutputSelect;
const UCHAR *pSiS_SoftSetting;
@@ -395,12 +375,6 @@ typedef struct _SiS_Private
const USHORT *pSiS_VideoSenseData2;
const USHORT *pSiS_YCSenseData2;
#endif
-
- const SiS_PanelDelayTblStruct *SiS_PanelDelayTbl;
- const SiS_PanelDelayTblStruct *SiS_PanelDelayTblLVDS;
-
- /* SiS bridge */
-
const UCHAR *SiS_NTSCPhase;
const UCHAR *SiS_PALPhase;
const UCHAR *SiS_NTSCPhase2;
@@ -410,58 +384,42 @@ typedef struct _SiS_Private
const UCHAR *SiS_PALMPhase2;
const UCHAR *SiS_PALNPhase2;
const UCHAR *SiS_SpecialPhase;
- const UCHAR *SiS_SpecialPhaseM;
- const UCHAR *SiS_SpecialPhaseJ;
+ const SiS_LCDDataStruct *SiS_StLCD1024x768Data;
const SiS_LCDDataStruct *SiS_ExtLCD1024x768Data;
const SiS_LCDDataStruct *SiS_St2LCD1024x768Data;
- const SiS_LCDDataStruct *SiS_LCD1280x720Data;
- const SiS_LCDDataStruct *SiS_StLCD1280x768_2Data;
- const SiS_LCDDataStruct *SiS_ExtLCD1280x768_2Data;
- const SiS_LCDDataStruct *SiS_LCD1280x768_3Data;
- const SiS_LCDDataStruct *SiS_LCD1280x800Data;
- const SiS_LCDDataStruct *SiS_LCD1280x960Data;
+ const SiS_LCDDataStruct *SiS_StLCD1280x1024Data;
const SiS_LCDDataStruct *SiS_ExtLCD1280x1024Data;
const SiS_LCDDataStruct *SiS_St2LCD1280x1024Data;
+ const SiS_LCDDataStruct *SiS_NoScaleData1024x768;
+ const SiS_LCDDataStruct *SiS_NoScaleData1280x1024;
+ const SiS_LCDDataStruct *SiS_LCD1280x960Data;
+ const SiS_LCDDataStruct *SiS_NoScaleData1400x1050;
+ const SiS_LCDDataStruct *SiS_NoScaleData1600x1200;
+ const SiS_LCDDataStruct *SiS_NoScaleData1280x768;
const SiS_LCDDataStruct *SiS_StLCD1400x1050Data;
- const SiS_LCDDataStruct *SiS_ExtLCD1400x1050Data;
const SiS_LCDDataStruct *SiS_StLCD1600x1200Data;
+ const SiS_LCDDataStruct *SiS_StLCD1280x768Data;
+ const SiS_LCDDataStruct *SiS_ExtLCD1400x1050Data;
const SiS_LCDDataStruct *SiS_ExtLCD1600x1200Data;
- const SiS_LCDDataStruct *SiS_LCD1680x1050Data;
+ const SiS_LCDDataStruct *SiS_ExtLCD1280x768Data;
const SiS_LCDDataStruct *SiS_NoScaleData;
const SiS_TVDataStruct *SiS_StPALData;
const SiS_TVDataStruct *SiS_ExtPALData;
const SiS_TVDataStruct *SiS_StNTSCData;
const SiS_TVDataStruct *SiS_ExtNTSCData;
- const SiS_TVDataStruct *SiS_St1HiTVData;
const SiS_TVDataStruct *SiS_St2HiTVData;
const SiS_TVDataStruct *SiS_ExtHiTVData;
- const SiS_TVDataStruct *SiS_St525iData;
- const SiS_TVDataStruct *SiS_St525pData;
- const SiS_TVDataStruct *SiS_St750pData;
- const SiS_TVDataStruct *SiS_Ext525iData;
- const SiS_TVDataStruct *SiS_Ext525pData;
- const SiS_TVDataStruct *SiS_Ext750pData;
const UCHAR *SiS_NTSCTiming;
const UCHAR *SiS_PALTiming;
const UCHAR *SiS_HiTVExtTiming;
const UCHAR *SiS_HiTVSt1Timing;
const UCHAR *SiS_HiTVSt2Timing;
+ const UCHAR *SiS_HiTVTextTiming;
const UCHAR *SiS_HiTVGroup3Data;
const UCHAR *SiS_HiTVGroup3Simu;
-#if 0
- const UCHAR *SiS_HiTVTextTiming;
const UCHAR *SiS_HiTVGroup3Text;
-#endif
-
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_1;
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_1;
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_2;
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_2;
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_3;
- const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_3;
-
- /* LVDS, Chrontel */
-
+ const SiS_PanelDelayTblStruct *SiS_PanelDelayTbl;
+ const SiS_PanelDelayTblStruct *SiS_PanelDelayTblLVDS;
const SiS_LVDSDataStruct *SiS_LVDS800x600Data_1;
const SiS_LVDSDataStruct *SiS_LVDS800x600Data_2;
const SiS_LVDSDataStruct *SiS_LVDS1024x768Data_1;
@@ -483,6 +441,10 @@ typedef struct _SiS_Private
const SiS_LVDSDataStruct *SiS_LVDS640x480Data_1;
const SiS_LVDSDataStruct *SiS_LVDS640x480Data_2;
const SiS_LVDSDataStruct *SiS_LVDS320x480Data_1;
+ const SiS_LVDSDataStruct *SiS_LCDA1400x1050Data_1;
+ const SiS_LVDSDataStruct *SiS_LCDA1400x1050Data_2;
+ const SiS_LVDSDataStruct *SiS_LCDA1600x1200Data_1;
+ const SiS_LVDSDataStruct *SiS_LCDA1600x1200Data_2;
const SiS_LVDSDataStruct *SiS_LVDSXXXxXXXData_1;
const SiS_LVDSDataStruct *SiS_LVDSBARCO1366Data_1;
const SiS_LVDSDataStruct *SiS_LVDSBARCO1366Data_2;
@@ -499,7 +461,6 @@ typedef struct _SiS_Private
const SiS_LVDSDataStruct *SiS_CHTVUPALNData;
const SiS_LVDSDataStruct *SiS_CHTVOPALNData;
const SiS_LVDSDataStruct *SiS_CHTVSOPALData;
-
const SiS_LVDSDesStruct *SiS_PanelType00_1;
const SiS_LVDSDesStruct *SiS_PanelType01_1;
const SiS_LVDSDesStruct *SiS_PanelType02_1;
@@ -534,11 +495,20 @@ typedef struct _SiS_Private
const SiS_LVDSDesStruct *SiS_PanelType0e_2;
const SiS_LVDSDesStruct *SiS_PanelType0f_2;
const SiS_LVDSDesStruct *SiS_PanelTypeNS_2;
+
+ const SiS_LVDSDesStruct *LVDS1024x768Des_1;
+ const SiS_LVDSDesStruct *LVDS1280x1024Des_1;
+ const SiS_LVDSDesStruct *LVDS1400x1050Des_1;
+ const SiS_LVDSDesStruct *LVDS1600x1200Des_1;
+ const SiS_LVDSDesStruct *LVDS1024x768Des_2;
+ const SiS_LVDSDesStruct *LVDS1280x1024Des_2;
+ const SiS_LVDSDesStruct *LVDS1400x1050Des_2;
+ const SiS_LVDSDesStruct *LVDS1600x1200Des_2;
+
const SiS_LVDSDesStruct *SiS_CHTVUNTSCDesData;
const SiS_LVDSDesStruct *SiS_CHTVONTSCDesData;
const SiS_LVDSDesStruct *SiS_CHTVUPALDesData;
const SiS_LVDSDesStruct *SiS_CHTVOPALDesData;
-
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1800x600_1;
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT11024x768_1;
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT11280x1024_1;
@@ -579,13 +549,48 @@ typedef struct _SiS_Private
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1640x480_2_H;
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1640x480_3;
const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1640x480_3_H;
- const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1320x480_1;
const SiS_LVDSCRT1DataStruct *SiS_CHTVCRT1UNTSC;
const SiS_LVDSCRT1DataStruct *SiS_CHTVCRT1ONTSC;
const SiS_LVDSCRT1DataStruct *SiS_CHTVCRT1UPAL;
const SiS_LVDSCRT1DataStruct *SiS_CHTVCRT1OPAL;
const SiS_LVDSCRT1DataStruct *SiS_CHTVCRT1SOPAL;
+ const SiS_LVDSCRT1DataStruct *SiS_LVDSCRT1320x480_1;
+
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT1800x600_1;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11024x768_1;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11280x1024_1;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11400x1050_1;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11600x1200_1;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT1800x600_1_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11024x768_1_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11280x1024_1_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11400x1050_1_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11600x1200_1_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT1800x600_2;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11024x768_2;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11280x1024_2;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11400x1050_2;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11600x1200_2;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT1800x600_2_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11024x768_2_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11280x1024_2_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11400x1050_2_H;
+ const SiS_LCDACRT1DataStruct *SiS_LCDACRT11600x1200_2_H;
+
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_1;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_1;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1400x1050_1;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1600x1200_1;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_2;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_2;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1400x1050_2;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1600x1200_2;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1024x768_3;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1280x1024_3;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1400x1050_3;
+ const SiS_Part2PortTblStruct *SiS_CRT2Part2_1600x1200_3;
+
const SiS_CHTVRegDataStruct *SiS_CHTVReg_UNTSC;
const SiS_CHTVRegDataStruct *SiS_CHTVReg_ONTSC;
const SiS_CHTVRegDataStruct *SiS_CHTVReg_UPAL;
@@ -595,7 +600,6 @@ typedef struct _SiS_Private
const SiS_CHTVRegDataStruct *SiS_CHTVReg_UPALN;
const SiS_CHTVRegDataStruct *SiS_CHTVReg_OPALN;
const SiS_CHTVRegDataStruct *SiS_CHTVReg_SOPAL;
-
const UCHAR *SiS_CHTVVCLKUNTSC;
const UCHAR *SiS_CHTVVCLKONTSC;
const UCHAR *SiS_CHTVVCLKUPAL;
@@ -606,13 +610,9 @@ typedef struct _SiS_Private
const UCHAR *SiS_CHTVVCLKOPALN;
const UCHAR *SiS_CHTVVCLKSOPAL;
- USHORT PanelXRes, PanelHT;
- USHORT PanelYRes, PanelVT;
- USHORT PanelHRS, PanelHRE;
- USHORT PanelVRS, PanelVRE;
- USHORT PanelVCLKIdx300;
- USHORT PanelVCLKIdx315;
-
+ USHORT PanelXRes;
+ USHORT PanelYRes;
+
BOOLEAN UseCustomMode;
BOOLEAN CRT1UsesCustomMode;
USHORT CHDisplay;
@@ -638,6 +638,9 @@ typedef struct _SiS_Private
USHORT CModeFlag_CRT1;
USHORT CInfoFlag;
+ BOOLEAN SiS_CHPALM;
+ BOOLEAN SiS_CHPALN;
+
int LVDSHL;
BOOLEAN Backup;
@@ -654,13 +657,11 @@ typedef struct _SiS_Private
UCHAR Backup_1d;
int UsePanelScaler;
- int CenterScreen;
USHORT CP_Vendor, CP_Product;
BOOLEAN CP_HaveCustomData;
- int CP_PreferredX, CP_PreferredY, CP_PreferredIndex;
+ int CP_PreferredX, CP_PreferredY;
int CP_MaxX, CP_MaxY, CP_MaxClock;
- BOOLEAN CP_Supports64048075;
int CP_HDisplay[7], CP_VDisplay[7]; /* For Custom LCD panel dimensions */
int CP_HTotal[7], CP_VTotal[7];
int CP_HSyncStart[7], CP_VSyncStart[7];