📄 atimach64.c
字号:
pATIHW->gen_test_cntl = inr(GEN_TEST_CNTL) & ~GEN_CUR_EN; if (pATI->Chip >= ATI_CHIP_264VTB) { pATIHW->mem_buf_cntl = inr(MEM_BUF_CNTL) | INVALIDATE_RB_CACHE; pATIHW->mem_cntl = inr(MEM_CNTL); pATIHW->mpp_config = inr(MPP_CONFIG); pATIHW->mpp_strobe_seq = inr(MPP_STROBE_SEQ); pATIHW->tvo_cntl = inr(TVO_CNTL); } /* Save draw engine state */ if (pATI->Block0Base && (pATIHW == &pATI->OldHW)) { /* Ensure apertures are enabled */ outr(BUS_CNTL, pATI->NewHW.bus_cntl); outr(CONFIG_CNTL, pATI->NewHW.config_cntl); ATIMach64WaitForIdle(pATI); /* Save FIFO size */ if (pATI->Chip >= ATI_CHIP_264VT4) pATIHW->gui_cntl = inm(GUI_CNTL); /* Save destination registers */ pATIHW->dst_off_pitch = inm(DST_OFF_PITCH); pATIHW->dst_x = inm(DST_X); pATIHW->dst_y = inm(DST_Y); pATIHW->dst_height = inm(DST_HEIGHT); pATIHW->dst_bres_err = inm(DST_BRES_ERR); pATIHW->dst_bres_inc = inm(DST_BRES_INC); pATIHW->dst_bres_dec = inm(DST_BRES_DEC); pATIHW->dst_cntl = inm(DST_CNTL); /* Save source registers */ pATIHW->src_off_pitch = inm(SRC_OFF_PITCH); pATIHW->src_x = inm(SRC_X); pATIHW->src_y = inm(SRC_Y); pATIHW->src_width1 = inm(SRC_WIDTH1); pATIHW->src_height1 = inm(SRC_HEIGHT1); pATIHW->src_x_start = inm(SRC_X_START); pATIHW->src_y_start = inm(SRC_Y_START); pATIHW->src_width2 = inm(SRC_WIDTH2); pATIHW->src_height2 = inm(SRC_HEIGHT2); pATIHW->src_cntl = inm(SRC_CNTL); if (pATI->Chip >= ATI_CHIP_264GTPRO) { CARD32 offset = TEX_LEVEL(inm(TEX_SIZE_PITCH)); /* Save 3D control & texture registers */ pATIHW->tex_offset = inm(TEX_0_OFF + offset); pATIHW->scale_3d_cntl = inm(SCALE_3D_CNTL); } /* Save host data register */ pATIHW->host_cntl = inm(HOST_CNTL); /* Save pattern registers */ pATIHW->pat_reg0 = inm(PAT_REG0); pATIHW->pat_reg1 = inm(PAT_REG1); pATIHW->pat_cntl = inm(PAT_CNTL); /* Save scissor registers */ pATIHW->sc_left = pATI->sc_left = inm(SC_LEFT); pATIHW->sc_right = pATI->sc_right = inm(SC_RIGHT); pATIHW->sc_top = pATI->sc_top = inm(SC_TOP); pATIHW->sc_bottom = pATI->sc_bottom = inm(SC_BOTTOM); /* Save data path registers */ pATIHW->dp_bkgd_clr = inm(DP_BKGD_CLR); pATIHW->dp_frgd_clr = inm(DP_FRGD_CLR); pATIHW->dp_write_mask = inm(DP_WRITE_MASK); pATIHW->dp_chain_mask = inm(DP_CHAIN_MASK); pATIHW->dp_pix_width = inm(DP_PIX_WIDTH); pATIHW->dp_mix = inm(DP_MIX); pATIHW->dp_src = inm(DP_SRC); /* Save colour compare registers */ pATIHW->clr_cmp_clr = inm(CLR_CMP_CLR); pATIHW->clr_cmp_msk = inm(CLR_CMP_MSK); pATIHW->clr_cmp_cntl = inm(CLR_CMP_CNTL); /* Save context */ pATIHW->context_mask = inm(CONTEXT_MASK); if (pATI->Chip >= ATI_CHIP_264GTPRO) { /* Save texture setup registers */ pATIHW->tex_size_pitch = inm(TEX_SIZE_PITCH); pATIHW->tex_cntl = inm(TEX_CNTL); } if (pATI->Block1Base) { /* Save overlay & scaler registers */ pATIHW->overlay_y_x_start = inm(OVERLAY_Y_X_START); pATIHW->overlay_y_x_end = inm(OVERLAY_Y_X_END); pATIHW->overlay_graphics_key_clr = inm(OVERLAY_GRAPHICS_KEY_CLR); pATIHW->overlay_graphics_key_msk = inm(OVERLAY_GRAPHICS_KEY_MSK); pATIHW->overlay_key_cntl = inm(OVERLAY_KEY_CNTL); pATIHW->overlay_scale_inc = inm(OVERLAY_SCALE_INC); pATIHW->overlay_scale_cntl = inm(OVERLAY_SCALE_CNTL); pATIHW->scaler_height_width = inm(SCALER_HEIGHT_WIDTH); pATIHW->scaler_test = inm(SCALER_TEST); pATIHW->video_format = inm(VIDEO_FORMAT); if (pATI->Chip < ATI_CHIP_264VTB) { pATIHW->buf0_offset = inm(BUF0_OFFSET); pATIHW->buf0_pitch = inm(BUF0_PITCH); pATIHW->buf1_offset = inm(BUF1_OFFSET); pATIHW->buf1_pitch = inm(BUF1_PITCH); } else { pATIHW->scaler_buf0_offset = inm(SCALER_BUF0_OFFSET); pATIHW->scaler_buf1_offset = inm(SCALER_BUF1_OFFSET); pATIHW->scaler_buf_pitch = inm(SCALER_BUF_PITCH); pATIHW->overlay_exclusive_horz = inm(OVERLAY_EXCLUSIVE_HORZ); pATIHW->overlay_exclusive_vert = inm(OVERLAY_EXCLUSIVE_VERT); if (pATI->Chip >= ATI_CHIP_264GTPRO) { pATIHW->scaler_colour_cntl = inm(SCALER_COLOUR_CNTL); pATIHW->scaler_h_coeff0 = inm(SCALER_H_COEFF0); pATIHW->scaler_h_coeff1 = inm(SCALER_H_COEFF1); pATIHW->scaler_h_coeff2 = inm(SCALER_H_COEFF2); pATIHW->scaler_h_coeff3 = inm(SCALER_H_COEFF3); pATIHW->scaler_h_coeff4 = inm(SCALER_H_COEFF4); pATIHW->scaler_buf0_offset_u = inm(SCALER_BUF0_OFFSET_U); pATIHW->scaler_buf0_offset_v = inm(SCALER_BUF0_OFFSET_V); pATIHW->scaler_buf1_offset_u = inm(SCALER_BUF1_OFFSET_U); pATIHW->scaler_buf1_offset_v = inm(SCALER_BUF1_OFFSET_V); } } } /* Restore aperture enablement */ outr(BUS_CNTL, pATIHW->bus_cntl); outr(CONFIG_CNTL, pATIHW->config_cntl); }}/* * ATIMach64Calculate -- * * This function is called to fill in the Mach64 portion of an ATIHWRec. */voidATIMach64Calculate( ATIPtr pATI, ATIHWPtr pATIHW, DisplayModePtr pMode){ int VDisplay; /* If not already done adjust horizontal timings */ if (!pMode->CrtcHAdjusted) { pMode->CrtcHAdjusted = TRUE; /* XXX Deal with Blank Start/End and overscan later */ pMode->CrtcHDisplay = (pMode->HDisplay >> 3) - 1; pMode->CrtcHSyncStart = (pMode->HSyncStart >> 3) - 1; pMode->CrtcHSyncEnd = (pMode->HSyncEnd >> 3) - 1; pMode->CrtcHTotal = (pMode->HTotal >> 3) - 1; /* Make adjustments if sync pulse width is out-of-bounds */ if ((pMode->CrtcHSyncEnd - pMode->CrtcHSyncStart) > (int)MaxBits(CRTC_H_SYNC_WID)) { pMode->CrtcHSyncEnd = pMode->CrtcHSyncStart + MaxBits(CRTC_H_SYNC_WID); } else if (pMode->CrtcHSyncStart == pMode->CrtcHSyncEnd) { if (pMode->CrtcHDisplay < pMode->CrtcHSyncStart) pMode->CrtcHSyncStart--; else if (pMode->CrtcHSyncEnd < pMode->CrtcHTotal) pMode->CrtcHSyncEnd++; } } /* * Always re-do vertical adjustments. */ pMode->CrtcVDisplay = pMode->VDisplay; pMode->CrtcVSyncStart = pMode->VSyncStart; pMode->CrtcVSyncEnd = pMode->VSyncEnd; pMode->CrtcVTotal = pMode->VTotal; if ((pATI->Chip >= ATI_CHIP_264CT) && ((pMode->Flags & V_DBLSCAN) || (pMode->VScan > 1))) { pMode->CrtcVDisplay <<= 1; pMode->CrtcVSyncStart <<= 1; pMode->CrtcVSyncEnd <<= 1; pMode->CrtcVTotal <<= 1; } /* * Might as well default to the same as VGA with respect to sync * polarities. */ if ((!(pMode->Flags & (V_PHSYNC | V_NHSYNC))) || (!(pMode->Flags & (V_PVSYNC | V_NVSYNC)))) { pMode->Flags &= ~(V_PHSYNC | V_NHSYNC | V_PVSYNC | V_NVSYNC); if (pATI->OptionPanelDisplay && (pATI->LCDPanelID >= 0)#ifdef TV_OUT && !pATI->tvActive#endif) VDisplay = pATI->LCDVertical; else VDisplay = pMode->CrtcVDisplay; if (VDisplay < 400) pMode->Flags |= V_PHSYNC | V_NVSYNC; else if (VDisplay < 480) pMode->Flags |= V_NHSYNC | V_PVSYNC; else if (VDisplay < 768) pMode->Flags |= V_NHSYNC | V_NVSYNC; else pMode->Flags |= V_PHSYNC | V_PVSYNC; } pMode->CrtcVDisplay--; pMode->CrtcVSyncStart--; pMode->CrtcVSyncEnd--; pMode->CrtcVTotal--; /* Make sure sync pulse is not too wide */ if ((pMode->CrtcVSyncEnd - pMode->CrtcVSyncStart) > (int)MaxBits(CRTC_V_SYNC_WID)) pMode->CrtcVSyncEnd = pMode->CrtcVSyncStart + MaxBits(CRTC_V_SYNC_WID); pMode->CrtcVAdjusted = TRUE; /* Redundant */ /* Build register contents */ pATIHW->crtc_h_total_disp = SetBits(pMode->CrtcHTotal, CRTC_H_TOTAL) | SetBits(pMode->CrtcHDisplay, CRTC_H_DISP); pATIHW->crtc_h_sync_strt_wid = SetBits(pMode->CrtcHSyncStart, CRTC_H_SYNC_STRT) | SetBits(pMode->CrtcHSkew, CRTC_H_SYNC_DLY) | /* ? */ SetBits(GetBits(pMode->CrtcHSyncStart, 0x0100U), CRTC_H_SYNC_STRT_HI) | SetBits(pMode->CrtcHSyncEnd - pMode->CrtcHSyncStart, CRTC_H_SYNC_WID); if (pMode->Flags & V_NHSYNC) pATIHW->crtc_h_sync_strt_wid |= CRTC_H_SYNC_POL; pATIHW->crtc_v_total_disp = SetBits(pMode->CrtcVTotal, CRTC_V_TOTAL) | SetBits(pMode->CrtcVDisplay, CRTC_V_DISP); pATIHW->crtc_v_sync_strt_wid = SetBits(pMode->CrtcVSyncStart, CRTC_V_SYNC_STRT) | SetBits(pMode->CrtcVSyncEnd - pMode->CrtcVSyncStart, CRTC_V_SYNC_WID); if (pMode->Flags & V_NVSYNC) pATIHW->crtc_v_sync_strt_wid |= CRTC_V_SYNC_POL; pATIHW->crtc_gen_cntl = inr(CRTC_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_VGA_128KAP_PAGING | CRTC_VFC_SYNC_TRISTATE | CRTC_LOCK_REGS | /* Already off, but ... */ CRTC_SYNC_TRISTATE | CRTC_DISP_REQ_EN | CRTC_VGA_TEXT_132 | CRTC_CUR_B_TEST); pATIHW->crtc_gen_cntl |= CRTC_EXT_DISP_EN | CRTC_EN | CRTC_VGA_LINEAR | CRTC_CNT_EN; switch (pATI->depth) {#ifndef AVOID_CPIO case 1: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_1BPP, CRTC_PIX_WIDTH); break; case 4: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_4BPP, CRTC_PIX_WIDTH); break;#endif /* AVOID_CPIO */ case 8: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_8BPP, CRTC_PIX_WIDTH); break; case 15: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_15BPP, CRTC_PIX_WIDTH); break; case 16: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_16BPP, CRTC_PIX_WIDTH); break; case 24: if (pATI->bitsPerPixel == 24) { pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_24BPP, CRTC_PIX_WIDTH); break; } if (pATI->bitsPerPixel != 32) break; /* Fall through */ case 32: pATIHW->crtc_gen_cntl |= SetBits(PIX_WIDTH_32BPP, CRTC_PIX_WIDTH); break; default: break; } if ((pMode->Flags & V_DBLSCAN) || (pMode->VScan > 1)) pATIHW->crtc_gen_cntl |= CRTC_DBL_SCAN_EN; if (pMode->Flags & V_INTERLACE) pATIHW->crtc_gen_cntl |= CRTC_INTERLACE_EN; if (pATI->OptionCSync || (pMode->Flags & (V_CSYNC | V_PCSYNC))) pATIHW->crtc_gen_cntl |= CRTC_CSYNC_EN; /* For now, set display FIFO low water mark as high as possible */ if (pATI->Chip < ATI_CHIP_264VTB) pATIHW->crtc_gen_cntl |= CRTC_FIFO_LWM;}/* * ATIMach64Set -- * * This function is called to load a Mach64's accelerator CRTC and draw engine. */voidATIMach64Set( ATIPtr pATI, ATIHWPtr pATIHW){#ifndef AVOID_CPIO if (pATIHW->crtc == ATI_CRTC_MACH64)#endif /* AVOID_CPIO */ { if ((pATIHW->FeedbackDivider > 0) && (pATI->ProgrammableClock != ATI_CLOCK_NONE)) ATIClockSet(pATI, pATIHW); /* Programme clock */ if (pATI->DAC == ATI_DAC_IBMRGB514) ATIRGB514Set(pATI, pATIHW); /* Load Mach64 CRTC registers */ outr(CRTC_H_TOTAL_DISP, pATIHW->crtc_h_total_disp); outr(CRTC_H_SYNC_STRT_WID, pATIHW->crtc_h_sync_strt_wid); outr(CRTC_V_TOTAL_DISP, pATIHW->crtc_v_total_disp); outr(CRTC_V_SYNC_STRT_WID, pATIHW->crtc_v_sync_strt_wid); outr(CRTC_OFF_PITCH, pATIHW->crtc_off_pitch); /* Load overscan registers */ outr(OVR_CLR, pATIHW->ovr_clr); outr(OVR_WID_LEFT_RIGHT, pATIHW->ovr_wid_left_right); outr(OVR_WID_TOP_BOTTOM, pATIHW->ovr_wid_top_bottom); /* Load hardware cursor registers */ outr(CUR_CLR0, pATIHW->cur_clr0); outr(CUR_CLR1, pATIHW->cur_clr1); outr(CUR_OFFSET, pATIHW->cur_offset); outr(CUR_HORZ_VERT_POSN, pATIHW->cur_horz_vert_posn); outr(CUR_HORZ_VERT_OFF, pATIHW->cur_horz_vert_off); /* Set pixel clock */ outr(CLOCK_CNTL, pATIHW->clock_cntl | CLOCK_STROBE); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl | GEN_GUI_EN); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl); outr(GEN_TEST_CNTL, pATIHW->gen_test_cntl | GEN_GUI_EN); /* Finalise CRTC setup and turn on the screen */ outr(CRTC_GEN_CNTL, pATIHW->crtc_gen_cntl); } /* Load draw engine */ if (pATI->Block0Base) { /* Clobber MMIO cache */ (void)memset(pATI->MMIOCached, 0, SizeOf(pATI->MMIOCached)); /* Ensure apertures are enabled */ outr(BUS_CNTL, pATI->NewHW.bus_cntl); outr(CONFIG_CNTL, pATI->NewHW.config_cntl); pATI->EngineIsBusy = TRUE; /* Force engine poll */ ATIMach64WaitForIdle(pATI); /* Load FIFO size */ if (pATI->Chip >= ATI_CHIP_264VT4) { outm(GUI_CNTL, pATIHW->gui_cntl); pATI->nAvailableFIFOEntries = 0; ATIMach64PollEngineStatus(pATI); } /* Set FIFO depth */ pATI->nFIFOEntries = pATI->nAvailableFIFOEntries; /* Load destination registers */ ATIMach64WaitForFIFO(pATI, 7); outf(DST_OFF_PITCH, pATIHW->dst_off_pitch); outf(DST_Y_X, SetWord(pATIHW->dst_x, 1) | SetWord(pATIHW->dst_y, 0)); outf(DST_HEIGHT, pATIHW->dst_height); outf(DST_BRES_ERR, pATIHW->dst_bres_err); outf(DST_BRES_INC, pATIHW->dst_bres_inc); outf(DST_BRES_DEC, pATIHW->dst_bres_dec); outf(DST_CNTL, pATIHW->dst_cntl); if (pATI->Chip >= ATI_CHIP_264GTPRO) { /* Load ROP unit registers */ ATIMach64WaitForFIFO(pATI, 2); outf(Z_CNTL, 0); outf(ALPHA_TST_CNTL, 0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -