📄 init.c
字号:
break; } SiS_SetReg1(SiS_P3c4,0x15,data);}voidSiS_SetDRAMSizingType(int index,USHORT DRAMTYPE_TABLE[][5]){ USHORT data; data = DRAMTYPE_TABLE[index][4]; SiS_SetReg1(SiS_P3c4,0x13,data); /* should delay 50 ns */}voidSiS_CheckBusWidth_310(ULONG ROMAddress,ULONG FBAddress){ USHORT data; PULONG volatile pVideoMemory; pVideoMemory = (PULONG) FBAddress; if (SiS_Get310DRAMType(ROMAddress)<2) { SiS_SetReg1(SiS_P3c4,0x13,0x00); SiS_SetReg1(SiS_P3c4,0x14,0x12); /* should delay */ SiS_SDR_MRS(); SiS_ChannelAB = 0; SiS_DataBusWidth = 128; pVideoMemory[0] = 0x01234567L; pVideoMemory[1] = 0x456789ABL; pVideoMemory[2] = 0x89ABCDEFL; pVideoMemory[3] = 0xCDEF0123L; pVideoMemory[4] = 0x55555555L; pVideoMemory[5] = 0x55555555L; pVideoMemory[6] = 0xFFFFFFFFL; pVideoMemory[7] = 0xFFFFFFFFL; if ((pVideoMemory[3]!=0xCDEF0123L) || (pVideoMemory[2] != 0x89ABCDEFL)) { /*ChannelA64Bit */ SiS_DataBusWidth = 64; SiS_ChannelAB = 0; data=SiS_GetReg1(SiS_P3c4,0x14); SiS_SetReg1(SiS_P3c4, 0x14, (USHORT) (data & 0xFD)); } if ((pVideoMemory[1]!=0x456789ABL) || (pVideoMemory[0] != 0x01234567L)) { /*ChannelB64Bit */ SiS_DataBusWidth = 64; SiS_ChannelAB = 1; data=SiS_GetReg1(SiS_P3c4,0x14); SiS_SetReg1(SiS_P3c4,0x14,(USHORT)((data&0xFD)|0x01)); } return; } else { /* DDR Dual channel */ SiS_SetReg1(SiS_P3c4,0x13,0x00); SiS_SetReg1(SiS_P3c4,0x14,0x02); /* Channel A, 64bit */ /* should delay */ SiS_DDR_MRS(); SiS_ChannelAB = 0; SiS_DataBusWidth = 64; pVideoMemory[0] = 0x01234567L; pVideoMemory[1] = 0x456789ABL; pVideoMemory[2] = 0x89ABCDEFL; pVideoMemory[3] = 0xCDEF0123L; pVideoMemory[4] = 0x55555555L; pVideoMemory[5] = 0x55555555L; pVideoMemory[6] = 0xAAAAAAAAL; pVideoMemory[7] = 0xAAAAAAAAL; if (pVideoMemory[1] == 0x456789ABL) { if (pVideoMemory[0] == 0x01234567L) { /* Channel A 64bit */ return; } } else { if (pVideoMemory[0] == 0x01234567L) { /* Channel A 32bit */ SiS_DataBusWidth = 32; SiS_SetReg1(SiS_P3c4,0x14,0x00); return; } } SiS_SetReg1(SiS_P3c4,0x14,0x03); /* Channel B, 64bit */ SiS_DDR_MRS(); SiS_ChannelAB = 1; SiS_DataBusWidth = 64; pVideoMemory[0] = 0x01234567L; pVideoMemory[1] = 0x456789ABL; pVideoMemory[2] = 0x89ABCDEFL; pVideoMemory[3] = 0xCDEF0123L; pVideoMemory[4] = 0x55555555L; pVideoMemory[5] = 0x55555555L; pVideoMemory[6] = 0xAAAAAAAAL; pVideoMemory[7] = 0xAAAAAAAAL; if (pVideoMemory[1] == 0x456789ABL) { /* Channel B 64 */ if (pVideoMemory[0] == 0x01234567L) { /* Channel B 64bit */ return; } else { /* error */ } } else { if (pVideoMemory[0] == 0x01234567L) { /* Channel B 32 */ SiS_DataBusWidth = 32; SiS_SetReg1(SiS_P3c4,0x14,0x01); } else { /* error */ } } }}intSiS_SetRank(int index,UCHAR RankNo,UCHAR SiS_ChannelAB,USHORT DRAMTYPE_TABLE[][5]){ USHORT data; int RankSize; if ((RankNo==2)&&(DRAMTYPE_TABLE[index][0]==2)) return 0; RankSize = DRAMTYPE_TABLE[index][3]/2 * SiS_DataBusWidth/32; if (RankNo*RankSize<=128) { data = 0; while ((RankSize>>=1)>0) { data+=0x10; } data |= (RankNo-1)<<2; data |= (SiS_DataBusWidth/64)&2; data |= SiS_ChannelAB; SiS_SetReg1(SiS_P3c4,0x14,data); /* should delay */ SiS_SDR_MRS(); return 1; } else return 0;}intSiS_SetDDRChannel(int index,UCHAR ChannelNo,UCHAR SiS_ChannelAB, USHORT DRAMTYPE_TABLE[][5]){ USHORT data; int RankSize; RankSize = DRAMTYPE_TABLE[index][3]/2 * SiS_DataBusWidth/32; /* RankSize = DRAMTYPE_TABLE[index][3]; */ if (ChannelNo*RankSize<=128) { data = 0; while ((RankSize>>=1)>0) { data+=0x10; } if (ChannelNo==2) data |= 0x0C; data |= (SiS_DataBusWidth/32)&2; data |= SiS_ChannelAB; SiS_SetReg1(SiS_P3c4,0x14,data); /* should delay */ SiS_DDR_MRS(); return 1; } else return 0;}intSiS_CheckColumn(int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ int i; ULONG Increment,Position; /*Increment = 1<<(DRAMTYPE_TABLE[index][2] + SiS_DataBusWidth / 64 + 1); */ Increment = 1<<(10 + SiS_DataBusWidth / 64); for (i=0,Position=0;i<2;i++) { *((PULONG)(FBAddress+Position))=Position; Position += Increment; } for (i=0,Position=0;i<2;i++) {/* if (FBAddress[Position]!=Position) */ if ( (*(PULONG) (FBAddress + Position)) !=Position) return 0; Position += Increment; } return 1;}intSiS_CheckBanks(int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ int i; ULONG Increment,Position; Increment = 1<<(DRAMTYPE_TABLE[index][2] + SiS_DataBusWidth / 64 + 2); for (i=0,Position=0;i<4;i++) {/* FBAddress[Position]=Position; */ *((PULONG)(FBAddress+Position))=Position; Position += Increment; } for (i=0,Position=0;i<4;i++) {/* if (FBAddress[Position]!=Position) */ if ( (*(PULONG) (FBAddress + Position)) !=Position) return 0; Position += Increment; } return 1;}intSiS_CheckRank(int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ int i; ULONG Increment,Position; Increment = 1<<(DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] + DRAMTYPE_TABLE[index][0] + SiS_DataBusWidth / 64 + RankNo); for (i=0,Position=0;i<2;i++) {/* FBAddress[Position]=Position; */ *((PULONG)(FBAddress+Position))=Position; /* *((PULONG)(FBAddress))=Position; */ Position += Increment; } for (i=0,Position=0;i<2;i++) {/* if (FBAddress[Position]!=Position) */ if ( (*(PULONG) (FBAddress + Position)) !=Position) /*if ( (*(PULONG) (FBAddress )) !=Position) */ return 0; Position += Increment; } return 1;}intSiS_CheckDDRRank(int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ ULONG Increment,Position; USHORT data; Increment = 1<<(DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] + DRAMTYPE_TABLE[index][0] + SiS_DataBusWidth / 64 + RankNo); Increment += Increment/2; Position =0; *((PULONG)(FBAddress+Position+0))=0x01234567; *((PULONG)(FBAddress+Position+1))=0x456789AB; *((PULONG)(FBAddress+Position+2))=0x55555555; *((PULONG)(FBAddress+Position+3))=0x55555555; *((PULONG)(FBAddress+Position+4))=0xAAAAAAAA; *((PULONG)(FBAddress+Position+5))=0xAAAAAAAA; if ( (*(PULONG) (FBAddress + 1))==0x456789AB) return 1; if ( (*(PULONG) (FBAddress + 0))==0x01234567) return 0; data=SiS_GetReg1(SiS_P3c4,0x14); data &= 0xF3; data |= 0x08; SiS_SetReg1(SiS_P3c4,0x14,data); data=SiS_GetReg1(SiS_P3c4,0x15); data += 0x20; SiS_SetReg1(SiS_P3c4,0x15,data); return 1;}intSiS_CheckRanks(int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ int r; for (r=RankNo;r>=1;r--) { if (!SiS_CheckRank(r,index,DRAMTYPE_TABLE,FBAddress)) return 0; } if (!SiS_CheckBanks(index,DRAMTYPE_TABLE,FBAddress)) return 0; if (!SiS_CheckColumn(index,DRAMTYPE_TABLE,FBAddress)) return 0; return 1;}intSiS_CheckDDRRanks(int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress){ int r; for (r=RankNo;r>=1;r--) { if (!SiS_CheckDDRRank(r,index,DRAMTYPE_TABLE,FBAddress)) return 0; } if (!SiS_CheckBanks(index,DRAMTYPE_TABLE,FBAddress)) return 0; if (!SiS_CheckColumn(index,DRAMTYPE_TABLE,FBAddress)) return 0; return 1;}intSiS_SDRSizing(ULONG FBAddress){ int i; UCHAR j; for (i=0;i<13;i++) { SiS_SetDRAMSizingType(i, SiS_SDRDRAM_TYPE); for (j=2;j>0;j--) { if (!SiS_SetRank(i,(UCHAR) j, SiS_ChannelAB,SiS_SDRDRAM_TYPE)) continue; else { if (SiS_CheckRanks(j,i,SiS_SDRDRAM_TYPE, FBAddress)) return 1; } } } return 0;}intSiS_DDRSizing(ULONG FBAddress){ int i; UCHAR j; for (i=0;i<4;i++){ SiS_SetDRAMSizingType(i,SiS_DDRDRAM_TYPE); SiS_DisableChannelInterleaving(i,SiS_DDRDRAM_TYPE); for (j=2;j>0;j--) { SiS_SetDDRChannel(i, j, SiS_ChannelAB, SiS_DDRDRAM_TYPE); if (!SiS_SetRank(i,(UCHAR) j, SiS_ChannelAB,SiS_DDRDRAM_TYPE)) continue; else { if (SiS_CheckDDRRanks(j,i,SiS_DDRDRAM_TYPE, FBAddress)) return 1; } } } return 0;}/* check if read cache pointer is correct*/voidSiS_VerifyMclk(ULONG FBAddr){ PUCHAR pVideoMemory = (PUCHAR) FBAddr; UCHAR i,j; USHORT Temp,SR21; pVideoMemory[0]=0xaa; /* alan */ pVideoMemory[16]=0x55; /* note: PCI read cache is off */ if ((pVideoMemory[0]!=0xaa)||(pVideoMemory[16]!=0x55)) { for (i=0,j=16;i<2;i++,j+=16) { SR21 = SiS_GetReg1(SiS_P3c4, 0x21); Temp = SR21 & 0xFB; /* disable PCI post write buffer empty gating */ SiS_SetReg1(SiS_P3c4, 0x21, Temp); Temp = SiS_GetReg1(SiS_P3c4, 0x3C); Temp = Temp | 0x01; /*MCLK reset */ SiS_SetReg1(SiS_P3c4, 0x3C, Temp); Temp = SiS_GetReg1(SiS_P3c4, 0x3C); Temp = Temp & 0xFE; /* MCLK normal operation */ SiS_SetReg1(SiS_P3c4, 0x3C, Temp); SiS_SetReg1(SiS_P3c4, 0x21, SR21); pVideoMemory[16+j] = j; if (pVideoMemory[16+j]==j) { pVideoMemory[j] = j; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -