diff options
author | Luc Verhaegen <libv@skynet.be> | 2004-11-23 19:13:00 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2004-11-23 19:13:00 +0000 |
commit | 26417159f00c7a02eeedaa0afe430fcb8b87c4ca (patch) | |
tree | 7cfd7eba167ea7f50730d332cc87489acaab8d9e | |
parent | 688e0311b464bd71e42c250557f4a71538c99521 (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.man | 4 | ||||
-rw-r--r-- | src/via_bandwidth.c | 91 | ||||
-rw-r--r-- | src/via_bios.h | 294 | ||||
-rw-r--r-- | src/via_driver.c | 661 | ||||
-rw-r--r-- | src/via_driver.h | 22 | ||||
-rw-r--r-- | src/via_i2c.c | 38 | ||||
-rw-r--r-- | src/via_id.c | 27 | ||||
-rw-r--r-- | src/via_mode.c | 1208 | ||||
-rw-r--r-- | src/via_mode.h | 202 | ||||
-rw-r--r-- | src/via_swov.c | 114 | ||||
-rw-r--r-- | src/via_vbe.c | 833 | ||||
-rw-r--r-- | src/via_vgahw.c | 31 | ||||
-rw-r--r-- | src/via_vgahw.h | 12 | ||||
-rw-r--r-- | src/via_video.c | 80 | ||||
-rw-r--r-- | src/via_xvmc.c | 14 | ||||
-rw-r--r-- | src/via_xvmc.h | 9 | ||||
-rw-r--r-- | src/via_xvpriv.h | 18 |
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; |