void PermediaSubsequentScreenToScreenCopy (int x1, int y1, int x2, int y2, int w, int h) { int lowerbits = bppand[(glintInfoRec.bitsPerPixel>>3)-1]; int srcaddr; int dstaddr; char align; if (blitydir < 0) { y1 = y1 + h - 1; y2 = y2 + h - 1; } /* We can only use GXcopy for Packed modes, and less than 32 width * gives us speed for small blits. */ if ((w < 32) || (grop != GXcopy)) { srcaddr = y1 * glintInfoRec.displayWidth + x1; dstaddr = y2 * glintInfoRec.displayWidth + x2; GLINT_WAIT(7); GLINT_WRITE_REG(mode, FBReadMode); GLINT_WRITE_REG (x2<<16, StartXDom); GLINT_WRITE_REG ((x2+w)<<16, StartXSub); GLINT_WRITE_REG (y2 << 16, StartY); GLINT_WRITE_REG (h, GLINTCount); } else { srcaddr = y1 * glintInfoRec.displayWidth + (x1 & ~lowerbits); dstaddr = y2 * glintInfoRec.displayWidth + (x2 & ~lowerbits); align = (x2 & lowerbits) - (x1 & lowerbits); GLINT_WAIT(8); GLINT_WRITE_REG(mode | FBRM_Packed | (align&7)<<20, FBReadMode); GLINT_WRITE_REG(x2<<16|(x2+w), PackedDataLimits); GLINT_WRITE_REG(Shiftbpp(x2)<<16, StartXDom); GLINT_WRITE_REG((Shiftbpp(x2+w+7))<<16, StartXSub); GLINT_WRITE_REG(y2 << 16, StartY); GLINT_WRITE_REG(h, GLINTCount); } GLINT_WRITE_REG(srcaddr - dstaddr, FBSourceOffset); GLINT_WRITE_REG (PrimitiveTrapezoid, Render); }
void PermediaSubsequentFillRectSolid(int x, int y, int w, int h) { int speed = 0; if (grop == GXcopy) { GLINT_WAIT(5); GLINT_WRITE_REG(x<<16, StartXDom); GLINT_WRITE_REG(y<<16, StartY); GLINT_WRITE_REG(h, GLINTCount); GLINT_WRITE_REG((x+w)<<16, StartXSub); speed = FastFillEnable; } else { GLINT_WAIT(7); GLINT_WRITE_REG(pprod | FBRM_Packed | FBRM_DstEnable, FBReadMode); GLINT_WRITE_REG(x<<16|(x+w), PackedDataLimits); GLINT_WRITE_REG(Shiftbpp(x)<<16, StartXDom); GLINT_WRITE_REG(y<<16, StartY); GLINT_WRITE_REG(h, GLINTCount); GLINT_WRITE_REG((Shiftbpp(x+w+7))<<16, StartXSub); } GLINT_WRITE_REG(PrimitiveTrapezoid | speed, Render); }
Bool Permedia3Init(ScrnInfoPtr pScrn, DisplayModePtr mode, GLINTRegPtr pReg) { GLINTPtr pGlint = GLINTPTR(pScrn); CARD32 temp1, temp2, temp3, temp4; if ((pGlint->numMultiDevices == 2) || (IS_J2000)) { STOREREG(GCSRAperture, GCSRSecondaryGLINTMapEn); } if (pGlint->MultiAperture) { STOREREG(GMultGLINTAperture, pGlint->realWidth); STOREREG(GMultGLINT1, PCI_REGION_BASE(pGlint->MultiPciInfo[0], 2, REGION_MEM) & 0xFF800000); STOREREG(GMultGLINT2, PCI_REGION_BASE(pGlint->MultiPciInfo[1], 2, REGION_MEM) & 0xFF800000); } STOREREG(PM3MemBypassWriteMask, 0xffffffff); STOREREG(Aperture0, 0x00000000); STOREREG(Aperture1, 0x00000000); if (pGlint->Chipset == PCI_VENDOR_3DLABS_CHIP_GAMMA) STOREREG(DFIFODis, 0x00000001); STOREREG(FIFODis, 0x00000007); temp1 = mode->CrtcHSyncStart - mode->CrtcHDisplay; temp2 = mode->CrtcVSyncStart - mode->CrtcVDisplay; temp3 = mode->CrtcHSyncEnd - mode->CrtcHSyncStart; temp4 = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; STOREREG(PMHTotal, Shiftbpp(pScrn, mode->CrtcHTotal) - 1); STOREREG(PMHsEnd, Shiftbpp(pScrn, temp1 + temp3)); STOREREG(PMHsStart, Shiftbpp(pScrn, temp1)); STOREREG(PMHbEnd, Shiftbpp(pScrn, mode->CrtcHTotal - mode->CrtcHDisplay)); STOREREG(PMHgEnd, Shiftbpp(pScrn, mode->CrtcHTotal - mode->CrtcHDisplay)); STOREREG(PMScreenStride, Shiftbpp(pScrn, pScrn->displayWidth)); STOREREG(PMVTotal, mode->CrtcVTotal - 1); STOREREG(PMVsEnd, temp2 + temp4 - 1); STOREREG(PMVsStart, temp2 - 1); STOREREG(PMVbEnd, mode->CrtcVTotal - mode->CrtcVDisplay); switch (pScrn->bitsPerPixel) { case 8: STOREREG(PM3ByAperture1Mode, PM3ByApertureMode_PIXELSIZE_8BIT); STOREREG(PM3ByAperture2Mode, PM3ByApertureMode_PIXELSIZE_8BIT); STOREREG(PMVideoControl, 1 | (1 << 3) | (1 << 5) | (0 << 19)); break; case 16: #if X_BYTE_ORDER != X_BIG_ENDIAN STOREREG(PM3ByAperture1Mode, PM3ByApertureMode_PIXELSIZE_16BIT); STOREREG(PM3ByAperture2Mode, PM3ByApertureMode_PIXELSIZE_16BIT); #else STOREREG(PM3ByAperture1Mode, PM3ByApertureMode_PIXELSIZE_16BIT | PM3ByApertureMode_BYTESWAP_BADC); STOREREG(PM3ByAperture2Mode, PM3ByApertureMode_PIXELSIZE_16BIT | PM3ByApertureMode_BYTESWAP_BADC); #endif STOREREG(PMVideoControl, 1 | (1 << 3) | (1 << 5) | (1 << 19)); break; case 32: #if X_BYTE_ORDER != X_BIG_ENDIAN STOREREG(PM3ByAperture1Mode, PM3ByApertureMode_PIXELSIZE_32BIT); STOREREG(PM3ByAperture2Mode, PM3ByApertureMode_PIXELSIZE_32BIT); #else STOREREG(PM3ByAperture1Mode, PM3ByApertureMode_PIXELSIZE_32BIT | PM3ByApertureMode_BYTESWAP_DCBA); STOREREG(PM3ByAperture2Mode, PM3ByApertureMode_PIXELSIZE_32BIT | PM3ByApertureMode_BYTESWAP_DCBA); #endif STOREREG(PMVideoControl, 1 | (1 << 3) | (1 << 5) | (2 << 19)); break; } STOREREG(VClkCtl, GLINT_READ_REG(VClkCtl) & 0xFFFFFFFC); STOREREG(PMScreenBase, 0x00000000); STOREREG(ChipConfig, GLINT_READ_REG(ChipConfig) & 0xFFFFFFFD); { /* Get the programmable clock values */ unsigned char m,n,p; /* Let's program the dot clock */ switch (pGlint->Chipset) { case PCI_VENDOR_3DLABS_CHIP_PERMEDIA4: case PCI_VENDOR_3DLABS_CHIP_R4: (void) PM4DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); break; case PCI_VENDOR_3DLABS_CHIP_PERMEDIA3: (void) PM3DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); break; case PCI_VENDOR_3DLABS_CHIP_GAMMA: switch (pGlint->MultiChip) { case PCI_CHIP_3DLABS_PERMEDIA3: (void) PM3DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); break; case PCI_CHIP_3DLABS_R4: (void) PM4DAC_CalculateClock(mode->Clock, pGlint->RefClock, &m,&n,&p); break; } break; } STOREDAC(PM3RD_DClk0PreScale, m); STOREDAC(PM3RD_DClk0FeedbackScale, n); STOREDAC(PM3RD_DClk0PostScale, p); } temp1 = 0; temp2 = 0; temp3 = 0; if (pGlint->UseFlatPanel) { temp2 |= PM3RD_DACControl_BLANK_PEDESTAL_ENABLE; temp3 |= PM3RD_MiscControl_VSB_OUTPUT_ENABLE; STOREREG(VSConfiguration, 0x06); STOREREG(VSBBase, 1<<14); } if (mode->Flags & V_PHSYNC) temp1 |= PM3RD_SyncControl_HSYNC_ACTIVE_HIGH; if (mode->Flags & V_PVSYNC) temp1 |= PM3RD_SyncControl_VSYNC_ACTIVE_HIGH; STOREREG(PM2VDACRDIndexControl, 0x00); STOREDAC(PM2VDACRDSyncControl, temp1); STOREDAC(PM2VDACRDDACControl, temp2); if (pScrn->rgbBits == 8) temp3 |= 0x01; /* 8bit DAC */ switch (pScrn->bitsPerPixel) { case 8: STOREDAC(PM2VDACRDPixelSize, 0x00); STOREDAC(PM2VDACRDColorFormat, 0x2E); break; case 16: temp3 |= PM3RD_MiscControl_DIRECTCOLOR_ENABLE; STOREDAC(PM2VDACRDPixelSize, 0x01); if (pScrn->depth == 15) { STOREDAC(PM2VDACRDColorFormat, 0x61); } else { STOREDAC(PM2VDACRDColorFormat, 0x70); } break; case 24: temp3 |= PM3RD_MiscControl_DIRECTCOLOR_ENABLE; STOREDAC(PM2VDACRDPixelSize, 0x04); STOREDAC(PM2VDACRDColorFormat, 0x20); break; case 32: temp3 |= PM3RD_MiscControl_DIRECTCOLOR_ENABLE; if (pScrn->overlayFlags & OVERLAY_8_32_PLANAR) { temp3 |= 0x18; STOREDAC(PM2VDACRDOverlayKey, pScrn->colorKey); } STOREDAC(PM2VDACRDPixelSize, 0x02); STOREDAC(PM2VDACRDColorFormat, 0x20); break; } STOREDAC(PM2VDACRDMiscControl, temp3); STOREREG(PM3FifoControl, 0x905); /* Lower the default fifo threshold */ return(TRUE); }