diff options
author | Y.C. Chen <yc_chen@aspeedtech.com> | 2008-08-22 12:01:18 +0800 |
---|---|---|
committer | Y.C. Chen <yc_chen@aspeedtech.com> | 2008-08-22 12:01:18 +0800 |
commit | 241d411e770c36b725cc72c1cd5e52932a8cf460 (patch) | |
tree | f97b611ad8b27e9b18a0b91013d3544f5daf2495 /src/ast_vgatool.c | |
parent | 35f09b08456177f837df9b965cec1019ea8f6238 (diff) |
Support AST1100/2050/2100xf86-video-ast-0.87.0
Diffstat (limited to 'src/ast_vgatool.c')
-rw-r--r-- | src/ast_vgatool.c | 125 |
1 files changed, 122 insertions, 3 deletions
diff --git a/src/ast_vgatool.c b/src/ast_vgatool.c index a833b3b..91a6a1d 100644 --- a/src/ast_vgatool.c +++ b/src/ast_vgatool.c @@ -61,11 +61,13 @@ void vASTOpenKey(ScrnInfoPtr pScrn); Bool bASTRegInit(ScrnInfoPtr pScrn); ULONG GetVRAMInfo(ScrnInfoPtr pScrn); ULONG GetMaxDCLK(ScrnInfoPtr pScrn); +void GetChipType(ScrnInfoPtr pScrn); void vAST1000DisplayOn(ASTRecPtr pAST); void vAST1000DisplayOff(ASTRecPtr pAST); void vSetStartAddressCRT1(ASTRecPtr pAST, ULONG base); void vASTLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, VisualPtr pVisual); void ASTDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); +Bool GetVGA2EDID(ScrnInfoPtr pScrn, unsigned char *pEDIDBuffer); void vASTOpenKey(ScrnInfoPtr pScrn) @@ -172,7 +174,10 @@ GetMaxDCLK(ScrnInfoPtr pScrn) } - /* Get Bandwidth */ + /* Get Bandwidth */ + /* Modify DARM utilization to 60% for AST1100/2100 16bits DRAM, ycchen@032508 */ + if ( ((pAST->jChipType == AST2100) || (pAST->jChipType == AST1100)) && (ulDRAMBusWidth == 16) ) + DRAMEfficiency = 600; ulDRAMBandwidth = ulMCLK * ulDRAMBusWidth * 2 / 8; ActualDRAMBandwidth = ulDRAMBandwidth * DRAMEfficiency / 1000; @@ -183,13 +188,34 @@ GetMaxDCLK(ScrnInfoPtr pScrn) else ulDCLK = ActualDRAMBandwidth / ((pScrn->bitsPerPixel+1) / 8); - if (ulDCLK > 165) ulDCLK = 165; - + /* Add for AST2100, ycchen@061807 */ + if (pAST->jChipType == AST2100) + if (ulDCLK > 200) ulDCLK = 200; + else + if (ulDCLK > 165) ulDCLK = 165; + return(ulDCLK); } void +GetChipType(ScrnInfoPtr pScrn) +{ + ASTRecPtr pAST = ASTPTR(pScrn); + ULONG ulData; + + pAST->jChipType = AST2100; + + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; + + ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x1207c); + + if ((ulData & 0x0300) == 0x0200) + pAST->jChipType = AST1100; +} + +void vSetStartAddressCRT1(ASTRecPtr pAST, ULONG base) { SetIndexReg(CRTC_PORT,0x0D, (UCHAR) (base & 0xFF)); @@ -319,3 +345,96 @@ ASTDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int fla } + +#define I2C_BASE 0x1e780000 +#define I2C_OFFSET (0xA000 + 0x40 * 4) /* port4 */ +#define I2C_DEVICEADDR 0x0A0 /* slave addr */ + +Bool +GetVGA2EDID(ScrnInfoPtr pScrn, unsigned char *pEDIDBuffer) +{ + ASTRecPtr pAST = ASTPTR(pScrn); + UCHAR *ulI2CBase = pAST->MMIOVirtualAddr + 0x10000 + I2C_OFFSET; + ULONG i, ulData; + UCHAR *pjEDID; + + pjEDID = pEDIDBuffer; + + /* SCU settings */ + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = 0x1e6e0000; + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; + xf86UDelay(10000); + + *(ULONG *) (pAST->MMIOVirtualAddr + 0x12000) = 0x1688A8A8; + ulData = *(ULONG *) (pAST->MMIOVirtualAddr + 0x12004); + ulData &= 0xfffffffb; + *(ULONG *) (pAST->MMIOVirtualAddr + 0x12004) = ulData; + xf86UDelay(10000); + + /* I2C settings */ + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF004) = I2C_BASE; + *(ULONG *) (pAST->MMIOVirtualAddr + 0xF000) = 0x1; + xf86UDelay(10000); + + /* I2C Start */ + *(ULONG *) (ulI2CBase + 0x00) = 0x0; + *(ULONG *) (ulI2CBase + 0x04) = 0x77777355; + *(ULONG *) (ulI2CBase + 0x08) = 0x0; + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x00) = 0x1; + *(ULONG *) (ulI2CBase + 0x0C) = 0xAF; + *(ULONG *) (ulI2CBase + 0x20) = I2C_DEVICEADDR; + *(ULONG *) (ulI2CBase + 0x14) = 0x03; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x03)); + if (ulData & 0x02) /* NACK */ + return (FALSE); + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x20) = (ULONG) 0; /* Offset */ + *(ULONG *) (ulI2CBase + 0x14) = 0x02; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x01)); + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x20) = I2C_DEVICEADDR + 1; + *(ULONG *) (ulI2CBase + 0x14) = 0x03; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x01)); + + /* I2C Read */ + for (i=0; i<127; i++) + { + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x0C) |= 0x10; + *(ULONG *) (ulI2CBase + 0x14) = 0x08; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x04)); + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(UCHAR *) (pjEDID++) = (UCHAR) ((*(ULONG *) (ulI2CBase + 0x20) & 0xFF00) >> 8); + } + + /* Read Last Byte */ + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x0C) |= 0x10; + *(ULONG *) (ulI2CBase + 0x14) = 0x18; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x04)); + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(UCHAR *) (pjEDID++) = (UCHAR) ((*(ULONG *) (ulI2CBase + 0x20) & 0xFF00) >> 8); + + /* I2C Stop */ + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + *(ULONG *) (ulI2CBase + 0x14) = 0x20; + do { + ulData = *(volatile ULONG *) (ulI2CBase + 0x10); + } while (!(ulData & 0x10)); + *(ULONG *) (ulI2CBase + 0x0C) &= 0xffffffef; + *(ULONG *) (ulI2CBase + 0x10) = 0xffffffff; + + return (TRUE); + +} /* GetVGA2EDID */ |