/*++ Copyright (c) 1993 Weitek Corporation Module Name: p9000.c Abstract: This module contains the code specific to the Weitek P9000. Environment: Kernel mode Revision History may be found at the end of this file. --*/ #include "p9.h" #include "p9gbl.h" #include "p9000.h" // // Static data for the P9000 specific support routines. // // // This table is used to compute the qsfselect value for the P9000 Srctl // register. This value is dependent upon a particular adapter's dot clock // divisor and its memory configuration. See p. 64 of the P9000 manual for // details. // ULONG qsfSelect[2][5] = { {4, 4, 5, 5, 6}, {3, 3, 4, 4, 5}, }; VOID Init8720( PHW_DEVICE_EXTENSION HwDeviceExtension ) /*++ Routine Description: Initialize the P9000. Arguments: HwDeviceExtension - Pointer to the miniport driver's device extension. Return Value: None. --*/ { P9_WR_REG(0x0000CL, 0x00000080L); //INTERRUPT-EN = disabled P9_WR_REG(0x00118L, 0x00000000L); //PREHRZC = 0 P9_WR_REG(0x00130L, 0x00000000L); //PREVRTC = 0 // // Initialize the P9 registers whose values are dependent upon a // particular OEM implementation. // P9_WR_REG(MEMCONF, HwDeviceExtension->AdapterDesc.ulMemConfVal); P9_WR_REG(SRCTL, HwDeviceExtension->AdapterDesc.ulSrctlVal | qsfSelect[(HwDeviceExtension->AdapterDesc.iClkDiv >> 2) - 1] [HwDeviceExtension->AdapterDesc.ulMemConfVal]); // // Initialize non-implementation specific registers. // P9_WR_REG(0x00188L, 0x00000186L); //RFPERIOD = P9_WR_REG(0x00190L, 0x000000FAL); //RLMAX = P9_WR_REG(0x80208L, 0x000000FFL); //allow writing in all 8 planes P9_WR_REG(0x8020CL, 0x0000000AL); //drawmode=buffer 0, write inside window P9_WR_REG(0x80190L, 0x00000000L); //disable any co-ord offset return; } VOID WriteTiming( PHW_DEVICE_EXTENSION HwDeviceExtension ) /*++ Routine Description: Arguments: HwDeviceExtension - Pointer to the miniport driver's device extension. pPal - Pointer to the array of pallete entries. StartIndex - Specifies the first pallete entry provided in pPal. Count - Number of palette entries in pPal Return Value: None. --*/ { int div; div = (HwDeviceExtension->AdapterDesc.iClkDiv)/(HwDeviceExtension->usBitsPixel / 8); P9_WR_REG(0x010CL, HwDeviceExtension->VideoData.hsyncp/div - 1 ); // HRZSR P9_WR_REG(0x0110L, (HwDeviceExtension->VideoData.hsyncp + HwDeviceExtension->VideoData.hbp) / div - 1 ); //HRZBR P9_WR_REG(0x0114L, (HwDeviceExtension->VideoData.hsyncp + HwDeviceExtension->VideoData.hbp + HwDeviceExtension->VideoData.XSize)/div -1 ); //HRZBF P9_WR_REG(0x0108L, (HwDeviceExtension->VideoData.hsyncp + HwDeviceExtension->VideoData.hbp + HwDeviceExtension->VideoData.XSize + HwDeviceExtension->VideoData.hfp)/div - 1 ); //HRZT P9_WR_REG(0x0124L, HwDeviceExtension->VideoData.vsp); //VRTSR P9_WR_REG(0x0128L, HwDeviceExtension->VideoData.vsp + HwDeviceExtension->VideoData.vbp ); //VRTBR P9_WR_REG(0x012CL, HwDeviceExtension->VideoData.vsp + HwDeviceExtension->VideoData.vbp + HwDeviceExtension->VideoData.YSize ); //VRTBF P9_WR_REG(0x0120L, HwDeviceExtension->VideoData.vsp + HwDeviceExtension->VideoData.vbp + HwDeviceExtension->VideoData.YSize+HwDeviceExtension->VideoData.vfp ); //VRTT return; } VOID SysConf( PHW_DEVICE_EXTENSION HwDeviceExtension ) /*++ Routine Description: Arguments: HwDeviceExtension - Pointer to the miniport driver's device extension. Return Value: None. --*/ { int i,j; // loop counters long sysval = 0x3000L; // swap bytes and words for little endian PC int xtem = HwDeviceExtension->VideoData.XSize * (HwDeviceExtension->usBitsPixel / 8); //save a copy for clearing bits in long ClipMax; // clipping register value for NotBusy to restore if (xtem & 0xf80) // each field in the sysconreg can only set { // a limited range of bits in the size j = 7; // each field is 3 bits wide for (i = 2048; i >= 128;i >>= 1) // look at all the bits field 3 can effect { if (i & xtem) // if this bit is on, { sysval |= ((long) j) << 20; // use this field to set it xtem &= ~i; // and remove the bit from the size break; // each field can only set one bit } j -= 1; } } if (xtem & 0x7C0) // do the same thing for field 2 { j = 6; // each field is 3 bits wide for (i = 1024; i >= 64; i >>= 1) // look at all the bits field 2 can effect { if (i & xtem) // if this bit is on, { sysval |= ((long)j)<<17; // use this field to set it xtem &= ~i; // and remove the bit from the size break; // each field can only set one bit } j -= 1; } } if (xtem & 0x3E0) // do the same thing for field 1 { j = 5; // each field is 3 bits wide for (i = 512; i >= 32;i >>= 1) // look at all the bits field 1 can effect { if (i & xtem) // if this bit is on, { sysval |= ((long) j) << 14; // use this field to set it xtem &= ~i; // and remove the bit from the size break; // each field can only set one bit } j -= 1; } } if (xtem != 0) // if there are bits left, it is an return; // illegal x size. P9_WR_REG(SYSCONFIG, sysval); // send data to the register P9_WR_REG(WMIN, 0); // minimum clipping register // calc and set max ClipMax=((long) HwDeviceExtension->VideoData.XSize - 1) << 16 | (div32(HwDeviceExtension->FrameLength, (SHORT) HwDeviceExtension->VideoData.XSize) - 1); // clipping to allow access to all of the extra memory. P9_WR_REG(WMAX, ClipMax); return; } VOID P9000SizeMem( PHW_DEVICE_EXTENSION HwDeviceExtension ) /*++ Routine Description: Determines the amount of video memory installed, as well as the P9000 memory configuration, and stores them in the device extension. Arguments: HwDeviceExtension - Pointer to the miniport driver's device extension. Return Value: None. --*/ { PULONG pulFrameBufAddr = (PULONG) HwDeviceExtension->FrameAddress; ULONG i; // // Assume 2 M of VRAM is installed. // HwDeviceExtension->AdapterDesc.ulMemConfVal = P90_MEM_CFG_3; HwDeviceExtension->FrameLength = 0x200000; // // Initialize the P9000 to memory configuration 3 (2M), so frame buffer // memory can be accessed. // P9_WR_REG(MEMCONF, P90_MEM_CFG_3); // // Write a series of test values to the frame buffer. // for (i = 0; i < 32; i++) { pulFrameBufAddr[i] = i; } // // Read back the test values. If any errors occur, this is not a valid // memory configuration. // for (i = 0; i < 32; i++) { if (pulFrameBufAddr[i] != i) { HwDeviceExtension->AdapterDesc.ulMemConfVal = P90_MEM_CFG_1; HwDeviceExtension->FrameLength = 0x100000; break; } } return; }