Annotation of ntddk/src/video/miniport/cirrus/modeset.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1992  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     modeset.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This is the modeset code for the CL6410/20 miniport driver.
                     12: 
                     13: Environment:
                     14: 
                     15:     kernel mode only
                     16: 
                     17: Notes:
                     18: 
                     19: Revision History:
                     20: 
                     21: --*/
                     22: #include "dderror.h"
                     23: #include "devioctl.h"
                     24: #include "miniport.h"
                     25: 
                     26: #include "ntddvdeo.h"
                     27: #include "video.h"
                     28: #include "cirrus.h"
                     29: #include "modeset.h"
                     30: 
                     31: VOID
                     32: VgaZeroVideoMemory(
                     33:     PHW_DEVICE_EXTENSION HwDeviceExtension
                     34:     );
                     35: 
                     36: 
                     37: // the following is defined in cirrus.c
                     38: VOID
                     39: SetCirrusBanking(
                     40:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                     41:     ULONG BankNumber
                     42:     );
                     43: 
                     44: //---------------------------------------------------------------------------
                     45: VP_STATUS
                     46: VgaInterpretCmdStream(
                     47:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                     48:     PUSHORT pusCmdStream
                     49:     )
                     50: 
                     51: /*++
                     52: 
                     53: Routine Description:
                     54: 
                     55:     Interprets the appropriate command array to set up VGA registers for the
                     56:     requested mode. Typically used to set the VGA into a particular mode by
                     57:     programming all of the registers
                     58: 
                     59: Arguments:
                     60: 
                     61:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                     62: 
                     63:     pusCmdStream - array of commands to be interpreted.
                     64: 
                     65: Return Value:
                     66: 
                     67:     The status of the operation (can only fail on a bad command); TRUE for
                     68:     success, FALSE for failure.
                     69: 
                     70: --*/
                     71: 
                     72: {
                     73:     ULONG ulCmd;
                     74:     ULONG ulPort;
                     75:     UCHAR jValue;
                     76:     USHORT usValue;
                     77:     ULONG culCount;
                     78:     ULONG ulIndex;
                     79:     ULONG ulBase;
                     80: 
                     81:     if (pusCmdStream == NULL) {
                     82: 
                     83:         VideoDebugPrint((1, "VgaInterpretCmdStream - Invalid pusCmdStream\n"));
                     84:         return TRUE;
                     85:     }
                     86: 
                     87:     ulBase = (ULONG)HwDeviceExtension->IOAddress;
                     88: 
                     89:     //
                     90:     // Now set the adapter to the desired mode.
                     91:     //
                     92: 
                     93:     while ((ulCmd = *pusCmdStream++) != EOD) {
                     94: 
                     95:         //
                     96:         // Determine major command type
                     97:         //
                     98: 
                     99:         switch (ulCmd & 0xF0) {
                    100: 
                    101:             //
                    102:             // Basic input/output command
                    103:             //
                    104: 
                    105:             case INOUT:
                    106: 
                    107:                 //
                    108:                 // Determine type of inout instruction
                    109:                 //
                    110: 
                    111:                 if (!(ulCmd & IO)) {
                    112: 
                    113:                     //
                    114:                     // Out instruction. Single or multiple outs?
                    115:                     //
                    116: 
                    117:                     if (!(ulCmd & MULTI)) {
                    118: 
                    119:                         //
                    120:                         // Single out. Byte or word out?
                    121:                         //
                    122: 
                    123:                         if (!(ulCmd & BW)) {
                    124: 
                    125:                             //
                    126:                             // Single byte out
                    127:                             //
                    128: 
                    129:                             ulPort = *pusCmdStream++;
                    130:                             jValue = (UCHAR) *pusCmdStream++;
                    131:                             VideoPortWritePortUchar((PUCHAR)(ulBase+ulPort),
                    132:                                     jValue);
                    133: 
                    134:                         } else {
                    135: 
                    136:                             //
                    137:                             // Single word out
                    138:                             //
                    139: 
                    140:                             ulPort = *pusCmdStream++;
                    141:                             usValue = *pusCmdStream++;
                    142:                             VideoPortWritePortUshort((PUSHORT)(ulBase+ulPort),
                    143:                                     usValue);
                    144: 
                    145:                         }
                    146: 
                    147:                     } else {
                    148: 
                    149:                         //
                    150:                         // Output a string of values
                    151:                         // Byte or word outs?
                    152:                         //
                    153: 
                    154:                         if (!(ulCmd & BW)) {
                    155: 
                    156:                             //
                    157:                             // String byte outs. Do in a loop; can't use
                    158:                             // VideoPortWritePortBufferUchar because the data
                    159:                             // is in USHORT form
                    160:                             //
                    161: 
                    162:                             ulPort = ulBase + *pusCmdStream++;
                    163:                             culCount = *pusCmdStream++;
                    164: 
                    165:                             while (culCount--) {
                    166:                                 jValue = (UCHAR) *pusCmdStream++;
                    167:                                 VideoPortWritePortUchar((PUCHAR)ulPort,
                    168:                                         jValue);
                    169: 
                    170:                             }
                    171: 
                    172:                         } else {
                    173: 
                    174:                             //
                    175:                             // String word outs
                    176:                             //
                    177: 
                    178:                             ulPort = *pusCmdStream++;
                    179:                             culCount = *pusCmdStream++;
                    180:                             VideoPortWritePortBufferUshort((PUSHORT)
                    181:                                     (ulBase + ulPort), pusCmdStream, culCount);
                    182:                             pusCmdStream += culCount;
                    183: 
                    184:                         }
                    185:                     }
                    186: 
                    187:                 } else {
                    188: 
                    189:                     // In instruction
                    190:                     //
                    191:                     // Currently, string in instructions aren't supported; all
                    192:                     // in instructions are handled as single-byte ins
                    193:                     //
                    194:                     // Byte or word in?
                    195:                     //
                    196: 
                    197:                     if (!(ulCmd & BW)) {
                    198:                         //
                    199:                         // Single byte in
                    200:                         //
                    201: 
                    202:                         ulPort = *pusCmdStream++;
                    203:                         jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
                    204: 
                    205:                     } else {
                    206: 
                    207:                         //
                    208:                         // Single word in
                    209:                         //
                    210: 
                    211:                         ulPort = *pusCmdStream++;
                    212:                         usValue = VideoPortReadPortUshort((PUSHORT)
                    213:                                 (ulBase+ulPort));
                    214: 
                    215:                     }
                    216: 
                    217:                 }
                    218: 
                    219:                 break;
                    220: 
                    221:             //
                    222:             // Higher-level input/output commands
                    223:             //
                    224: 
                    225:             case METAOUT:
                    226: 
                    227:                 //
                    228:                 // Determine type of metaout command, based on minor
                    229:                 // command field
                    230:                 //
                    231:                 switch (ulCmd & 0x0F) {
                    232: 
                    233:                     //
                    234:                     // Indexed outs
                    235:                     //
                    236: 
                    237:                     case INDXOUT:
                    238: 
                    239:                         ulPort = ulBase + *pusCmdStream++;
                    240:                         culCount = *pusCmdStream++;
                    241:                         ulIndex = *pusCmdStream++;
                    242: 
                    243:                         while (culCount--) {
                    244: 
                    245:                             usValue = (USHORT) (ulIndex +
                    246:                                       (((ULONG)(*pusCmdStream++)) << 8));
                    247:                             VideoPortWritePortUshort((PUSHORT)ulPort, usValue);
                    248: 
                    249:                             ulIndex++;
                    250: 
                    251:                         }
                    252: 
                    253:                         break;
                    254: 
                    255:                     //
                    256:                     // Masked out (read, AND, XOR, write)
                    257:                     //
                    258: 
                    259:                     case MASKOUT:
                    260: 
                    261:                         ulPort = *pusCmdStream++;
                    262:                         jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort);
                    263:                         jValue &= *pusCmdStream++;
                    264:                         jValue ^= *pusCmdStream++;
                    265:                         VideoPortWritePortUchar((PUCHAR)ulBase + ulPort,
                    266:                                 jValue);
                    267:                         break;
                    268: 
                    269:                     //
                    270:                     // Attribute Controller out
                    271:                     //
                    272: 
                    273:                     case ATCOUT:
                    274: 
                    275:                         ulPort = ulBase + *pusCmdStream++;
                    276:                         culCount = *pusCmdStream++;
                    277:                         ulIndex = *pusCmdStream++;
                    278: 
                    279:                         while (culCount--) {
                    280: 
                    281:                             // Write Attribute Controller index
                    282:                             VideoPortWritePortUchar((PUCHAR)ulPort,
                    283:                                     (UCHAR)ulIndex);
                    284: 
                    285:                             // Write Attribute Controller data
                    286:                             jValue = (UCHAR) *pusCmdStream++;
                    287:                             VideoPortWritePortUchar((PUCHAR)ulPort, jValue);
                    288: 
                    289:                             ulIndex++;
                    290: 
                    291:                         }
                    292: 
                    293:                         break;
                    294: 
                    295:                     //
                    296:                     // None of the above; error
                    297:                     //
                    298:                     default:
                    299: 
                    300:                         return FALSE;
                    301: 
                    302:                 }
                    303: 
                    304: 
                    305:                 break;
                    306: 
                    307:             //
                    308:             // NOP
                    309:             //
                    310: 
                    311:             case NCMD:
                    312: 
                    313:                 break;
                    314: 
                    315:             //
                    316:             // Unknown command; error
                    317:             //
                    318: 
                    319:             default:
                    320: 
                    321:                 return FALSE;
                    322: 
                    323:         }
                    324: 
                    325:     }
                    326: 
                    327:     return TRUE;
                    328: 
                    329: } // end VgaInterpretCmdStream()
                    330: 
                    331: 
                    332: VP_STATUS
                    333: VgaSetMode(
                    334:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                    335:     PVIDEO_MODE Mode,
                    336:     ULONG ModeSize
                    337:     )
                    338: 
                    339: /*++
                    340: 
                    341: Routine Description:
                    342: 
                    343:     This routine sets the vga into the requested mode.
                    344: 
                    345: Arguments:
                    346: 
                    347:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                    348: 
                    349:     Mode - Pointer to the structure containing the information about the
                    350:         font to be set.
                    351: 
                    352:     ModeSize - Length of the input buffer supplied by the user.
                    353: 
                    354: Return Value:
                    355: 
                    356:     ERROR_INSUFFICIENT_BUFFER if the input buffer was not large enough
                    357:         for the input data.
                    358: 
                    359:     ERROR_INVALID_PARAMETER if the mode number is invalid.
                    360: 
                    361:     NO_ERROR if the operation completed successfully.
                    362: 
                    363: --*/
                    364: 
                    365: {
                    366: 
                    367:     PVIDEOMODE pRequestedMode;
                    368:     PUSHORT pusCmdStream;
                    369:     VP_STATUS status;
                    370: #ifdef INT10_MODE_SET
                    371:     VIDEO_X86_BIOS_ARGUMENTS biosArguments;
                    372: #endif
                    373: 
                    374: 
                    375:     //
                    376:     // Check if the size of the data in the input buffer is large enough.
                    377:     //
                    378: 
                    379:     if (ModeSize < sizeof(VIDEO_MODE)) {
                    380: 
                    381:         return ERROR_INSUFFICIENT_BUFFER;
                    382: 
                    383:     }
                    384: 
                    385:     //
                    386:     // Extract the clear memory bit.
                    387:     //
                    388: 
                    389:     if (Mode->RequestedMode & VIDEO_MODE_NO_ZERO_MEMORY) {
                    390: 
                    391:         Mode->RequestedMode &= ~VIDEO_MODE_NO_ZERO_MEMORY;
                    392: 
                    393:     }  else {
                    394: 
                    395:         VgaZeroVideoMemory(HwDeviceExtension);
                    396: 
                    397:     }
                    398: 
                    399:     //
                    400:     // Check to see if we are requesting a valid mode
                    401:     //
                    402: 
                    403:     if ( (Mode->RequestedMode >= NumVideoModes) ||
                    404:          (!ModesVGA[Mode->RequestedMode].ValidMode) ) {
                    405: 
                    406:         return ERROR_INVALID_PARAMETER;
                    407: 
                    408:     }
                    409: 
                    410:     pRequestedMode = &ModesVGA[Mode->RequestedMode];
                    411: 
                    412: #ifdef INT10_MODE_SET
                    413: 
                    414:     VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
                    415: 
                    416:     //
                    417:     // first, set the montype, if valid
                    418:     //
                    419: 
                    420:     if (pRequestedMode->MonitorType) {
                    421: 
                    422:         biosArguments.Eax = 0x1200 | pRequestedMode->MonitorType;
                    423:         biosArguments.Ebx = 0xA2;     // set monitor type command
                    424:         status = VideoPortInt10(HwDeviceExtension, &biosArguments);
                    425: 
                    426:         if (status != NO_ERROR) {
                    427: 
                    428:             return status;
                    429: 
                    430:         }
                    431: 
                    432:         //
                    433:         // for 640x480 modes, determine the refresh type
                    434:         // 
                    435: 
                    436:         if (pRequestedMode->hres == 640) {
                    437: 
                    438:             if (pRequestedMode->Frequency == 72) { // 72 hz refresh
                    439: 
                    440:                 // this high refresh setup only takes effect in 640x480
                    441: 
                    442:                 biosArguments.Eax = 0x1201;   // enable HIGH refresh
                    443:                 biosArguments.Ebx = 0xA3;     // set refresh type 
                    444: 
                    445:                 status = VideoPortInt10(HwDeviceExtension, &biosArguments);
                    446: 
                    447:             } else {
                    448: 
                    449:                 // set low refresh rate
                    450: 
                    451:                 biosArguments.Eax = 0x1200;   // enable LOW refresh, 640x480 only
                    452:                 biosArguments.Ebx = 0xA3;     // set refresh type 
                    453: 
                    454:                 status = VideoPortInt10(HwDeviceExtension, &biosArguments);
                    455: 
                    456:             } // endif Monitor == 4
                    457: 
                    458:         }
                    459: 
                    460:         if (status != NO_ERROR) {
                    461: 
                    462:             return status;
                    463: 
                    464:         }
                    465: 
                    466:     }
                    467: 
                    468:     VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
                    469: 
                    470:     //
                    471:     // then, set the mode
                    472:     //
                    473: 
                    474:     switch (HwDeviceExtension->ChipType) {
                    475: 
                    476:     case CL6410:
                    477: 
                    478:         biosArguments.Eax = pRequestedMode->BiosModes.BiosModeCL6410;
                    479:         break;
                    480: 
                    481:     case CL6420:
                    482: 
                    483:         biosArguments.Eax = pRequestedMode->BiosModes.BiosModeCL6420;
                    484:         break;
                    485: 
                    486:     case CL542x:
                    487: 
                    488:         biosArguments.Eax = pRequestedMode->BiosModes.BiosModeCL542x;
                    489:         break;
                    490: 
                    491:     }
                    492: 
                    493:     status = VideoPortInt10(HwDeviceExtension, &biosArguments);
                    494: 
                    495:     //
                    496:     // thhis code fixes a bug for color TFT panels only
                    497:     // when on the 6420 and in 640x480 8bpp only
                    498:     //
                    499: 
                    500:     if ( (HwDeviceExtension->ChipType == CL6420) &&      
                    501:          (pRequestedMode->bitsPerPlane == 8)     &&
                    502:          (pRequestedMode->hres == 640) ) {
                    503: 
                    504:         VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    505:                                 GRAPH_ADDRESS_PORT, 0xDC); // color LCD config reg.
                    506: 
                    507:         if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    508:                                    GRAPH_DATA_PORT) & 01) { // if TFT panel
                    509: 
                    510:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    511:                                     GRAPH_ADDRESS_PORT, 0xD6); // greyscale offset LCD reg.
                    512: 
                    513:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    514:                                     GRAPH_DATA_PORT,
                    515: 
                    516:             (UCHAR)((VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    517:                                             GRAPH_DATA_PORT) & 0x3f) | 0x40));
                    518: 
                    519:         }
                    520:     }
                    521: 
                    522: #endif
                    523: 
                    524:     //
                    525:     // Select proper command array for adapter type
                    526:     //
                    527: 
                    528:     switch (HwDeviceExtension->ChipType) {
                    529: 
                    530:     case CL6410:
                    531: 
                    532:         VideoDebugPrint((1, "VgaSetMode - Setting mode for 6410\n"));
                    533:         if (HwDeviceExtension->DisplayType == crt)
                    534:            pusCmdStream = pRequestedMode->CmdStrings.pCL6410_crt;
                    535:         else 
                    536:            pusCmdStream = pRequestedMode->CmdStrings.pCL6410_panel;
                    537:         break;
                    538: 
                    539:     case CL6420:
                    540:         VideoDebugPrint((1, "VgaSetMode - Setting mode for 6420\n"));
                    541:         if (HwDeviceExtension->DisplayType == crt)
                    542:            pusCmdStream = pRequestedMode->CmdStrings.pCL6420_crt;
                    543:         else 
                    544:            pusCmdStream = pRequestedMode->CmdStrings.pCL6420_panel;
                    545:         break;
                    546: 
                    547:     case CL542x:
                    548:         VideoDebugPrint((1, "VgaSetMode - Setting mode for 542x\n"));
                    549:         pusCmdStream = pRequestedMode->CmdStrings.pCL542x;
                    550:         break;
                    551: 
                    552:     default:
                    553:         return ERROR_INVALID_PARAMETER;
                    554:     }
                    555: 
                    556:     VgaInterpretCmdStream(HwDeviceExtension, pusCmdStream);
                    557: 
                    558:     //
                    559:     // Support 256 color modes by stretching the scan lines.
                    560:     //
                    561: 
                    562:     if (pRequestedMode->CmdStrings.pStretchScan) {
                    563: 
                    564:         VgaInterpretCmdStream(HwDeviceExtension,
                    565:                               pRequestedMode->CmdStrings.pStretchScan);
                    566: 
                    567:     }
                    568: 
                    569: #ifdef INT10_MODE_SET
                    570: {
                    571:     UCHAR temp;
                    572:     UCHAR dummy;
                    573:     UCHAR bIsColor;
                    574: 
                    575:     if (!(pRequestedMode->fbType & VIDEO_MODE_GRAPHICS)) {
                    576: 
                    577:             //
                    578:             // Fix to make sure we always set the colors in text mode to be
                    579:             // intensity, and not flashing
                    580:             // For this zero out the Mode Control Regsiter bit 3 (index 0x10
                    581:             // of the Attribute controller).
                    582:             //
                    583: 
                    584:             if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    585:                     MISC_OUTPUT_REG_READ_PORT) & 0x01) {
                    586: 
                    587:                 bIsColor = TRUE;
                    588: 
                    589:             } else {
                    590: 
                    591:                 bIsColor = FALSE;
                    592: 
                    593:             }
                    594: 
                    595:             if (bIsColor) {
                    596: 
                    597:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    598:                         INPUT_STATUS_1_COLOR);
                    599:             } else {
                    600: 
                    601:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    602:                         INPUT_STATUS_1_MONO);
                    603:             }
                    604: 
                    605:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    606:                     ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
                    607:             temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    608:                     ATT_DATA_READ_PORT);
                    609: 
                    610:             temp &= 0xF7;
                    611: 
                    612:             if (bIsColor) {
                    613: 
                    614:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    615:                         INPUT_STATUS_1_COLOR);
                    616:             } else {
                    617: 
                    618:                 dummy = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    619:                         INPUT_STATUS_1_MONO);
                    620:             }
                    621: 
                    622:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    623:                     ATT_ADDRESS_PORT, (0x10 | VIDEO_ENABLE));
                    624:             VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    625:                     ATT_DATA_WRITE_PORT, temp);
                    626:     }
                    627: }
                    628: #else
                    629:  
                    630:     //
                    631:     // if 6410 rev. AB, then fix CR13 in hires mode
                    632:     //
                    633: 
                    634:     if ( (HwDeviceExtension->ChipType == CL6420) &&      
                    635:          (HwDeviceExtension->ChipRevision >= 0x7e) &&
                    636:          (HwDeviceExtension->DisplayType == crt) && 
                    637:          (pRequestedMode->hres == 1024) ) {
                    638: 
                    639:       VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    640:             CRTC_ADDRESS_PORT_COLOR, 0x13);
                    641:       VideoPortWritePortUchar(HwDeviceExtension->IOAddress +
                    642:             CRTC_DATA_PORT_COLOR,
                    643:             (UCHAR)(VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    644:                CRTC_DATA_PORT_COLOR) + 0x01));
                    645: 
                    646:     }
                    647: 
                    648: #endif
                    649: 
                    650:     //
                    651:     // Update the location of the physical frame buffer within video memory.
                    652:     //
                    653: 
                    654:     HwDeviceExtension->PhysicalFrameLength =
                    655:             MemoryMaps[pRequestedMode->MemMap].MaxSize;
                    656: 
                    657:     HwDeviceExtension->PhysicalFrameBase.LowPart =
                    658:             MemoryMaps[pRequestedMode->MemMap].Start;
                    659: 
                    660:     //
                    661:     // Store the new mode value.
                    662:     //
                    663: 
                    664:     HwDeviceExtension->CurrentMode = pRequestedMode;
                    665:     HwDeviceExtension->ModeIndex = Mode->RequestedMode;
                    666: 
                    667:     return NO_ERROR;
                    668: 
                    669: } //end VgaSetMode()
                    670: 
                    671: VP_STATUS
                    672: VgaQueryAvailableModes(
                    673:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                    674:     PVIDEO_MODE_INFORMATION ModeInformation,
                    675:     ULONG ModeInformationSize,
                    676:     PULONG OutputSize
                    677:     )
                    678: 
                    679: /*++
                    680: 
                    681: Routine Description:
                    682: 
                    683:     This routine returns the list of all available available modes on the
                    684:     card.
                    685: 
                    686: Arguments:
                    687: 
                    688:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                    689: 
                    690:     ModeInformation - Pointer to the output buffer supplied by the user.
                    691:         This is where the list of all valid modes is stored.
                    692: 
                    693:     ModeInformationSize - Length of the output buffer supplied by the user.
                    694: 
                    695:     OutputSize - Pointer to a buffer in which to return the actual size of
                    696:         the data in the buffer. If the buffer was not large enough, this
                    697:         contains the minimum required buffer size.
                    698: 
                    699: Return Value:
                    700: 
                    701:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
                    702:         for the data being returned.
                    703: 
                    704:     NO_ERROR if the operation completed successfully.
                    705: 
                    706: --*/
                    707: 
                    708: {
                    709:     PVIDEO_MODE_INFORMATION videoModes = ModeInformation;
                    710:     ULONG i;
                    711: 
                    712:     //
                    713:     // Find out the size of the data to be put in the buffer and return
                    714:     // that in the status information (whether or not the information is
                    715:     // there). If the buffer passed in is not large enough return an
                    716:     // appropriate error code.
                    717:     //
                    718: 
                    719:     if (ModeInformationSize < (*OutputSize =
                    720:             HwDeviceExtension->NumAvailableModes *
                    721:             sizeof(VIDEO_MODE_INFORMATION)) ) {
                    722: 
                    723:         return ERROR_INSUFFICIENT_BUFFER;
                    724: 
                    725:     }
                    726: 
                    727:     //
                    728:     // For each mode supported by the card, store the mode characteristics
                    729:     // in the output buffer.
                    730:     //
                    731: 
                    732:     for (i = 0; i < NumVideoModes; i++) {
                    733: 
                    734:         if (ModesVGA[i].ValidMode) {
                    735: 
                    736:             videoModes->Length = sizeof(VIDEO_MODE_INFORMATION);
                    737:             videoModes->ModeIndex  = i;
                    738:             videoModes->VisScreenWidth = ModesVGA[i].hres;
                    739:             videoModes->ScreenStride = ModesVGA[i].wbytes;
                    740:             videoModes->VisScreenHeight = ModesVGA[i].vres;
                    741:             videoModes->NumberOfPlanes = ModesVGA[i].numPlanes;
                    742:             videoModes->BitsPerPlane = ModesVGA[i].bitsPerPlane;
                    743:             videoModes->Frequency = ModesVGA[i].Frequency;
                    744:             videoModes->XMillimeter = 330;        // temporary hardcoded constant
                    745:             videoModes->YMillimeter = 240;        // temporary hardcoded constant
                    746:             videoModes->NumberRedBits = 6;
                    747:             videoModes->NumberGreenBits = 6;
                    748:             videoModes->NumberBlueBits = 6;
                    749:             videoModes->AttributeFlags = ModesVGA[i].fbType;
                    750:             videoModes->AttributeFlags |= ModesVGA[i].Interlaced ?
                    751:                  VIDEO_MODE_INTERLACED : 0;
                    752: 
                    753:             videoModes->RedMask = 0;
                    754:             videoModes->GreenMask = 0;
                    755:             videoModes->BlueMask = 0;
                    756:             videoModes->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN |
                    757:                     VIDEO_MODE_MANAGED_PALETTE;
                    758: 
                    759:             videoModes++;
                    760: 
                    761:         }
                    762:     }
                    763: 
                    764:     return NO_ERROR;
                    765: 
                    766: } // end VgaGetAvailableModes()
                    767: 
                    768: VP_STATUS
                    769: VgaQueryNumberOfAvailableModes(
                    770:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                    771:     PVIDEO_NUM_MODES NumModes,
                    772:     ULONG NumModesSize,
                    773:     PULONG OutputSize
                    774:     )
                    775: 
                    776: /*++
                    777: 
                    778: Routine Description:
                    779: 
                    780:     This routine returns the number of available modes for this particular
                    781:     video card.
                    782: 
                    783: Arguments:
                    784: 
                    785:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                    786: 
                    787:     NumModes - Pointer to the output buffer supplied by the user. This is
                    788:         where the number of modes is stored.
                    789: 
                    790:     NumModesSize - Length of the output buffer supplied by the user.
                    791: 
                    792:     OutputSize - Pointer to a buffer in which to return the actual size of
                    793:         the data in the buffer.
                    794: 
                    795: Return Value:
                    796: 
                    797:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
                    798:         for the data being returned.
                    799: 
                    800:     NO_ERROR if the operation completed successfully.
                    801: 
                    802: --*/
                    803: 
                    804: {
                    805:     //
                    806:     // Find out the size of the data to be put in the the buffer and return
                    807:     // that in the status information (whether or not the information is
                    808:     // there). If the buffer passed in is not large enough return an
                    809:     // appropriate error code.
                    810:     //
                    811: 
                    812:     if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) {
                    813: 
                    814:         return ERROR_INSUFFICIENT_BUFFER;
                    815: 
                    816:     }
                    817: 
                    818:     //
                    819:     // Store the number of modes into the buffer.
                    820:     //
                    821: 
                    822:     NumModes->NumModes = HwDeviceExtension->NumAvailableModes;
                    823:     NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
                    824: 
                    825:     return NO_ERROR;
                    826: 
                    827: } // end VgaGetNumberOfAvailableModes()
                    828: 
                    829: VP_STATUS
                    830: VgaQueryCurrentMode(
                    831:     PHW_DEVICE_EXTENSION HwDeviceExtension,
                    832:     PVIDEO_MODE_INFORMATION ModeInformation,
                    833:     ULONG ModeInformationSize,
                    834:     PULONG OutputSize
                    835:     )
                    836: 
                    837: /*++
                    838: 
                    839: Routine Description:
                    840: 
                    841:     This routine returns a description of the current video mode.
                    842: 
                    843: Arguments:
                    844: 
                    845:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                    846: 
                    847:     ModeInformation - Pointer to the output buffer supplied by the user.
                    848:         This is where the current mode information is stored.
                    849: 
                    850:     ModeInformationSize - Length of the output buffer supplied by the user.
                    851: 
                    852:     OutputSize - Pointer to a buffer in which to return the actual size of
                    853:         the data in the buffer. If the buffer was not large enough, this
                    854:         contains the minimum required buffer size.
                    855: 
                    856: Return Value:
                    857: 
                    858:     ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
                    859:         for the data being returned.
                    860: 
                    861:     NO_ERROR if the operation completed successfully.
                    862: 
                    863: --*/
                    864: 
                    865: {
                    866:     //
                    867:     // Find out the size of the data to be put in the the buffer and return
                    868:     // that in the status information (whether or not the information is
                    869:     // there). If the buffer passed in is not large enough return an
                    870:     // appropriate error code.
                    871:     //
                    872: 
                    873:     if (ModeInformationSize < (*OutputSize = sizeof(VIDEO_MODE_INFORMATION))) {
                    874: 
                    875:         return ERROR_INSUFFICIENT_BUFFER;
                    876: 
                    877:     }
                    878: 
                    879:     //
                    880:     // Store the characteristics of the current mode into the buffer.
                    881:     //
                    882: 
                    883:     ModeInformation->Length = sizeof(VIDEO_MODE_INFORMATION);
                    884:     ModeInformation->ModeIndex = HwDeviceExtension->ModeIndex;
                    885:     ModeInformation->VisScreenWidth = HwDeviceExtension->CurrentMode->hres;
                    886:     ModeInformation->ScreenStride = HwDeviceExtension->CurrentMode->wbytes;
                    887:     ModeInformation->VisScreenHeight = HwDeviceExtension->CurrentMode->vres;
                    888:     ModeInformation->NumberOfPlanes = HwDeviceExtension->CurrentMode->numPlanes;
                    889:     ModeInformation->BitsPerPlane = HwDeviceExtension->CurrentMode->bitsPerPlane;
                    890:     ModeInformation->Frequency = HwDeviceExtension->CurrentMode->Frequency;
                    891:     ModeInformation->XMillimeter = 330;        // temporary hardcoded constant
                    892:     ModeInformation->YMillimeter = 240;        // temporary hardcoded constant
                    893:     ModeInformation->NumberRedBits = 6;
                    894:     ModeInformation->NumberGreenBits = 6;
                    895:     ModeInformation->NumberBlueBits = 6;
                    896:     ModeInformation->RedMask = 0;
                    897:     ModeInformation->GreenMask = 0;
                    898:     ModeInformation->BlueMask = 0;
                    899:     ModeInformation->AttributeFlags = HwDeviceExtension->CurrentMode->fbType |
                    900:              VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE;
                    901:     ModeInformation->AttributeFlags |= HwDeviceExtension->CurrentMode->Interlaced ?
                    902:              VIDEO_MODE_INTERLACED : 0;
                    903: 
                    904: 
                    905:     return NO_ERROR;
                    906: 
                    907: } // end VgaQueryCurrentMode()
                    908: 
                    909: 
                    910: VOID
                    911: VgaZeroVideoMemory(
                    912:     PHW_DEVICE_EXTENSION HwDeviceExtension
                    913:     )
                    914: 
                    915: /*++
                    916: 
                    917: Routine Description:
                    918: 
                    919:     This routine zeros the first 256K on the VGA.
                    920: 
                    921: Arguments:
                    922: 
                    923:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                    924: 
                    925: 
                    926: Return Value:
                    927: 
                    928:     None.
                    929: 
                    930: --*/
                    931: {
                    932:     UCHAR temp;
                    933:     ULONG i;
                    934:     ULONG max;
                    935: 
                    936:     //
                    937:     // Map font buffer at A0000
                    938:     //
                    939: 
                    940:     VgaInterpretCmdStream(HwDeviceExtension, EnableA000Data);
                    941: 
                    942:     //
                    943:     // Enable all planes.
                    944:     //
                    945: 
                    946:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT,
                    947:             IND_MAP_MASK);
                    948: 
                    949:     temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress +
                    950:             SEQ_DATA_PORT) | (UCHAR)0x0F;
                    951: 
                    952:     VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,
                    953:             temp);
                    954: 
                    955: #ifndef INT10_MODE_SET
                    956: 
                    957:     //
                    958:     // Zero the memory for all pages.
                    959:     //
                    960: 
                    961:     switch (HwDeviceExtension->ChipType) {
                    962: 
                    963:     case CL6410:
                    964: 
                    965:         max = 1;       // 6410 max memory is 256k
                    966:         break;
                    967: 
                    968:     case CL6420:
                    969: 
                    970:         max = 4;       // 6410 max memory is 1meg.
                    971:         break;
                    972: 
                    973:     case CL542x:
                    974: 
                    975:         max = 8;       // 6410 max memory is 2meg.
                    976:         break;
                    977: 
                    978:     }
                    979:   
                    980:     for (i = 0; i < max; i++) {
                    981: 
                    982:         SetCirrusBanking(HwDeviceExtension,i);     // setup next 256k bank
                    983:         VideoPortZeroMemory(HwDeviceExtension->VideoMemoryAddress, 0xFFFF);
                    984: 
                    985:     }
                    986: 
                    987:     SetCirrusBanking(HwDeviceExtension,0);     // reset the banks
                    988: 
                    989: #else
                    990: 
                    991:     VideoPortZeroMemory(HwDeviceExtension->VideoMemoryAddress, 0xFFFF);
                    992: 
                    993: #endif
                    994: 
                    995:     VgaInterpretCmdStream(HwDeviceExtension, DisableA000Color);
                    996: 
                    997: }
                    998: 
                    999: 
                   1000: VOID
                   1001: CirrusValidateModes(
                   1002:     PHW_DEVICE_EXTENSION HwDeviceExtension
                   1003:     )
                   1004: 
                   1005: /*++
                   1006: 
                   1007: Routine Description:
                   1008: 
                   1009:     Determines which modes are valid and which are not.
                   1010: 
                   1011: Arguments:
                   1012: 
                   1013:     HwDeviceExtension - Pointer to the miniport driver's device extension.
                   1014: 
                   1015: Return Value:
                   1016: 
                   1017:     None.
                   1018: 
                   1019: --*/
                   1020: {
                   1021: 
                   1022:     ULONG i;
                   1023: 
                   1024:     HwDeviceExtension->NumAvailableModes = 0;
                   1025: 
                   1026:     for (i = 0; i < NumVideoModes; i++) {
                   1027: 
                   1028:        if ( (HwDeviceExtension->AdapterMemorySize >=
                   1029:              ModesVGA[i].numPlanes * ModesVGA[i].sbytes) &&
                   1030:             (HwDeviceExtension->ChipType & ModesVGA[i].ChipType) &&
                   1031:             (HwDeviceExtension->DisplayType & ModesVGA[i].DisplayType)) {
                   1032: 
                   1033:             ModesVGA[i].ValidMode = TRUE;
                   1034:             HwDeviceExtension->NumAvailableModes++;
                   1035:    
                   1036:         }
                   1037:     }
                   1038: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.