summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2004-11-23 19:13:00 +0000
committerLuc Verhaegen <libv@skynet.be>2004-11-23 19:13:00 +0000
commit26417159f00c7a02eeedaa0afe430fcb8b87c4ca (patch)
tree7cfd7eba167ea7f50730d332cc87489acaab8d9e
parent688e0311b464bd71e42c250557f4a71538c99521 (diff)
Sync with unichrome X r27. Fixes: CLE266 rev.18 hang in HQV Idle. XvMC
removing DRI MMIO. AGP ringbuffer crashing at VT switch. Bad handling of unsupported mode. YV12 Chroma. Flickering overlay when covered. Updates: ids. XvMC to new drm version. Improves: XvMC startup time and handling of multiple cards. VGA/output debugging. VT162x DAC detection. Move to single I2CDev for VT162x. ViaYUVFillBlack. Removes: pViaModeTable structure and the acquiring of modetables from VGA BIOS. Unused/broken VBE OEM calls. Adds: Option to control VT1622 flicker filter. (Terry Barnaby, Thomas Hellström, Ivor Hewitt, Pieter Peers, Luc Verhaegen)
-rw-r--r--man/via.man4
-rw-r--r--src/via_bandwidth.c91
-rw-r--r--src/via_bios.h294
-rw-r--r--src/via_driver.c661
-rw-r--r--src/via_driver.h22
-rw-r--r--src/via_i2c.c38
-rw-r--r--src/via_id.c27
-rw-r--r--src/via_mode.c1208
-rw-r--r--src/via_mode.h202
-rw-r--r--src/via_swov.c114
-rw-r--r--src/via_vbe.c833
-rw-r--r--src/via_vgahw.c31
-rw-r--r--src/via_vgahw.h12
-rw-r--r--src/via_video.c80
-rw-r--r--src/via_xvmc.c14
-rw-r--r--src/via_xvmc.h9
-rw-r--r--src/via_xvpriv.h18
17 files changed, 1318 insertions, 2340 deletions
diff --git a/man/via.man b/man/via.man
index 5b0a0bb..352543b 100644
--- a/man/via.man
+++ b/man/via.man
@@ -88,6 +88,10 @@ are supported.
.BI "Option \*qTVDotCrawl\*q \*q" boolean \*q
Disable or enable dotcrawl.
.TP
+.BI "Option \*qTVDeflicker\*q \*q" integer \*q
+Specify deflicker setting for TV output. Valid values are 0,1,2
+0) No deflicker, 1) 1:1:1 deflicker, 2) 1:2:1 deflicker.
+.TP
.BI "Option \*qTVType\*q \*q" string \*q
Specify TV output format. The driver currently supports "NTSC" and
"PAL" timings only.
diff --git a/src/via_bandwidth.c b/src/via_bandwidth.c
index b387980..dcc9cfb 100644
--- a/src/via_bandwidth.c
+++ b/src/via_bandwidth.c
@@ -39,7 +39,6 @@
static void
ViaSetCLE266APrimaryFIFO(ScrnInfoPtr pScrn, Bool Enable)
{
-
VIAPtr pVia = VIAPTR(pScrn);
CARD32 dwGE230, dwGE298;
@@ -106,7 +105,7 @@ ViaSetPrimaryExpireNumber(ScrnInfoPtr pScrn, DisplayModePtr mode, ViaExpireNumbe
(Expire->Y == mode->CrtcVDisplay) &&
(Expire->Bpp == pScrn->bitsPerPixel) &&
(Expire->bRamClock == pVia->MemClk)) {
- ViaSeqChange(hwp, 0x22, Expire->bTuningValue, 0x1F);
+ ViaSeqMask(hwp, 0x22, Expire->bTuningValue, 0x1F);
return;
}
}
@@ -132,7 +131,7 @@ ViaSetPrimaryFetchCount(ScrnInfoPtr pScrn, int width)
}
hwp->writeSeq(hwp, 0x1C, (Count >> 1) & 0xFF); /* +1 in original CLE266/KM400 code */
- ViaSeqChange(hwp, 0x1D, Count >> 9, 0x03);
+ ViaSeqMask(hwp, 0x1D, Count >> 9, 0x03);
}
/*
@@ -151,12 +150,12 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
if (CLE266_REV_IS_CX(pVia->ChipRev)) {
if (pVia->HasSecondary) { /* SAMM or DuoView case */
if (mode->HDisplay >= 1024) {
- ViaSeqChange(hwp, 0x16, 0x1C, 0x3F); /* 28 */
+ ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */
hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */
}
} else { /* Single view or Simultaneous case */
if (mode->HDisplay > 1024) {
- ViaSeqChange(hwp, 0x16, 0x17, 0x3F); /* 23 */
+ ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */
hwp->writeSeq(hwp, 0x17, 0x2F); /* 47 */
}
}
@@ -168,7 +167,7 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
if ((mode->HDisplay > 1024) && pVia->HasSecondary) {
ViaSetCLE266APrimaryFIFO(pScrn, TRUE);
- ViaSeqChange(hwp, 0x16, 0x17, 0x3F); /* 23 */
+ ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */
hwp->writeSeq(hwp, 0x17, 0x2F); /* 47 */
hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */
}
@@ -183,19 +182,19 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
if (pVia->HasSecondary) { /* SAMM or DuoView case */
if ((mode->HDisplay >= 1600) &&
(pVia->MemClk <= VIA_MEM_DDR200)) {
- ViaSeqChange(hwp, 0x16, 0x09, 0x3F); /* 9 */
+ ViaSeqMask(hwp, 0x16, 0x09, 0x3F); /* 9 */
hwp->writeSeq(hwp, 0x17, 0x1C); /* 28 */
} else {
- ViaSeqChange(hwp, 0x16, 0x1C, 0x3F); /* 28 */
+ ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */
hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */
}
} else {
if ((mode->HDisplay > 1280))
- ViaSeqChange(hwp, 0x16, 0x1C, 0x3F); /* 28 */
+ ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */
else if (mode->HDisplay > 1024)
- ViaSeqChange(hwp, 0x16, 0x17, 0x3F); /* 23 */
+ ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */
else
- ViaSeqChange(hwp, 0x16, 0x10, 0x3F); /* 16 */
+ ViaSeqMask(hwp, 0x16, 0x10, 0x3F); /* 16 */
hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */
}
hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */
@@ -208,29 +207,29 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
#ifdef HAVE_K8M800
case VIA_K8M800:
hwp->writeSeq(hwp, 0x17, 0xBF); /* 384/2 - 1 = 191 (orig via comment: 384/8) */
- ViaSeqChange(hwp, 0x16, 0x92, 0xBF); /* 328/4 = 82 = 0x52*/
- ViaSeqChange(hwp, 0x18, 0x8a, 0xBF); /* 74 */
+ ViaSeqMask(hwp, 0x16, 0x92, 0xBF); /* 328/4 = 82 = 0x52*/
+ ViaSeqMask(hwp, 0x18, 0x8a, 0xBF); /* 74 */
ViaSetPrimaryFetchCount(pScrn, mode->CrtcHDisplay);
if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32))
- ViaSeqChange(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */
+ ViaSeqMask(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */
else
- ViaSeqChange(hwp, 0x22, 0x00, 0x1F); /* 128/4 = overflow = 0 */
+ ViaSeqMask(hwp, 0x22, 0x00, 0x1F); /* 128/4 = overflow = 0 */
break;
#endif /* HAVE_K8M800 */
#ifdef HAVE_PM800
case VIA_PM800:
hwp->writeSeq(hwp, 0x17, 0x5F); /* 95 */
- ViaSeqChange(hwp, 0x16, 0x20, 0xBF); /* 32 */
- ViaSeqChange(hwp, 0x18, 0x10, 0xBF); /* 16 */
+ ViaSeqMask(hwp, 0x16, 0x20, 0xBF); /* 32 */
+ ViaSeqMask(hwp, 0x18, 0x10, 0xBF); /* 16 */
ViaSetPrimaryFetchCount(pScrn, mode->CrtcHDisplay);
if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32))
- ViaSeqChange(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */
+ ViaSeqMask(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */
else
- ViaSeqChange(hwp, 0x22, 0x1F, 0x1F); /* 31 */
+ ViaSeqMask(hwp, 0x22, 0x1F, 0x1F); /* 31 */
break;
#endif /* HAVE_PM800 */
default:
@@ -259,7 +258,7 @@ ViaSetSecondaryFetchCount(ScrnInfoPtr pScrn, int width)
}
hwp->writeCrtc(hwp, 0x65, (Count >> 1) & 0xFF);
- ViaCrtcChange(hwp, 0x67, Count >> 7, 0x0C);
+ ViaCrtcMask(hwp, 0x67, Count >> 7, 0x0C);
}
/*
@@ -279,20 +278,20 @@ ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
case VIA_CLE266:
if (CLE266_REV_IS_CX(pVia->ChipRev)) {
if (mode->HDisplay >= 1024) {
- ViaCrtcChange(hwp, 0x6A, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
hwp->writeCrtc(hwp, 0x68, 0xAB); /* depth: 10, threshold: 11 */
} else {
- ViaCrtcChange(hwp, 0x6A, 0x00, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x00, 0x20);
hwp->writeCrtc(hwp, 0x68, 0x67); /* depth: 6, threshold: 7 */
}
} else {
if ((pScrn->bitsPerPixel >= 24) &&
(((mode->VDisplay > 768) && (pVia->MemClk <= VIA_MEM_DDR200)) ||
((mode->HDisplay > 1280) && (pVia->MemClk <= VIA_MEM_DDR266)))) {
- ViaCrtcChange(hwp, 0x6A, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
hwp->writeCrtc(hwp, 0x68, 0xAB); /* depth: 10, threshold: 11 */
} else {
- ViaCrtcChange(hwp, 0x6A, 0x00, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x00, 0x20);
hwp->writeCrtc(hwp, 0x68, 0x67); /* depth: 6, threshold: 7 */
}
}
@@ -300,20 +299,20 @@ ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
break;
case VIA_KM400:
if ((mode->HDisplay >= 1600) && (pVia->MemClk <= VIA_MEM_DDR200)) {
- ViaCrtcChange(hwp, 0x6A, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
hwp->writeCrtc(hwp, 0x68, 0xEB); /* depth: 14, threshold: 11 */
} else if ((pScrn->bitsPerPixel == 32) &&
(((mode->HDisplay > 1024) && (pVia->MemClk <= VIA_MEM_DDR333)) ||
((mode->HDisplay >= 1024) && (pVia->MemClk <= VIA_MEM_DDR200)))) {
- ViaCrtcChange(hwp, 0x6A, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
hwp->writeCrtc(hwp, 0x68, 0xCA); /* depth: 12, threshold: 10 */
} else if ((pScrn->bitsPerPixel == 16) &&
(((mode->HDisplay > 1280) && (pVia->MemClk <= VIA_MEM_DDR333)) ||
((mode->HDisplay >= 1280) && (pVia->MemClk <= VIA_MEM_DDR200)))) {
- ViaCrtcChange(hwp, 0x6A, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
hwp->writeCrtc(hwp, 0x68, 0xAB); /* depth: 10, threshold: 11 */
} else {
- ViaCrtcChange(hwp, 0x6A, 0x00, 0x20);
+ ViaCrtcMask(hwp, 0x6A, 0x00, 0x20);
hwp->writeCrtc(hwp, 0x68, 0x67); /* depth: 6, threshold: 7 */
}
ViaSetSecondaryFetchCount(pScrn, mode->CrtcHDisplay);
@@ -321,47 +320,47 @@ ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode)
#ifdef HAVE_K8M800
case VIA_K8M800:
/* depth: (384 /8 -1 -1) = 46 = 0x2E */
- ViaCrtcChange(hwp, 0x68, 0xE0, 0xF0);
- ViaCrtcChange(hwp, 0x94, 0x00, 0x80);
- ViaCrtcChange(hwp, 0x95, 0x80, 0x80);
+ ViaCrtcMask(hwp, 0x68, 0xE0, 0xF0);
+ ViaCrtcMask(hwp, 0x94, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x95, 0x80, 0x80);
/* threshold: (328/4) = 82 = 0x52 */
- ViaCrtcChange(hwp, 0x68, 0x02, 0x0F);
- ViaCrtcChange(hwp, 0x95, 0x50, 0x70);
+ ViaCrtcMask(hwp, 0x68, 0x02, 0x0F);
+ ViaCrtcMask(hwp, 0x95, 0x50, 0x70);
/* preq: 74 = 0x4A */
- ViaCrtcChange(hwp, 0x92, 0x0A, 0x0F);
- ViaCrtcChange(hwp, 0x95, 0x04, 0x07);
+ ViaCrtcMask(hwp, 0x92, 0x0A, 0x0F);
+ ViaCrtcMask(hwp, 0x95, 0x04, 0x07);
ViaSetSecondaryFetchCount(pScrn, mode->CrtcHDisplay);
if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32))
- ViaCrtcChange(hwp, 0x94, 0x10, 0x7F); /* 64/4 */
+ ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); /* 64/4 */
else
- ViaCrtcChange(hwp, 0x94, 0x20, 0x7F); /* 128/4 */
+ ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); /* 128/4 */
break;
#endif /* HAVE_K8M800 */
#ifdef HAVE_PM800
case VIA_PM800:
/* depth: 12 - 1 = 0x0B */
- ViaCrtcChange(hwp, 0x68, 0xB0, 0xF0);
- ViaCrtcChange(hwp, 0x94, 0x00, 0x80);
- ViaCrtcChange(hwp, 0x95, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x68, 0xB0, 0xF0);
+ ViaCrtcMask(hwp, 0x94, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x95, 0x00, 0x80);
/* threshold: 16 = 0x10 */
- ViaCrtcChange(hwp, 0x68, 0x00, 0x0F);
- ViaCrtcChange(hwp, 0x95, 0x10, 0x70);
+ ViaCrtcMask(hwp, 0x68, 0x00, 0x0F);
+ ViaCrtcMask(hwp, 0x95, 0x10, 0x70);
/* preq: 8 = 0x08 */
- ViaCrtcChange(hwp, 0x92, 0x08, 0x0F);
- ViaCrtcChange(hwp, 0x95, 0x00, 0x07);
+ ViaCrtcMask(hwp, 0x92, 0x08, 0x0F);
+ ViaCrtcMask(hwp, 0x95, 0x00, 0x07);
ViaSetSecondaryFetchCount(pScrn, mode->CrtcHDisplay);
if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32))
- ViaCrtcChange(hwp, 0x94, 0x10, 0x7F); /* 64/4 */
+ ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); /* 64/4 */
else
- ViaCrtcChange(hwp, 0x94, 0x20, 0x7F); /* 128/4 */
+ ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); /* 128/4 */
break;
#endif /* HAVE_PM800 */
default:
diff --git a/src/via_bios.h b/src/via_bios.h
index 92cd298..c9b3f72 100644
--- a/src/via_bios.h
+++ b/src/via_bios.h
@@ -26,62 +26,6 @@
#ifndef _VIA_BIOS_H_
#define _VIA_BIOS_H_ 1
-#define VIA_CRT_SUPPORT TRUE
-#define VIA_LCD_SUPPORT TRUE
-#define VIA_UNCOVERD_LCD_PANEL FALSE
-#define VIA_NTSC_SUPPORT TRUE
-#define VIA_PAL_SUPPORT TRUE
-#define VIA_DVI_SUPPORT TRUE
-
-#define VIA_CRT_SUPPORT_BIT 0x01
-#define VIA_LCD_SUPPORT_BIT 0x02
-#define VIA_NTSC_SUPPORT_BIT 0x04
-#define VIA_PAL_SUPPORT_BIT 0x08
-#define VIA_DVI_SUPPORT_BIT 0x20
-
-#define VIA_BIOS_REG_TABLE_MAX_NUM 32
-#define VIA_BIOS_REG_LCD_MAX_NUM 48
-#define VIA_BIOS_NUM_RES 17
-#define VIA_BIOS_NUM_REFRESH 5
-#define VIA_BIOS_NUM_LCD_SUPPORT_MASK 8
-#define VIA_BIOS_NUM_LCD_POWER_SEQ 4
-#define VIA_BIOS_NUM_PANEL 7
-#define VIA_BIOS_MAX_NUM_MPATCH2 18
-#define VIA_BIOS_MAX_NUM_MPATCH1 9
-#define VIA_BIOS_MAX_NUM_CTREXP 5
-#define VIA_BIOS_MAX_NUM_TV_REG 144 /* 00 - 8F, tv2,tv3 are the same */
-#define VIA_BIOS_MAX_NUM_TV_CRTC 32
-#define VIA_BIOS_NUM_TV_SPECIAL_REG 8
-#define VIA_BIOS_MAX_NUM_TV_PATCH 8
-#define VIA_BIOS_NUM_TV_OTHER 16
-#define VIA_BIOS_NUM_TV2 2
-#define VIA_BIOS_NUM_TV3 6
-
-/* The position of some BIOS information from start of BIOS */
-#define VIA_BIOS_SIZE_POS 0x2
-#define VIA_BIOS_OFFSET_POS 0x1B
-
-/* The offset of table from table start */
-#define VIA_BIOS_CSTAB_POS 6
-#define VIA_BIOS_STDVGAREGTAB_POS 8
-#define VIA_BIOS_COMMEXTREGTAB_POS 10
-#define VIA_BIOS_STDMODEXTREGTAB_POS 12
-#define VIA_BIOS_EXTMODEREGTAB_POS 14
-#define VIA_BIOS_REFRESHMODETAB_POS 16
-#define VIA_BIOS_BIOSVER_POS 18
-#define VIA_BIOS_BCPPOST_POS 20
-#define VIA_BIOS_LCDMODETAB_POS 40
-#define VIA_BIOS_TVMODETAB_POS 42
-#define VIA_BIOS_TVMASKTAB_POS 44
-#define VIA_BIOS_MODEOVERTAB_POS 46
-#define VIA_BIOS_TV3HSCALETAB_POS 48
-#define VIA_BIOS_LCDPOWERON_POS 50
-#define VIA_BIOS_LCDPOWEROFF_POS 52
-#define VIA_BIOS_LCDMODEFIX_POS 54
-#define ZCR 0x0
-#define ZSR 0x1
-#define ZGR 0x2
-
#define VIA_RES_640X480 0
#define VIA_RES_800X600 1
#define VIA_RES_1024X768 2
@@ -109,7 +53,6 @@
#define VIA_TVRES_720X576 5
#define VIA_TVRES_INVALID 255
-
#define VIA_NUM_REFRESH_RATE 5
#define VIA_PANEL6X4 0
#define VIA_PANEL8X6 1
@@ -141,8 +84,8 @@
#define TVOUTPUT_SC 0x16
#define VIA_NONETV 0
-#define VIA_TV2PLUS 1
-#define VIA_TV3 2
+#define VIA_VT1621 1 /* TV2PLUS */
+#define VIA_VT1622 2 /* TV3 */
#define VIA_VT1622A 7
#define VIA_VT1623 9
@@ -181,211 +124,9 @@
#define CAP_WEAVE 0x0
#define CAP_BOB 0x1
-typedef struct _VIABIOSSTDVGATABLE {
- CARD8 columns;
- CARD8 rows;
- CARD8 fontHeight;
- CARD16 pageSize;
- CARD8 SR[5];
- CARD8 misc;
- CARD8 CR[25];
- CARD8 AR[20];
- CARD8 GR[9];
-} VIABIOSStdVGATableRec, *VIABIOSStdVGATablePtr;
-
-
-typedef struct _VIABIOSREFRESHTABLE {
- CARD8 refresh;
- CARD16 VClk;
- CARD8 CR[14];
-} VIABIOSRefreshTableRec, *VIABIOSRefreshTablePtr;
-
-
-typedef struct _VIABIOSREGTABLE {
- CARD8 port[VIA_BIOS_REG_TABLE_MAX_NUM];
- CARD8 offset[VIA_BIOS_REG_TABLE_MAX_NUM];
- CARD8 mask[VIA_BIOS_REG_TABLE_MAX_NUM];
- CARD8 data[VIA_BIOS_REG_TABLE_MAX_NUM];
- int numEntry;
-} VIABIOSRegTableRec, *VIABIOSRegTablePtr;
-
-
-typedef struct _VIAVMODEENTRY {
- unsigned short Width;
- unsigned short Height;
- unsigned short Bpp;
- unsigned short Mode;
- unsigned short MemNeed;
- unsigned short MClk;
- unsigned short VClk;
- VIABIOSStdVGATableRec stdVgaTable;
- VIABIOSRegTableRec extModeExtTable;
-} VIAModeEntry, *VIAModeEntryPtr;
-
-
-typedef struct _VIALCDMODEENTRY {
- CARD16 LCDClk;
- CARD16 VClk;
- CARD16 LCDClk_12Bit;
- CARD16 VClk_12Bit;
- CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM];
- CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM];
- CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM];
- int numEntry;
-} VIALCDModeEntry, *VIALCDModeEntryPtr;
-
-
-typedef struct _VIALCDMPATCHENTRY {
- CARD8 Mode;
- CARD16 LCDClk;
- CARD16 VClk;
- CARD16 LCDClk_12Bit;
- CARD16 VClk_12Bit;
- CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM];
- CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM];
- CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM];
- int numEntry;
-} VIALCDMPatchEntry, *VIALCDMPatchEntryPtr;
-
-
-typedef struct _VIALCDMODEFIX {
- CARD8 reqMode[32];
- CARD8 fixMode[32];
- int numEntry;
-} VIALCDModeFixRec, *VIALCDModeFixRecPtr;
-
-
-typedef struct _VIALCDPOWERSEQUENCE {
- CARD8 powerSeq;
- CARD8 port[4];
- CARD8 offset[4];
- CARD8 mask[4];
- CARD8 data[4];
- CARD16 delay[4];
- int numEntry;
-} VIALCDPowerSeqRec, *VIALCDPowerSeqRecPtr;
-
-
-typedef struct _VIALCDMODETABLE {
- CARD8 fpIndex;
- CARD8 fpSize;
- CARD8 powerSeq;
- int numMPatchDP2Ctr;
- int numMPatchDP2Exp;
- int numMPatchDP1Ctr;
- int numMPatchDP1Exp;
- CARD16 SuptMode[VIA_BIOS_NUM_LCD_SUPPORT_MASK];
- VIALCDModeEntry FPconfigTb;
- VIALCDModeEntry InitTb;
- VIALCDMPatchEntry MPatchDP2Ctr[VIA_BIOS_MAX_NUM_MPATCH2];
- VIALCDMPatchEntry MPatchDP2Exp[VIA_BIOS_MAX_NUM_MPATCH2];
- VIALCDMPatchEntry MPatchDP1Ctr[VIA_BIOS_MAX_NUM_MPATCH1];
- VIALCDMPatchEntry MPatchDP1Exp[VIA_BIOS_MAX_NUM_MPATCH1];
- VIALCDModeEntry LowResCtr;
- VIALCDModeEntry LowResExp;
- VIALCDModeEntry MCtr[VIA_BIOS_MAX_NUM_CTREXP];
- VIALCDModeEntry MExp[VIA_BIOS_MAX_NUM_CTREXP];
-} VIALCDModeTableRec, *VIALCDModePtr;
-
-
-typedef struct _VIATVMASKTABLE {
- CARD8 TV[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 misc1;
- CARD8 misc2;
- int numTV;
- int numCRTC1;
- int numCRTC2;
-} VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr;
-
-typedef struct _VIATVMODETABLE {
- CARD8 TVNTSCC[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 TVNTSCS[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH];
- CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD8 TVPALC[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 TVPALS[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH];
-} VIABIOSTV2TableRec, *VIABIOSTV2TablePtr;
-
-
-typedef struct _VIATV3MODETABLE {
- CARD8 TVNTSC[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH];
- CARD16 RGBNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD16 YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD16 SDTV_RGBNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD16 SDTV_YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER];
- CARD8 TVPAL[VIA_BIOS_MAX_NUM_TV_REG];
- CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG];
- CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
- CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH];
- CARD16 RGBPAL[VIA_BIOS_NUM_TV_OTHER];
- CARD16 YCbCrPAL[VIA_BIOS_NUM_TV_OTHER];
- CARD16 SDTV_RGBPAL[VIA_BIOS_NUM_TV_OTHER];
- CARD16 SDTV_YCbCrPAL[VIA_BIOS_NUM_TV_OTHER];
-} VIABIOSTV3TableRec, *VIABIOSTV3TablePtr;
-
-typedef struct _VIAVMODETABLE {
- unsigned short BIOSVer;
- char BIOSDate[9];
- unsigned short NumModes;
- int NumPowerOn;
- int NumPowerOff;
- VIAModeEntryPtr Modes;
- VIABIOSRegTableRec commExtTable;
- VIABIOSRegTableRec stdModeExtTable;
- VIABIOSRefreshTableRec refreshTable[VIA_BIOS_NUM_RES][VIA_BIOS_NUM_REFRESH];
- VIALCDModeTableRec lcdTable[VIA_BIOS_NUM_PANEL];
- VIALCDPowerSeqRec powerOn[VIA_BIOS_NUM_LCD_POWER_SEQ];
- VIALCDPowerSeqRec powerOff[VIA_BIOS_NUM_LCD_POWER_SEQ];
- VIALCDModeFixRec modeFix;
- VIABIOSTVMASKTableRec tv2MaskTable;
- VIABIOSTVMASKTableRec tv3MaskTable;
- VIABIOSTVMASKTableRec vt1622aMaskTable;
- VIABIOSTV2TableRec tv2Table[VIA_BIOS_NUM_TV2];
- VIABIOSTV2TableRec tv2OverTable[VIA_BIOS_NUM_TV2];
- VIABIOSTV3TableRec tv3Table[VIA_BIOS_NUM_TV3];
- VIABIOSTV3TableRec tv3OverTable[VIA_BIOS_NUM_TV3];
- VIABIOSTV3TableRec vt1622aTable[VIA_BIOS_NUM_TV3];
- VIABIOSTV3TableRec vt1622aOverTable[VIA_BIOS_NUM_TV3];
-} VIAModeTableRec, *VIAModeTablePtr;
-
typedef struct _VIABIOSINFO {
int scrnIndex;
- Bool UseBIOS;
- VIAModeTablePtr pModeTable;
- int BIOSMajorVersion;
- int BIOSMinorVersion;
- CARD8 BIOSDateYear;
- CARD8 BIOSDateMonth;
- CARD8 BIOSDateDay;
-
CARD16 ModeIndex;
CARD16 ResolutionIndex;
CARD16 RefreshIndex;
@@ -404,6 +145,7 @@ typedef struct _VIABIOSINFO {
CARD8 BusWidth; /* Digital Output Bus Width */
int PanelSize;
int PanelIndex;
+ Bool ForcePanel;
Bool SetDVI;
/* LCD Simultaneous Expand Mode HWCursor Y Scale */
Bool scaleY;
@@ -414,26 +156,34 @@ typedef struct _VIABIOSINFO {
/* TV entries */
int TVEncoder;
int TVType;
- Bool TVAttach;
Bool TVDotCrawl;
int TVOutput;
int TVVScan;
int TVHScale;
CARD16 TVIndex;
- CARD8 TVI2CAdd;
- CARD8 TVRegs[0xFF];
+ CARD8 TVI2CAddr;
+ Bool TVUseGpioI2c;
+ I2CDevPtr TVI2CDev;
+ int TVDeflicker;
+
} VIABIOSInfoRec, *VIABIOSInfoPtr;
-/* Functions protype */
+/* Function prototypes */
/* via_bios.c */
-void ViaModeTablesInit(VIABIOSInfoPtr pBIOSInfo);
+CARD8 ViaVBEGetActiveDevice(ScrnInfoPtr pScrn);
+CARD16 ViaVBEGetDisplayDeviceInfo(ScrnInfoPtr pScrn, CARD8 *numDevice);
+void ViaVBEPrintBIOSVersion(ScrnInfoPtr pScrn);
+void ViaVBEPrintBIOSDate(ScrnInfoPtr pScrn);
+#ifdef HAVE_DEBUG
+void ViaDumpVGAROM(ScrnInfoPtr pScrn);
+#endif /* HAVE_DEBUG */
/* via_mode.c */
-void VIACheckTVExist(ScrnInfoPtr pScrn);
+void VIATVDetect(ScrnInfoPtr pScrn);
CARD8 VIAGetActiveDisplay(ScrnInfoPtr pScrn);
Bool VIAPostDVI(ScrnInfoPtr pScrn);
CARD8 VIAGetDeviceDetect(ScrnInfoPtr pScrn);
-Bool VIAFindModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode);
+Bool VIAFindModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool Final);
void VIASetModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode);
void VIASetModeForMHS(ScrnInfoPtr pScrn, DisplayModePtr mode);
void VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies,
@@ -441,14 +191,6 @@ void VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies,
void VIAEnableLCD(ScrnInfoPtr pScrn);
void VIADisableLCD(ScrnInfoPtr pScrn);
-
-/* via_vbe.c */
-Bool ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn);
-CARD8 ViaVBEGetActiveDevice(ScrnInfoPtr pScrn);
-CARD16 ViaVBEGetDisplayDeviceInfo(ScrnInfoPtr pScrn, CARD8 *numDevice);
-Bool ViaVBEGetBIOSDate(ScrnInfoPtr pScrn);
-int ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn);
-
/* in via_bandwidth.c */
void ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode);
void ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode);
diff --git a/src/via_driver.c b/src/via_driver.c
index d0e7d4d..f72e95a 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -27,7 +27,7 @@
/*************************************************************************
*
* File: via_driver.c
- * Content: XFree86 4.0 for VIA/S3G UniChrom
+ * Content: XFree86 4.0 for VIA/S3G UniChrome
*
************************************************************************/
@@ -61,9 +61,8 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags);
static Bool VIAEnterVT(int scrnIndex, int flags);
static void VIALeaveVT(int scrnIndex, int flags);
static void VIASave(ScrnInfoPtr pScrn);
+static void VIARestore(ScrnInfoPtr pScrn);
static Bool VIAWriteMode(ScrnInfoPtr pScrn, DisplayModePtr mode);
-static void VIARestoreRegs(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr,
- VIARegPtr restore);
static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen);
static Bool VIASaveScreen(ScreenPtr pScreen, int mode);
static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc,
@@ -123,6 +122,11 @@ static PciChipsets VIAPciChipsets[] = {
int gVIAEntityIndex = -1;
typedef enum {
+#ifdef HAVE_DEBUG
+ OPTION_DUMPVGAROM,
+ OPTION_PRINTVGAREGS,
+ OPTION_PRINTTVREGS,
+#endif /* HAVE_DEBUG */
OPTION_PCI_BURST,
OPTION_PCI_RETRY,
OPTION_NOACCEL,
@@ -130,13 +134,13 @@ typedef enum {
OPTION_HWCURSOR,
OPTION_SHADOW_FB,
OPTION_ROTATE,
- OPTION_USEBIOS,
OPTION_VIDEORAM,
OPTION_ACTIVEDEVICE,
OPTION_LCDDUALEDGE,
OPTION_BUSWIDTH,
OPTION_CENTER,
OPTION_PANELSIZE,
+ OPTION_FORCEPANEL,
OPTION_TVDOTCRAWL,
OPTION_TVTYPE,
OPTION_TVOUTPUT,
@@ -147,25 +151,32 @@ typedef enum {
OPTION_CAP1_DEINTERLACE,
OPTION_CAP0_FIELDSWAP,
OPTION_DRIXINERAMA,
- OPTION_DISABLEIRQ
+ OPTION_DISABLEIRQ,
+ OPTION_TVDEFLICKER
} VIAOpts;
static OptionInfoRec VIAOptions[] =
{
+#ifdef HAVE_DEBUG /* Don't document these */
+ {OPTION_DUMPVGAROM, "DumpVGAROM", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_PRINTVGAREGS, "PrintVGARegs", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_PRINTTVREGS, "PrintTVRegs", OPTV_BOOLEAN, {0}, FALSE},
+#endif /* HAVE_DEBUG */
{OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_HWCURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE},
- {OPTION_USEBIOS, "UseBIOS", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_VIDEORAM, "VideoRAM", OPTV_INTEGER, {0}, FALSE},
{OPTION_ACTIVEDEVICE, "ActiveDevice", OPTV_ANYSTR, {0}, FALSE},
{OPTION_LCDDUALEDGE, "LCDDualEdge", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_BUSWIDTH, "BusWidth", OPTV_ANYSTR, {0}, FALSE},
{OPTION_CENTER, "Center", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_PANELSIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE},
+ {OPTION_FORCEPANEL, "ForcePanel", OPTV_BOOLEAN, {0}, FALSE}, /* last resort - don't doc */
{OPTION_TVDOTCRAWL, "TVDotCrawl", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_TVDEFLICKER,"TVDeflicker", OPTV_INTEGER, {0}, FALSE},
{OPTION_TVTYPE, "TVType", OPTV_ANYSTR, {0}, FALSE},
{OPTION_TVOUTPUT, "TVOutput", OPTV_ANYSTR, {0}, FALSE},
{OPTION_TVVSCAN, "TVVScan", OPTV_ANYSTR, {0}, FALSE},
@@ -396,8 +407,7 @@ static Bool VIAGetRec(ScrnInfoPtr pScrn)
xnfcalloc(sizeof(VIABIOSInfoRec), 1);
((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->scrnIndex =
pScrn->scrnIndex;
- ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable =
- xnfcalloc(sizeof(VIAModeTableRec), 1);
+ ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->TVI2CDev = NULL;
((VIARec *)(pScrn->driverPrivate))->FirstInit = TRUE;
((VIARec *)(pScrn->driverPrivate))->CursorImage = NULL;
@@ -416,14 +426,15 @@ static void VIAFreeRec(ScrnInfoPtr pScrn)
if (VIAPTR(pScrn)->pVbe)
vbeFree(VIAPTR(pScrn)->pVbe);
- xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable);
+ if (((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->TVI2CDev)
+ xf86DestroyI2CDevRec((((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->TVI2CDev), TRUE);
xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo);
ViaTunerDestroy(pScrn);
- xfree(pScrn->driverPrivate);
- pScrn->driverPrivate = NULL;
VIAUnmapMem(pScrn);
+ xfree(pScrn->driverPrivate);
+ pScrn->driverPrivate = NULL;
} /* VIAFreeRec */
@@ -857,15 +868,6 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
pVia->hwcursor ? "HW" : "SW");
from = X_DEFAULT;
- if (xf86ReturnOptValBool(VIAOptions, OPTION_USEBIOS, FALSE)) {
- from = X_CONFIG;
- pBIOSInfo->UseBIOS = TRUE;
- }
- else {
- pBIOSInfo->UseBIOS = FALSE;
- }
- xf86DrvMsg(pScrn->scrnIndex, from, "%ssing video BIOS to set modes\n",
- pBIOSInfo->UseBIOS ? "U" : "Not u" );
pScrn->videoRam = 0;
if(xf86GetOptValInteger(VIAOptions, OPTION_VIDEORAM, &pScrn->videoRam)) {
@@ -1011,6 +1013,12 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
}
}
+ /* Force the use of the Panel? */
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_FORCEPANEL, FALSE))
+ pBIOSInfo->ForcePanel = TRUE;
+ else
+ pBIOSInfo->ForcePanel = FALSE;
+
/* TV DotCrawl Enable Option */
if (xf86ReturnOptValBool(VIAOptions, OPTION_TVDOTCRAWL, FALSE)) {
pBIOSInfo->TVDotCrawl = TRUE;
@@ -1020,6 +1028,12 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
pBIOSInfo->TVDotCrawl = FALSE;
}
+ /* TV Deflicker */
+ pBIOSInfo->TVDeflicker = 0;
+ if(xf86GetOptValInteger(VIAOptions, OPTION_TVDEFLICKER, &pBIOSInfo->TVDeflicker)) {
+ xf86DrvMsg( pScrn->scrnIndex, X_CONFIG, "Option: TVDeflicker %d\n", pBIOSInfo->TVDeflicker );
+ }
+
pBIOSInfo->TVType = TVTYPE_NONE;
if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) {
if (!xf86NameCmp(s, "NTSC")) {
@@ -1181,11 +1195,25 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
}
hwp = VGAHWPTR(pScrn);
-#ifdef REGISTER_PRINT
+#ifdef HAVE_DEBUG
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_DUMPVGAROM, FALSE))
+ ViaDumpVGAROM(pScrn);
+
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_PRINTVGAREGS, FALSE))
+ pVia->PrintVGARegs = TRUE;
+ else
+ pVia->PrintVGARegs = FALSE;
+
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_PRINTTVREGS, FALSE))
+ pVia->PrintTVRegs = TRUE;
+ else
+ pVia->PrintTVRegs = FALSE;
+
/* Do this as early as possible */
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPreInit: Printing VGA registers.\n");
- ViaVgahwPrint(VGAHWPTR(pScrn));
-#endif
+ if (pVia->PrintVGARegs)
+ ViaVgahwPrint(VGAHWPTR(pScrn));
+#endif /* HAVE_DEBUG */
+
if (pVia->Chipset == VIA_CLE266)
ViaDoubleCheckCLE266Revision(pScrn);
@@ -1197,9 +1225,8 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
pVia->MemClk = hwp->readCrtc(hwp, 0x3D) >> 4;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected MemClk %d\n", pVia->MemClk));
- ViaModeTablesInit(pBIOSInfo);
- ViaVBEGetBIOSVersion(pScrn);
- ViaVBEGetBIOSDate(pScrn);
+ ViaVBEPrintBIOSVersion(pScrn);
+ ViaVBEPrintBIOSDate(pScrn);
if (pBIOSInfo->TVType == TVTYPE_NONE) {
/* use jumper to determine TV Type */
@@ -1223,28 +1250,21 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
}
}
- /* Next go on to detect amount of installed ram */
+ /* detect amount of installed ram */
if (pScrn->videoRam < 16384 || pScrn->videoRam > 65536) {
- bMemSize = ViaVBEGetVideoMemSize(pScrn);
- if (bMemSize) {
- pScrn->videoRam = bMemSize << 6;
- }
- else {
- if(pVia->Chipset == VIA_CLE266)
- bMemSize = hwp->readSeq(hwp, 0x34);
- else
- bMemSize = hwp->readSeq(hwp, 0x39);
- if (bMemSize > 16 && bMemSize <= 128) {
- pScrn->videoRam = (bMemSize + 1) << 9;
- }
- else if (bMemSize > 0 && bMemSize < 31){
- pScrn->videoRam = bMemSize << 12;
- }
- else {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to detect memory size, defaulting to 16MB\n");
- pScrn->videoRam = 16 << 10; /* Assume the base 16Mb */
- }
- }
+ if(pVia->Chipset == VIA_CLE266)
+ bMemSize = hwp->readSeq(hwp, 0x34);
+ else
+ bMemSize = hwp->readSeq(hwp, 0x39);
+
+ if (bMemSize > 16 && bMemSize <= 128)
+ pScrn->videoRam = (bMemSize + 1) << 9;
+ else if (bMemSize > 0 && bMemSize < 31)
+ pScrn->videoRam = bMemSize << 12;
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Memory size detection failed: using 16MB\n");
+ pScrn->videoRam = 16 << 10; /* Assume the base 16Mb */
+ }
}
/* Split FB for SAMM */
@@ -1286,7 +1306,7 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
xf86LoaderReqSymLists(ddcSymbols, NULL);
if (!(pVia->pVbe && ((pVia->DDC1 = vbeDoEDID(pVia->pVbe, NULL)))))
- pVia->DDC1 = xf86DoEDID_DDC2(pScrn->scrnIndex, pVia->I2C_Port1);
+ pVia->DDC1 = xf86DoEDID_DDC2(pScrn->scrnIndex, pVia->pI2CBus1);
if (pVia->DDC1) {
xf86PrintEDID(pVia->DDC1);
@@ -1294,6 +1314,22 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
}
}
+ VIATVDetect(pScrn);
+
+ /* Detect TMDS/LVDS Encoder */
+ VIAPostDVI(pScrn);
+ pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pScrn);
+
+ VIADeviceSelection(pScrn);
+ if (pVia->IsSecondary) {
+ if (pVia->SAMM)
+ VIADeviceDispatch(pScrn);
+ else {
+ VIAFreeRec(pScrn);
+ return FALSE;
+ }
+ }
+
/*
* Setup the ClockRanges, which describe what clock ranges are available,
* and what sort of modes they can be used for.
@@ -1349,13 +1385,6 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
pVia->Bpp = pScrn->bitsPerPixel >> 3;
pVia->Bpl = pScrn->displayWidth * pVia->Bpp;
- /* Detect TV Encoder */
- VIACheckTVExist(pScrn);
-
- /* Detect TMDS/LVDS Encoder */
- VIAPostDVI(pScrn);
- pBIOSInfo->ConnectedDevice = VIAGetDeviceDetect(pScrn);
-
xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);
pScrn->currentMode = pScrn->modes;
xf86PrintModes(pScrn);
@@ -1430,16 +1459,6 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags)
/* xf86LoaderReqSymLists(mpegSymbols, NULL); */
- VIADeviceSelection(pScrn);
- if (pVia->IsSecondary) {
- if (pVia->SAMM)
- VIADeviceDispatch(pScrn);
- else {
- VIAFreeRec(pScrn);
- return FALSE;
- }
- }
-
VIAUnmapMem(pScrn);
return TRUE;
@@ -1472,7 +1491,7 @@ static Bool VIAEnterVT(int scrnIndex, int flags)
#ifdef XF86DRI
/*
- * Rebind AGP memory, reinitialize ringbuffer and release the
+ * Reinitialize ringbuffer and release the
* hardware lock.
*/
@@ -1490,11 +1509,8 @@ static void VIALeaveVT(int scrnIndex, int flags)
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
- vgaRegPtr vgaSavePtr = &hwp->SavedReg;
- VIARegPtr viaSavePtr = &pVia->SavedReg;
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIALeaveVT\n"));
-
#ifdef XF86DRI
@@ -1503,7 +1519,9 @@ static void VIALeaveVT(int scrnIndex, int flags)
*/
viaDRILeaveVT(scrnIndex);
-#endif
+#else
+ ViaWaitIdle(pScrn);
+#endif
if (pVia->VQEnable)
ViaVQDisable(pScrn);
@@ -1515,22 +1533,19 @@ static void VIALeaveVT(int scrnIndex, int flags)
if (pVia->hwcursor)
ViaCursorStore(pScrn);
- VIARestoreRegs(pScrn, vgaSavePtr, viaSavePtr);
+ VIARestore(pScrn);
vgaHWLock(hwp);
}
-static void VIASave(ScrnInfoPtr pScrn)
+static void
+VIASave(ScrnInfoPtr pScrn)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
- vgaRegPtr vgaSavePtr = &hwp->SavedReg;
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIARegPtr save = &pVia->SavedReg;
+ VIARegPtr Regs = &pVia->SavedReg;
int i;
- I2CDevPtr dev;
- unsigned char W_Buffer[1];
- unsigned char TVRegs[0xFF];
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASave\n"));
@@ -1552,215 +1567,192 @@ static void VIASave(ScrnInfoPtr pScrn)
vgaHWProtect(pScrn, TRUE);
if (xf86IsPrimaryPci(pVia->PciInfo))
- vgaHWSave(pScrn, vgaSavePtr, VGA_SR_ALL);
+ vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL);
else
- vgaHWSave(pScrn, vgaSavePtr, VGA_SR_MODE);
+ vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE);
/* Unlock Extended Regs */
hwp->writeSeq(hwp, 0x10, 0x01);
- save->SR14 = hwp->readSeq(hwp, 0x14);
- save->SR15 = hwp->readSeq(hwp, 0x15);
- save->SR16 = hwp->readSeq(hwp, 0x16);
- save->SR17 = hwp->readSeq(hwp, 0x17);
- save->SR18 = hwp->readSeq(hwp, 0x18);
- save->SR19 = hwp->readSeq(hwp, 0x19);
- save->SR1A = hwp->readSeq(hwp, 0x1A);
- save->SR1B = hwp->readSeq(hwp, 0x1B);
- save->SR1C = hwp->readSeq(hwp, 0x1C);
- save->SR1D = hwp->readSeq(hwp, 0x1D);
- save->SR1E = hwp->readSeq(hwp, 0x1E);
- save->SR1F = hwp->readSeq(hwp, 0x1F);
-
- save->SR22 = hwp->readSeq(hwp, 0x22);
- save->SR23 = hwp->readSeq(hwp, 0x23);
- save->SR24 = hwp->readSeq(hwp, 0x24);
- save->SR25 = hwp->readSeq(hwp, 0x25);
- save->SR26 = hwp->readSeq(hwp, 0x26);
- save->SR27 = hwp->readSeq(hwp, 0x27);
- save->SR28 = hwp->readSeq(hwp, 0x28);
- save->SR29 = hwp->readSeq(hwp, 0x29);
- save->SR2A = hwp->readSeq(hwp, 0x2A);
- save->SR2B = hwp->readSeq(hwp, 0x2B);
-
- save->SR2E = hwp->readSeq(hwp, 0x2E);
-
- save->SR44 = hwp->readSeq(hwp, 0x44);
- save->SR45 = hwp->readSeq(hwp, 0x45);
- save->SR46 = hwp->readSeq(hwp, 0x46);
- save->SR47 = hwp->readSeq(hwp, 0x47);
-
- save->CR13 = hwp->readCrtc(hwp, 0x13);
-
- save->CR32 = hwp->readCrtc(hwp, 0x32);
- save->CR33 = hwp->readCrtc(hwp, 0x33);
- save->CR34 = hwp->readCrtc(hwp, 0x34);
- save->CR35 = hwp->readCrtc(hwp, 0x35);
- save->CR36 = hwp->readCrtc(hwp, 0x36);
+ Regs->SR14 = hwp->readSeq(hwp, 0x14);
+ Regs->SR15 = hwp->readSeq(hwp, 0x15);
+ Regs->SR16 = hwp->readSeq(hwp, 0x16);
+ Regs->SR17 = hwp->readSeq(hwp, 0x17);
+ Regs->SR18 = hwp->readSeq(hwp, 0x18);
+ Regs->SR19 = hwp->readSeq(hwp, 0x19);
+ Regs->SR1A = hwp->readSeq(hwp, 0x1A);
+ Regs->SR1B = hwp->readSeq(hwp, 0x1B);
+ Regs->SR1C = hwp->readSeq(hwp, 0x1C);
+ Regs->SR1D = hwp->readSeq(hwp, 0x1D);
+ Regs->SR1E = hwp->readSeq(hwp, 0x1E);
+ Regs->SR1F = hwp->readSeq(hwp, 0x1F);
+
+ Regs->SR22 = hwp->readSeq(hwp, 0x22);
+ Regs->SR23 = hwp->readSeq(hwp, 0x23);
+ Regs->SR24 = hwp->readSeq(hwp, 0x24);
+ Regs->SR25 = hwp->readSeq(hwp, 0x25);
+ Regs->SR26 = hwp->readSeq(hwp, 0x26);
+ Regs->SR27 = hwp->readSeq(hwp, 0x27);
+ Regs->SR28 = hwp->readSeq(hwp, 0x28);
+ Regs->SR29 = hwp->readSeq(hwp, 0x29);
+ Regs->SR2A = hwp->readSeq(hwp, 0x2A);
+ Regs->SR2B = hwp->readSeq(hwp, 0x2B);
+
+ Regs->SR2E = hwp->readSeq(hwp, 0x2E);
+
+ Regs->SR44 = hwp->readSeq(hwp, 0x44);
+ Regs->SR45 = hwp->readSeq(hwp, 0x45);
+ Regs->SR46 = hwp->readSeq(hwp, 0x46);
+ Regs->SR47 = hwp->readSeq(hwp, 0x47);
+
+ Regs->CR13 = hwp->readCrtc(hwp, 0x13);
+
+ Regs->CR32 = hwp->readCrtc(hwp, 0x32);
+ Regs->CR33 = hwp->readCrtc(hwp, 0x33);
+ Regs->CR34 = hwp->readCrtc(hwp, 0x34);
+ Regs->CR35 = hwp->readCrtc(hwp, 0x35);
+ Regs->CR36 = hwp->readCrtc(hwp, 0x36);
/* Saving TV register status before set mode */
switch (pBIOSInfo->TVEncoder) {
- case VIA_NONETV:
- break;
- case VIA_VT1623:
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
+ case VIA_VT1621:
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVUseGpioI2c) {
+ CARD8 R_Buffer[1];
+
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
for (i = 0; i < 0x6C; i++) {
- VIAGPIOI2C_ReadByte(&(pVia->GpioI2c), i, (TVRegs + i));
- save->TVRegs[i] = TVRegs[i];
- /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Save TV Register[%d]0x%X\n", i, save->TVRegs[i]));*/
- }
- break;
- default:
- if (xf86I2CProbeAddress(pVia->I2C_Port2, pBIOSInfo->TVI2CAdd)) {
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
- dev->pI2CBus = pVia->I2C_Port2;
-
- if (xf86I2CDevInit(dev)) {
- W_Buffer[0] = 0;
- xf86I2CWriteRead(dev, W_Buffer,1, TVRegs, 0xFF);
- for (i = 0; i < 0xFF; i++) {
- save->TVRegs[i] = TVRegs[i];
- }
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- else
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- break;
+ VIAGPIOI2C_ReadByte(&(pVia->GpioI2c), i, R_Buffer);
+ Regs->TVRegs[i] = R_Buffer[0];
+ /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Save TV Register[%d]0x%X\n", i, Regs->TVRegs[i]));*/
+ }
+ } else {
+ CARD8 W_Buffer[1], TVRegs[0xFF];
+
+ W_Buffer[0] = 0;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, TVRegs, 0xFF);
+ for (i = 0; i < 0xFF; i++)
+ Regs->TVRegs[i] = TVRegs[i];
+ }
+ break;
+ default:
+ break;
}
/* Save LCD control regs */
for (i = 0; i < 68; i++)
- save->CRTCRegs[i] = hwp->readCrtc(hwp, i + 0x50);
+ Regs->CRTCRegs[i] = hwp->readCrtc(hwp, i + 0x50);
- if (!pVia->ModeStructInit) {
- vgaHWCopyReg(&hwp->ModeReg, vgaSavePtr);
- memcpy(&pVia->ModeReg, save, sizeof(VIARegRec));
- pVia->ModeStructInit = TRUE;
- }
vgaHWProtect(pScrn, FALSE);
}
- return;
}
static void
-VIARestoreRegs(ScrnInfoPtr pScrn, vgaRegPtr vgaSavePtr, VIARegPtr restore)
+VIARestore(ScrnInfoPtr pScrn)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
-/* Bool graphicsMode = FALSE;*/
+ VIARegPtr Regs = &pVia->SavedReg;
int i;
- unsigned char W_Buffer[3];
- I2CDevPtr dev = NULL;
CARD8 tmp;
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIARestoreRegs\n"));
+ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIARestore\n"));
+
+ /* Secondary? */
vgaHWProtect(pScrn, TRUE);
/* Unlock Extended Regs */
hwp->writeSeq(hwp, 0x10, 0x01);
- /* How can we know the mode is graphical mode or not ? */
- /* graphicsMode = (restore->mode == 0xFF) ? FALSE : TRUE; */
hwp->writeCrtc(hwp, 0x6A, 0x00);
hwp->writeCrtc(hwp, 0x6B, 0x00);
hwp->writeCrtc(hwp, 0x6C, 0x00);
switch (pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
- case VIA_TV3:
- case VIA_VT1622A:
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
- dev->pI2CBus = pVia->I2C_Port2;
- if (xf86I2CDevInit(dev)) {
- for (i = 0; i < 0xFF; i++) {
- W_Buffer[0] = (unsigned char)(i);
- W_Buffer[1] = (unsigned char)(restore->TVRegs[i]);
- xf86I2CWriteRead(dev, W_Buffer, 2, NULL,0);
- }
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- else
- xf86DestroyI2CDevRec(dev,TRUE);
- break;
- case VIA_VT1623:
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
+ case VIA_VT1621:
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVUseGpioI2c) {
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
for (i = 0; i < 0x6C; i++) {
- VIAGPIOI2C_Write(&(pVia->GpioI2c), i, restore->TVRegs[i]);
- /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Write Back Register[%d]:0x%X\n", i, restore->TVRegs[i]));*/
+ VIAGPIOI2C_Write(&(pVia->GpioI2c), i, Regs->TVRegs[i]);
+ /*DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Write Back Register[%d]:0x%X\n", i, Regs->TVRegs[i]));*/
}
- break;
- default:
- break;
+ } else {
+ CARD8 W_Buffer[3];
+
+ for (i = 0; i < 0xFF; i++) {
+ W_Buffer[0] = (CARD8)(i);
+ W_Buffer[1] = (CARD8)(Regs->TVRegs[i]);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer, 2, NULL,0);
+ }
+ }
+ break;
+ default:
+ break;
}
/* restore the standard vga regs */
if (xf86IsPrimaryPci(pVia->PciInfo))
- vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_ALL);
+ vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_ALL);
else
- vgaHWRestore(pScrn, vgaSavePtr, VGA_SR_MODE);
+ vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE);
/* restore extended regs */
- hwp->writeSeq(hwp, 0x14, restore->SR14);
- hwp->writeSeq(hwp, 0x15, restore->SR15);
- hwp->writeSeq(hwp, 0x16, restore->SR16);
- hwp->writeSeq(hwp, 0x17, restore->SR17);
- hwp->writeSeq(hwp, 0x18, restore->SR18);
- hwp->writeSeq(hwp, 0x19, restore->SR19);
- hwp->writeSeq(hwp, 0x1A, restore->SR1A);
- hwp->writeSeq(hwp, 0x1B, restore->SR1B);
- hwp->writeSeq(hwp, 0x1C, restore->SR1C);
- hwp->writeSeq(hwp, 0x1D, restore->SR1D);
- hwp->writeSeq(hwp, 0x1E, restore->SR1E);
- hwp->writeSeq(hwp, 0x1F, restore->SR1F);
-
- hwp->writeSeq(hwp, 0x22, restore->SR22);
- hwp->writeSeq(hwp, 0x23, restore->SR23);
- hwp->writeSeq(hwp, 0x24, restore->SR24);
- hwp->writeSeq(hwp, 0x25, restore->SR25);
- hwp->writeSeq(hwp, 0x26, restore->SR26);
- hwp->writeSeq(hwp, 0x27, restore->SR27);
- hwp->writeSeq(hwp, 0x28, restore->SR28);
- hwp->writeSeq(hwp, 0x29, restore->SR29);
- hwp->writeSeq(hwp, 0x2A, restore->SR2A);
- hwp->writeSeq(hwp, 0x2B, restore->SR2B);
-
- hwp->writeSeq(hwp, 0x2E, restore->SR2E);
+ hwp->writeSeq(hwp, 0x14, Regs->SR14);
+ hwp->writeSeq(hwp, 0x15, Regs->SR15);
+ hwp->writeSeq(hwp, 0x16, Regs->SR16);
+ hwp->writeSeq(hwp, 0x17, Regs->SR17);
+ hwp->writeSeq(hwp, 0x18, Regs->SR18);
+ hwp->writeSeq(hwp, 0x19, Regs->SR19);
+ hwp->writeSeq(hwp, 0x1A, Regs->SR1A);
+ hwp->writeSeq(hwp, 0x1B, Regs->SR1B);
+ hwp->writeSeq(hwp, 0x1C, Regs->SR1C);
+ hwp->writeSeq(hwp, 0x1D, Regs->SR1D);
+ hwp->writeSeq(hwp, 0x1E, Regs->SR1E);
+ hwp->writeSeq(hwp, 0x1F, Regs->SR1F);
+
+ hwp->writeSeq(hwp, 0x22, Regs->SR22);
+ hwp->writeSeq(hwp, 0x23, Regs->SR23);
+ hwp->writeSeq(hwp, 0x24, Regs->SR24);
+ hwp->writeSeq(hwp, 0x25, Regs->SR25);
+ hwp->writeSeq(hwp, 0x26, Regs->SR26);
+ hwp->writeSeq(hwp, 0x27, Regs->SR27);
+ hwp->writeSeq(hwp, 0x28, Regs->SR28);
+ hwp->writeSeq(hwp, 0x29, Regs->SR29);
+ hwp->writeSeq(hwp, 0x2A, Regs->SR2A);
+ hwp->writeSeq(hwp, 0x2B, Regs->SR2B);
+
+ hwp->writeSeq(hwp, 0x2E, Regs->SR2E);
- hwp->writeSeq(hwp, 0x44, restore->SR44);
- hwp->writeSeq(hwp, 0x45, restore->SR45);
- hwp->writeSeq(hwp, 0x46, restore->SR46);
- hwp->writeSeq(hwp, 0x47, restore->SR47);
-
- hwp->writeCrtc(hwp, 0x13, restore->CR13);
- hwp->writeCrtc(hwp, 0x32, restore->CR32);
- hwp->writeCrtc(hwp, 0x33, restore->CR33);
- hwp->writeCrtc(hwp, 0x34, restore->CR34);
- hwp->writeCrtc(hwp, 0x35, restore->CR35);
- hwp->writeCrtc(hwp, 0x36, restore->CR36);
+ hwp->writeSeq(hwp, 0x44, Regs->SR44);
+ hwp->writeSeq(hwp, 0x45, Regs->SR45);
+ hwp->writeSeq(hwp, 0x46, Regs->SR46);
+ hwp->writeSeq(hwp, 0x47, Regs->SR47);
+
+ hwp->writeCrtc(hwp, 0x13, Regs->CR13);
+ hwp->writeCrtc(hwp, 0x32, Regs->CR32);
+ hwp->writeCrtc(hwp, 0x33, Regs->CR33);
+ hwp->writeCrtc(hwp, 0x34, Regs->CR34);
+ hwp->writeCrtc(hwp, 0x35, Regs->CR35);
+ hwp->writeCrtc(hwp, 0x36, Regs->CR36);
/* Restore LCD control regs */
for (i = 0; i < 68; i++)
- hwp->writeCrtc(hwp, i + 0x50, restore->CRTCRegs[i]);
+ hwp->writeCrtc(hwp, i + 0x50, Regs->CRTCRegs[i]);
if (pBIOSInfo->DefaultActiveDevice & VIA_DEVICE_LCD)
VIAEnableLCD(pScrn);
ViaDisablePrimaryFIFO(pScrn);
+
/* Reset clock */
tmp = hwp->readMiscOut(hwp);
hwp->writeMiscOut(hwp, tmp);
- /* If we're going into graphics mode and acceleration was enabled, */
-/*
- if (graphicsMode && (!pVia->NoAccel)) {
- VIAInitialize2DEngine(pScrn);
- }
-*/
vgaHWProtect(pScrn, FALSE);
}
@@ -1801,18 +1793,18 @@ void VIAEnableMMIO(ScrnInfoPtr pScrn)
/* Enable MMIO */
if(!pVia->IsSecondary) {
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "primary val = %x\n", hwp->readSeq(hwp, 0x1A)));
- ViaSeqChange(hwp, 0x1A, 0x68, 0x68);
+ ViaSeqMask(hwp, 0x1A, 0x68, 0x68);
}
else {
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "secondary val = %x\n", hwp->readSeq(hwp, 0x1A)));
- ViaSeqChange(hwp, 0x1A, 0x38, 0x38);
+ ViaSeqMask(hwp, 0x1A, 0x38, 0x38);
}
}
void VIADisableMMIO(ScrnInfoPtr pScrn)
{
- ViaSeqChange(VGAHWPTR(pScrn), 0x1A, 0x00, 0x68);
+ ViaSeqMask(VGAHWPTR(pScrn), 0x1A, 0x00, 0x68);
}
static Bool VIAMapMMIO(ScrnInfoPtr pScrn)
@@ -1950,7 +1942,6 @@ static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen,
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
- int ret;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit\n"));
@@ -1966,10 +1957,10 @@ static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen,
vgaHWBlankScreen(pScrn, FALSE);
- if (!VIAWriteMode(pScrn, pScrn->currentMode))
+ if (!VIAWriteMode(pScrn, pScrn->currentMode)) {
+ vgaHWBlankScreen(pScrn, TRUE);
return FALSE;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- State saved\n"));
+ }
/* Darken the screen for aesthetic reasons and set the viewport */
VIASaveScreen(pScreen, SCREEN_SAVER_ON);
@@ -1995,10 +1986,8 @@ static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen,
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Visuals set up\n"));
- ret = VIAInternalScreenInit(scrnIndex, pScreen);
-
- if (!ret)
- return FALSE;
+ if (!VIAInternalScreenInit(scrnIndex, pScreen))
+ return FALSE;
xf86SetBlackWhitePixels(pScreen);
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- B & W\n"));
@@ -2140,9 +2129,11 @@ static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen,
if (serverGeneration == 1)
xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
-#ifdef REGISTER_PRINT
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit: Printing VGA registers.\n");
- ViaVgahwPrint(VGAHWPTR(pScrn));
+#ifdef HAVE_DEBUG
+ if (pVia->PrintVGARegs) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit: Printing VGA registers.\n");
+ ViaVgahwPrint(VGAHWPTR(pScrn));
+ }
#endif
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Done\n"));
@@ -2152,17 +2143,13 @@ static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen,
static int VIAInternalScreenInit(int scrnIndex, ScreenPtr pScreen)
{
- ScrnInfoPtr pScrn;
- VIAPtr pVia;
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ VIAPtr pVia = VIAPTR(pScrn);
int width, height, displayWidth;
unsigned char *FBStart;
- int ret = TRUE;
xf86DrvMsg(scrnIndex, X_INFO, "VIAInternalScreenInit\n");
- pScrn = xf86Screens[pScreen->myNum];
- pVia = VIAPTR(pScrn);
-
displayWidth = pScrn->displayWidth;
if (pVia->rotate) {
@@ -2184,10 +2171,8 @@ static int VIAInternalScreenInit(int scrnIndex, ScreenPtr pScreen)
FBStart = pVia->FBStart;
}
- ret = fbScreenInit(pScreen, FBStart, width, height,
- pScrn->xDpi, pScrn->yDpi, displayWidth,
- pScrn->bitsPerPixel);
- return ret;
+ return fbScreenInit(pScreen, FBStart, width, height, pScrn->xDpi,
+ pScrn->yDpi, displayWidth, pScrn->bitsPerPixel);
}
@@ -2195,7 +2180,9 @@ static ModeStatus VIAValidMode(int scrnIndex, DisplayModePtr mode,
Bool verbose, int flags)
{
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAValidMode\n"));
- /* TODO check modes */
+
+ if (!VIAFindModeUseBIOSTable(xf86Screens[scrnIndex], mode, FALSE))
+ return MODE_BAD;
return MODE_OK;
}
@@ -2203,32 +2190,19 @@ static Bool
VIAWriteMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
VIAPtr pVia = VIAPTR(pScrn);
- VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
vgaHWPtr hwp = VGAHWPTR(pScrn);
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAWriteMode\n"));
- if (!vgaHWInit(pScrn, mode)) {
- vgaHWBlankScreen(pScrn, TRUE);
+ if (!VIAFindModeUseBIOSTable(pScrn, mode, TRUE)) {
return FALSE;
}
- pScrn->vtSema = TRUE;
-
- {
- int i;
-
- for (i = 0; i < 0xFF; i++) {
- pBIOSInfo->TVRegs[i] = pVia->SavedReg.TVRegs[i];
- }
- }
-
- if (!VIAFindModeUseBIOSTable(pScrn, mode)) {
- vgaHWBlankScreen(pScrn, TRUE);
- VIAFreeRec(pScrn);
+ if (!vgaHWInit(pScrn, mode))
return FALSE;
- }
+
+ pScrn->vtSema = TRUE;
/* FIXME - need DRI lock for this bit - see i810 */
if (!pVia->IsSecondary)
@@ -2265,8 +2239,6 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
- vgaRegPtr vgaSavePtr = &hwp->SavedReg;
- VIARegPtr viaSavePtr = &pVia->SavedReg;
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIACloseScreen\n"));
@@ -2277,7 +2249,7 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
ViaWaitIdle(pScrn);
/* Patch for normal log out and restart X, 3D application will hang */
- VIARestoreRegs(pScrn, vgaSavePtr, viaSavePtr);
+ VIARestore(pScrn);
if (!pVia->IsSecondary) {
/* Turn off all video activities */
@@ -2315,7 +2287,7 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
}
if (pScrn->vtSema) {
- VIARestoreRegs(pScrn, vgaSavePtr, viaSavePtr);
+ VIARestore(pScrn);
vgaHWLock(hwp);
VIAUnmapMem(pScrn);
}
@@ -2331,9 +2303,11 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen)
static void VIAFreeScreen(int scrnIndex, int flags)
{
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAFreeScreen\n"));
+
+ VIAFreeRec(xf86Screens[scrnIndex]);
+
if (xf86LoaderCheckSymbol("vgaHWFreeHWRec"))
vgaHWFreeHWRec(xf86Screens[scrnIndex]);
- VIAFreeRec(xf86Screens[scrnIndex]);
}
static Bool VIASaveScreen(ScreenPtr pScreen, int mode)
@@ -2357,7 +2331,7 @@ void VIAAdjustFrame(int scrnIndex, int x, int y, int flags)
/* now program the start address registers */
if (pVia->IsSecondary) {
Base = (Base + pScrn->fbOffset) >> 3;
- ViaCrtcChange(hwp, 0x62, (Base & 0x7F) << 1 , 0xFE);
+ ViaCrtcMask(hwp, 0x62, (Base & 0x7F) << 1 , 0xFE);
hwp->writeCrtc(hwp, 0x63, (Base & 0x7F80) >> 7);
hwp->writeCrtc(hwp, 0x64, (Base & 0x7F8000) >> 15);
}
@@ -2425,15 +2399,38 @@ Bool VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
VIAPtr pVia = VIAPTR(pScrn);
+ Bool ret;
DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIASwitchMode\n"));
/* Wait Hardware Engine idle to switch graphicd mode */
+
+#ifdef XF86DRI
+
+ /*
+ * Take the hardware lock, flush and disable the ringbuffer.
+ */
+
+ viaDRILeaveVT(scrnIndex);
+#else
ViaWaitIdle(pScrn);
+#endif
if (pVia->VQEnable)
ViaVQDisable(pScrn);
- return VIAWriteMode(xf86Screens[scrnIndex], mode);
+ ret = VIAWriteMode(xf86Screens[scrnIndex], mode);
+
+#ifdef XF86DRI
+
+ /*
+ * Reinitialize ringbuffer and release the
+ * hardware lock.
+ */
+
+ viaDRIEnterVT(scrnIndex);
+#endif
+ return ret;
+
}
static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
@@ -2443,9 +2440,6 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
CARD8 val;
- I2CDevPtr dev;
- unsigned char W_Buffer[2];
-
/* Clear DPMS setting */
val = hwp->readCrtc(hwp, 0x36);
val &= 0xCF;
@@ -2460,30 +2454,25 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
VIAEnableLCD(pScrn);
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
- dev->pI2CBus = pVia->I2C_Port2;
- if (xf86I2CDevInit(dev)) {
- switch (pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
- case VIA_TV3:
- case VIA_VT1622A:
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = 0x0;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- break;
- case VIA_VT1623:
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
- VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0);
- break;
- default:
- break;
- }
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- else
- xf86DestroyI2CDevRec(dev,TRUE);
+ switch (pBIOSInfo->TVEncoder) {
+ case VIA_VT1621:
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVUseGpioI2c) {
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
+ VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0);
+ } else {
+ CARD8 W_Buffer[2];
+
+ W_Buffer[0] = 0x0E;
+ W_Buffer[1] = 0x0;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ }
+ break;
+ default:
+ break;
+ }
}
hwp->writeCrtc(hwp, 0x36, val);
break;
@@ -2494,34 +2483,29 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags)
VIADisableLCD(pScrn);
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
- dev->pI2CBus = pVia->I2C_Port2;
- if (xf86I2CDevInit(dev)) {
- switch (pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = 0x03;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- break;
- case VIA_TV3:
- case VIA_VT1622A:
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = 0x0F;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- break;
- case VIA_VT1623:
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
- VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0x0F);
- break;
- default:
- break;
- }
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- else
- xf86DestroyI2CDevRec(dev,TRUE);
+ CARD8 W_Buffer[2];
+
+ switch (pBIOSInfo->TVEncoder) {
+ case VIA_VT1621:
+ W_Buffer[0] = 0x0E;
+ W_Buffer[1] = 0x03;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ break;
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVUseGpioI2c) {
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
+ VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0x0F);
+ } else {
+ W_Buffer[0] = 0x0E;
+ W_Buffer[1] = 0x0F;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ }
+ break;
+ default:
+ break;
+ }
}
val |= 0x30;
@@ -2565,15 +2549,6 @@ Bool VIADeviceSelection(ScrnInfoPtr pScrn)
pBIOSInfo->ActiveDevice &= pBIOSInfo->ConnectedDevice;
pVia->ActiveDevice = pBIOSInfo->ActiveDevice;
- /*if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD) {
- pBIOSInfo->DVIEncoder = VIA_VT3191;
- numDevice = 0x02;
- i = ViaVBEGetDisplayDeviceInfo(pScrn, &numDevice);
- if (i != 0xFFFF) {
- if (pBIOSInfo->PanelSize == VIA_PANEL_INVALID)
- pBIOSInfo->PanelSize = numDevice;
- }*/
-
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Connected Device is %d\n", pBIOSInfo->ConnectedDevice));
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device is %d\n", pBIOSInfo->ActiveDevice));
diff --git a/src/via_driver.h b/src/via_driver.h
index 2a533e3..2e1ddb9 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -26,9 +26,9 @@
#ifndef _VIA_DRIVER_H_
#define _VIA_DRIVER_H_ 1
-/* #define DEBUG_PRINT */
+/* #define HAVE_DEBUG */
-#ifdef DEBUG_PRINT
+#ifdef HAVE_DEBUG
#define DEBUG(x) x
#else
#define DEBUG(x)
@@ -69,7 +69,7 @@
#define DRIVER_NAME "via"
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
-#define PATCHLEVEL 26
+#define PATCHLEVEL 27
#define VIA_VERSION ((VERSION_MAJOR<<24) | (VERSION_MINOR<<16) | PATCHLEVEL)
#define VIA_MAX_ACCEL_X (2047)
@@ -183,9 +183,7 @@ typedef struct{
typedef struct _VIA {
VIARegRec SavedReg;
- VIARegRec ModeReg;
xf86CursorInfoPtr CursorInfoRec;
- Bool ModeStructInit;
int Bpp, Bpl;
unsigned PlaneMask;
@@ -267,11 +265,9 @@ typedef struct _VIA {
int DGAOldDepth;
/* I2C & DDC */
- I2CBusPtr I2C_Port1;
- I2CBusPtr I2C_Port2;
- I2CBusPtr pI2CBus1; /* == I2C_Port1 */
- I2CBusPtr pI2CBus2; /* == I2C_Port1 */
- I2CBusPtr pI2CBus3; /* the bus now accessed as gpioi2c */
+ I2CBusPtr pI2CBus1;
+ I2CBusPtr pI2CBus2;
+ I2CBusPtr pI2CBus3; /* Future implementation: now gpioi2c */
xf86MonPtr DDC1;
xf86MonPtr DDC2;
GpioI2cRec GpioI2c; /* should be weened off, but we have no info,
@@ -334,6 +330,12 @@ typedef struct _VIA {
int AudioMute;
ViaSharedPtr sharedData;
+
+#ifdef HAVE_DEBUG
+ Bool DumpVGAROM;
+ Bool PrintVGARegs;
+ Bool PrintTVRegs;
+#endif /* HAVE_DEBUG */
} VIARec, *VIAPtr;
diff --git a/src/via_i2c.c b/src/via_i2c.c
index fd265b0..3474df2 100644
--- a/src/via_i2c.c
+++ b/src/via_i2c.c
@@ -65,8 +65,8 @@ VIAI2C1PutBits(I2CBusPtr Bus, int clock, int data)
if (data)
value |= DDC_SDA_WRITE_MASK;
- ViaSeqChange(hwp, 0x26, value,
- 0x01 | DDC_SCL_WRITE_MASK | DDC_SDA_WRITE_MASK);
+ ViaSeqMask(hwp, 0x26, value,
+ 0x01 | DDC_SCL_WRITE_MASK | DDC_SDA_WRITE_MASK);
}
/*
@@ -128,8 +128,8 @@ VIAI2C2PutBits(I2CBusPtr Bus, int clock, int data)
if (data)
value |= DDC_SDA_WRITE_MASK;
- ViaSeqChange(hwp, 0x31, value,
- 0x01 | DDC_SCL_WRITE_MASK | DDC_SDA_WRITE_MASK);
+ ViaSeqMask(hwp, 0x31, value,
+ 0x01 | DDC_SCL_WRITE_MASK | DDC_SDA_WRITE_MASK);
}
/*
@@ -278,7 +278,7 @@ VIAGPIOI2C_Initial(GpioI2cPtr pDev, CARD8 Slave)
static void
ViaGpioI2c_Release(GpioI2cPtr pDev)
{
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT, 0x00, GPIOI2C_MASKD);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT, 0x00, GPIOI2C_MASKD);
}
/*
@@ -288,12 +288,12 @@ static void
ViaGpioI2c_SCLWrite(GpioI2cPtr pDev, CARD8 Data)
{
if (Data)
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT,
- GPIOI2C_SCL_WRITE | I2C_OUTPUT_CLOCK,
- GPIOI2C_SCL_MASK | I2C_OUTPUT_CLOCK);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT,
+ GPIOI2C_SCL_WRITE | I2C_OUTPUT_CLOCK,
+ GPIOI2C_SCL_MASK | I2C_OUTPUT_CLOCK);
else
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_WRITE,
- GPIOI2C_SCL_MASK | I2C_OUTPUT_CLOCK);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_WRITE,
+ GPIOI2C_SCL_MASK | I2C_OUTPUT_CLOCK);
}
/*
@@ -303,7 +303,7 @@ ViaGpioI2c_SCLWrite(GpioI2cPtr pDev, CARD8 Data)
static void
ViaGpioI2c_SCLRead(GpioI2cPtr pDev)
{
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_READ, GPIOI2C_SCL_MASK);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_READ, GPIOI2C_SCL_MASK);
}
#endif
@@ -314,12 +314,12 @@ static void
ViaGpioI2c_SDAWrite(GpioI2cPtr pDev, CARD8 Data)
{
if (Data)
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT,
- GPIOI2C_SDA_WRITE | I2C_OUTPUT_DATA,
- GPIOI2C_SDA_MASK | I2C_OUTPUT_DATA);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT,
+ GPIOI2C_SDA_WRITE | I2C_OUTPUT_DATA,
+ GPIOI2C_SDA_MASK | I2C_OUTPUT_DATA);
else
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SDA_WRITE,
- GPIOI2C_SDA_MASK | I2C_OUTPUT_DATA);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SDA_WRITE,
+ GPIOI2C_SDA_MASK | I2C_OUTPUT_DATA);
}
/*
@@ -328,7 +328,7 @@ ViaGpioI2c_SDAWrite(GpioI2cPtr pDev, CARD8 Data)
static void
ViaGpioI2c_SDARead(GpioI2cPtr pDev)
{
- ViaSeqChange(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_READ, GPIOI2C_SDA_MASK);
+ ViaSeqMask(pDev->hwp, VIA_GPIOI2C_PORT, GPIOI2C_SCL_READ, GPIOI2C_SDA_MASK);
}
/* Set SCL */
@@ -672,10 +672,6 @@ VIAI2CInit(ScrnInfoPtr pScrn)
pVia->pI2CBus2 = ViaI2CBus2Init(pScrn->scrnIndex);
pVia->pI2CBus3 = ViaI2CBus3Init(pScrn->scrnIndex);
- /* so that i dont have to clean out the lot right now. */
- pVia->I2C_Port1 = pVia->pI2CBus1;
- pVia->I2C_Port2 = pVia->pI2CBus2;
-
ViaGpioI2CInit(&(pVia->GpioI2c), VGAHWPTR(pScrn),
pVia->pI2CBus1->I2CUDelay);
}
diff --git a/src/via_id.c b/src/via_id.c
index 126d1a6..0e71218 100644
--- a/src/via_id.c
+++ b/src/via_id.c
@@ -36,19 +36,34 @@
* There's no reason for this to be known outside of via_id.o
* Only a pointer to an single entry will ever be used outside.
*
+ * The .tw trend is all too apparent and is bound to make anyone
+ * prejudist. This isn't just VIA alone. -- Luc.
+ *
*/
struct ViaCardIdStruct ViaCardId[] = {
- {"VIA EPIA M/MII/...", VIA_CLE266, 0x1106, 0x3122, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
- {"Shuttle FX43", VIA_KM400, 0x1297, 0xF643, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
- {"Asustek A7V8X-MX", VIA_KM400, 0x1043, 0x80ED, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ /* CLE266 */
{"ECS G320", VIA_CLE266, 0x1019, 0xB320, VIA_DEVICE_CRT | VIA_DEVICE_LCD, VIA_DEVICE_LCD},
+ {"VIA EPIA M/MII/...", VIA_CLE266, 0x1106, 0x3122, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
+ /* KM400 */
{"Acer Aspire 135x", VIA_KM400, 0x1025, 0x0033, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV, VIA_DEVICE_LCD},
+ {"Asustek A7V8X-MX", VIA_KM400, 0x1043, 0x80ED, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ {"Asustek A7V8X-MX SE", VIA_KM400, 0x1043, 0x8118, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ {"Soltek SL-75MIV2", VIA_KM400, 0x1106, 0x0000, VIA_DEVICE_CRT, VIA_DEVICE_NONE}, /* VIA/0x0000 -- soltek is .tw */
+ {"Shuttle FX43", VIA_KM400, 0x1297, 0xF643, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
+ {"Giga-byte 7VM400", VIA_KM400, 0x1458, 0xD000, VIA_DEVICE_CRT, VIA_DEVICE_NONE}, /* 7VM400M-RZ, GA-7VM400AMF */
+ {"DFI KM400-MLV", VIA_KM400, 0x1462, 0x7061, VIA_DEVICE_CRT, VIA_DEVICE_NONE}, /* ??? MSI ??? */
{"Averatec 322x", VIA_KM400, 0x14FF, 0x030D, VIA_DEVICE_CRT | VIA_DEVICE_LCD, VIA_DEVICE_LCD},
{"Gericom Hummer Advance", VIA_KM400, 0x1584, 0x800A, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV, VIA_DEVICE_LCD},
- {"Shuttle FX83", VIA_K8M800, 0x1297, 0xF683, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
- {"Mitac 8399/Pogolinux Konabook 3100", VIA_K8M800, 0x1071, 0x8399, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV, VIA_DEVICE_LCD},
- {"Giga-byte 7VM400M-RZ", VIA_KM400, 0x1458, 0xD000, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
{"ASRock Inc. K7VM4", VIA_KM400, 0x1849, 0x7205, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ {"Soyo K7VME", VIA_KM400, 0xA723, 0x10FD, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ /* K8M800 */
+ {"Acer Aspire 136x", VIA_K8M800, 0x1025, 0x006E, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV, VIA_DEVICE_LCD},
+ {"Mitac 8399/Pogolinux Konabook 3100", VIA_K8M800, 0x1071, 0x8399, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV, VIA_DEVICE_LCD},
+ {"Giga-byte GA-K8VM800M", VIA_K8M800, 0x1106, 0x3108, VIA_DEVICE_CRT, VIA_DEVICE_NONE}, /* VIA/K8M800 -- giga-byte is .tw */
+ {"Shuttle FX83", VIA_K8M800, 0x1297, 0xF683, VIA_DEVICE_CRT | VIA_DEVICE_TV, VIA_DEVICE_NONE},
+ /* PM800 */
+ {"Biostar P4VMA-M", VIA_PM800, 0x1565, 0x1202, VIA_DEVICE_CRT, VIA_DEVICE_NONE},
+ /* keep this */
{NULL, VIA_UNKNOWN, 0x0000, 0x0000, VIA_DEVICE_NONE}
};
diff --git a/src/via_mode.c b/src/via_mode.c
index a60d069..5938ade 100644
--- a/src/via_mode.c
+++ b/src/via_mode.c
@@ -35,6 +35,15 @@
#include "via_vgahw.h"
#include "via_id.h"
+/*
+ * Modetable nonsense.
+ *
+ */
+#include "via_mode.h"
+#include "via_tv2.h"
+#include "via_tv3.h"
+#include "via_vt1622a.h"
+
/* plain and simple lookuptable for TV/PanelIndex selection */
struct {
int Index;
@@ -63,90 +72,133 @@ struct {
{VIA_RES_INVALID, VIA_TVRES_INVALID, VIA_PANEL_INVALID, 0, 0}
};
-/*=*
- *
- * int VIACheckTVExist(VIABIOSInfoPtr) - Check TV Encoder
- *
- * Return Type: int
- *
- * The Definition of Input Value:
- *
- * VIABIOSInfoPtr
- *
- * The Definition of Return Value:
+#ifdef HAVE_DEBUG
+/*
+ * Print the content of the I2C registers of a detected TV encoder
*
- * 0 - None
- * 1 - VIA VT1621
- * 2 - VIA VT1622
+ */
+static void
+ViaPrintTVRegs(ScrnInfoPtr pScrn)
+{
+ VIAPtr pVia = VIAPTR(pScrn);
+ VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+ int i;
+ CARD8 R_Buffer[1];
+
+ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPrintTVRegs\n"));
+
+ if (pBIOSInfo->TVUseGpioI2c) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for GPIOI2C 0x%02X\n",
+ pVia->GpioI2c.Address);
+
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
+
+ for (i = 0; i < 0xFF; i++) {
+ VIAGPIOI2C_Read(&(pVia->GpioI2c), i, R_Buffer, 1);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, R_Buffer[0]);
+ }
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of TV registers.\n");
+ } else if (pBIOSInfo->TVI2CDev) {
+ CARD8 W_Buffer[1];
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n",
+ pBIOSInfo->TVI2CDev->DevName);
+ for (i = 0; i < 0xFF; i++) {
+ W_Buffer[0] = i;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, R_Buffer[0]);
+ }
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of TV registers.\n");
+ }
+}
+#endif /* HAVE_DEBUG */
+
+/*
+ * We currently only support a single TV encoder and only know the VT162x
*
- *=*/
+ */
void
-VIACheckTVExist(ScrnInfoPtr pScrn)
+VIATVDetect(ScrnInfoPtr pScrn)
{
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- I2CDevPtr dev;
CARD8 W_Buffer[1];
CARD8 R_Buffer[1];
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIACheckTVExist\n"));
+ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIATVDetect\n"));
+
+ /* preset some pBIOSInfo TV related values */
+ pBIOSInfo->TVEncoder = VIA_NONETV;
+ pBIOSInfo->TVI2CAddr = 0x00;
+ pBIOSInfo->TVUseGpioI2c = FALSE;
+ pBIOSInfo->TVI2CDev = NULL;
+
/* Check For TV2/TV3 */
- if (xf86I2CProbeAddress(pVia->I2C_Port2, 0x40)) {
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = 0x40;
- dev->pI2CBus = pVia->I2C_Port2;
+ if (xf86I2CProbeAddress(pVia->pI2CBus2, 0x40)) {
+ pBIOSInfo->TVI2CDev = xf86CreateI2CDevRec();
+ pBIOSInfo->TVI2CDev->DevName = "VT162x";
+ pBIOSInfo->TVI2CDev->SlaveAddr = 0x40;
+ pBIOSInfo->TVI2CDev->pI2CBus = pVia->pI2CBus2;
- if (xf86I2CDevInit(dev)) {
+ if (xf86I2CDevInit(pBIOSInfo->TVI2CDev)) {
W_Buffer[0] = 0x1B;
- xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1);
- xf86DestroyI2CDevRec(dev,TRUE);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
switch (R_Buffer[0]) {
case 2:
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Found TVEncoder VT1621!\n"));
- pBIOSInfo->TVEncoder = VIA_TV2PLUS;
- pBIOSInfo->TVI2CAdd = 0x40;
- break;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected VIA Technologies VT1621 TV Encoder\n");
+ pBIOSInfo->TVEncoder = VIA_VT1621;
+ pBIOSInfo->TVI2CAddr = 0x40;
+ break;
case 3:
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Found TVEncoder VT1622!\n"));
- pBIOSInfo->TVEncoder = VIA_TV3;
- pBIOSInfo->TVI2CAdd = 0x40;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected VIA Technologies VT1622 TV Encoder\n");
+ pBIOSInfo->TVEncoder = VIA_VT1622;
+ pBIOSInfo->TVI2CAddr = 0x40;
break;
case 16:
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Found TVEncoder VT1622A!\n"));
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected VIA Technologies VT1622A/VT1623 TV Encoder\n");
pBIOSInfo->TVEncoder = VIA_VT1622A;
- pBIOSInfo->TVI2CAdd = 0x40;
+ pBIOSInfo->TVI2CAddr = 0x40;
break;
default:
pBIOSInfo->TVEncoder = VIA_NONETV;
break;
}
}
- else
- xf86DestroyI2CDevRec(dev,TRUE);
+
+ if (pBIOSInfo->TVEncoder == VIA_NONETV) {
+ xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev,TRUE);
+ pBIOSInfo->TVI2CDev = NULL;
+ }
}
- else
- pBIOSInfo->TVEncoder = VIA_NONETV;
if (pBIOSInfo->TVEncoder == VIA_NONETV) {
VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
if (VIAGPIOI2C_Read(&(pVia->GpioI2c), 0x1B, R_Buffer, 1)) {
switch (R_Buffer[0]) {
case 16:
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Found TVEncoder VT1623!\n"));
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
+ "Detected VIA Technologies VT1622A/VT1623 TV Encoder (GPIOI2c)\n");
pBIOSInfo->TVEncoder = VIA_VT1623;
+ pBIOSInfo->TVUseGpioI2c = TRUE;
+ pBIOSInfo->TVI2CAddr = 0x40;
break;
default:
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
- "Unknow TVEncoder Type:%d!\n", R_Buffer[0]));
+ "Unknown TVEncoder: %02X!\n", R_Buffer[0]));
break;
}
}
}
+
+#ifdef HAVE_DEBUG
+ /* superfluous check: prints only when TVI2CDev or TVUseGpioI2c */
+ if (pVia->PrintTVRegs && (pBIOSInfo->TVEncoder != VIA_NONETV))
+ ViaPrintTVRegs(pScrn);
+#endif /* HAVE_DEBUG */
}
/*=*
@@ -184,96 +236,25 @@ VIAGetActiveDisplay(ScrnInfoPtr pScrn)
return tmp;
}
-/*=*
- *
- * CARD8 VIASensorTV2(VIABIOSInfoPtr pBIOSInfo)
- *
- * - Sense TV2+ Encoder
- *
- * Return Type: CARD8
- *
- * The Definition of Input Value:
- *
- * VIABIOSInfoPtr
- *
- * The Definition of Return Value:
- *
- * Bit[2] Bit[0]
- * 0 0 - Composite + S-Video
- * 0 1 - S-Video
- * 1 0 - Composite
- * 1 1 - None
- *=*/
-static CARD8
-VIASensorTV2(ScrnInfoPtr pScrn)
-{
- VIAPtr pVia = VIAPTR(pScrn);
- I2CDevPtr dev;
- CARD8 save, tmp = 0x05;
- CARD8 W_Buffer[2];
- CARD8 R_Buffer[1];
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASensorTV2\n"));
- dev = xf86CreateI2CDevRec();
- dev->DevName = "VT1621";
- dev->SlaveAddr = 0x40;
- dev->pI2CBus = pVia->I2C_Port2;
-
- if (xf86I2CDevInit(dev)) {
- W_Buffer[0] = 0x0E;
- xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1);
- save = R_Buffer[0];
- W_Buffer[1] = 0x08;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- W_Buffer[1] = 0;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- W_Buffer[0] = 0x0F;
- xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1);
- tmp = R_Buffer[0] & 0x0F;
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = save;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- xf86DestroyI2CDevRec(dev,TRUE);
- } else
- xf86DestroyI2CDevRec(dev,TRUE);
-
- return tmp;
-}
-
-
-/*=*
- *
- * CARD8 VIASensorTV3(VIABIOSInfoPtr pBIOSInfo)
- *
- * - Sense TV3 Encoder
- *
- * Return Type: CARD8
- *
- * The Definition of Input Value:
- *
- * VIABIOSInfoPtr
- *
- * The Definition of Return Value:
+/*
+ * Detects if the type of connection attached to the VT162x TV encoder.
+ * Returns TRUE if anything is connected.
*
- * Bit[3] Bit[2] Bit[1] Bit[0]
- * 1 1 1 1 - None
- * 0 1 1 1 - Composite
- * 1 1 1 0 - Composite
- * - Others: S-Video
- *=*/
-static CARD8
-VIASensorTV3(ScrnInfoPtr pScrn)
+ */
+static Bool
+VIAVT162xDACDetect(ScrnInfoPtr pScrn)
{
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- I2CDevPtr dev;
- CARD8 save, tmp = 0;
+ CARD8 save, sense;
CARD8 W_Buffer[2];
CARD8 R_Buffer[1];
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASensorTV3\n"));
- if (pBIOSInfo->TVEncoder == VIA_VT1623) {
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
+ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAVT162xDACDetect\n"));
+
+ if (pBIOSInfo->TVUseGpioI2c) {
+ /* when we finally get GPIOI2C sorted out, we can plainly remove this block */
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
VIAGPIOI2C_Read(&(pVia->GpioI2c), 0x0E, R_Buffer, 1);
save = R_Buffer[0];
W_Buffer[0] = 0;
@@ -283,41 +264,88 @@ VIASensorTV3(ScrnInfoPtr pScrn)
W_Buffer[0] = 0;
VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, W_Buffer[0]);
VIAGPIOI2C_Read(&(pVia->GpioI2c), 0x0F, R_Buffer, 1);
- tmp = R_Buffer[0] & 0x0F;
+ sense = R_Buffer[0] & 0x0F;
W_Buffer[0] = save;
VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, W_Buffer[0]);
} else {
- dev = xf86CreateI2CDevRec();
- dev->DevName = "VT1622";
- dev->SlaveAddr = 0x40;
- dev->pI2CBus = pVia->I2C_Port2;
-
- if (xf86I2CDevInit(dev)) {
- W_Buffer[0] = 0x0E;
- xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1);
- save = R_Buffer[0];
- W_Buffer[1] = 0;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- W_Buffer[1] = 0x80;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- W_Buffer[1] = 0;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- W_Buffer[0] = 0x0F;
- xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,1);
- tmp = R_Buffer[0] & 0x0F;
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = save;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- xf86DestroyI2CDevRec(dev,TRUE);
- }
- else {
- xf86DestroyI2CDevRec(dev,TRUE);
- }
+ W_Buffer[0] = 0x0E;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+ save = R_Buffer[0];
+ W_Buffer[1] = 0;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ W_Buffer[1] = 0x80;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ W_Buffer[1] = 0;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ W_Buffer[0] = 0x0F;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1);
+ sense = R_Buffer[0] & 0x0F;
+ W_Buffer[0] = 0x0E;
+ W_Buffer[1] = save;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ }
+
+ if (pBIOSInfo->TVEncoder == VIA_VT1621) {
+ /* VT1621 only knows composite and s-video */
+ switch (sense) {
+ case 0x00:
+ pBIOSInfo->TVOutput = TVOUTPUT_SC;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n");
+ return TRUE;
+ case 0x01:
+ pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Composite connected.\n");
+ return TRUE;
+ case 0x02:
+ pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n");
+ return TRUE;
+ case 0x03:
+ pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n");
+ return FALSE;
+ default:
+ pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n",
+ sense);
+ return FALSE;
+ }
+ } else {
+ /* VT1622, VT1622A and VT1623 know composite, s-video, RGB and YCBCR */
+ switch (sense) {
+ case 0x00: /* DAC A,B,C,D */
+ pBIOSInfo->TVOutput = TVOUTPUT_RGB;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: RGB connected.\n");
+ return TRUE;
+ case 0x01: /* DAC A,B,C */
+ pBIOSInfo->TVOutput = TVOUTPUT_SC;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n");
+ return TRUE;
+ case 0x07: /* DAC A */
+ pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Composite connected.\n");
+ return TRUE;
+ case 0x08: /* DAC B,C,D */
+ pBIOSInfo->TVOutput = TVOUTPUT_YCBCR;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: YcBcR connected.\n");
+ return TRUE;
+ case 0x09: /* DAC B,C */
+ pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n");
+ return TRUE;
+ case 0x0F:
+ pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n");
+ return FALSE;
+ default:
+ pBIOSInfo->TVOutput = TVOUTPUT_NONE;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n",
+ sense);
+ return FALSE;
+ }
}
- return tmp;
}
-
/*=*
*
* Bool VIASensorDVI(pBIOSInfo)
@@ -351,7 +379,7 @@ VIASensorDVI(ScrnInfoPtr pScrn)
/* Enable DI0, DI1 */
cr6c = hwp->readCrtc(hwp, 0x6C);
- ViaCrtcChange(hwp, 0x6C, 0x21, 0x21);
+ ViaCrtcMask(hwp, 0x6C, 0x21, 0x21);
cr93 = hwp->readCrtc(hwp, 0x93);
/* check for CLE266 first!!! */
@@ -375,11 +403,11 @@ VIASensorDVI(ScrnInfoPtr pScrn)
break;
}
- if (xf86I2CProbeAddress(pVia->I2C_Port2, SlaveAddr)) {
+ if (xf86I2CProbeAddress(pVia->pI2CBus2, SlaveAddr)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TMDS";
dev->SlaveAddr = SlaveAddr;
- dev->pI2CBus = pVia->I2C_Port2;
+ dev->pI2CBus = pVia->pI2CBus2;
if (xf86I2CDevInit(dev)) {
W_Buffer[0] = 0x09;
@@ -425,7 +453,7 @@ VIAPostDVI(ScrnInfoPtr pScrn)
/* Enable DI0, DI1 */
cr6c = hwp->readCrtc(hwp, 0x6C);
- ViaCrtcChange(hwp, 0x6C, 0x21, 0x21);
+ ViaCrtcMask(hwp, 0x6C, 0x21, 0x21);
cr93 = hwp->readCrtc(hwp, 0x93);
/* check for CLE266 first!!! */
@@ -437,11 +465,11 @@ VIAPostDVI(ScrnInfoPtr pScrn)
/* Enable LCD */
VIAEnableLCD(pScrn);
- if (xf86I2CProbeAddress(pVia->I2C_Port2, 0x70)) {
+ if (xf86I2CProbeAddress(pVia->pI2CBus2, 0x70)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TMDS";
dev->SlaveAddr = 0x70;
- dev->pI2CBus = pVia->I2C_Port2;
+ dev->pI2CBus = pVia->pI2CBus2;
if (xf86I2CDevInit(dev)) {
W_Buffer[0] = 0x00;
xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,4);
@@ -505,11 +533,11 @@ VIAPostDVI(ScrnInfoPtr pScrn)
/* Check VT3192 TMDS Exist or not?*/
if (!pBIOSInfo->TMDS) {
- if (xf86I2CProbeAddress(pVia->I2C_Port2, 0x10)) {
+ if (xf86I2CProbeAddress(pVia->pI2CBus2, 0x10)) {
dev = xf86CreateI2CDevRec();
dev->DevName = "TMDS";
dev->SlaveAddr = 0x10;
- dev->pI2CBus = pVia->I2C_Port2;
+ dev->pI2CBus = pVia->pI2CBus2;
if (xf86I2CDevInit(dev)) {
W_Buffer[0] = 0x00;
xf86I2CWriteRead(dev, W_Buffer,1, R_Buffer,4);
@@ -658,76 +686,27 @@ VIAGetDeviceDetect(ScrnInfoPtr pScrn)
{
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- CARD8 tmp, sense;
+ CARD8 tmp;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetDeviceDetect\n"));
tmp = VIA_DEVICE_CRT1; /* Default assume color CRT attached */
-/*
- if (VIA_LCD_SUPPORT) {
- if (VIA_UNCOVERD_LCD_PANEL)
- tmp |= 0x08;
- }
-*/
+
if (pBIOSInfo->LVDS) {
pBIOSInfo->LCDAttach = TRUE;
tmp |= VIA_DEVICE_LCD;
}
switch (pBIOSInfo->TVEncoder) {
- case VIA_NONETV:
- pBIOSInfo->TVAttach = FALSE;
- break;
- case VIA_TV2PLUS:
- sense = VIASensorTV2(pScrn);
- if (sense == 0x05) {
- pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */
- }
- else {
- tmp |= VIA_DEVICE_TV;
- pBIOSInfo->TVAttach = TRUE;
- if (!pBIOSInfo->TVOutput) {
- if (sense == 0) {
- /*tmp |= 0xC0; Connect S_Video + Composite */
- pBIOSInfo->TVOutput = TVOUTPUT_SC;
- }
- if (sense == 0x01) {
- /*tmp |= 0x80; Connect S_Video */
- pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
- }
- else {
- /*tmp |= 0x40; Connect Composite */
- pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
- }
- }
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "TV2 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput));
- }
- break;
- case VIA_TV3:
- case VIA_VT1622A:
- case VIA_VT1623:
- sense = VIASensorTV3(pScrn);
- if (sense == 0x0F) {
- pBIOSInfo->TVAttach = FALSE; /* No TV Output Attached */
- }
- else {
- tmp |= VIA_DEVICE_TV;
- pBIOSInfo->TVAttach = TRUE;
- if (!pBIOSInfo->TVOutput) {
- if (sense == 0x07 || sense == 0x0E) {
- /*tmp |= 0x40; Connect Composite */
- pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE;
- }
- else {
- /*tmp |= 0x80; Connect S_Video */
- pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO;
- }
- }
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "TV3 sense = %d ,TVOutput = %d\n", sense, pBIOSInfo->TVOutput));
- }
- break;
- default:
- break;
+ case VIA_VT1621:
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVOutput || VIAVT162xDACDetect(pScrn))
+ tmp |= VIA_DEVICE_TV;
+ break;
+ default:
+ break;
}
if (pBIOSInfo->TMDS) {
@@ -744,8 +723,15 @@ VIAGetDeviceDetect(ScrnInfoPtr pScrn)
}
}
+ if (pBIOSInfo->ForcePanel) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Forcing panel.\n");
+ tmp |= VIA_DEVICE_LCD;
+ }
+
if ((pVia->Id) && (pVia->Id->Force != VIA_DEVICE_NONE)) {
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Forcing %d.\n", pVia->Id->Force));
+ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Forcing %d (from PCI subsystem ID information).\n",
+ pVia->Id->Force));
tmp |= pVia->Id->Force;
}
@@ -809,10 +795,10 @@ VIAGetPanelSizeFromDDCv1(ScrnInfoPtr pScrn, int *size)
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv1\n"));
- if (!xf86I2CProbeAddress(pVia->I2C_Port2, 0xA0))
+ if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA0))
return FALSE;
- pMon = xf86DoEDID_DDC2(pScrn->scrnIndex, pVia->I2C_Port2);
+ pMon = xf86DoEDID_DDC2(pScrn->scrnIndex, pVia->pI2CBus2);
if (!pMon)
return FALSE;
@@ -845,7 +831,7 @@ VIAGetPanelSizeFromDDCv2(ScrnInfoPtr pScrn, int *size)
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv2\n"));
- if (!xf86I2CProbeAddress(pVia->I2C_Port2, 0xA2))
+ if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA2))
return FALSE;
dev = xf86CreateI2CDevRec();
@@ -859,7 +845,7 @@ VIAGetPanelSizeFromDDCv2(ScrnInfoPtr pScrn, int *size)
dev->BitTimeout = 40;
dev->ByteTimeout = 40;
dev->AcknTimeout = 40;
- dev->pI2CBus = pVia->I2C_Port2;
+ dev->pI2CBus = pVia->pI2CBus2;
if (!xf86I2CDevInit(dev)) {
xf86DestroyI2CDevRec(dev,TRUE);
@@ -977,15 +963,14 @@ static Bool
ViaGetModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
{
VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
int i;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaGetModeIndex\n"));
- for (i = 0; i < pViaModeTable->NumModes; i++)
- if ((pViaModeTable->Modes[i].Bpp == pScrn->bitsPerPixel) &&
- (pViaModeTable->Modes[i].Width == mode->CrtcHDisplay) &&
- (pViaModeTable->Modes[i].Height == mode->CrtcVDisplay)) {
+ for (i = 0; i < NumModes; i++)
+ if ((Modes[i].Bpp == pScrn->bitsPerPixel) &&
+ (Modes[i].Width == mode->CrtcHDisplay) &&
+ (Modes[i].Height == mode->CrtcVDisplay)) {
pBIOSInfo->ModeIndex = i;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaGetModeIndex:"
" %d\n", pBIOSInfo->ModeIndex));
@@ -995,16 +980,15 @@ ViaGetModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode)
return FALSE;
}
- /*
- *
- * ViaModeIndexTable[i].PanelIndex is pBIOSInfo->PanelSize
- * pBIOSInfo->PanelIndex is the index to lcdTable.
- *
- */
+/*
+ *
+ * ViaModeIndexTable[i].PanelIndex is pBIOSInfo->PanelSize
+ * pBIOSInfo->PanelIndex is the index to lcdTable.
+ *
+ */
static Bool
ViaPanelGetIndex(VIABIOSInfoPtr pBIOSInfo)
{
- VIALCDModePtr Table = pBIOSInfo->pModeTable->lcdTable;
int i;
DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "ViaPanelGetIndex\n"));
@@ -1031,14 +1015,13 @@ ViaPanelGetIndex(VIABIOSInfoPtr pBIOSInfo)
for (i = 0; i < VIA_BIOS_NUM_PANEL; i++)
- if (Table[i].fpSize == pBIOSInfo->PanelSize) {
+ if (lcdTable[i].fpSize == pBIOSInfo->PanelSize) {
int modeNum, tmp;
- modeNum = (int)pBIOSInfo->pModeTable->Modes[pBIOSInfo->ModeIndex].Mode;
+ modeNum = (int)Modes[pBIOSInfo->ModeIndex].Mode;
tmp = 0x01 << (modeNum & 0xF);
- if ((CARD16)(tmp) &
- pBIOSInfo->pModeTable->lcdTable[i].SuptMode[(modeNum >> 4)]) {
+ if ((CARD16)(tmp) & lcdTable[i].SuptMode[(modeNum >> 4)]) {
pBIOSInfo->PanelIndex = i;
DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "ViaPanelGetIndex:"
"index: %d (%dx%d)\n", pBIOSInfo->PanelIndex,
@@ -1156,6 +1139,9 @@ ViaTVGetIndex(VIABIOSInfoPtr pBIOSInfo)
for (i = 0; ViaResolutionTable[i].Index != VIA_RES_INVALID; i++)
if (ViaResolutionTable[i].Index == pBIOSInfo->ResolutionIndex) {
+ if (ViaResolutionTable[i].TVIndex == VIA_TVRES_INVALID)
+ break;
+
/* check tv standard */
if ((pBIOSInfo->ResolutionIndex == VIA_TVRES_720X480) &&
(pBIOSInfo->TVType == TVTYPE_PAL))
@@ -1165,7 +1151,7 @@ ViaTVGetIndex(VIABIOSInfoPtr pBIOSInfo)
break;
/* check encoder */
- if ((pBIOSInfo->TVEncoder == VIA_TV2PLUS) &&
+ if ((pBIOSInfo->TVEncoder == VIA_VT1621) &&
((pBIOSInfo->ResolutionIndex != VIA_RES_640X480) &&
(pBIOSInfo->ResolutionIndex != VIA_RES_800X600)))
break;
@@ -1183,22 +1169,30 @@ ViaTVGetIndex(VIABIOSInfoPtr pBIOSInfo)
*
*/
Bool
-VIAFindModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
+VIAFindModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool Final)
{
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+ int level;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFindModeUseBIOSTable\n"));
+ if (Final)
+ level = X_ERROR;
+ else
+ level = X_INFO;
+
if (!ViaGetModeIndex(pScrn, mode) || !ViaGetResolutionIndex(pScrn, mode)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Mode not supported.\n");
+ xf86DrvMsg(pScrn->scrnIndex, level, "Mode \"%s\" not supported by driver.\n",
+ mode->name);
return FALSE;
}
ViaGetNearestRefresh(pScrn, mode);
if (!ViaRefreshAllowed(pScrn)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Refreshrate too high for"
- " available memory bandwidth.\n");
+ xf86DrvMsg(pScrn->scrnIndex, level, "Refreshrate (%fHz) for \"%s\" too"
+ " high for available memory bandwidth.\n",
+ mode->VRefresh, mode->name);
return FALSE;
}
@@ -1212,17 +1206,19 @@ VIAFindModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)) {
if (!ViaTVGetIndex(pBIOSInfo)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Mode not supported by TV encoder.\n");
+ xf86DrvMsg(pScrn->scrnIndex, level, "Mode \"%s\" not supported by"
+ " TV encoder.\n", mode->name);
return FALSE;
}
}
-
+
if (pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) {
if (pBIOSInfo->PanelSize == VIA_PANEL_INVALID)
VIAGetPanelSize(pScrn);
if (!ViaPanelGetIndex(pBIOSInfo)) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Mode not supported by LCD/DFP.\n");
+ xf86DrvMsg(pScrn->scrnIndex, level, "Mode \"%s\" not supported by"
+ " LCD/DFP.\n", mode->name);
return FALSE;
}
}
@@ -1258,15 +1254,15 @@ VIASetPrimaryClock(vgaHWPtr hwp, CARD16 clock)
{
DEBUG(xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VIASetPrimaryClock to 0x%X\n", clock));
- ViaCrtcChange(hwp, 0x17, 0x00, 0x80); /* desync */
+ ViaCrtcMask(hwp, 0x17, 0x00, 0x80); /* desync */
hwp->writeSeq(hwp, 0x46, clock >> 8);
hwp->writeSeq(hwp, 0x47, clock & 0xFF);
- ViaCrtcChange(hwp, 0x17, 0x80, 0x80); /* sync */
+ ViaCrtcMask(hwp, 0x17, 0x80, 0x80); /* sync */
- ViaSeqChange(hwp, 0x40, 0x02, 0x02);
- ViaSeqChange(hwp, 0x40, 0x00, 0x02);
+ ViaSeqMask(hwp, 0x40, 0x02, 0x02);
+ ViaSeqMask(hwp, 0x40, 0x00, 0x02);
}
/*
@@ -1277,15 +1273,15 @@ VIASetSecondaryClock(vgaHWPtr hwp, CARD16 clock)
{
DEBUG(xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VIASetSecondaryClock to 0x%X\n", clock));
- ViaCrtcChange(hwp, 0x17, 0x00, 0x80); /* desync */
+ ViaCrtcMask(hwp, 0x17, 0x00, 0x80); /* desync */
hwp->writeSeq(hwp, 0x44, clock >> 8);
hwp->writeSeq(hwp, 0x45, clock & 0xFF);
- ViaCrtcChange(hwp, 0x17, 0x80, 0x80); /* sync */
+ ViaCrtcMask(hwp, 0x17, 0x80, 0x80); /* sync */
- ViaSeqChange(hwp, 0x40, 0x04, 0x04);
- ViaSeqChange(hwp, 0x40, 0x00, 0x04);
+ ViaSeqMask(hwp, 0x40, 0x04, 0x04);
+ ViaSeqMask(hwp, 0x40, 0x00, 0x04);
}
static void
@@ -1294,8 +1290,7 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
- VIALCDModePtr LCDTable;
+ VIALCDModeTableRec Table = lcdTable[pBIOSInfo->PanelIndex];
CARD8 modeNum = 0;
int resIdx;
int port, offset, data;
@@ -1303,8 +1298,6 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetLCDMode\n"));
- LCDTable = &(pViaModeTable->lcdTable[pBIOSInfo->PanelIndex]);
-
if (pBIOSInfo->PanelSize == VIA_PANEL12X10)
hwp->writeCrtc(hwp, 0x89, 0x07);
@@ -1314,20 +1307,20 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* Set LCD InitTb Regs */
if (pBIOSInfo->BusWidth == VIA_DI_12BIT) {
if (!pVia->IsSecondary)
- VIASetPrimaryClock(hwp, LCDTable->InitTb.VClk_12Bit);
- VIASetSecondaryClock(hwp, LCDTable->InitTb.LCDClk_12Bit);
+ VIASetPrimaryClock(hwp, Table.InitTb.VClk_12Bit);
+ VIASetSecondaryClock(hwp, Table.InitTb.LCDClk_12Bit);
} else {
if (!pVia->IsSecondary)
- VIASetPrimaryClock(hwp, LCDTable->InitTb.VClk);
- VIASetSecondaryClock(hwp, LCDTable->InitTb.LCDClk);
+ VIASetPrimaryClock(hwp, Table.InitTb.VClk);
+ VIASetSecondaryClock(hwp, Table.InitTb.LCDClk);
}
VIASetUseExternalClock(hwp);
- for (i = 0; i < LCDTable->InitTb.numEntry; i++) {
- port = LCDTable->InitTb.port[i];
- offset = LCDTable->InitTb.offset[i];
- data = LCDTable->InitTb.data[i];
+ for (i = 0; i < Table.InitTb.numEntry; i++) {
+ port = Table.InitTb.port[i];
+ offset = Table.InitTb.offset[i];
+ data = Table.InitTb.data[i];
ViaVgahwWrite(hwp, 0x300+port, offset, 0x301+port, data);
}
@@ -1378,15 +1371,15 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
}
if (pBIOSInfo->Center) {
- Main = &(LCDTable->MCtr[resIdx]);
- Patch1 = LCDTable->MPatchDP1Ctr;
- Patch2 = LCDTable->MPatchDP2Ctr;
+ Main = &(Table.MCtr[resIdx]);
+ Patch1 = Table.MPatchDP1Ctr;
+ Patch2 = Table.MPatchDP2Ctr;
} else { /* expand! */
/* LCD Expand Mode Y Scale Flag */
pBIOSInfo->scaleY = TRUE;
- Main = &(LCDTable->MExp[resIdx]);
- Patch1 = LCDTable->MPatchDP1Exp;
- Patch2 = LCDTable->MPatchDP2Exp;
+ Main = &(Table.MExp[resIdx]);
+ Patch1 = Table.MPatchDP1Exp;
+ Patch2 = Table.MPatchDP2Exp;
}
/* Set Main LCD Registers */
@@ -1405,16 +1398,15 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
VIASetSecondaryClock(hwp, Main->LCDClk);
}
- for (i = 0; i < pViaModeTable->modeFix.numEntry; i++) {
- if (pViaModeTable->modeFix.reqMode[i] ==
- (CARD8)(pViaModeTable->Modes[pBIOSInfo->ModeIndex].Mode)) {
- modeNum = pViaModeTable->modeFix.fixMode[i];
+ for (i = 0; i < modeFix.numEntry; i++) {
+ if (modeFix.reqMode[i] == (CARD8)(Modes[pBIOSInfo->ModeIndex].Mode)) {
+ modeNum = modeFix.fixMode[i];
break;
}
}
/* Set LCD Mode patch registers. */
- for (i = 0; i < LCDTable->numMPatchDP2Exp; i++, Patch2++) {
+ for (i = 0; i < Table.numMPatchDP2Exp; i++, Patch2++) {
if (Patch2->Mode == modeNum) {
if (!pBIOSInfo->Center && (mode->CrtcHDisplay == pBIOSInfo->panelX))
pBIOSInfo->scaleY = FALSE;
@@ -1440,7 +1432,7 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* Set LCD Secondary Mode Patch registers. */
if (pVia->IsSecondary) {
- for (i = 0; i < LCDTable->numMPatchDP1Ctr; i++, Patch1++) {
+ for (i = 0; i < Table.numMPatchDP1Ctr; i++, Patch1++) {
if (Patch1->Mode == modeNum) {
for (j = 0; j < Patch1->numEntry; j++) {
ViaVgahwWrite(hwp, 0x300 + Patch1->port[j], Patch1->offset[j],
@@ -1461,29 +1453,29 @@ VIASetLCDMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* Enable LCD */
if (!pVia->IsSecondary) {
/* CRT Display Source Bit 6 - 0: CRT, 1: LCD */
- ViaSeqChange(hwp, 0x16, 0x40, 0x40);
+ ViaSeqMask(hwp, 0x16, 0x40, 0x40);
/* Enable Simultaneous */
if (pBIOSInfo->BusWidth == VIA_DI_12BIT) {
hwp->writeCrtc(hwp, 0x6B, 0xA8);
- if ((pVia->Chipset == VIA_CLE266) &&
+ if ((pVia->Chipset == VIA_CLE266) &&
CLE266_REV_IS_AX(pVia->ChipRev))
hwp->writeCrtc(hwp, 0x93, 0xB1);
else
hwp->writeCrtc(hwp, 0x93, 0xAF);
} else {
- ViaCrtcChange(hwp, 0x6B, 0x08, 0x08);
+ ViaCrtcMask(hwp, 0x6B, 0x08, 0x08);
hwp->writeCrtc(hwp, 0x93, 0x00);
}
hwp->writeCrtc(hwp, 0x6A, 0x48);
} else {
/* CRT Display Source Bit 6 - 0: CRT, 1: LCD */
- ViaSeqChange(hwp, 0x16, 0x00, 0x40);
+ ViaSeqMask(hwp, 0x16, 0x00, 0x40);
/* Enable SAMM */
if (pBIOSInfo->BusWidth == VIA_DI_12BIT) {
- ViaCrtcChange(hwp, 0x6B, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6B, 0x20, 0x20);
if ((pVia->Chipset == VIA_CLE266) &&
CLE266_REV_IS_AX(pVia->ChipRev))
hwp->writeCrtc(hwp, 0x93, 0xB1);
@@ -1501,96 +1493,86 @@ static void
VIAPreSetTV2Mode(VIAPtr pVia)
{
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIABIOSTV2TablePtr Table;
- VIABIOSTVMASKTablePtr Mask;
+ VIABIOSTV2TableRec Table;
+ VIABIOSTVMASKTableRec Mask;
CARD8 *TV;
CARD16 *Patch2;
int i, j;
CARD8 W_Buffer[VIA_BIOS_MAX_NUM_TV_REG+1];
CARD8 W_Other[2];
- I2CDevPtr dev;
CARD8 R_Buffer[1];
DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetTV2Mode\n"));
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->tv2OverTable[pBIOSInfo->TVIndex]);
+ Table = tv2OverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->tv2Table[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->tv2MaskTable);
+ Table = tv2Table[pBIOSInfo->TVIndex];
+ Mask = tv2MaskTable;
if (pBIOSInfo->TVType == TVTYPE_PAL) {
- Patch2 = Table->PatchPAL2;
+ Patch2 = Table.PatchPAL2;
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
- TV = Table->TVPALC;
+ TV = Table.TVPALC;
else /* S-video */
- TV = Table->TVPALS;
+ TV = Table.TVPALS;
} else { /* TVTYPE_NTSC */
- Patch2 = Table->PatchNTSC2;
+ Patch2 = Table.PatchNTSC2;
if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE)
- TV = Table->TVNTSCC;
+ TV = Table.TVNTSCC;
else /* S-video */
- TV = Table->TVNTSCS;
+ TV = Table.TVNTSCS;
}
- dev = xf86CreateI2CDevRec();
- dev->DevName = "VT1621";
- dev->SlaveAddr = 0x40;
- dev->pI2CBus = pVia->I2C_Port2;
-
- xf86I2CDevInit(dev);
-
W_Buffer[0] = 0;
- for (i = 0, j = 0; (j < Mask->numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
- if (Mask->TV[i] == 0xFF) {
+ for (i = 0, j = 0; (j < Mask.numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
+ if (Mask.TV[i] == 0xFF) {
W_Buffer[i + 1] = TV[i];
j++;
} else
- W_Buffer[i + 1] = pBIOSInfo->TVRegs[i];
+ W_Buffer[i + 1] = pVia->SavedReg.TVRegs[i];
}
- xf86I2CWriteRead(dev, W_Buffer, i + 1, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer, i + 1, NULL,0);
/* Turn on all Composite and S-Video output */
W_Other[0] = 0x0E;
W_Other[1] = 0;
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) {
- CARD16 *DotCrawl = Table->DotCrawlNTSC;
+ CARD16 *DotCrawl = Table.DotCrawlNTSC;
for (i = 1; i < (DotCrawl[0] + 1); i++) {
W_Other[0] = (CARD8)(DotCrawl[i] & 0xFF);
if (W_Other[0] == 0x11) {
- xf86I2CWriteRead(dev, W_Other,1, R_Buffer,1);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,1, R_Buffer,1);
W_Other[1] = R_Buffer[0] | (CARD8)(DotCrawl[i] >> 8);
} else
W_Other[1] = (CARD8)(DotCrawl[i] >> 8);
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
}
if (pVia->IsSecondary) { /* Patch as setting 2nd path */
- int numPatch = (int)(Mask->misc2 >> 5);
+ int numPatch = (int)(Mask.misc2 >> 5);
for (i = 0; i < numPatch; i++) {
W_Other[0] = (CARD8)(Patch2[i] & 0xFF);
W_Other[1] = (CARD8)(Patch2[i] >> 8);
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
}
-
- xf86DestroyI2CDevRec(dev,TRUE);
}
static void
-VIAPreSetVT1623Mode(VIAPtr pVia)
+VIAPreSetVT1623ModeGpioI2c(VIAPtr pVia)
{
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIABIOSTV3TablePtr Table;
- VIABIOSTVMASKTablePtr Mask;
+ VIABIOSTV3TableRec Table;
+ VIABIOSTVMASKTableRec Mask;
CARD8 *TV;
CARD16 *RGB, *YCbCr, *Patch2;
int i, j;
@@ -1598,46 +1580,46 @@ VIAPreSetVT1623Mode(VIAPtr pVia)
CARD8 R_Buffer[1];
GpioI2cPtr pDev = &(pVia->GpioI2c);
- DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetVT1623Mode\n"));
+ DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetVT1623ModeGpioI2c\n"));
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->vt1622aOverTable[pBIOSInfo->TVIndex]);
+ Table = vt1622aOverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->vt1622aTable[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->vt1622aMaskTable);
+ Table = vt1622aTable[pBIOSInfo->TVIndex];
+ Mask = vt1622aMaskTable;
if (pBIOSInfo->TVType == TVTYPE_PAL) {
- TV = Table->TVPAL;
- RGB = Table->RGBPAL;
- YCbCr = Table->YCbCrPAL;
- Patch2 = Table->PatchPAL2;
+ TV = Table.TVPAL;
+ RGB = Table.RGBPAL;
+ YCbCr = Table.YCbCrPAL;
+ Patch2 = Table.PatchPAL2;
} else {
- TV = Table->TVNTSC;
- RGB = Table->RGBNTSC;
- YCbCr = Table->YCbCrNTSC;
- Patch2 = Table->PatchNTSC2;
+ TV = Table.TVNTSC;
+ RGB = Table.RGBNTSC;
+ YCbCr = Table.YCbCrNTSC;
+ Patch2 = Table.PatchNTSC2;
}
- VIAGPIOI2C_Initial(pDev, 0x40);
+ VIAGPIOI2C_Initial(pDev, pBIOSInfo->TVI2CAddr);
/* TV Reset */
VIAGPIOI2C_Write(pDev, 0x1D, 0x0);
VIAGPIOI2C_Write(pDev, 0x1D, 0x80);
VIAGPIOI2C_Write(pDev, 0, 0);
- for (i = 1, j = 0; (j < Mask->numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
- if (Mask->TV[i] == 0xFF) {
+ for (i = 1, j = 0; (j < Mask.numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
+ if (Mask.TV[i] == 0xFF) {
VIAGPIOI2C_Write(pDev, i + 1, TV[j]);
j++;
} else
- VIAGPIOI2C_Write(pDev, i + 1, pBIOSInfo->TVRegs[j]);
+ VIAGPIOI2C_Write(pDev, i + 1, pVia->SavedReg.TVRegs[j]);
}
/* Turn on all Composite and S-Video output */
VIAGPIOI2C_Write(pDev, 0x0E, 0x0);
if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) {
- CARD16 *DotCrawl = Table->DotCrawlNTSC;
+ CARD16 *DotCrawl = Table.DotCrawlNTSC;
for (i = 1; i < (DotCrawl[0] + 1); i++) {
W_Buffer[0] = (CARD8)(DotCrawl[i] & 0xFF);
@@ -1669,7 +1651,7 @@ VIAPreSetVT1623Mode(VIAPtr pVia)
}
if (pVia->IsSecondary) { /* Patch as setting 2nd path */
- int numPatch = (int)(Mask->misc2 >> 5);
+ int numPatch = (int)(Mask.misc2 >> 5);
for (i = 0; i < numPatch; i++) {
W_Buffer[0] = (CARD8)(Patch2[i] & 0xFF);
@@ -1685,67 +1667,67 @@ VIAPostSetTV2Mode(ScrnInfoPtr pScrn)
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIABIOSTV2TablePtr Table;
- VIABIOSTVMASKTablePtr Mask;
+ VIABIOSTV2TableRec Table;
+ VIABIOSTVMASKTableRec Mask;
CARD8 *CRTC, *Misc;
int i, j;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPostSetTV2Mode\n"));
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->tv2OverTable[pBIOSInfo->TVIndex]);
+ Table = tv2OverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->tv2Table[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->tv2MaskTable);
+ Table = tv2Table[pBIOSInfo->TVIndex];
+ Mask = tv2MaskTable;
if (pVia->IsSecondary) {
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pScrn->bitsPerPixel) {
case 16:
- CRTC = Table->CRTCPAL2_16BPP;
+ CRTC = Table.CRTCPAL2_16BPP;
break;
case 24:
case 32:
- CRTC = Table->CRTCPAL2_32BPP;
+ CRTC = Table.CRTCPAL2_32BPP;
break;
case 8:
default:
- CRTC = Table->CRTCPAL2_8BPP;
+ CRTC = Table.CRTCPAL2_8BPP;
break;
}
- Misc = Table->MiscPAL2;
+ Misc = Table.MiscPAL2;
} else {
switch (pScrn->bitsPerPixel) {
case 16:
- CRTC = Table->CRTCNTSC2_16BPP;
+ CRTC = Table.CRTCNTSC2_16BPP;
break;
case 24:
case 32:
- CRTC = Table->CRTCNTSC2_32BPP;
+ CRTC = Table.CRTCNTSC2_32BPP;
break;
case 8:
default:
- CRTC = Table->CRTCNTSC2_8BPP;
+ CRTC = Table.CRTCNTSC2_8BPP;
break;
}
- Misc = Table->MiscNTSC2;
+ Misc = Table.MiscNTSC2;
}
- for (i = 0, j = 0; i < Mask->numCRTC2; j++) {
- if (Mask->CRTC2[j] == 0xFF) {
+ for (i = 0, j = 0; i < Mask.numCRTC2; j++) {
+ if (Mask.CRTC2[j] == 0xFF) {
hwp->writeCrtc(hwp, j + 0x50, CRTC[j]);
i++;
}
}
- if (Mask->misc2 & 0x18) {
+ if (Mask.misc2 & 0x18) {
VIASetSecondaryClock(hwp, (Misc[3] << 8) | Misc[4]);
VIASetUseExternalClock(hwp);
}
- ViaCrtcChange(hwp, 0x6A, 0xC0, 0xC0);
- ViaCrtcChange(hwp, 0x6B, 0x01, 0x01);
- ViaCrtcChange(hwp, 0x6C, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6A, 0xC0, 0xC0);
+ ViaCrtcMask(hwp, 0x6B, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6C, 0x01, 0x01);
/* Disable LCD Scaling */
if (!pVia->SAMM || pVia->FirstInit)
@@ -1753,26 +1735,26 @@ VIAPostSetTV2Mode(ScrnInfoPtr pScrn)
} else {
if (pBIOSInfo->TVType == TVTYPE_PAL) {
- CRTC = Table->CRTCPAL1;
- Misc = Table->MiscPAL1;
+ CRTC = Table.CRTCPAL1;
+ Misc = Table.MiscPAL1;
} else {
- CRTC = Table->CRTCNTSC1;
- Misc = Table->MiscNTSC1;
+ CRTC = Table.CRTCNTSC1;
+ Misc = Table.MiscNTSC1;
}
- for (i = 0, j = 0; i < Mask->numCRTC1; j++) {
- if (Mask->CRTC1[j] == 0xFF) {
+ for (i = 0, j = 0; i < Mask.numCRTC1; j++) {
+ if (Mask.CRTC1[j] == 0xFF) {
hwp->writeCrtc(hwp, j, CRTC[j]);
i++;
}
}
- ViaCrtcChange(hwp, 0x33, Misc[0], 0x20);
+ ViaCrtcMask(hwp, 0x33, Misc[0], 0x20);
hwp->writeCrtc(hwp, 0x6A, Misc[1]);
hwp->writeCrtc(hwp, 0x6B, Misc[2] | 0x01);
hwp->writeCrtc(hwp, 0x6C, Misc[3] | 0x01); /* ? */
- if (Mask->misc1 & 0x30) {
+ if (Mask.misc1 & 0x30) {
VIASetPrimaryClock(hwp, (Misc[4] << 8) | Misc[5]);
VIASetUseExternalClock(hwp);
}
@@ -1783,88 +1765,80 @@ static void
VIAPreSetTV3Mode(VIAPtr pVia)
{
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIABIOSTV3TablePtr Table;
- VIABIOSTVMASKTablePtr Mask;
+ VIABIOSTV3TableRec Table;
+ VIABIOSTVMASKTableRec Mask;
CARD8 *TV;
CARD16 *RGB, *YCbCr, *Patch2;
int i, j;
CARD8 W_Buffer[VIA_BIOS_MAX_NUM_TV_REG + 1];
CARD8 W_Other[2];
- I2CDevPtr dev;
CARD8 R_Buffer[1];
DEBUG(xf86DrvMsg(pBIOSInfo->scrnIndex, X_INFO, "VIAPreSetTV3Mode\n"));
- if (pBIOSInfo->TVEncoder == VIA_TV3) {
+ if (pBIOSInfo->TVEncoder == VIA_VT1622) {
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->tv3OverTable[pBIOSInfo->TVIndex]);
+ Table = tv3OverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->tv3Table[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->tv3MaskTable);
+ Table = tv3Table[pBIOSInfo->TVIndex];
+ Mask = tv3MaskTable;
} else { /* VT1622A */
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->vt1622aOverTable[pBIOSInfo->TVIndex]);
+ Table = vt1622aOverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->vt1622aTable[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->vt1622aMaskTable);
+ Table = vt1622aTable[pBIOSInfo->TVIndex];
+ Mask = vt1622aMaskTable;
}
if (pBIOSInfo->TVType == TVTYPE_PAL) {
- TV = Table->TVPAL;
- RGB = Table->RGBPAL;
- YCbCr = Table->YCbCrPAL;
- Patch2 = Table->PatchPAL2;
+ TV = Table.TVPAL;
+ RGB = Table.RGBPAL;
+ YCbCr = Table.YCbCrPAL;
+ Patch2 = Table.PatchPAL2;
} else {
- TV = Table->TVNTSC;
- RGB = Table->RGBNTSC;
- YCbCr = Table->YCbCrNTSC;
- Patch2 = Table->PatchNTSC2;
+ TV = Table.TVNTSC;
+ RGB = Table.RGBNTSC;
+ YCbCr = Table.YCbCrNTSC;
+ Patch2 = Table.PatchNTSC2;
}
- dev = xf86CreateI2CDevRec();
- dev->DevName = "VT1622";
- dev->SlaveAddr = 0x40;
- dev->pI2CBus = pVia->I2C_Port2;
-
- xf86I2CDevInit(dev);
-
W_Buffer[0] = 0;
- for (i = 0, j = 0; (j < Mask->numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
- if (Mask->TV[i] == 0xFF) {
+ for (i = 0, j = 0; (j < Mask.numTV) && (i < VIA_BIOS_MAX_NUM_TV_REG); i++) {
+ if (Mask.TV[i] == 0xFF) {
W_Buffer[i + 1] = TV[i];
j++;
} else
- W_Buffer[i + 1] = pBIOSInfo->TVRegs[i];
+ W_Buffer[i + 1] = pVia->SavedReg.TVRegs[i];
}
/* TV Reset */
W_Other[0] = 0x1D;
W_Other[1] = 0;
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
W_Other[0] = 0x1D;
W_Other[1] = 0x80;
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
- xf86I2CWriteRead(dev, W_Buffer, i + 1, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer, i + 1, NULL,0);
/* Turn on all Composite and S-Video output */
W_Other[0] = 0x0E;
W_Other[1] = 0;
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) {
- CARD16 *DotCrawl = Table->DotCrawlNTSC;
+ CARD16 *DotCrawl = Table.DotCrawlNTSC;
for (i = 1; i < (DotCrawl[0] + 1); i++) {
W_Other[0] = (CARD8)(DotCrawl[i] & 0xFF);
if (W_Other[0] == 0x11) {
- xf86I2CWriteRead(dev, W_Other,1, R_Buffer,1);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,1, R_Buffer,1);
W_Other[1] = R_Buffer[0] | (CARD8)(DotCrawl[i] >> 8);
}
else {
W_Other[1] = (CARD8)(DotCrawl[i] >> 8);
}
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
}
@@ -1872,27 +1846,35 @@ VIAPreSetTV3Mode(VIAPtr pVia)
for (i = 1; i < (RGB[0] + 1); i++) {
W_Other[0] = (CARD8)(RGB[i] & 0xFF);
W_Other[1] = (CARD8)(RGB[i] >> 8);
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
} else if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) {
for (i = 1; i < (YCbCr[0] + 1); i++) {
W_Other[0] = (CARD8)(YCbCr[i] & 0xFF);
W_Other[1] = (CARD8)(YCbCr[i] >> 8);
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
}
if (pVia->IsSecondary) { /* Patch as setting 2nd path */
- int numPatch = (int)(Mask->misc2 >> 5);
+ int numPatch = (int)(Mask.misc2 >> 5);
for (i = 0; i < numPatch; i++) {
W_Other[0] = (CARD8)(Patch2[i] & 0xFF);
W_Other[1] = (CARD8)(Patch2[i] >> 8);
- xf86I2CWriteRead(dev, W_Other,2, NULL,0);
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
}
- xf86DestroyI2CDevRec(dev,TRUE);
+ /* Configure flicker filter */
+ W_Other[0] = 3;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,1, R_Buffer,1);
+ W_Other[1] = R_Buffer[0] & 0xFC;
+ if(pBIOSInfo->TVDeflicker == 1)
+ W_Other[1] |= 0x01;
+ else if(pBIOSInfo->TVDeflicker == 2)
+ W_Other[1] |= 0x02;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Other,2, NULL,0);
}
static void
@@ -1901,76 +1883,76 @@ VIAPostSetTV3Mode(ScrnInfoPtr pScrn)
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIABIOSTV3TablePtr Table;
- VIABIOSTVMASKTablePtr Mask;
+ VIABIOSTV3TableRec Table;
+ VIABIOSTVMASKTableRec Mask;
CARD8 *CRTC, *Misc;
int i, j;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPostSetTV3Mode\n"));
- if (pBIOSInfo->TVEncoder == VIA_TV3) {
+ if (pBIOSInfo->TVEncoder == VIA_VT1622) {
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->tv3OverTable[pBIOSInfo->TVIndex]);
+ Table = tv3OverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->tv3Table[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->tv3MaskTable);
+ Table = tv3Table[pBIOSInfo->TVIndex];
+ Mask = tv3MaskTable;
} else { /* VT1622A */
if (pBIOSInfo->TVVScan == VIA_TVOVER)
- Table = &(pBIOSInfo->pModeTable->vt1622aOverTable[pBIOSInfo->TVIndex]);
+ Table = vt1622aOverTable[pBIOSInfo->TVIndex];
else /* VIA_TVNORMAL */
- Table = &(pBIOSInfo->pModeTable->vt1622aTable[pBIOSInfo->TVIndex]);
- Mask = &(pBIOSInfo->pModeTable->vt1622aMaskTable);
+ Table = vt1622aTable[pBIOSInfo->TVIndex];
+ Mask = vt1622aMaskTable;
}
if (pVia->IsSecondary) {
if (pBIOSInfo->TVType == TVTYPE_PAL) {
switch (pScrn->bitsPerPixel) {
case 16:
- CRTC = Table->CRTCPAL2_16BPP;
+ CRTC = Table.CRTCPAL2_16BPP;
break;
case 24:
case 32:
- CRTC = Table->CRTCPAL2_32BPP;
+ CRTC = Table.CRTCPAL2_32BPP;
break;
case 8:
default:
- CRTC = Table->CRTCPAL2_8BPP;
+ CRTC = Table.CRTCPAL2_8BPP;
break;
}
- Misc = Table->MiscPAL2;
+ Misc = Table.MiscPAL2;
} else {
switch (pScrn->bitsPerPixel) {
case 16:
- CRTC = Table->CRTCNTSC2_16BPP;
+ CRTC = Table.CRTCNTSC2_16BPP;
break;
case 24:
case 32:
- CRTC = Table->CRTCNTSC2_32BPP;
+ CRTC = Table.CRTCNTSC2_32BPP;
break;
case 8:
default:
- CRTC = Table->CRTCNTSC2_8BPP;
+ CRTC = Table.CRTCNTSC2_8BPP;
break;
}
- Misc = Table->MiscNTSC2;
+ Misc = Table.MiscNTSC2;
}
- for (i = 0, j = 0; i < Mask->numCRTC2; j++) {
- if (Mask->CRTC2[j] == 0xFF) {
+ for (i = 0, j = 0; i < Mask.numCRTC2; j++) {
+ if (Mask.CRTC2[j] == 0xFF) {
hwp->writeCrtc(hwp, j + 0x50, CRTC[j]);
i++;
}
}
- if (Mask->misc2 & 0x18) {
+ if (Mask.misc2 & 0x18) {
/* CLE266Ax use 2x XCLK */
if ((pVia->Chipset == VIA_CLE266) &&
CLE266_REV_IS_AX(pVia->ChipRev)) {
- ViaCrtcChange(hwp, 0x6B, 0x20, 0x20);
+ ViaCrtcMask(hwp, 0x6B, 0x20, 0x20);
/* Fix TV clock Polarity for CLE266A2 */
if (pVia->ChipRev == 0x02)
- ViaCrtcChange(hwp, 0x6C, 0x1C, 0x1C);
+ ViaCrtcMask(hwp, 0x6C, 0x1C, 0x1C);
VIASetSecondaryClock(hwp, 0x471C);
} else
@@ -1979,30 +1961,30 @@ VIAPostSetTV3Mode(ScrnInfoPtr pScrn)
VIASetUseExternalClock(hwp);
}
- ViaCrtcChange(hwp, 0x6A, 0xC0, 0xC0);
- ViaCrtcChange(hwp, 0x6B, 0x01, 0x01);
- ViaCrtcChange(hwp, 0x6C, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6A, 0xC0, 0xC0);
+ ViaCrtcMask(hwp, 0x6B, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6C, 0x01, 0x01);
/* Disable LCD Scaling */
if (!pVia->SAMM || pVia->FirstInit)
hwp->writeCrtc(hwp, 0x79, 0x00);
} else {
if (pBIOSInfo->TVType == TVTYPE_PAL) {
- CRTC = Table->CRTCPAL1;
- Misc = Table->MiscPAL1;
+ CRTC = Table.CRTCPAL1;
+ Misc = Table.MiscPAL1;
} else {
- CRTC = Table->CRTCNTSC1;
- Misc = Table->MiscNTSC1;
+ CRTC = Table.CRTCNTSC1;
+ Misc = Table.MiscNTSC1;
}
- for (i = 0, j = 0; i < Mask->numCRTC1; j++) {
- if (Mask->CRTC1[j] == 0xFF) {
+ for (i = 0, j = 0; i < Mask.numCRTC1; j++) {
+ if (Mask.CRTC1[j] == 0xFF) {
hwp->writeCrtc(hwp, j, CRTC[j]);
i++;
}
}
- ViaCrtcChange(hwp, 0x33, Misc[0], 0x20);
+ ViaCrtcMask(hwp, 0x33, Misc[0], 0x20);
hwp->writeCrtc(hwp, 0x6A, Misc[1]);
if ((pVia->Chipset == VIA_CLE266) &&
@@ -2014,7 +1996,7 @@ VIAPostSetTV3Mode(ScrnInfoPtr pScrn)
} else
hwp->writeCrtc(hwp, 0x6B, Misc[2] | 0x01);
- if (Mask->misc1 & 0x30) {
+ if (Mask.misc1 & 0x30) {
/* CLE266Ax use 2x XCLK */
if ((pVia->Chipset == VIA_CLE266) &&
CLE266_REV_IS_AX(pVia->ChipRev))
@@ -2025,32 +2007,43 @@ VIAPostSetTV3Mode(ScrnInfoPtr pScrn)
VIASetUseExternalClock(hwp);
}
- ViaCrtcChange(hwp, 0x6A, 0x40, 0x40);
- ViaCrtcChange(hwp, 0x6B, 0x01, 0x01);
- ViaCrtcChange(hwp, 0x6C, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6A, 0x40, 0x40);
+ ViaCrtcMask(hwp, 0x6B, 0x01, 0x01);
+ ViaCrtcMask(hwp, 0x6C, 0x01, 0x01);
}
- ViaSeqChange(hwp, 0x1E, 0xC0, 0xC0); /* Enable DI0/DVP0 */
+ ViaSeqMask(hwp, 0x1E, 0xC0, 0xC0); /* Enable DI0/DVP0 */
}
/*
*
*/
static void
-ViaTVModePreset(VIAPtr pVia)
+ViaTVModePreset(ScrnInfoPtr pScrn)
{
- switch (pVia->pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
+ VIAPtr pVia = VIAPTR(pScrn);
+ VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
+
+ switch (pBIOSInfo->TVEncoder) {
+ case VIA_VT1621:
VIAPreSetTV2Mode(pVia);
break;
- case VIA_TV3:
+ case VIA_VT1622:
case VIA_VT1622A:
- VIAPreSetTV3Mode(pVia);
- break;
case VIA_VT1623:
- VIAPreSetVT1623Mode(pVia);
+ if (pBIOSInfo->TVUseGpioI2c)
+ VIAPreSetVT1623ModeGpioI2c(pVia);
+ else
+ VIAPreSetTV3Mode(pVia);
+ break;
+ default:
break;
}
+
+#ifdef HAVE_DEBUG
+ if (pVia->PrintTVRegs)
+ ViaPrintTVRegs(pScrn);
+#endif /* HAVE_DEBUG */
}
/*
@@ -2060,37 +2053,29 @@ static void
ViaTVClose(VIAPtr pVia)
{
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- I2CDevPtr dev;
CARD8 W_Buffer[2];
- dev = xf86CreateI2CDevRec();
- dev->DevName = "TV";
- dev->SlaveAddr = pBIOSInfo->TVI2CAdd;
- dev->pI2CBus = pVia->I2C_Port2;
- if (xf86I2CDevInit(dev)) {
-
- switch (pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
- W_Buffer[0] = 0x0E;
- W_Buffer[1] = 0x03;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- break;
- case VIA_TV3:
- case VIA_VT1622A:
+ switch (pBIOSInfo->TVEncoder) {
+ case VIA_VT1621:
+ W_Buffer[0] = 0x0E;
+ W_Buffer[1] = 0x03;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
+ break;
+ case VIA_VT1622:
+ case VIA_VT1622A:
+ case VIA_VT1623:
+ if (pBIOSInfo->TVUseGpioI2c) {
+ VIAGPIOI2C_Initial(&(pVia->GpioI2c), pBIOSInfo->TVI2CAddr);
+ VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0x0F);
+ } else {
W_Buffer[0] = 0x0E;
W_Buffer[1] = 0x0F;
- xf86I2CWriteRead(dev, W_Buffer,2, NULL,0);
- break;
- case VIA_VT1623:
- VIAGPIOI2C_Initial(&(pVia->GpioI2c), 0x40);
- VIAGPIOI2C_Write(&(pVia->GpioI2c), 0x0E, 0x0F);
- break;
- default:
- break;
+ xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0);
}
+ break;
+ default:
+ break;
}
-
- xf86DestroyI2CDevRec(dev,TRUE);
}
/*
@@ -2101,10 +2086,10 @@ ViaTVModePostSet(ScrnInfoPtr pScrn)
{
switch (VIAPTR(pScrn)->pBIOSInfo->TVEncoder) {
- case VIA_TV2PLUS:
+ case VIA_VT1621:
VIAPostSetTV2Mode(pScrn);
break;
- case VIA_TV3:
+ case VIA_VT1622:
case VIA_VT1622A:
case VIA_VT1623:
VIAPostSetTV3Mode(pScrn);
@@ -2127,13 +2112,13 @@ ViaSetPrimaryOffset(ScrnInfoPtr pScrn)
/* Make sure that this is 32byte aligned */
if (Offset & 0x03) {
- Offset += 0x03;
- Offset &= ~0x03;
+ Offset += 0x03;
+ Offset &= ~0x03;
}
hwp->writeCrtc(hwp, 0x13, Offset & 0xFF);
- ViaCrtcChange(hwp, 0x35, Offset >> 3, 0xE0);
+ ViaCrtcMask(hwp, 0x35, Offset >> 3, 0xE0);
}
-
+
/*
* Patch for horizontal blanking end bit6
*/
@@ -2142,7 +2127,6 @@ ViaSetBlankingEndOverflow(vgaHWPtr hwp)
{
CARD8 start, end;
-
DEBUG(xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "ViaSetBlankingEndOverflow\n"));
start = hwp->readCrtc(hwp, 0x02); /* Save Blanking Start */
@@ -2151,15 +2135,15 @@ ViaSetBlankingEndOverflow(vgaHWPtr hwp)
end |= ((hwp->readCrtc(hwp, 0x05) & 0x80) >> 2); /* Blanking End bit[5:0] */
if ((start & 0x3f) > end) { /* Is Blanking End overflow ? */
- if (start & 0x40) /* Blanking Start bit6 = ? */
- ViaCrtcChange(hwp, 0x33, 0x00, 0x20); /* bit6 = 1, Blanking End bit6 = 0 */
- else
- ViaCrtcChange(hwp, 0x33, 0x20, 0x20); /* bit6 = 0, Blanking End bit6 = 1 */
+ if (start & 0x40) /* Blanking Start bit6 = ? */
+ ViaCrtcMask(hwp, 0x33, 0x00, 0x20); /* bit6 = 1, Blanking End bit6 = 0 */
+ else
+ ViaCrtcMask(hwp, 0x33, 0x20, 0x20); /* bit6 = 0, Blanking End bit6 = 1 */
} else {
- if (start & 0x40) /* Blanking Start bit6 = ? */
- ViaCrtcChange(hwp, 0x33, 0x20, 0x20); /* bit6 = 1, Blanking End bit6 = 1 */
- else
- ViaCrtcChange(hwp, 0x33, 0x00, 0x20); /* bit6 = 0, Blanking End bit6 = 0 */
+ if (start & 0x40) /* Blanking Start bit6 = ? */
+ ViaCrtcMask(hwp, 0x33, 0x20, 0x20); /* bit6 = 1, Blanking End bit6 = 1 */
+ else
+ ViaCrtcMask(hwp, 0x33, 0x00, 0x20); /* bit6 = 0, Blanking End bit6 = 0 */
}
}
@@ -2197,7 +2181,7 @@ ViaPrimaryRefreshPatch(vgaHWPtr hwp, int Refresh, VIABIOSRefreshTablePtr Table)
}
return FALSE;
}
-
+
/*
*
*/
@@ -2207,15 +2191,14 @@ VIASetModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
int port, offset, mask, data;
int i;
Bool SetTV = FALSE;
- VIAModeEntryPtr Mode;
+ VIAModeEntry Mode = Modes[pBIOSInfo->ModeIndex];
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetModeUseBIOSTable\n"));
/* Turn off Screen */
- ViaCrtcChange(hwp, 0x17, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x17, 0x00, 0x80);
/* Clean Second Path Status */
hwp->writeCrtc(hwp, 0x6A, 0x00);
@@ -2229,61 +2212,60 @@ VIASetModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)) {
if (pBIOSInfo->TVIndex != VIA_TVRES_INVALID) {
SetTV = TRUE;
- ViaTVModePreset(pVia);
+ ViaTVModePreset(pScrn);
} else {
if (!pVia->SAMM) /* from via code */
ViaTVClose(pVia);
}
}
- Mode = &(pViaModeTable->Modes[pBIOSInfo->ModeIndex]);
/* Get Standard VGA Regs */
/* Set Sequences regs */
for (i = 1; i < 5; i++)
- hwp->writeSeq(hwp, i , Mode->stdVgaTable.SR[i]);
+ hwp->writeSeq(hwp, i , Mode.stdVgaTable.SR[i]);
/* Set Misc reg */
- hwp->writeMiscOut(hwp, Mode->stdVgaTable.misc);
+ hwp->writeMiscOut(hwp, Mode.stdVgaTable.misc);
/* Set CRTC regs */
for (i = 0; i < 25; i++)
- hwp->writeCrtc(hwp, i, Mode->stdVgaTable.CR[i]);
+ hwp->writeCrtc(hwp, i, Mode.stdVgaTable.CR[i]);
/* Set attribute regs */
for (i = 0; i < 20; i++)
- hwp->writeAttr(hwp, i, Mode->stdVgaTable.AR[i]);
+ hwp->writeAttr(hwp, i, Mode.stdVgaTable.AR[i]);
for (i = 0; i < 9; i++)
- hwp->writeGr(hwp, i, Mode->stdVgaTable.GR[i]);
+ hwp->writeGr(hwp, i, Mode.stdVgaTable.GR[i]);
/* Unlock Extended regs */
hwp->writeSeq(hwp, 0x10, 0x01);
/* Set Commmon Ext. Regs */
- for (i = 0; i < pViaModeTable->commExtTable.numEntry; i++) {
- port = pViaModeTable->commExtTable.port[i];
- offset = pViaModeTable->commExtTable.offset[i];
- mask = pViaModeTable->commExtTable.mask[i];
- data = pViaModeTable->commExtTable.data[i] & mask;
+ for (i = 0; i < commExtTable.numEntry; i++) {
+ port = commExtTable.port[i];
+ offset = commExtTable.offset[i];
+ mask = commExtTable.mask[i];
+ data = commExtTable.data[i] & mask;
ViaVgahwWrite(hwp, 0x300+port, offset, 0x301+port, data);
}
- if (Mode->Mode <= 0x13) {
+ if (Mode.Mode <= 0x13) {
/* Set Standard Mode-Spec. Extend Regs */
- for (i = 0; i < pViaModeTable->stdModeExtTable.numEntry; i++) {
- port = pViaModeTable->stdModeExtTable.port[i];
- offset = pViaModeTable->stdModeExtTable.offset[i];
- mask = pViaModeTable->stdModeExtTable.mask[i];
- data = pViaModeTable->stdModeExtTable.data[i] & mask;
+ for (i = 0; i < stdModeExtTable.numEntry; i++) {
+ port = stdModeExtTable.port[i];
+ offset = stdModeExtTable.offset[i];
+ mask = stdModeExtTable.mask[i];
+ data = stdModeExtTable.data[i] & mask;
ViaVgahwWrite(hwp, 0x300+port, offset, 0x301+port, data);
}
} else {
/* Set Extended Mode-Spec. Extend Regs */
- for (i = 0; i < Mode->extModeExtTable.numEntry; i++) {
- port = Mode->extModeExtTable.port[i];
- offset = Mode->extModeExtTable.offset[i];
- mask = Mode->extModeExtTable.mask[i];
- data = Mode->extModeExtTable.data[i] & mask;
+ for (i = 0; i < Mode.extModeExtTable.numEntry; i++) {
+ port = Mode.extModeExtTable.port[i];
+ offset = Mode.extModeExtTable.offset[i];
+ mask = Mode.extModeExtTable.mask[i];
+ data = Mode.extModeExtTable.data[i] & mask;
ViaVgahwWrite(hwp, 0x300+port, offset, 0x301+port, data);
}
}
@@ -2291,34 +2273,34 @@ VIASetModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* ugly; we should set the standard modeclock if we don't need
to patch for the refresh rate */
/* ResMode & RefreshIndex should be correct at this stage. */
- if (((pBIOSInfo->ResolutionIndex == VIA_RES_INVALID) ||
- (pBIOSInfo->RefreshIndex == 0xFF) || SetTV
- || !ViaPrimaryRefreshPatch(hwp, supportRef[pBIOSInfo->RefreshIndex],
- pViaModeTable->refreshTable[pBIOSInfo->ResolutionIndex]))
- && (Mode->VClk != 0)) {
- VIASetPrimaryClock(hwp, Mode->VClk);
+ if (((pBIOSInfo->ResolutionIndex == VIA_RES_INVALID) ||
+ (pBIOSInfo->RefreshIndex == 0xFF) || SetTV
+ || !ViaPrimaryRefreshPatch(hwp, supportRef[pBIOSInfo->RefreshIndex],
+ (VIABIOSRefreshTablePtr) refreshTable[pBIOSInfo->ResolutionIndex]))
+ && (Mode.VClk != 0)) {
+ VIASetPrimaryClock(hwp, Mode.VClk);
VIASetUseExternalClock(hwp);
}
ViaSetPrimaryOffset(pScrn);
/* Enable MMIO & PCI burst (1 wait state) */
- ViaSeqChange(hwp, 0x1A, 0x06, 0x06);
+ ViaSeqMask(hwp, 0x1A, 0x06, 0x06);
/* Enable modify CRTC starting address */
- ViaCrtcChange(hwp, 0x11, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x11, 0x00, 0x80);
ViaSetBlankingEndOverflow(hwp);
/* LCD Simultaneous Set Mode */
if ((pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD))
&& (pBIOSInfo->PanelIndex != VIA_BIOS_NUM_PANEL)) {
- VIASetLCDMode(pScrn, mode);
- VIAEnableLCD(pScrn);
+ VIASetLCDMode(pScrn, mode);
+ VIAEnableLCD(pScrn);
}
else if ((pBIOSInfo->ConnectedDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD)) &&
(!pVia->HasSecondary)) {
- VIADisableLCD(pScrn);
+ VIADisableLCD(pScrn);
}
if (SetTV)
@@ -2327,11 +2309,11 @@ VIASetModeUseBIOSTable(ScrnInfoPtr pScrn, DisplayModePtr mode)
ViaSetPrimaryFIFO(pScrn, mode);
/* Enable CRT Controller (3D5.17 Hardware Reset) */
- ViaCrtcChange(hwp, 0x17, 0x80, 0x80);
+ ViaCrtcMask(hwp, 0x17, 0x80, 0x80);
/* Turn off CRT, if user doesn't want crt on */
if (!(pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1))
- ViaCrtcChange(hwp, 0x36, 0x30, 0x30);
+ ViaCrtcMask(hwp, 0x36, 0x30, 0x30);
/* Open Screen */ /* -- wrong -- this is your bogstandard vga palette disable */
hwp->disablePalette(hwp);
@@ -2356,7 +2338,7 @@ ViaSetSecondaryOffset(ScrnInfoPtr pScrn)
Offset &= ~0x03;
}
hwp->writeCrtc(hwp, 0x66, Offset & 0xFF);
- ViaCrtcChange(hwp, 0x67, Offset >> 8, 0x03);
+ ViaCrtcMask(hwp, 0x67, Offset >> 8, 0x03);
}
void
@@ -2368,11 +2350,11 @@ VIASetModeForMHS(ScrnInfoPtr pScrn, DisplayModePtr mode)
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetModeForMHS\n"));
/* Turn off Screen */
- ViaCrtcChange(hwp, 0x17, 0x00, 0x80);
+ ViaCrtcMask(hwp, 0x17, 0x00, 0x80);
if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) {
if (pBIOSInfo->TVIndex != VIA_TVRES_INVALID) {
- ViaTVModePreset(pVia);
+ ViaTVModePreset(pScrn);
ViaTVModePostSet(pScrn);
} else {
if (!pVia->SAMM) /* from via code */
@@ -2382,7 +2364,7 @@ VIASetModeForMHS(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* CLE266A2 apparently doesn't like this */
if ((pVia->Chipset != VIA_CLE266) || (pVia->ChipRev != 0x02))
- ViaCrtcChange(hwp, 0x6C, 0x00, 0x1E);
+ ViaCrtcMask(hwp, 0x6C, 0x00, 0x1E);
if ((pBIOSInfo->ActiveDevice & (VIA_DEVICE_DFP | VIA_DEVICE_LCD))
&& (pBIOSInfo->PanelIndex != VIA_BIOS_NUM_PANEL)) {
@@ -2399,7 +2381,7 @@ VIASetModeForMHS(ScrnInfoPtr pScrn, DisplayModePtr mode)
/* via code: 8bit = 0x00, 16bit = 0x40, 24 & 32bit = 0x80 */
/* with this arithmetic 32bit becomes 0xC0 */
- ViaCrtcChange(hwp, 0x67, (pScrn->bitsPerPixel - 0x01) << 3, 0xC0);
+ ViaCrtcMask(hwp, 0x67, (pScrn->bitsPerPixel - 0x01) << 3, 0xC0);
/* Open Screen */ /* -- wrong -- this is your bogstandard vga palette disable */
hwp->disablePalette(hwp);
@@ -2411,15 +2393,15 @@ VIASetModeForMHS(ScrnInfoPtr pScrn, DisplayModePtr mode)
* All of via lacks consistency.
*/
static void
-ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRecPtr Sequence)
+ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence)
{
int i;
- for (i = 0; i < Sequence->numEntry; i++) {
- ViaVgahwChange(hwp, 0x300 + Sequence->port[i], Sequence->offset[i],
- 0x301 + Sequence->port[i], Sequence->data[i],
- Sequence->mask[i]);
- usleep(Sequence->delay[i]);
+ for (i = 0; i < Sequence.numEntry; i++) {
+ ViaVgahwMask(hwp, 0x300 + Sequence.port[i], Sequence.offset[i],
+ 0x301 + Sequence.port[i], Sequence.data[i],
+ Sequence.mask[i]);
+ usleep(Sequence.delay[i]);
}
}
@@ -2429,20 +2411,18 @@ VIAEnableLCD(ScrnInfoPtr pScrn)
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIAPtr pVia = VIAPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
int i;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VIAEnableLCD\n"));
/* Enable LCD */
- ViaCrtcChange(hwp, 0x6A, 0x08, 0x08);
+ ViaCrtcMask(hwp, 0x6A, 0x08, 0x08);
/* Find Panel Size Index for PowerSeq Table */
if (pVia->Chipset == VIA_CLE266) {
if (pBIOSInfo->PanelSize != VIA_PANEL_INVALID) {
- for (i = 0; i < pViaModeTable->NumPowerOn; i++) {
- if (pViaModeTable->lcdTable[pBIOSInfo->PanelIndex].powerSeq ==
- pViaModeTable->powerOn[i].powerSeq)
+ for (i = 0; i < NumPowerOn; i++) {
+ if (lcdTable[pBIOSInfo->PanelIndex].powerSeq == powerOn[i].powerSeq)
break;
}
} else
@@ -2451,7 +2431,7 @@ VIAEnableLCD(ScrnInfoPtr pScrn)
i = 2;
usleep(1);
- ViaLCDPowerSequence(hwp, &(pViaModeTable->powerOn[i]));
+ ViaLCDPowerSequence(hwp, powerOn[i]);
usleep(1);
}
@@ -2460,21 +2440,19 @@ VIADisableLCD(ScrnInfoPtr pScrn)
{
vgaHWPtr hwp = VGAHWPTR(pScrn);
VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
int i;
DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VIADisableLCD\n"));
/* Disable LCD */
- ViaCrtcChange(hwp, 0x6A, 0x00, 0x08);
+ ViaCrtcMask(hwp, 0x6A, 0x00, 0x08);
- for (i = 0; i < pViaModeTable->NumPowerOn; i++) {
- if (pViaModeTable->lcdTable[pBIOSInfo->PanelIndex].powerSeq ==
- pViaModeTable->powerOn[i].powerSeq)
+ for (i = 0; i < NumPowerOn; i++) {
+ if (lcdTable[pBIOSInfo->PanelIndex].powerSeq == powerOn[i].powerSeq)
break;
}
- ViaLCDPowerSequence(hwp, &(pViaModeTable->powerOff[i]));
+ ViaLCDPowerSequence(hwp, powerOff[i]);
}
/*
@@ -2482,114 +2460,6 @@ VIADisableLCD(ScrnInfoPtr pScrn)
* All palette.
*
*/
-#ifdef UNUSED
-static void
-VIASavePalette(ScrnInfoPtr pScrn, LOCO *colors) {
- vgaHWPtr hwp = VGAHWPTR(pScrn);
- VIAPtr pVia = VIAPTR(pScrn);
- int i, sr1a, sr1b, cr67, cr6a;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASavePalette\n"));
- /* sr16 = hwp->readSeq(hwp, 0x16); */
- sr1a = hwp->readSeq(hwp, 0x1A);
- sr1b = hwp->readSeq(hwp, 0x1B);
- cr67 = hwp->readCrtc(hwp, 0x67);
- cr6a = hwp->readCrtc(hwp, 0x6A);
-
- /*
- if (pScrn->bitsPerPixel == 8)
- ViaSeqChange(hwp, 0x16, 0x00, 0x80);
- else
- ViaSeqChange(hwp, 0x16, 0x80, 0x80);
- */
- if (pVia->IsSecondary) {
- ViaSeqChange(hwp, 0x1A, 0x01, 0x01);
- ViaSeqChange(hwp, 0x1B, 0x80, 0x80);
- ViaCrtcChange(hwp, 0x67, 0x00, 0xC0);
- ViaCrtcChange(hwp, 0x6A, 0xC0, 0xC0);
- } else {
- ViaSeqChange(hwp, 0x1A, 0x00, 0x01);
- ViaSeqChange(hwp, 0x1B, 0x20, 0x20);
- }
-
- hwp->writeDacReadAddr(hwp, 0x00);
- for (i = 0; i < 256; i++) {
- colors[i].red = hwp->readDacData(hwp);
- colors[i].green = hwp->readDacData(hwp);
- colors[i].blue = hwp->readDacData(hwp);
- DEBUG(xf86Msg(X_INFO, "%d, %d, %d\n", colors[i].red,
- colors[i].green, colors[i].blue));
- }
- ViaWaitIdle(pScrn);
-
- /*
- if (pScrn->bitsPerPixel == 8)
- hwp->writeSeq(hwp, 0x16, sr16);
- hwp->writeSeq(hwp, 0x16, sr16);
- */
- hwp->writeSeq(hwp, 0x1A, sr1a);
- hwp->writeSeq(hwp, 0x1B, sr1b);
-
- if (pVia->IsSecondary) {
- hwp->writeCrtc(hwp, 0x67, cr67);
- hwp->writeCrtc(hwp, 0x6A, cr6a);
- }
-}
-
-static void
-VIARestorePalette(ScrnInfoPtr pScrn, LOCO *colors) {
- vgaHWPtr hwp = VGAHWPTR(pScrn);
- VIAPtr pVia = VIAPTR(pScrn);
- int i, sr1a, sr1b, cr67, cr6a, sr16;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIARestorePalette\n"));
- sr16 = hwp->readSeq(hwp, 0x16);
- sr1a = hwp->readSeq(hwp, 0x1A);
- sr1b = hwp->readSeq(hwp, 0x1B);
- cr67 = hwp->readCrtc(hwp, 0x67);
- cr6a = hwp->readCrtc(hwp, 0x6A);
-
- /* if (pScrn->bitsPerPixel == 8)
- ViaSeqChange(hwp, 0x16, 0x00, 0x80);
- else
- ViaSeqChange(hwp, 0x16, 0x80, 0x80);
- */
-
- if (pVia->IsSecondary) {
- ViaSeqChange(hwp, 0x1A, 0x01, 0x01);
- ViaSeqChange(hwp, 0x1B, 0x80, 0x80);
- ViaCrtcChange(hwp, 0x67, 0x00, 0xC0);
- ViaCrtcChange(hwp, 0x6A, 0xC0, 0xC0);
- } else {
- ViaSeqChange(hwp, 0x1A, 0x00, 0x01);
- ViaSeqChange(hwp, 0x1B, 0x20, 0x20);
- }
-
- hwp->writeDacWriteAddr(hwp, 0x00);
- for (i = 0; i < 256; i++) {
- hwp->writeDacData(hwp, colors[i].red);
- hwp->writeDacData(hwp, colors[i].green);
- hwp->writeDacData(hwp, colors[i].blue);
- /*DEBUG(xf86Msg(X_INFO, "%d, %d, %d\n", colors[i].red,
- colors[i].green, colors[i].blue));*/
- }
- ViaWaitIdle(pScrn);
-
- /*
- if (pScrn->bitsPerPixel == 8)
- hwp->writeSeq(hwp, 0x16, sr16);
- hwp->writeSeq(hwp, 0x16, sr16);
- */
- hwp->writeSeq(hwp, 0x1A, sr1a);
- hwp->writeSeq(hwp, 0x1B, sr1b);
-
- if (pVia->IsSecondary) {
- hwp->writeCrtc(hwp, 0x67, cr67);
- hwp->writeCrtc(hwp, 0x6A, cr6a);
- }
-}
-#endif /* UNUSED */
-
void
VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
LOCO *colors, VisualPtr pVisual)
@@ -2610,10 +2480,10 @@ VIALoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
CR6A = hwp->readCrtc(hwp, 0x6A);
if (pVia->IsSecondary) {
- ViaSeqChange(hwp, 0x1A, 0x01, 0x01);
- ViaSeqChange(hwp, 0x1B, 0x80, 0x80);
- ViaCrtcChange(hwp, 0x67, 0x00, 0xC0);
- ViaCrtcChange(hwp, 0x6A, 0xC0, 0xC0);
+ ViaSeqMask(hwp, 0x1A, 0x01, 0x01);
+ ViaSeqMask(hwp, 0x1B, 0x80, 0x80);
+ ViaCrtcMask(hwp, 0x67, 0x00, 0xC0);
+ ViaCrtcMask(hwp, 0x6A, 0xC0, 0xC0);
}
for (i = 0; i < numColors; i++) {
diff --git a/src/via_mode.h b/src/via_mode.h
index 4897a4d..20a4a2d 100644
--- a/src/via_mode.h
+++ b/src/via_mode.h
@@ -26,10 +26,206 @@
#ifndef _VIA_MODE_H_
#define _VIA_MODE_H_ 1
-static const unsigned short BIOSVer = 0X10;
+/*
+ * First some structs and defines that used to sit in via_bios.h
+ *
+ */
+
+#define VIA_BIOS_REG_TABLE_MAX_NUM 32
+#define VIA_BIOS_REG_LCD_MAX_NUM 48
+#define VIA_BIOS_NUM_RES 17
+#define VIA_BIOS_NUM_REFRESH 5
+#define VIA_BIOS_NUM_LCD_SUPPORT_MASK 8
+#define VIA_BIOS_NUM_LCD_POWER_SEQ 4
+#define VIA_BIOS_NUM_PANEL 7
+#define VIA_BIOS_MAX_NUM_MPATCH2 18
+#define VIA_BIOS_MAX_NUM_MPATCH1 9
+#define VIA_BIOS_MAX_NUM_CTREXP 5
+#define VIA_BIOS_MAX_NUM_TV_REG 144 /* 00 - 8F, tv2,tv3 are the same */
+#define VIA_BIOS_MAX_NUM_TV_CRTC 32
+#define VIA_BIOS_NUM_TV_SPECIAL_REG 8
+#define VIA_BIOS_MAX_NUM_TV_PATCH 8
+#define VIA_BIOS_NUM_TV_OTHER 16
+#define VIA_BIOS_NUM_TV2 2
+#define VIA_BIOS_NUM_TV3 6
+
+typedef struct _VIABIOSSTDVGATABLE {
+ CARD8 columns;
+ CARD8 rows;
+ CARD8 fontHeight;
+ CARD16 pageSize;
+ CARD8 SR[5];
+ CARD8 misc;
+ CARD8 CR[25];
+ CARD8 AR[20];
+ CARD8 GR[9];
+} VIABIOSStdVGATableRec, *VIABIOSStdVGATablePtr;
+
+
+typedef struct _VIABIOSREFRESHTABLE {
+ CARD8 refresh;
+ CARD16 VClk;
+ CARD8 CR[14];
+} VIABIOSRefreshTableRec, *VIABIOSRefreshTablePtr;
+
+
+typedef struct _VIABIOSREGTABLE {
+ CARD8 port[VIA_BIOS_REG_TABLE_MAX_NUM];
+ CARD8 offset[VIA_BIOS_REG_TABLE_MAX_NUM];
+ CARD8 mask[VIA_BIOS_REG_TABLE_MAX_NUM];
+ CARD8 data[VIA_BIOS_REG_TABLE_MAX_NUM];
+ int numEntry;
+} VIABIOSRegTableRec, *VIABIOSRegTablePtr;
+
+
+typedef struct _VIAVMODEENTRY {
+ unsigned short Width;
+ unsigned short Height;
+ unsigned short Bpp;
+ unsigned short Mode;
+ unsigned short MemNeed;
+ unsigned short MClk;
+ unsigned short VClk;
+ VIABIOSStdVGATableRec stdVgaTable;
+ VIABIOSRegTableRec extModeExtTable;
+} VIAModeEntry, *VIAModeEntryPtr;
+
+
+typedef struct _VIALCDMODEENTRY {
+ CARD16 LCDClk;
+ CARD16 VClk;
+ CARD16 LCDClk_12Bit;
+ CARD16 VClk_12Bit;
+ CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM];
+ CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM];
+ CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM];
+ int numEntry;
+} VIALCDModeEntry, *VIALCDModeEntryPtr;
+
+
+typedef struct _VIALCDMPATCHENTRY {
+ CARD8 Mode;
+ CARD16 LCDClk;
+ CARD16 VClk;
+ CARD16 LCDClk_12Bit;
+ CARD16 VClk_12Bit;
+ CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM];
+ CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM];
+ CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM];
+ int numEntry;
+} VIALCDMPatchEntry, *VIALCDMPatchEntryPtr;
-static char BIOSDate[] =
- { 0X30, 0X34, 0X2F, 0X31, 0X35, 0X2F, 0X30, 0X33, 0 };
+
+typedef struct _VIALCDMODEFIX {
+ CARD8 reqMode[32];
+ CARD8 fixMode[32];
+ int numEntry;
+} VIALCDModeFixRec, *VIALCDModeFixRecPtr;
+
+
+typedef struct _VIALCDPOWERSEQUENCE {
+ CARD8 powerSeq;
+ CARD8 port[4];
+ CARD8 offset[4];
+ CARD8 mask[4];
+ CARD8 data[4];
+ CARD16 delay[4];
+ int numEntry;
+} VIALCDPowerSeqRec, *VIALCDPowerSeqRecPtr;
+
+
+typedef struct _VIALCDMODETABLE {
+ CARD8 fpIndex;
+ CARD8 fpSize;
+ CARD8 powerSeq;
+ int numMPatchDP2Ctr;
+ int numMPatchDP2Exp;
+ int numMPatchDP1Ctr;
+ int numMPatchDP1Exp;
+ CARD16 SuptMode[VIA_BIOS_NUM_LCD_SUPPORT_MASK];
+ VIALCDModeEntry FPconfigTb;
+ VIALCDModeEntry InitTb;
+ VIALCDMPatchEntry MPatchDP2Ctr[VIA_BIOS_MAX_NUM_MPATCH2];
+ VIALCDMPatchEntry MPatchDP2Exp[VIA_BIOS_MAX_NUM_MPATCH2];
+ VIALCDMPatchEntry MPatchDP1Ctr[VIA_BIOS_MAX_NUM_MPATCH1];
+ VIALCDMPatchEntry MPatchDP1Exp[VIA_BIOS_MAX_NUM_MPATCH1];
+ VIALCDModeEntry LowResCtr;
+ VIALCDModeEntry LowResExp;
+ VIALCDModeEntry MCtr[VIA_BIOS_MAX_NUM_CTREXP];
+ VIALCDModeEntry MExp[VIA_BIOS_MAX_NUM_CTREXP];
+} VIALCDModeTableRec, *VIALCDModePtr;
+
+
+typedef struct _VIATVMASKTABLE {
+ CARD8 TV[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 misc1;
+ CARD8 misc2;
+ int numTV;
+ int numCRTC1;
+ int numCRTC2;
+} VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr;
+
+typedef struct _VIATVMODETABLE {
+ CARD8 TVNTSCC[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 TVNTSCS[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH];
+ CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD8 TVPALC[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 TVPALS[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH];
+} VIABIOSTV2TableRec, *VIABIOSTV2TablePtr;
+
+
+typedef struct _VIATV3MODETABLE {
+ CARD8 TVNTSC[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 CRTCNTSC1[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 MiscNTSC1[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 MiscNTSC2[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 CRTCNTSC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCNTSC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCNTSC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD16 PatchNTSC2[VIA_BIOS_MAX_NUM_TV_PATCH];
+ CARD16 RGBNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 SDTV_RGBNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 SDTV_YCbCrNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER];
+ CARD8 TVPAL[VIA_BIOS_MAX_NUM_TV_REG];
+ CARD8 CRTCPAL1[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 MiscPAL1[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 MiscPAL2[VIA_BIOS_NUM_TV_SPECIAL_REG];
+ CARD8 CRTCPAL2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCPAL2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD8 CRTCPAL2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC];
+ CARD16 PatchPAL2[VIA_BIOS_MAX_NUM_TV_PATCH];
+ CARD16 RGBPAL[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 YCbCrPAL[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 SDTV_RGBPAL[VIA_BIOS_NUM_TV_OTHER];
+ CARD16 SDTV_YCbCrPAL[VIA_BIOS_NUM_TV_OTHER];
+} VIABIOSTV3TableRec, *VIABIOSTV3TablePtr;
+
+/*
+ * Former via_mode.h tables
+ *
+ */
+static const unsigned short BIOSVer = 0X10;
+/* Date: 04/15/03 */
+/* static char BIOSDate[] =
+ { 0X30, 0X34, 0X2F, 0X31, 0X35, 0X2F, 0X30, 0X33, 0 }; */
static const unsigned short NumModes = 97;
diff --git a/src/via_swov.c b/src/via_swov.c
index 6a2904a..ab07390 100644
--- a/src/via_swov.c
+++ b/src/via_swov.c
@@ -44,7 +44,6 @@
#ifdef XF86DRI
#include "via_common.h"
#endif
-#include "via_lib.h"
#include "via_vgahw.h"
#include "via_id.h"
@@ -218,6 +217,22 @@ static void ViaVideoRegWrite(VIAPtr pVia)
}
}
+/*
+ * Fill the buffer with 0x8000 (YUV2 black)
+ */
+static void
+ViaYUVFillBlack(VIAPtr pVia, int offset, int num)
+{
+ CARD16 *ptr = (CARD16 *)(pVia->FBBase + offset);
+
+ while(num-- > 0)
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+ *ptr++ = 0x0080;
+#else
+ *ptr++ = 0x8000;
+#endif
+}
+
/*************************************************************************
Function : VIAVidCreateSurface
Create overlay surface depend on FOURCC
@@ -264,12 +279,8 @@ unsigned long VIAVidCreateSurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurface
return retCode;
dwAddr = pVia->swov.SWOVMem.base;
- /* fill in the SW buffer with 0x8000 (YUY2-black color) to clear FB buffer*/
-#ifdef ALIGNMENT_EXPERIMENT
- ViaYUVFillBlack(pVia, dwAddr, SWFBSIZE>>2);
-#else
+
ViaYUVFillBlack(pVia, dwAddr, SWFBSIZE);
-#endif
pVia->swov.SWDevice.dwSWPhysicalAddr[0] = dwAddr;
pVia->swov.SWDevice.lpSWOverlaySurface[0] = pVia->FBBase+dwAddr;
@@ -316,13 +327,7 @@ unsigned long VIAVidCreateSurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurface
if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/
pVia->swov.overlayRecordV1.dwHQVAddr[2] = dwAddr + 2 * HQVFBSIZE;
-
- /* fill in the HQV buffer with 0x8000 (YUY2-black color) to clear HQV buffers*/
-#ifdef ALIGNMENT_EXPERIMENT
- ViaYUVFillBlack(pVia, dwAddr, HQVFBSIZE>>2);
-#else
ViaYUVFillBlack(pVia, dwAddr, HQVFBSIZE);
-#endif
VIDOutD(HQV_DST_STARTADDR1,pVia->swov.overlayRecordV1.dwHQVAddr[1]);
VIDOutD(HQV_DST_STARTADDR0,pVia->swov.overlayRecordV1.dwHQVAddr[0]);
@@ -377,13 +382,8 @@ unsigned long VIAVidCreateSurface(ScrnInfoPtr pScrn, LPDDSURFACEDESC lpDDSurface
dwAddr = pVia->swov.SWfbMem.base;
DEBUG(ErrorF("dwAddr for SWfbMem is %lu\n", dwAddr));
- /* fill in the SW buffer with 0x8000 (YUY2-black color) to clear FB buffer
- */
-#ifdef ALIGNMENT_EXPERIMENT
- ViaYUVFillBlack(pVia, dwAddr, SWFBSIZE>>2);
-#else
+
ViaYUVFillBlack(pVia, dwAddr, SWFBSIZE);
-#endif
pVia->swov.SWDevice.dwSWPhysicalAddr[0] = dwAddr;
pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] = pVia->swov.SWDevice.dwSWPhysicalAddr[0]
@@ -445,14 +445,8 @@ if (!(pVia->swov.gdwVideoFlagSW & SW_USE_HQV))
if ( hwDiff->dwThreeHQVBuffer ) /*CLE_C0*/
pVia->swov.overlayRecordV1.dwHQVAddr[2] = dwAddr + 2 * HQVFBSIZE;
- /* fill in the HQV buffer with 0x8000 (YUY2-black color) to clear HQV buffers
- * FIXME: Check if should fill 3 on C0
- */
-#ifdef ALIGNMENT_EXPERIMENT
- ViaYUVFillBlack(pVia, dwAddr, HQVFBSIZE>>2);
-#else
+ /* FIXME: Check if should fill 3 on C0 */
ViaYUVFillBlack(pVia, dwAddr, HQVFBSIZE);
-#endif
VIDOutD(HQV_DST_STARTADDR1,pVia->swov.overlayRecordV1.dwHQVAddr[1]);
VIDOutD(HQV_DST_STARTADDR0,pVia->swov.overlayRecordV1.dwHQVAddr[0]);
@@ -958,7 +952,7 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
{
viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER, V_COMPOSE_MODE , dwCompose|V3_COMMAND_FIRE );
}
-
+
viaMacro_VidREGFlush(pVia);
return PI_ERR;
}
@@ -1383,32 +1377,66 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
/*if (0)*/
{
DBG_DD(ErrorF(" First HQV\n"));
-
+
viaMacro_VidREGFlush(pVia);
-
- DBG_DD(ErrorF(" Wait flips"));
+
+ DBG_DD(ErrorF(" Wait flips"));
if ( hwDiff->dwHQVInitPatch )
{
- DBG_DD(ErrorF(" Wait flips 1"));
+ DBG_DD(ErrorF(" Wait flips 1"));
viaWaitHQVFlipClear(pVia, ((dwHQVCtl&~HQV_SW_FLIP)|HQV_FLIP_STATUS)&~HQV_ENABLE);
VIDOutD(HQV_CONTROL, dwHQVCtl);
- DBG_DD(ErrorF(" Wait flips2"));
+ DBG_DD(ErrorF(" Wait flips2"));
viaWaitHQVFlip(pVia);
- DBG_DD(ErrorF(" Wait flips 3"));
+ DBG_DD(ErrorF(" Wait flips 3"));
viaWaitHQVFlipClear(pVia, ((dwHQVCtl&~HQV_SW_FLIP)|HQV_FLIP_STATUS)&~HQV_ENABLE);
VIDOutD(HQV_CONTROL, dwHQVCtl);
- DBG_DD(ErrorF(" Wait flips4"));
+ DBG_DD(ErrorF(" Wait flips4"));
viaWaitHQVFlip(pVia);
}
else /* CLE_C0 */
{
+ /* check HQV is idle */
+ {
+ CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL);
+ DBG_DD(ErrorF("HQV control wf - %08x\n", *pdwState));
+
+ while(!(*pdwState & HQV_IDLE))
+ {
+ DBG_DD(ErrorF("HQV control busy - %08x\n", *pdwState));
+ usleep(1);
+ }
+ }
+
VIDOutD(HQV_CONTROL, dwHQVCtl & ~HQV_SW_FLIP);
VIDOutD(HQV_CONTROL, dwHQVCtl | HQV_SW_FLIP);
- DBG_DD(ErrorF(" Wait flips5"));
- viaWaitHQVFlip(pVia);
- DBG_DD(ErrorF(" Wait flips6"));
- }
+ {
+ CARD32 volatile *pdwState = (CARD32 volatile *) (pVia->VidMapBase+HQV_CONTROL);
+ int i = 50;
+
+ DBG_DD(ErrorF("HQV control wf5 - %08x\n", *pdwState));
+
+ DBG_DD(ErrorF(" Wait flips5"));
+
+ while (!(*pdwState & HQV_FLIP_STATUS))
+ {
+ DBG_DD(ErrorF(" HQV wait %d %08x\n",i, *pdwState));
+
+ *pdwState |= HQV_SW_FLIP|HQV_FLIP_STATUS;
+
+ usleep(1);
+
+ if (!i--)
+ break;
+ }
+#if 0
+ viaWaitHQVFlip(pVia);
+#endif
+ DBG_DD(ErrorF(" Wait flips6"));
+ }
+ }
+
if (dwVideoFlag & VIDEO_1_INUSE)
{
VIDOutD(V1_CONTROL, dwVidCtl);
@@ -1420,7 +1448,7 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
viaWaitVBI(pVia);
DBG_DD(ErrorF(" Wait flips 8"));
hwp->writeSeq(hwp, 0x17, 0x2F);
- ViaSeqChange(hwp, 0x16, 0x14, 0x1F);
+ ViaSeqMask(hwp, 0x16, 0x14, 0x1F);
hwp->writeSeq(hwp, 0x18, 0x56);
DBG_DD(ErrorF(" Wait flips 9"));
}
@@ -1473,7 +1501,7 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
/*Hide overlay*/
if ( hwDiff->dwHQVDisablePatch ) /*CLE_C0*/
- ViaSeqChange(hwp, 0x2E, 0x00, 0x10);
+ ViaSeqMask(hwp, 0x2E, 0x00, 0x10);
viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_FIFO_CONTROL,V1_FIFO_PRETHRESHOLD12 |
V1_FIFO_THRESHOLD8 |V1_FIFO_DEPTH16);
@@ -1482,7 +1510,7 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
if (dwVideoFlag&VIDEO_HQV_INUSE)
{
- viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,HQV_CONTROL, (VIDInD(HQV_CONTROL) & (~HQV_ENABLE)));
+ viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,HQV_CONTROL, (VIDInD(HQV_CONTROL) & (~HQV_ENABLE)));
}
if (dwVideoFlag&VIDEO_1_INUSE)
@@ -1495,11 +1523,11 @@ static unsigned long Upd_Video(ScrnInfoPtr pScrn, unsigned long dwVideoFlag,unsi
viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V3_CONTROL, (VIDInD(V3_CONTROL) & (~V3_ENABLE)));
viaMacro_VidREGRec(pVia, VIDREGREC_SAVE_REGISTER,V_COMPOSE_MODE, (VIDInD(V_COMPOSE_MODE)|V3_COMMAND_FIRE));
}
-
+
viaMacro_VidREGFlush(pVia);
if ( hwDiff->dwHQVDisablePatch ) /*CLE_C0*/
- ViaSeqChange(hwp, 0x2E, 0x10, 0x10);
+ ViaSeqMask(hwp, 0x2E, 0x10, 0x10);
}
DBG_DD(ErrorF(" Done Upd_Video"));
@@ -1631,7 +1659,7 @@ unsigned long VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY lpUpdate)
else
{
//Set Display FIFO
- ViaSeqChange(hwp, 0x16, 0x0C, 0xE0);
+ ViaSeqMask(hwp, 0x16, 0x0C, 0xE0);
DBG_DD(ErrorF("set 3c4.16 : %08x \n",hwp->readSeq(hwp, 0x16)));
hwp->writeSeq(hwp, 0x18, 0x4c);
DBG_DD(ErrorF(" 3c4.18 : %08x \n",hwp->readSeq(hwp, 0x18)));
diff --git a/src/via_vbe.c b/src/via_vbe.c
deleted file mode 100644
index 079965c..0000000
--- a/src/via_vbe.c
+++ /dev/null
@@ -1,833 +0,0 @@
-/*
- * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * VBE OEM Extensions
- *
- * Most of these are either not used or not working properly.
- * Need information from via.
- *
- */
-
-#include "via_driver.h"
-
-/*
- * CARD8 ViaVBEGetActiveDevice(ScrnInfoPtr pScrn);
- *
- * - Determine which devices (CRT1, LCD, TV, DFP) are active
- *
- * Need more information: return does not match my biossetting -- luc
- *
- *
- * VBE OEM subfunction 0x0103 (from via code)
- * cx = 0x00
- * returns:
- * cx = active device
- *
- */
-CARD8
-ViaVBEGetActiveDevice(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
-
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- CARD8 device = 0;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetActiveDevice\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0103;
-
- pInt10->cx = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetActiveDevice: VBE call failed.\n");
- return 0xFF;
- }
-
- if (pInt10->cx & 0x01)
- device = VIA_DEVICE_CRT1;
- if (pInt10->cx & 0x02)
- device |= VIA_DEVICE_LCD;
- if (pInt10->cx & 0x04)
- device |= VIA_DEVICE_TV;
- if (pInt10->cx & 0x20)
- device |= VIA_DEVICE_DFP;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device(s): %u\n", device));
- return device;
- }
-
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetActiveDevice: VBE not initialised.\n");
- return 0xFF;
-}
-
-/*
- * CARD16 ViaVBEGetDisplayDeviceInfo(pScrn, *numDevice);
- *
- * - Returns the maximal vertical resolution of the Display Device
- * provided in numDevice (CRT (0), DVI (1), LCD/Panel (2))
- *
- *
- * VBE OEM subfunction 0x0806 (from via code)
- * cx = *numDevice
- * di = 0x00
- * returns:
- * cx = *numDevice
- * di = max. vertical resolution
- *
- */
-CARD16
-ViaVBEGetDisplayDeviceInfo(ScrnInfoPtr pScrn, CARD8 *numDevice)
-{
- if (VIAPTR(pScrn)->pVbe) {
-
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetDisplayDeviceInfo\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0806;
-
- pInt10->cx = *numDevice;
- pInt10->di = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceInfo: VBE call failed.\n");
- return 0xFFFF;
- }
-
- *numDevice = pInt10->cx;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vertical Resolution: %u\n", pInt10->di & 0xFFFF));
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel ID: %u\n", *numDevice));
-
- return (pInt10->di & 0xFFFF);
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceInfo: VBE not initialised.\n");
- return 0xFFFF;
-}
-
-#ifdef UNUSED
-/*
- * CARD8 ViaVBEGetDisplayDeviceAttached(pScrn);
- *
- * - Find out which display devices are being used.
- *
- * Why is CRT2 ignored?
- *
- *
- * VBE OEM subfunction 0x0004 (from via code)
- * cx = 0x00
- * returns:
- * cx = display devices
- * Bit[4] = CRT2
- * Bit[3] = DFP
- * Bit[2] = TV
- * Bit[1] = LCD
- * Bit[0] = CRT
- */
-static CARD8
-ViaVBEGetDisplayDeviceAttached(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
-
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- CARD8 device = 0;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetDisplayDeviceAttached\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x04;
-
- pInt10->cx = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceAttached: VBE call failed.\n");
- return 0xFF;
- }
-
- if (pInt10->cx & 0x01)
- device = VIA_DEVICE_CRT1;
- if (pInt10->cx & 0x02)
- device |= VIA_DEVICE_LCD;
- if (pInt10->cx & 0x04)
- device |= VIA_DEVICE_TV;
- if (pInt10->cx & 0x20)
- device |= VIA_DEVICE_DFP;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attached Device(s): %d\n", device));
- return device;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetDisplayDeviceAttached: VBE not initialised.\n");
- return 0xFF;
-}
-#endif /* UNUSED */
-
-/*
- * Bool ViaVBEGetBIOSDate(ScrnInfoPtr pScrn);
- *
- * - Get the BIOS release date and store it in the BIOSInfo.
- *
- *
- * VBE OEM subfunction 0x0100 (from via code)
- * cx = 0x00
- * dx = 0x00
- * si = 0x00
- * returns:
- * bx = year
- * cx = month
- * dx = day
- *
- */
-Bool
-ViaVBEGetBIOSDate(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
-
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetBIOSDate\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0100;
-
- pInt10->cx = 0x00;
- pInt10->dx = 0x00;
- pInt10->si = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSDate: VBE call failed.\n");
- return FALSE;
- }
-
- pBIOSInfo->BIOSDateYear = ((pInt10->bx >> 8) - 48) + ((pInt10->bx & 0xFF) - 48) * 10;
- pBIOSInfo->BIOSDateMonth = ((pInt10->cx >> 8) - 48) + ((pInt10->cx & 0xFF) - 48) * 10;
- pBIOSInfo->BIOSDateDay = ((pInt10->dx >> 8) - 48) + ((pInt10->dx & 0xFF) - 48) * 10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "BIOS Release Date: %d/%d/%d\n",
- pBIOSInfo->BIOSDateYear + 2000, pBIOSInfo->BIOSDateMonth,
- pBIOSInfo->BIOSDateDay));
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSDate: VBE not initialised.\n");
- return FALSE;
-}
-
-/*
- * Bool ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn);
- *
- * - Return the BIOS version.
- *
- * Calls VBE subfunction 00h (VBE supplemental specification information.)
- * Not functional.
- *
- * VBE OEM subfunction 0x0000 (??? - from via code)
- * cx = 0x00
- * returns:
- * bx = version.
- *
- */
-Bool
-ViaVBEGetBIOSVersion(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
-
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetBIOSVersion\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x00; /* ??? */
- pInt10->cx = 0x00;
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSVersion: VBE call failed.\n");
- return FALSE;
- }
-
- pBIOSInfo->BIOSMajorVersion = (pInt10->bx >> 8) & 0xFF;
- pBIOSInfo->BIOSMinorVersion = pInt10->bx & 0xFF;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "BIOS Version: %d.%d\n",
- pBIOSInfo->BIOSMajorVersion, pBIOSInfo->BIOSMinorVersion));
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetBIOSVersion: VBE not initialised.\n");
- return FALSE;
-}
-
-#ifdef UNUSED
-/*
- * CARD8 ViaVBEGetFlatPanelInfo(ScrnInfoPtr pScrn);
- *
- * - Return the flat panel id
- *
- *
- * VBE OEM subfunction 0x0006 (from via code)
- * cx = 0x00
- * returns:
- * cx = panel id.
- *
- */
-static CARD8
-ViaVBEGetFlatPanelInfo(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetFlatPanelInfo\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x06;
-
- pInt10->cx = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetFlatPanelInfo: VBE call failed!\n");
- return 0xFF;
- }
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel ID: %u\n", pInt10->cx & 0x0F));
- return (pInt10->cx & 0x0F);
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetFlatPanelInfo: VBE not initialised.\n");
- return 0xFF;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * CARD16 ViaVBEGetTVConfiguration(ScrnInfoPtr pScrn, CARD16 dx);
- *
- * - ...
- *
- * will only return 0x0000 or 0xFFFF.
- *
- * VBE OEM subfunction 0x8107 (from via code)
- * cx = 0x01
- * dx = ?
- * returns:
- * dx = tv configuration?
- *
- */
-static CARD16
-ViaVBEGetTVConfiguration(ScrnInfoPtr pScrn, CARD16 dx)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- CARD16 config = 0;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetTVConfiguration\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x8107;
- pInt10->cx = 0x01;
- pInt10->dx = dx;
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xff) != 0x4f) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVConfiguration: VBE call failed.\n");
- return 0xFFFF;
- }
-
- if (pInt10->dx)
- config = ViaVBEGetTVConfiguration(pScrn, pInt10->dx);
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV Configuration: %u\n", config));
- return config;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVConfiguration: VBE not initialised.\n");
- return 0xFFFF;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * CARD8 ViaVBEGetTVEncoderType(ScrnInfoPtr pScrn);
- *
- * - Return the type of tv encoder attached.
- *
- * Calls VBE subfunction 00h (VBE supplemental specification information.)
- * Not functional.
- *
- * VBE OEM subfunction 0x0000 (??? - from via code)
- * cx = 0x00
- * returns:
- * cx = TV encoder type?
- *
- */
-static CARD8
-ViaVBEGetTVEncoderType(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetTVEncoderType\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0000; /* ??? */
-
- pInt10->cx = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVEncoderType: VBE call failed.\n");
- return 0xFF;
- }
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV Encoder: %u\n", pInt10->cx >> 8));
- return (pInt10->cx >> 8);
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetTVEncoderType: VBE not initialised.\n");
- return 0xFF;
-}
-#endif /* UNUSED */
-
-/*
- * int ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn);
- *
- * - Get the memory size from VBE OEM.
- *
- * Calls VBE subfunction 00h (VBE supplemental specification information.)
- * Not functional.
- *
- *
- * VBE OEM subfunction 0x0000 (??? - from via code)
- * cx = 0x00
- * dx = 0x00
- * di = 0x00
- * si = 0x00
- * returns:
- * si = memory size
- *
- */
-int
-ViaVBEGetVideoMemSize(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetVideoMemSize\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0000; /* ??? */
-
- pInt10->cx = 0x00;
- pInt10->dx = 0x00;
- pInt10->di = 0x00;
- pInt10->si = 0x00;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetVideoMemSize: VBE call failed.\n");
- return 0;
- }
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Memory Size: %d\n", pInt10->si));
- if (pInt10->si > 1)
- return pInt10->si;
- return 0;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetVideoMemSize: VBE not initialised.\n");
- return 0;
-}
-
-#ifdef UNUSED
-/*
- * Bool ViaVBESetActiveDevice(ScrnInfoPtr pScrn);
- *
- * - Set the active display device from pBIOSInfo
- *
- *
- * VBE OEM subfunction 0x8003 (from via code)
- * cx = ActiveDevice
- * dx = Mode numbers
- * di = Refreshrate
- *
- */
-static Bool
-ViaVBESetActiveDevice(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
- VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetActiveDevice\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x8003;
-
- /* Set Active Device and Translate BIOS byte definition */
- pInt10->cx = 0x00;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1)
- pInt10->cx = 0x01;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD)
- pInt10->cx |= 0x02;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)
- pInt10->cx |= 0x04;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP)
- pInt10->cx |= 0x20;
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device: %d\n", pInt10->cx));
-
- /* Set Current mode */
- pInt10->dx = pViaModeTable->Modes[pBIOSInfo->ModeIndex].Mode;
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode Number: %d\n", pInt10->dx));
-
- /* Set Current Refresh rate */
- switch(pBIOSInfo->Refresh) {
- case 60:
- pInt10->di = 0;
- break;
- case 75:
- pInt10->di = 5;
- break;
- case 85:
- pInt10->di = 7;
- break;
- case 100:
- pInt10->di = 9;
- break;
- case 120:
- pInt10->di = 10;
- break;
- default:
- pInt10->di = 0;
- break;
- }
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Refresh Rate Index: %d\n", pInt10->di));
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetActiveDevice: VBE call failed.\n");
- return FALSE;
- }
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetActiveDevice: VBE not initialised.\n");
- return FALSE;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * Bool ViaVBEGetModeInfo(ScrnInfoPtr pScrn, int ModeNo, int *Xres, int *Yres, int *bpp);
- *
- * - Retrieve resolution and bitdepth from VESA OEM for a given modenumber.
- *
- * Introduced in CLEXF40037
- *
- * VBE OEM subfunction 0x0302 (from via code)
- * cx = ModeNo
- * dx = 0x00
- * returns:
- * bx = Vertical resolution
- * cx = Horizontal resolution
- * dx & 0xFF = bitdepth
- *
- */
-static Bool
-ViaVBEGetModeInfo(ScrnInfoPtr pScrn, int ModeNo, int *Xres, int *Yres, int *bpp)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEGetModeInfo\n"));
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Retrieving info for Mode: %d\n", ModeNo));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0302;
-
- pInt10->cx = ModeNo;
- pInt10->dx = 0x00;
- /* pInt10->di = 0x00;
- pInt10->si = 0x00; */
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetModeInfo: VBE call failed.\n");
- return FALSE;
- }
-
- *Xres = pInt10->cx;
- *Yres = pInt10->bx;
- *bpp = pInt10->dx & 0xFF;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Retrieved Xres: %d; Yres: %d; bpp %d\n",
- *Xres, *Yres, *bpp));
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEGetModeInfo: VBE not initialised.\n");
- return FALSE;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * int ViaVBEQueryModeList(ScrnInfoPtr pScrn, int serno, int* ModeNo);
- *
- * - ...
- *
- * Introduced in CLEXF40037
- *
- * VBE OEM subfunction 0x0202 (from via code)
- * cx = 0x00
- * dx = serno
- * returns
- * cx = Mode number
- * dx = serno (next?)
- */
-static int
-ViaVBEQueryModeList(ScrnInfoPtr pScrn, int serno, int* ModeNo)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEQueryModeList\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0202;
-
- pInt10->cx = 0x00;
- pInt10->dx = serno;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQueryModeList: VBE call failed.\n");
- return 0x00;
- }
-
- *ModeNo = pInt10->cx;
-
- return pInt10->dx;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQueryModeList: VBE not initialised.\n");
- return 0x00;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * int ViaVBEQuerySupportedRefreshRate(ScrnInfoPtr pScrn, int ModeNo,
- * int serno, int *refIndex);
- *
- * - ...
- *
- * Introduced in CLEXF40037
- *
- * VBE OEM subfunction 0x0201 (from via code)
- * cx = Mode Number
- * dx = serial number
- * returns
- * bx = index to refresh rate table
- * dx = serial number
- */
-static int
-ViaVBEQuerySupportedRefreshRate(ScrnInfoPtr pScrn, int ModeNo, int serno, int *refIndex)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBEQuerySupportRefreshRate\n"));
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ModeNo:%x SerialNo:%d\n", ModeNo, serno));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0201;
-
- pInt10->cx = ModeNo;
- pInt10->dx = serno;
- /* pInt10->di = 0x00; */
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQuerySupportedRefreshRate: VBE call failed.\n");
- return 0x00;
- }
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "refIndex:%d SerialNo:%d\n", pInt10->bx, pInt10->dx));
-
- *refIndex = pInt10->bx;
- return pInt10->dx;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBEQuerySupportedRefreshRate: VBE not initialised.\n");
- return 0x00;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * Bool ViaVBESetDeviceRefreshRate(ScrnInfoPtr pScrn);
- *
- * - ...
- *
- * Introduced in CLEXF40037
- *
- * VBE OEM subfunction 0x0001 (from via code)
- * cx = active device
- * dx = mode (set to 0 currently (by via))
- * di = refresh rate index
- */
-static Bool
-ViaVBESetDeviceRefreshRate(ScrnInfoPtr pScrn)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
- VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetDeviceRefreshRate\n"));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0001;
-
- /* Set Active Device and Translate BIOS byte definition */
- pInt10->cx = 0;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_CRT1)
- pInt10->cx = 0x01;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_LCD)
- pInt10->cx |= 0x02;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)
- pInt10->cx |= 0x04;
- if (pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP)
- pInt10->cx |= 0x20;
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active device: %d\n", pInt10->cx));
-
- /* Set Current mode */
- pInt10->dx = 0;
- /*
- pInt10->dx = pViaModeTable->Modes[pBIOSInfo->ModeIndex].Mode;
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode number: %d\n", pInt10->dx));
- */
-
- /* Set Current Refresh rate */
- switch(pBIOSInfo->Refresh) {
- case 60:
- pInt10->di = 0;
- break;
- case 75:
- pInt10->di = 5;
- break;
- case 85:
- pInt10->di = 7;
- break;
- case 100:
- pInt10->di = 9;
- break;
- case 120:
- pInt10->di = 10;
- break;
- default:
- pInt10->di = 0;
- break;
- }
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Refresh rate index: %d\n", pInt10->di));
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetDeviceRefreshRate: VBE call failed.\n");
- return FALSE;
- }
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetDeviceRefreshRate: VBE not initialised.\n");
- return FALSE;
-}
-#endif /* UNUSED */
-
-#ifdef UNUSED
-/*
- * Bool ViaVBESetFlatPanelState(ScrnInfoPtr pScrn, Bool expand);
- *
- * - ...
- *
- * Introduced in CLEXF40037
- *
- * VBE OEM subfunction 0x0306 (from via code)
- * cx = expand
- */
-static Bool
-ViaVBESetFlatPanelState(ScrnInfoPtr pScrn, Bool expand)
-{
- if (VIAPTR(pScrn)->pVbe) {
- xf86Int10InfoPtr pInt10 = VIAPTR(pScrn)->pVbe->pInt10;
-
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVBESetFlatPanelState\n"));
- DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "expand: %d\n", expand));
-
- pInt10->ax = 0x4F14;
- pInt10->bx = 0x0306;
-
- if (expand)
- pInt10->cx = 0x81;
- else
- pInt10->cx = 0x80;
-
- pInt10->num = 0x10;
- xf86ExecX86int10(pInt10);
-
- if ((pInt10->ax & 0xFF) != 0x4F) {
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetFlatPanelState: VBE call failed.\n");
- return FALSE;
- }
- return TRUE;
- }
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaVBESetFlatPanelState: VBE not initialised.\n");
- return FALSE;
-}
-#endif /* UNUSED */
diff --git a/src/via_vgahw.c b/src/via_vgahw.c
index 2787bf8..a856325 100644
--- a/src/via_vgahw.c
+++ b/src/via_vgahw.c
@@ -30,6 +30,7 @@
#include "xf86_ansic.h"
#include "compiler.h"
#include "xf86.h"
+#include "via_driver.h" /* for HAVE_DEBUG */
#include "via_vgahw.h"
/*
@@ -96,7 +97,7 @@ ViaVgahwWrite(vgaHWPtr hwp, int indexaddress, CARD8 index,
*
*/
void
-ViaVgahwChange(vgaHWPtr hwp, int indexaddress, CARD8 index,
+ViaVgahwMask(vgaHWPtr hwp, int indexaddress, CARD8 index,
int valueaddress, CARD8 value, CARD8 mask)
{
CARD8 tmp;
@@ -113,7 +114,7 @@ ViaVgahwChange(vgaHWPtr hwp, int indexaddress, CARD8 index,
*
*/
void
-ViaCrtcChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
+ViaCrtcMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
{
CARD8 tmp;
@@ -128,7 +129,7 @@ ViaCrtcChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
*
*/
void
-ViaSeqChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
+ViaSeqMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
{
CARD8 tmp;
@@ -142,22 +143,32 @@ ViaSeqChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask)
/*
*
*/
-#ifdef REGISTER_PRINT
+#ifdef HAVE_DEBUG
void
ViaVgahwPrint(vgaHWPtr hwp)
{
int i;
-
xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Printing VGA Sequence registers:\n");
- /* 0x50 - used by tuner. */
- for (i = 0; i < 0x51; i++)
+ for (i = 0x00; i < 0x93; i++)
xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "SR%02X: 0x%02X\n", i, hwp->readSeq(hwp, i));
xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Printing VGA CRTM/C registers:\n");
- /* 0xA2 - something to do with LCD scaling */
- for (i = 0; i < 0xA3; i++)
+ for (i = 0x00; i < 0x19; i++)
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "CR%02X: 0x%02X\n", i, hwp->readCrtc(hwp, i));
+ for (i = 0x33; i < 0xA3; i++)
xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "CR%02X: 0x%02X\n", i, hwp->readCrtc(hwp, i));
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Printing VGA Graphics registers:\n");
+ for (i = 0x00; i < 0x08; i++)
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "GR%02X: 0x%02X\n", i, hwp->readGr(hwp, i));
+
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Printing VGA Attribute registers:\n");
+ for (i = 0x00; i < 0x14; i++)
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "AR%02X: 0x%02X\n", i, hwp->readAttr(hwp, i));
+
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Printing VGA Miscellaneous register:\n");
+ xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Misc: 0x%02X\n", hwp->readMiscOut(hwp));
+
xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "End of VGA Registers.\n");
}
-#endif /* REGISTER_PRINT */
+#endif /* HAVE_DEBUG */
diff --git a/src/via_vgahw.h b/src/via_vgahw.h
index df05ca0..4198987 100644
--- a/src/via_vgahw.h
+++ b/src/via_vgahw.h
@@ -25,8 +25,6 @@
#include "vgaHW.h"
-/* #define REGISTER_PRINT */
-
/* not used currently */
/*
CARD8 ViaVgahwIn(vgaHWPtr hwp, int address);
@@ -39,14 +37,14 @@ CARD8 ViaVgahwRead(vgaHWPtr hwp, int indexaddress, CARD8 index,
void ViaVgahwWrite(vgaHWPtr hwp, int indexaddress, CARD8 index,
int valueaddress, CARD8 value);
-void ViaVgahwChange(vgaHWPtr hwp, int indexaddress, CARD8 index,
+void ViaVgahwMask(vgaHWPtr hwp, int indexaddress, CARD8 index,
int valueaddress, CARD8 value, CARD8 mask);
-void ViaCrtcChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask);
-void ViaSeqChange(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask);
+void ViaCrtcMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask);
+void ViaSeqMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask);
-#ifdef REGISTER_PRINT
+#ifdef HAVE_DEBUG
void ViaVgahwPrint(vgaHWPtr hwp);
-#endif
+#endif /* HAVE_DEBUG */
#endif /* _VIA_VGAHW_H_ */
diff --git a/src/via_video.c b/src/via_video.c
index c8a7e24..0e41d34 100644
--- a/src/via_video.c
+++ b/src/via_video.c
@@ -193,12 +193,11 @@ static XF86ImageRec ImagesG[NUM_IMAGES_G] =
}
};
-static char * XVPORTNAME[5] =
+static char * XVPORTNAME[XV_PORT_NUM] =
{
"XV_SWOV",
"XV_TV0" ,
"XV_TV1" ,
- "XV_UTCTRL",
"XV_DUMMY"
};
@@ -518,14 +517,14 @@ viaSetupImageVideoG(ScreenPtr pScreen)
xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY");
/* AllocatePortPriv();*/
- for ( i = 0; i< XV_PORT_NUM; i ++ ) {
+ for ( i = 0; i < XV_PORT_NUM; i ++ ) {
if(!(viaAdaptPtr[i] = xf86XVAllocateVideoAdaptorRec(pScrn)))
return NULL;
gviaPortPriv[i] = (viaPortPrivPtr)xnfcalloc(1, sizeof(viaPortPrivRec) );
pdevUnion[i] = (DevUnion *)xnfcalloc(1, sizeof(DevUnion));
- if(i == 0) /* Overlay engine */
+ if(i == XV_PORT_SWOV) /* Overlay engine */
{
viaAdaptPtr[i]->type = XvInputMask | XvWindowMask | XvImageMask | XvVideoMask | XvStillMask;
viaAdaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
@@ -545,16 +544,9 @@ viaSetupImageVideoG(ScreenPtr pScreen)
viaAdaptPtr[i]->nPorts = 1;
viaAdaptPtr[i]->pPortPrivates = pdevUnion[i];
viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) gviaPortPriv[i];
- if (i == 3) /* Utility port doesn't need attribute */
- {
- viaAdaptPtr[i]->nAttributes = 0;
- viaAdaptPtr[i]->pAttributes = NULL;
- }
- else
- {
- viaAdaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G;
- viaAdaptPtr[i]->pAttributes = AttributesG;
- }
+ viaAdaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G;
+ viaAdaptPtr[i]->pAttributes = AttributesG;
+
viaAdaptPtr[i]->nImages = NUM_IMAGES_G;
viaAdaptPtr[i]->pImages = ImagesG;
viaAdaptPtr[i]->PutVideo = viaPutVideo;
@@ -711,9 +703,7 @@ viaStopVideoG(ScrnInfoPtr pScrn, pointer data, Bool exit)
pPriv->old_drw_y= 0;
pPriv->old_drw_w= 0;
pPriv->old_drw_h= 0;
- } else {
- viaStopSWOVerlay(pScrn);
- }
+ }
}
/* App "xawtv" attribute from -1000 to 1000 */
@@ -788,9 +778,9 @@ viaSetPortAttributeG(
int attr, avalue;
ViaTunerPtr pTuner = NULL;
- if(pPriv->xv_portnum == COMMAND_FOR_TV0)
+ if(pPriv->xv_portnum == XV_PORT_TV0)
pTuner = pVia->Tuner[0];
- else if(pPriv->xv_portnum == COMMAND_FOR_TV1)
+ else if(pPriv->xv_portnum == XV_PORT_TV1)
pTuner = pVia->Tuner[1];
;
DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : \n"));
@@ -893,7 +883,7 @@ viaSetPortAttributeG(
if(pTuner)
{
ViaAudioMode(pVia, value);
- if(pPriv->xv_portnum == COMMAND_FOR_TV0)
+ if(pPriv->xv_portnum == XV_PORT_TV0)
ViaAudioSelect(pScrn,0);
else
ViaAudioSelect(pScrn, 1);
@@ -1109,13 +1099,13 @@ viaPutImageG(
switch ( pPriv->xv_portnum )
{
- case COMMAND_FOR_TV0 :
- case COMMAND_FOR_TV1 :
+ case XV_PORT_TV0:
+ case XV_PORT_TV1:
DBG_DD(ErrorF(" via_video.c : : Shall not happen! \n"));
break;
- case COMMAND_FOR_SWOV :
- case COMMAND_FOR_DUMMY :
+ case XV_PORT_SWOV:
+ case XV_PORT_DUMMY:
{
DDUPDATEOVERLAY UpdateOverlay_Video;
LPDDUPDATEOVERLAY lpUpdateOverlay = &UpdateOverlay_Video;
@@ -1271,24 +1261,24 @@ viaQueryImageAttributesG(
if(*w > VIA_MAX_XVIMAGE_X) *w = VIA_MAX_XVIMAGE_X;
if(*h > VIA_MAX_XVIMAGE_Y) *h = VIA_MAX_XVIMAGE_Y;
- *w = (*w + 1) & ~1;
+ *w = (*w + 7) & ~7;
if(offsets)
offsets[0] = 0;
switch(id) {
case FOURCC_YV12: /*Planar format : YV12 -4:2:0*/
- *h = (*h + 1) & ~1;
- size = (*w + 3) & ~3;
- if(pitches) pitches[0] = size;
- size *= *h;
- if(offsets) offsets[1] = size;
- tmp = ((*w >> 1) + 3) & ~3;
- if(pitches) pitches[1] = pitches[2] = tmp;
- tmp *= (*h >> 1);
- size += tmp;
- if(offsets) offsets[2] = size;
- size += tmp;
- break;
+ *h = (*h + 1) & ~1;
+ size = *w;
+ if(pitches) pitches[0] = size;
+ size *= *h;
+ if(offsets) offsets[1] = size;
+ tmp = (*w >> 1);
+ if(pitches) pitches[1] = pitches[2] = tmp;
+ tmp *= (*h >> 1);
+ size += tmp;
+ if(offsets) offsets[2] = size;
+ size += tmp;
+ break;
case FOURCC_VIA:
*h = (*h + 1) & ~1;
#ifdef XF86DRI
@@ -1350,24 +1340,16 @@ viaPutVideo(ScrnInfoPtr pScrn,
switch ( pPriv->xv_portnum )
{
- case COMMAND_FOR_TV0 :
+ case XV_PORT_TV0:
+ case XV_PORT_TV1:
pPriv->yuv_win.x = drw_x;
pPriv->yuv_win.y = drw_y;
pPriv->yuv_win.width = drw_w;
pPriv->yuv_win.height = drw_h;
pPriv->yuv_win.chromakey = pPriv->colorKey;
break;
-
- case COMMAND_FOR_TV1 :
- pPriv->yuv_win.x = drw_x;
- pPriv->yuv_win.y = drw_y;
- pPriv->yuv_win.width = drw_w;
- pPriv->yuv_win.height = drw_h;
- pPriv->yuv_win.chromakey = pPriv->colorKey;
- break;
-
- case COMMAND_FOR_SWOV :
- case COMMAND_FOR_DUMMY :
+ case XV_PORT_SWOV:
+ case XV_PORT_DUMMY:
DBG_DD(ErrorF(" via_video.c : This port doesn't support PutVideo.\n"));
return XvBadAlloc;
default:
diff --git a/src/via_xvmc.c b/src/via_xvmc.c
index e304af3..ee14b5c 100644
--- a/src/via_xvmc.c
+++ b/src/via_xvmc.c
@@ -280,12 +280,12 @@ void ViaInitXVMC(ScreenPtr pScreen)
"[XvMC] Could not get drm version. Disabling XvMC\n");
return;
}
- if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 2))) {
+ if (((drmVer->version_major <= 2) && (drmVer->version_minor < 0))) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"[XvMC] Kernel drm is not compatible with XvMC.\n");
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"[XvMC] Kernel drm version: %d.%d.%d "
- "and need at least version 1.3.0.\n",
+ "and need at least version 2.0.0.\n",
drmVer->version_major,drmVer->version_minor,
drmVer->version_patchlevel);
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
@@ -293,7 +293,7 @@ void ViaInitXVMC(ScreenPtr pScreen)
drmFreeVersion(drmVer);
return;
}
- if ((drmVer->version_major >= 2)) {
+ if ((drmVer->version_major >= 3)) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"[XvMC] XvMC X driver may not be compatible "
"with kernel drm.\n");
@@ -317,7 +317,6 @@ void ViaInitXVMC(ScreenPtr pScreen)
0 , &(vXvMC->fbBase)) < 0) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[XvMC] drmAddMap(FB) failed. Disabling XvMC.\n");
- drmRmMap(pVia->drmFD,vXvMC->mmioBase);
return;
}
@@ -326,7 +325,6 @@ void ViaInitXVMC(ScreenPtr pScreen)
if (! xf86XvMCScreenInit(pScreen, 1, ppAdapt)) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[XvMC] XvMCScreenInit failed. Disabling XvMC.\n");
- drmRmMap(pVia->drmFD,vXvMC->mmioBase);
drmRmMap(pVia->drmFD,vXvMC->fbBase);
return;
}
@@ -371,6 +369,7 @@ int ViaXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
viaPortPrivPtr pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr;
ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv;
volatile ViaXvMCSAreaPriv *sAPriv;
+ int authenticated;
sAPriv = (ViaXvMCSAreaPriv*) DRIGetSAREAPrivate(pScrn->pScreen);
@@ -421,7 +420,7 @@ int ViaXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
DRM_CONTEXT_2DONLY);
cPriv->drmCtx = contextRec->drmcontext;
- drmAuthMagic(pVia->drmFD, pContext->flags);
+ authenticated = (drmAuthMagic(pVia->drmFD, pContext->flags) == 0);
contextRec->fbBase = (CARD8 *)pVia->FrameBufferBase;
/*
@@ -440,9 +439,10 @@ int ViaXvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
contextRec->major = VIAXVMC_MAJOR;
contextRec->minor = VIAXVMC_MINOR;
contextRec->pl = VIAXVMC_PL;
- strncpy (contextRec->busIdString, pDRIInfo->busIdString, 9);
+ strncpy (contextRec->busIdString,pDRIInfo->busIdString, 20);
contextRec->initAttrs = vx->xvAttr;
contextRec->useAGP = pViaDRI->ringBufActive;
+ contextRec->authenticated = authenticated;
vXvMC->nContexts++;
vXvMC->contexts[ctxNo] = pContext->context_id;
vXvMC->cPrivs[ctxNo] = cPriv;
diff --git a/src/via_xvmc.h b/src/via_xvmc.h
index a599b1e..00a0128 100644
--- a/src/via_xvmc.h
+++ b/src/via_xvmc.h
@@ -35,8 +35,8 @@
#define DRM_VIA_DEC_FUTEX 5
#define VIAXVMC_MAJOR 0
-#define VIAXVMC_MINOR 6
-#define VIAXVMC_PL 1
+#define VIAXVMC_MINOR 7
+#define VIAXVMC_PL 0
#define VIA_NUM_XVMC_ATTRIBUTES 6
#define VIA_XVMC_VALID 0x80000000
@@ -79,6 +79,7 @@ typedef struct{
*/
typedef struct {
+ unsigned int major,minor,pl;
unsigned ctxNo;
unsigned xvmc_port;
drm_context_t drmcontext;
@@ -90,10 +91,10 @@ typedef struct {
unsigned int sAreaOffset;
unsigned int sAreaSize;
unsigned int sAreaPrivOffset;
- char busIdString[10];
- unsigned int major,minor,pl;
+ char busIdString[20];
ViaXvMCAttrHolder initAttrs;
int useAGP;
+ int authenticated;
unsigned pad;
} ViaXvMCCreateContextRec;
diff --git a/src/via_xvpriv.h b/src/via_xvpriv.h
index cd8a720..d859791 100644
--- a/src/via_xvpriv.h
+++ b/src/via_xvpriv.h
@@ -29,19 +29,11 @@
#include "xf86xv.h"
#include "videodev.h"
-#define XV_PORT_NUM 5
-#define XV_SWOV_PORTID 0
-#define XV_TV0_PORTID 1
-#define XV_TV1_PORTID 2
-/* UTCTRL is deprecated */
-#define XV_UTCTRL_PORTID 3
-#define XV_DUMMY_PORTID 4
-
-#define COMMAND_FOR_SWOV XV_SWOV_PORTID
-#define COMMAND_FOR_TV0 XV_TV0_PORTID
-#define COMMAND_FOR_TV1 XV_TV1_PORTID
-#define COMMAND_FOR_UTCTRL XV_UTCTRL_PORTID
-#define COMMAND_FOR_DUMMY XV_DUMMY_PORTID
+#define XV_PORT_SWOV 0
+#define XV_PORT_TV0 1
+#define XV_PORT_TV1 2
+#define XV_PORT_DUMMY 3
+#define XV_PORT_NUM 4
typedef struct {
unsigned char xv_portnum;