📄 rage.c
字号:
outl(ATIIOPortDSP_ON_OFF, restore->dsp_on_off); outl(ATIIOPortDSP_CONFIG, restore->dsp_config); }; outl(ATIIOPortMEM_INFO, restore->mem_info); outl(ATIIOPortCRTC_INT_CNTL,restore->crtc_int_cntl); outl(ATIIOPortCRTC_GEN_CNTL,restore->crtc_gen_cntl); outl(ATIIOPortGEN_TEST_CNTL,restore->gen_test_cntl); switch(rage_clock){ case 0: /* internal clock */ i=ATIGetMach64PLLReg(PLL_VCLK_CNTL) | PLL_VCLK_RESET; ATIPutMach64PLLReg(PLL_VCLK_CNTL,i); ATIPutMach64PLLReg(PLL_VCLK_POST_DIV, restore->PLL[PLL_VCLK_POST_DIV]); ATIPutMach64PLLReg(PLL_XCLK_CNTL, restore->PLL[PLL_XCLK_CNTL]); ATIPutMach64PLLReg(PLL_VCLK0_FB_DIV+ATIClockToProgram, restore->PLL[PLL_VCLK0_FB_DIV+ATIClockToProgram]); i&= ~PLL_VCLK_RESET; ATIPutMach64PLLReg(PLL_VCLK_CNTL,i); break; }; /* make sure the dac is in 8 bit or 6 bit mode, as needed */ outl(ATIIOPortDAC_CNTL, restore->dac_cntl); outb(ATIIOPortDAC_MASK, 0xFFU); outb(ATIIOPortDAC_WRITE, 0x00U); for (Index = 0; Index < DAC_SIZE; Index++) outb(ATIIOPortDAC_DATA, restore->DAC[Index]); switch(rage_dac){ case 5: i=inl(ATIIOPortDAC_CNTL); outl(ATIIOPortDAC_CNTL,(i&0xfffffffc)|2); outb(ATIIOPortDAC_WRITE,restore->extdac[8]); outb(ATIIOPortDAC_MASK,restore->extdac[10]); outb(ATIIOPortDAC_READ,restore->extdac[11]); outl(ATIIOPortDAC_CNTL,(i&0xfffffffc)|3); outb(ATIIOPortDAC_WRITE,(inb(ATIIOPortDAC_WRITE)&0x80)|restore->extdac[12]); break; }; outb(ATIIOPortDAC_READ, restore->dac_read); outb(ATIIOPortDAC_WRITE, restore->dac_write); outl(ATIIOPortDAC_CNTL, restore->dac_cntl);};/* Return nonzero if mode is available */static int rage_modeavailable(int mode){ struct info *info; ModeTiming *modetiming; ModeInfo *modeinfo; if ((mode < G640x480x256 ) || mode == G720x348x2) return __svgalib_vga_driverspecs.modeavailable(mode); info = &__svgalib_infotable[mode]; if (rage_memory * 1024 < info->ydim * info->xbytes) return 0; modeinfo = __svgalib_createModeInfoStructureForSvgalibMode(mode); modetiming = malloc(sizeof(ModeTiming)); if (__svgalib_getmodetiming(modetiming, modeinfo, cardspecs)) { free(modetiming); free(modeinfo); return 0; } free(modetiming); free(modeinfo); return SVGADRV;}static unsignedcomp_lmn(unsigned clock, int *n, int *mp, int *lp);/* Local, called by rage_setmode(). */static void rage_initializemode(unsigned char *moderegs, ModeTiming * modetiming, ModeInfo * modeinfo, int mode){ int m,n,l,i; ATIHWPtr ATINewHWPtr; int ATIDisplayFIFODepth = 32 ; int ReferenceDivider = M ; ATINewHWPtr=(ATIHWPtr)(moderegs+VGA_TOTAL_REGS); moderegs[GRA+0]=0; moderegs[GRA+1]=0; moderegs[GRA+2]=0; moderegs[GRA+3]=0; moderegs[GRA+4]=0; moderegs[GRA+5]=0x10; moderegs[GRA+6]=1; moderegs[GRA+7]=0; moderegs[GRA+8]=0xff; moderegs[SEQ+0]=0x3; moderegs[SEQ+1]=0x0; moderegs[SEQ+2]=0x0F; moderegs[SEQ+3]=0x0; moderegs[SEQ+4]=0x0A; moderegs[ATT+0x10]=0x0c; moderegs[ATT+0x11]=0x11; moderegs[ATT+0x12]=0xf; moderegs[ATT+0x13]=0x13; moderegs[ATT+0x14]=0; moderegs[VGA_MISCOUTPUT]=0x27; ATINewHWPtr->clock_cntl=ATIClockToProgram; ATINewHWPtr->crtc_int_cntl=(inl(ATIIOPortCRTC_INT_CNTL) & ~CRTC_INT_ENS) | CRTC_INT_ACKS /*0x80000074 */; ATINewHWPtr->shared_cntl=0; ATINewHWPtr->gen_test_cntl=0; ATINewHWPtr->mem_info=inl(ATIIOPortMEM_INFO); if(ATIChip<ATI_CHIP_264CT) ATINewHWPtr->mem_info &= ~(CTL_MEM_BNDRY | CTL_MEM_BNDRY_EN) ; ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]=ATIGetMach64PLLReg(PLL_VCLK_POST_DIV); ATINewHWPtr->PLL[PLL_XCLK_CNTL]=ATIGetMach64PLLReg(PLL_XCLK_CNTL); for(i=0;i<256;i++)ATINewHWPtr->DAC[i*3]=ATINewHWPtr->DAC[i*3+1]= ATINewHWPtr->DAC[i*3+2]=i; ATINewHWPtr->crtc_off_pitch=SetBits(modeinfo->width >> 3, CRTC_PITCH); ATINewHWPtr->bus_cntl = (inl(ATIIOPortBUS_CNTL) & ~BUS_HOST_ERR_INT_EN) | BUS_HOST_ERR_INT; if (ATIChip < ATI_CHIP_264VTB) ATINewHWPtr->bus_cntl = (ATINewHWPtr->bus_cntl & ~(BUS_FIFO_ERR_INT_EN | BUS_ROM_DIS)) | (SetBits(15, BUS_FIFO_WS) | BUS_FIFO_ERR_INT); else ATINewHWPtr->bus_cntl |= BUS_APER_REG_DIS; ATINewHWPtr->dac_cntl=inl(ATIIOPortDAC_CNTL); if (modeinfo->bitsPerPixel>8) ATINewHWPtr->dac_cntl |= DAC_8BIT_EN; else ATINewHWPtr->dac_cntl &= ~DAC_8BIT_EN; ATINewHWPtr->config_cntl= inl(ATIIOPortCONFIG_CNTL) | CFG_MEM_VGA_AP_EN; ATINewHWPtr->ovr_clr=0; modetiming->CrtcVDisplay--; modetiming->CrtcVSyncStart--; modetiming->CrtcVSyncEnd--; modetiming->CrtcVTotal--; modetiming->CrtcHDisplay = (modetiming->CrtcHDisplay >> 3) - 1; modetiming->CrtcHTotal = (modetiming->CrtcHTotal >> 3) - 1; modetiming->CrtcHSyncStart = (modetiming->CrtcHSyncStart >> 3) -1; modetiming->CrtcHSyncEnd = (modetiming->CrtcHSyncEnd >> 3) -1; comp_lmn(modetiming->pixelClock,&n,&m,&l); switch(rage_clock) { case 1: ATINewHWPtr->ics2595=n|(l<<9); break; default: ATINewHWPtr->PLL[PLL_VCLK0_FB_DIV+ATIClockToProgram]=n; ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]&=0xfc<<(ATIClockToProgram<<1); ATINewHWPtr->PLL[PLL_VCLK_POST_DIV]|=(l&3)<<(ATIClockToProgram<<1); ATINewHWPtr->PLL[PLL_XCLK_CNTL]&=~(0x10<<ATIClockToProgram); ATINewHWPtr->PLL[PLL_XCLK_CNTL]|=((l>>2)<<4)<<ATIClockToProgram; }; ATINewHWPtr->crtc_h_total_disp = SetBits(modetiming->CrtcHTotal, CRTC_H_TOTAL) | SetBits(modetiming->CrtcHDisplay, CRTC_H_DISP); ATINewHWPtr->crtc_h_sync_strt_wid = SetBits(modetiming->CrtcHSyncStart, CRTC_H_SYNC_STRT) | SetBits(0, CRTC_H_SYNC_DLY) | SetBits(GetBits(modetiming->CrtcHSyncStart, 0x0100U),CRTC_H_SYNC_STRT_HI) | SetBits(modetiming->CrtcHSyncEnd - modetiming->CrtcHSyncStart,CRTC_H_SYNC_WID); if (modetiming->flags & NHSYNC) ATINewHWPtr->crtc_h_sync_strt_wid |= CRTC_H_SYNC_POL; ATINewHWPtr->crtc_v_total_disp = SetBits(modetiming->CrtcVTotal, CRTC_V_TOTAL) | SetBits(modetiming->CrtcVDisplay, CRTC_V_DISP); ATINewHWPtr->crtc_v_sync_strt_wid = SetBits(modetiming->CrtcVSyncStart, CRTC_V_SYNC_STRT) | SetBits(modetiming->CrtcVSyncEnd - modetiming->CrtcVSyncStart,CRTC_V_SYNC_WID); if (modetiming->flags & NVSYNC) ATINewHWPtr->crtc_v_sync_strt_wid |= CRTC_V_SYNC_POL; ATINewHWPtr->crtc_gen_cntl = inl(ATIIOPortCRTC_GEN_CNTL) & ~(CRTC_DBL_SCAN_EN | CRTC_INTERLACE_EN | CRTC_HSYNC_DIS | CRTC_VSYNC_DIS | CRTC_CSYNC_EN | CRTC_PIX_BY_2_EN | CRTC_DISPLAY_DIS | CRTC_VGA_XOVERSCAN | CRTC_PIX_WIDTH | CRTC_BYTE_PIX_ORDER | CRTC_FIFO_LWM | CRTC_VGA_128KAP_PAGING | CRTC_VFC_SYNC_TRISTATE | CRTC_LOCK_REGS | CRTC_SYNC_TRISTATE | CRTC_DISP_REQ_EN | CRTC_VGA_TEXT_132 | CRTC_CUR_B_TEST); ATINewHWPtr->crtc_gen_cntl |= CRTC_EXT_DISP_EN | CRTC_EN | CRTC_VGA_LINEAR | CRTC_CNT_EN | CRTC_BYTE_PIX_ORDER; switch (modeinfo->bitsPerPixel) { case 1: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_1BPP; break; case 4: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_4BPP; break; case 8: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_8BPP; break; case 16: switch(modeinfo->colorBits) { case 15: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_15BPP; break; case 16: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_16BPP; break; }; break; case 24: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_24BPP; break; case 32: ATINewHWPtr->crtc_gen_cntl |= CRTC_PIX_WIDTH_32BPP; break; default: break; } if (modetiming->flags & DOUBLESCAN) ATINewHWPtr->crtc_gen_cntl |= CRTC_DBL_SCAN_EN; if (modetiming->flags & INTERLACED) ATINewHWPtr->crtc_gen_cntl |= CRTC_INTERLACE_EN; switch(rage_dac){ case 5: /* 68860/68880 */ ATINewHWPtr->extdac[8]=2; ATINewHWPtr->extdac[10]=0x1d; switch(modeinfo->bitsPerPixel) { case 8: ATINewHWPtr->extdac[11]=0x83; break; case 15: ATINewHWPtr->extdac[11]=0xa0; break; case 16: ATINewHWPtr->extdac[11]=0xa1; break; case 24: ATINewHWPtr->extdac[11]=0xc0; break; case 32: ATINewHWPtr->extdac[11]=0xe3; break; }; ATINewHWPtr->extdac[12]=0x60; if(modeinfo->bitsPerPixel==8)ATINewHWPtr->extdac[12]=0x61; if(rage_memory<1024)ATINewHWPtr->extdac[12]|=0x04; if(rage_memory==1024)ATINewHWPtr->extdac[12]|=0x08; if(rage_memory>1024)ATINewHWPtr->extdac[12]|=0x0c; break; }; rage_bpp = modeinfo->bytesPerPixel; if((ATIChip>=ATI_CHIP_264VTB)&&(ATIIODecoding==BLOCK_IO)){ int Multiplier, Divider; int dsp_precision, dsp_on, dsp_off, dsp_xclks; int tmp, vshift, xshift; int ATIXCLKFeedbackDivider, ATIXCLKReferenceDivider, ATIXCLKPostDivider; int ATIXCLKMaxRASDelay, ATIXCLKPageFaultDelay, ATIDisplayLoopLatency; int IO_Value; IO_Value = ATIGetMach64PLLReg(PLL_XCLK_CNTL); ATIXCLKPostDivider = GetBits(IO_Value, PLL_XCLK_SRC_SEL); ATIXCLKReferenceDivider = M ; switch (ATIXCLKPostDivider) { case 0: case 1: case 2: case 3: break; case 4: ATIXCLKReferenceDivider *= 3; ATIXCLKPostDivider = 0; break; default: return; } ATIXCLKPostDivider -= GetBits(IO_Value, PLL_MFB_TIMES_4_2B); ATIXCLKFeedbackDivider = ATIGetMach64PLLReg(PLL_MCLK_FB_DIV); IO_Value = inl(ATIIOPortMEM_INFO); tmp = GetBits(IO_Value, CTL_MEM_TRP); ATIXCLKPageFaultDelay = GetBits(IO_Value, CTL_MEM_TRCD) + GetBits(IO_Value, CTL_MEM_TCRD) + tmp + 2; ATIXCLKMaxRASDelay = GetBits(IO_Value, CTL_MEM_TRAS) + tmp + 2; ATIDisplayFIFODepth = 32; if ( ATIChip < ATI_CHIP_264VT4 ) { ATIXCLKPageFaultDelay += 2; ATIXCLKMaxRASDelay += 3; ATIDisplayFIFODepth = 24; } switch (ATIMemoryType) { case MEM_264_DRAM: if (rage_memory <= 1024) ATIDisplayLoopLatency = 10; else { ATIDisplayLoopLatency = 8; ATIXCLKPageFaultDelay += 2; } break; case MEM_264_EDO: case MEM_264_PSEUDO_EDO: if (rage_memory <= 1024) ATIDisplayLoopLatency = 9; else { ATIDisplayLoopLatency = 8; ATIXCLKPageFaultDelay++; } break; case MEM_264_SDRAM: if (rage_memory <= 1024) ATIDisplayLoopLatency = 11; else { ATIDisplayLoopLatency = 10; ATIXCLKPageFaultDelay++; } break; case MEM_264_SGRAM: ATIDisplayLoopLatency = 8; ATIXCLKPageFaultDelay += 3; break; default: ATIDisplayLoopLatency = 11; ATIXCLKPageFaultDelay += 3; break; } if (ATIXCLKMaxRASDelay <= ATIXCLKPageFaultDelay) ATIXCLKMaxRASDelay = ATIXCLKPageFaultDelay + 1;# define Maximum_DSP_PRECISION ((int)GetBits(DSP_PRECISION, DSP_PRECISION)) Multiplier = ReferenceDivider * ATIXCLKFeedbackDivider * postdiv[l]; Divider = n * ATIXCLKReferenceDivider;/* if (!ATIUsingPlanarModes) */ Divider *= modeinfo->bitsPerPixel >> 2; vshift = (5 - 2) - ATIXCLKPostDivider; vshift++; tmp = ATIDivide(Multiplier * ATIDisplayFIFODepth, Divider, vshift, 1); for (dsp_precision = -5; tmp; dsp_precision++) tmp >>= 1; if (dsp_precision < 0) dsp_precision = 0; else if (dsp_precision > Maximum_DSP_PRECISION) dsp_precision = Maximum_DSP_PRECISION; xshift = 6 - dsp_precision; vshift += xshift; dsp_off = ATIDivide(Multiplier * (ATIDisplayFIFODepth - 1), Divider, vshift, 1); { dsp_on = ATIDivide(Multiplier, Divider, vshift, -1); tmp = ATIDivide(ATIXCLKMaxRASDelay, 1, xshift, 1); if (dsp_on < tmp) dsp_on = tmp; dsp_on += tmp + ATIDivide(ATIXCLKPageFaultDelay, 1, xshift, 1); } dsp_xclks = ATIDivide(Multiplier, Divider, vshift + 5, 1); ATINewHWPtr->dsp_on_off = SetBits(dsp_on, DSP_ON) | SetBits(dsp_off, DSP_OFF); ATINewHWPtr->dsp_config = SetBits(dsp_precision, DSP_PRECISION) | SetBits(dsp_xclks, DSP_XCLKS_PER_QW) | SetBits(ATIDisplayLoopLatency, DSP_LOOP_LATENCY);} if (ATIChip < ATI_CHIP_264VTB) ATINewHWPtr->crtc_gen_cntl |= CRTC_FIFO_LWM;return ;}static int rage_setmode(int mode, int prv_mode){ unsigned char *moderegs; ModeTiming *modetiming; ModeInfo *modeinfo; ATIHWPtr ATINewHWPtr; if ((mode < G640x480x256 /*&& mode != G320x200x256*/) || mode == G720x348x2) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -