9 static const unsigned short XGINew_DDRDRAM_TYPE340[4][2] = {
15 static const unsigned short XGINew_DDRDRAM_TYPE20[12][2] = {
29 #define XGIFB_ROM_SIZE 65536
46 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
78 static void XGINew_DDR1x_MRS_340(
unsigned long P3c4,
148 pVBInfo->
P3c4, 0x32) & 0xFC) | 0x02);
152 static void XGINew_DDRII_Bootup_XG27(
156 unsigned long P3d4 = P3c4 + 0x10;
157 pVBInfo->
ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
158 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
228 unsigned long P3d4 = P3c4 + 0x10;
230 pVBInfo->
ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
231 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
270 static void XGINew_DDR1x_MRS_XG20(
unsigned long P3c4,
302 static void XGINew_DDR1x_DefaultRegister(
306 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
309 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
323 XGINew_DDR1x_MRS_XG20(P3c4, pVBInfo);
325 XGINew_SetMemoryClock(HwDeviceExtension, pVBInfo);
375 XGINew_DDR1x_MRS_340(P3c4, pVBInfo);
379 static void XGINew_DDR2_DefaultRegister(
383 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
411 XGINew_DDRII_Bootup_XG27(HwDeviceExtension, P3c4, pVBInfo);
413 XGINew_DDR2_MRS_XG20(HwDeviceExtension, P3c4, pVBInfo);
416 static void XGINew_SetDRAMDefaultRegister340(
422 unsigned long P3d4 = Port, P3c4 = Port - 0x10;
430 for (i = 0; i < 4; i++) {
433 for (j = 0; j < 4; j++) {
434 temp1 = ((temp >> (2 *
j)) & 0x03) << 2;
445 for (i = 0; i < 4; i++) {
448 for (j = 0; j < 4; j++) {
449 temp1 = ((temp >> (2 *
j)) & 0x03) << 2;
460 for (k = 0; k < 4; k++) {
464 for (i = 0; i < 8; i++) {
467 for (j = 0; j < 4; j++) {
468 temp1 = (temp >> (2 *
j)) & 0x03;
490 for (j = 0; j < 4; j++) {
491 temp1 = (temp >> (2 *
j)) & 0x03;
506 temp2 = (temp >> 4) & 0x07;
518 for (j = 0; j <= 6; j++)
522 for (j = 0; j <= 2; j++)
526 for (j = 0; j < 2; j++)
550 temp = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
552 XGINew_DDR1x_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
555 XGINew_DDR2_DefaultRegister(HwDeviceExtension, P3d4, pVBInfo);
563 static unsigned short XGINew_SetDRAMSize20Reg(
564 unsigned short dram_size,
569 unsigned char ChannelNo;
571 RankSize = dram_size * pVBInfo->
ram_bus / 8;
585 if (ChannelNo * RankSize <= 256) {
586 while ((RankSize >>= 1) > 0)
601 static int XGINew_ReadWriteRest(
unsigned short StopAddr,
605 unsigned long Position = 0;
608 writel(Position, fbaddr + Position);
610 for (i = StartAddr; i <= StopAddr; i++) {
612 writel(Position, fbaddr + Position);
619 if (
readl(fbaddr + Position) != Position)
622 for (i = StartAddr; i <= StopAddr; i++) {
624 if (
readl(fbaddr + Position) != Position)
630 static unsigned char XGINew_CheckFrequence(
struct vb_device_info *pVBInfo)
636 if ((data & 0x10) == 0) {
638 data = (data & 0x02) >> 1;
668 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
682 if (XGINew_ReadWriteRest(23,
697 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
716 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
731 if (XGINew_ReadWriteRest(22,
747 if (XGINew_ReadWriteRest(22, 21, pVBInfo) == 1)
771 if (XGINew_CheckFrequence(pVBInfo) == 1) {
777 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
782 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
789 if (XGINew_ReadWriteRest(23, 22, pVBInfo) == 1)
801 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
813 if (XGINew_CheckFrequence(pVBInfo) == 1) {
819 if (XGINew_ReadWriteRest(25, 23, pVBInfo) == 1)
825 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1)
831 if (XGINew_ReadWriteRest(24, 23, pVBInfo) == 1) {
843 if (XGINew_ReadWriteRest(25, 24, pVBInfo) == 1) {
859 const unsigned short (*dram_table)[2];
863 XGINew_CheckChannel(HwDeviceExtension, pVBInfo);
866 dram_table = XGINew_DDRDRAM_TYPE20;
870 dram_table = XGINew_DDRDRAM_TYPE340;
875 for (i = 0; i <
size; i++) {
880 memsize = XGINew_SetDRAMSize20Reg(dram_table[i][0], pVBInfo);
887 (
unsigned long) (1 << memsize))
890 if (XGINew_ReadWriteRest(memsize, start_addr, pVBInfo) == 1)
911 XGINew_DDRSizing340(HwDeviceExtension, pVBInfo);
917 static u8 *xgifb_copy_rom(
struct pci_dev *
dev,
size_t *rom_size)
923 if (rom_address ==
NULL)
927 if (rom_copy ==
NULL)
938 static void xgifb_read_vbios(
struct pci_dev *pdev,
952 vbios = xgifb_copy_rom(pdev, &vbios_size);
954 dev_err(&pdev->
dev,
"Video BIOS not available\n");
957 if (vbios_size <= 0x65)
963 if (!(vbios[0x65] & 0x1) &&
969 if (vbios_size <= 0x317)
971 i = vbios[0x316] | (vbios[0x317] << 8);
972 if (vbios_size <= i - 1)
987 if (vbios_size <= i + 24)
990 lvds->
LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
991 lvds->
LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
992 lvds->
LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
993 lvds->
LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
994 lvds->
LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
995 lvds->
LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
996 lvds->
LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
997 lvds->
LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
1000 lvds->
PSC_S1 = vbios[i + 20];
1001 lvds->
PSC_S2 = vbios[i + 21];
1002 lvds->
PSC_S3 = vbios[i + 22];
1003 lvds->
PSC_S4 = vbios[i + 23];
1004 lvds->
PSC_S5 = vbios[i + 24];
1009 dev_err(&pdev->
dev,
"Video BIOS corrupted\n");
1016 unsigned short tempbx = 0,
temp, tempcx, CR3CData;
1043 if (tempbx & tempcx) {
1059 unsigned short temp, tempcl = 0, tempch = 0, CR31Data, CR38Data;
1118 if ((temp & ActiveLCD) && (temp &
ActiveTV))
1124 if (!(temp & ActiveCRT1))
1127 if (!((temp & ActiveLCD) || (temp &
ActiveTV) || (temp & ActiveCRT2)))
1142 unsigned short temp;
1196 XGINew_SenseLCD(HwDeviceExtension, pVBInfo);
1220 unsigned char Temp, bCR4A;
1241 static unsigned char GetXG21FPBits(
struct vb_device_info *pVBInfo)
1250 if ((CR38 & 0xE0) > 0x80) {
1261 static unsigned char GetXG27FPBits(
struct vb_device_info *pVBInfo)
1272 temp = ((temp & 0x04) >> 1) | ((~temp) & 0x01);
1285 unsigned char i, temp = 0,
temp1;
1292 dev_dbg(&pdev->
dev,
"pVBInfo->FBAddr == 0\n");
1296 dev_dbg(&pdev->
dev,
"pVBInfo->BaseAddr == 0\n");
1326 xgifb_read_vbios(pdev, pVBInfo);
1333 XGINew_GetXG21Sense(HwDeviceExtension, pVBInfo);
1336 XGINew_GetXG27Sense(HwDeviceExtension, pVBInfo);
1340 for (i = 0x06; i < 0x20; i++)
1343 for (i = 0x21; i <= 0x27; i++)
1346 for (i = 0x31; i <= 0x3B; i++)
1353 for (i = 0x79; i <= 0x7C; i++)
1378 for (i = 0x47; i <= 0x4C; i++)
1381 pVBInfo->
AGPReg[i - 0x47]);
1383 for (i = 0x70; i <= 0x71; i++)
1386 pVBInfo->
AGPReg[6 + i - 0x70]);
1388 for (i = 0x74; i <= 0x77; i++)
1391 pVBInfo->
AGPReg[8 + i - 0x74]);
1393 pci_read_config_dword(pdev, 0x50, &Temp);
1414 temp = (
unsigned char) ((temp1 >> 4) & 0x0F);
1425 XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo) != 0) {
1464 temp = GetXG21FPBits(pVBInfo);
1473 temp = GetXG27FPBits(pVBInfo);
1477 pVBInfo->
ram_type = XGINew_GetXG20DRAMType(HwDeviceExtension, pVBInfo);
1479 XGINew_SetDRAMDefaultRegister340(HwDeviceExtension,
1483 XGINew_SetDRAMSize_340(xgifb_info, HwDeviceExtension, pVBInfo);
1487 (
unsigned char) ((pVBInfo->
SR22) & 0xFE));
1491 XGINew_ChkSenseStatus(HwDeviceExtension, pVBInfo);
1492 XGINew_SetModeScratch(HwDeviceExtension, pVBInfo);