Annotation of driverkit/libDriver/ppc/IONDRVFramebuffer.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  * Copyright (c) 1997 Apple Computer, Inc.
                     26:  *
                     27:  *
                     28:  * HISTORY
                     29:  *
                     30:  * Simon Douglas  22 Oct 97
                     31:  * - first checked in.
                     32:  */
                     33: 
                     34: 
                     35: #define KERNOBJC 1                     // remove
                     36: #define KERNEL_PRIVATE 1
                     37: #define DRIVER_PRIVATE 1
                     38: 
                     39: #import <driverkit/generalFuncs.h>
                     40: #import <driverkit/IODisplay.h>
                     41: #import <driverkit/IODisplayPrivate.h>
                     42: #import        <driverkit/IOFrameBufferShared.h>
                     43: #import        <bsd/dev/kmreg_com.h>
                     44: #import        <bsd/dev/ppc/kmDevice.h>
                     45: 
                     46: #import <mach/vm_param.h>       /* for round_page() */
                     47: #import <machdep/ppc/proc_reg.h>
                     48: #import <string.h>
                     49: 
                     50: #import        <driverkit/ppc/IOFramebuffer.h>
                     51: #import        "IONDRVFramebuffer.h"
                     52: 
                     53: extern IODisplayInfo   bootDisplayInfo;
                     54: 
                     55: @implementation IONDRVFramebuffer
                     56: 
                     57: //=======================================================================
                     58: 
                     59: - (IOReturn)doControl:(UInt32)code params:(void *)params
                     60: {
                     61:     IOReturn   err;
                     62:     CntrlParam pb;
                     63: 
                     64:     pb.qLink = 0;
                     65:     pb.csCode = code;
                     66:     pb.csParams = params;
                     67: 
                     68:     err = NDRVDoDriverIO( doDriverIO, /*ID*/ (UInt32) &pb, &pb,
                     69:        kControlCommand, kImmediateIOCommandKind );
                     70: 
                     71:     return( err);
                     72: }
                     73: 
                     74: - (IOReturn)doStatus:(UInt32)code params:(void *)params
                     75: {
                     76:     IOReturn   err;
                     77:     CntrlParam pb;
                     78: 
                     79:     pb.qLink = 0;
                     80:     pb.csCode = code;
                     81:     pb.csParams = params;
                     82: 
                     83:     err = NDRVDoDriverIO( doDriverIO, /*ID*/ (UInt32) &pb, &pb,
                     84:        kStatusCommand, kImmediateIOCommandKind );
                     85: 
                     86:     return( err);
                     87: }
                     88: 
                     89: //=======================================================================
                     90: 
                     91: + (BOOL)probe:device
                     92: {
                     93:     id         inst;
                     94:     Class       newClass = self;
                     95:     char *     name;
                     96: 
                     97:     if( NDRVForDevice( device)) {
                     98:         name = [device nodeName];
                     99:         if( 0 == strncmp("ATY,", name, strlen("ATY,")))
                    100:             newClass = [IOATINDRV class];
                    101:         else if( 0 == strncmp("IMS,tt3d", name, strlen("IMS,tt3d")))
                    102:             newClass = [IOIX3DNDRV class];
                    103:     } else
                    104:        newClass = [IOOFFramebuffer class];
                    105: 
                    106:     // Create an instance and initialize
                    107:     inst = [[newClass alloc] initFromDeviceDescription:device];
                    108:     if (inst == nil)
                    109:         return NO;
                    110: 
                    111:     [inst setDeviceKind:"Linear Framebuffer"];
                    112: 
                    113:     [inst registerDevice];
                    114: 
                    115:     return YES;
                    116: }
                    117: 
                    118: - initFromDeviceDescription:(IOPCIDevice *) deviceDescription
                    119: {
                    120:     id                 me = nil;
                    121:     kern_return_t      err = 0;
                    122:     UInt32             i, propSize;
                    123:     UInt32             numMaps = 8;
                    124:     IOApertureInfo     maps[ numMaps ];        // FIX
                    125:     IOLogicalAddress   aaplAddress[ 8 ];       // FIX
                    126:     IOApertureInfo   * map;
                    127:     IOPropertyTable  * propTable;
                    128:     void *             prop;
                    129:     char *             logname;
                    130:     InterruptSetMember intsProperty[ 3 ];
                    131: 
                    132:     do {
                    133:        ioDevice = deviceDescription;
                    134:        logname = [ioDevice nodeName];
                    135:        propTable = [ioDevice propertyTable];
                    136: 
                    137:        prop = &ndrvInst;
                    138:        propSize = sizeof( NDRVInstance);
                    139:        err = [propTable getProperty:"AAPL,ndrvInst" flags:0 value:&prop length:&propSize];
                    140:        if( err)
                    141:            continue;
                    142:        err = NDRVGetSymbol( ndrvInst, "DoDriverIO", &doDriverIO );
                    143:        if( err)
                    144:            continue;
                    145:        err = NDRVGetSymbol( ndrvInst, "TheDriverDescription", (void **)&theDriverDesc );
                    146:        if( err)
                    147:            continue;
                    148:     
                    149:        transferTable = IOMalloc(sizeof( ColorSpec) * 256);    // Initialize transfer table variables.  
                    150:        brightnessLevel = EV_SCREEN_MAX_BRIGHTNESS;
                    151:        scaledTable = 0;
                    152:        cachedModeIndex = 0x7fffffff;
                    153: 
                    154:        numMaps = 8;
                    155:        err = [ioDevice getApertures:maps items:&numMaps];
                    156:        if( err)
                    157:            continue;
                    158:     
                    159:        for( i = 0, map = maps; i < numMaps; i++, map++) {
                    160: 
                    161:            if( (((UInt32)bootDisplayInfo.frameBuffer) >= ((UInt32)map->physical))
                    162:            &&  (((UInt32)bootDisplayInfo.frameBuffer) < (map->length + (UInt32)map->physical)) )
                    163:                consoleDevice = YES;
                    164: 
                    165:            // this means any graphics card grabs a BAT for the segment.
                    166:            aaplAddress[ i ] = PEMapSegment( map->physical, 0x10000000);
                    167:            if( aaplAddress[ i ] != map->physical) {
                    168:                IOLog("%s: NDRV needs 1-1 mapping\n", logname);
                    169:                err = IO_R_VM_FAILURE;
                    170:                break;
                    171:            }
                    172: 
                    173: #if 0
                    174:            // Declare range for pmap'ing into user space
                    175:            // Shouldn't be here but it's too expensive to do it for all devices
                    176:            if( map->length > 0x01000000)
                    177:                map->length = 0x01000000;               // greed hack
                    178:            err = pmap_add_physical_memory( map->physical,
                    179:                                            map->physical + map->length, FALSE, PTE_WIMG_IO);
                    180:            if(err)
                    181:                kprintf("%s: pmap_add_physical_memory: %d for 0x%08x - 0x%08x\n",
                    182:                        logname, err, map->physical, map->physical + map->length);
                    183: #endif
                    184:        }
                    185:        if( err)
                    186:            continue;
                    187: 
                    188:        // NDRV aperture vectors
                    189:         [propTable deleteProperty:"AAPL,address"];
                    190:         err = [propTable createProperty:"AAPL,address" flags:0
                    191:                    value:aaplAddress length:(numMaps * sizeof( IOLogicalAddress))];
                    192:        if( err)
                    193:            continue;
                    194: 
                    195:        // interrupt tree for NDRVs - not really
                    196:        err = [propTable createProperty:"driver-ist" flags:0
                    197:                    value:intsProperty length:sizeof( intsProperty)];
                    198: 
                    199:        // tell kmDevice if it's on the boot console, it's going away
                    200:        if( consoleDevice)
                    201:            [kmId unregisterDisplay:nil];
                    202: 
                    203:        err = [self checkDriver];
                    204:        if( err) {
                    205:            kprintf("%s: Not usable\n", logname );
                    206:             if( err == -999)
                    207:                 IOLog("%s: Driver is incompatible.\n", logname );
                    208:            continue;
                    209:        }
                    210: 
                    211:        if (nil == [super initFromDeviceDescription:deviceDescription])
                    212:            continue;
                    213:        err = [self open];
                    214:        if( err)
                    215:            continue;
                    216: 
                    217: #if 0
                    218:        if ([self startIOThread] != IO_R_SUCCESS)
                    219:            kprintf("startIOThread FAIL\n");
                    220:        [self enableAllInterrupts];
                    221: #endif
                    222: 
                    223:        me = self;                      // Success
                    224: 
                    225:     } while( false);
                    226: 
                    227:     if( me == nil)
                    228:        [super free];
                    229: 
                    230:     return( me);
                    231: }
                    232: 
                    233: 
                    234: - free
                    235: {
                    236:     if (transferTable != 0) {
                    237:         IOFree(transferTable, 256 * sizeof( ColorSpec));
                    238:     }
                    239:     return [super free];
                    240: }
                    241: 
                    242: 
                    243: - (IOReturn)
                    244:     getDisplayModeTiming:(IOFBIndex)connectIndex mode:(IOFBDisplayModeID)modeID
                    245:                timingInfo:(IOFBTimingInformation *)info connectFlags:(UInt32 *)flags
                    246: {
                    247:     VDTimingInfoRec            timingInfo;
                    248:     OSStatus                   err;
                    249: 
                    250:     timingInfo.csTimingMode = modeID;
                    251:     timingInfo.csTimingFormat = kDeclROMtables;                        // in case the driver doesn't do it
                    252:     err = [self doStatus:cscGetModeTiming params:&timingInfo];
                    253:     if( err == noErr) {
                    254:        if( timingInfo.csTimingFormat == kDeclROMtables)
                    255:            info->standardTimingID = timingInfo.csTimingData;
                    256:        else
                    257:            info->standardTimingID = timingInvalid;
                    258:        *flags = timingInfo.csTimingFlags;
                    259:        return( [super getDisplayModeTiming:connectIndex mode:modeID timingInfo:info connectFlags:flags]);
                    260:     }
                    261:     *flags = 0;
                    262:     return( IO_R_UNDEFINED_MODE);
                    263: }
                    264: 
                    265: - (IOReturn)
                    266:     getDisplayModeByIndex:(IOFBIndex)modeIndex displayMode:(IOFBDisplayModeID *)displayModeID
                    267: {
                    268: 
                    269:     // unfortunately, there is no "kDisplayModeIDFindSpecific"
                    270:     if( modeIndex <= cachedModeIndex) {
                    271:        cachedModeID = kDisplayModeIDFindFirstResolution;
                    272:        cachedModeIndex = -1;
                    273:     }
                    274: 
                    275:     cachedVDResolution.csPreviousDisplayModeID = cachedModeID;
                    276: 
                    277:     while( 
                    278:           (noErr == [self doStatus:cscGetNextResolution params:&cachedVDResolution])
                    279:        && ((SInt32) cachedVDResolution.csDisplayModeID > 0) ) {
                    280: 
                    281:            cachedVDResolution.csPreviousDisplayModeID = cachedVDResolution.csDisplayModeID;
                    282: 
                    283:            if( modeIndex == ++cachedModeIndex) {
                    284:                cachedModeID            = cachedVDResolution.csDisplayModeID;
                    285:                *displayModeID          = cachedModeID;
                    286:                return( noErr);
                    287:            }
                    288:     }
                    289:     cachedModeIndex = 0x7fffffff;
                    290:     return( IO_R_UNDEFINED_MODE);
                    291: }
                    292: 
                    293: 
                    294: - (IOReturn)
                    295:     getResInfoForMode:(IOFBDisplayModeID)modeID info:(VDResolutionInfoRec **)theInfo
                    296: {
                    297: 
                    298:     *theInfo = &cachedVDResolution;
                    299: 
                    300:     if( cachedVDResolution.csDisplayModeID == modeID)
                    301:        return( noErr);
                    302: 
                    303:     cachedVDResolution.csPreviousDisplayModeID = kDisplayModeIDFindFirstResolution;
                    304: 
                    305:     while(
                    306:        (noErr == [self doStatus:cscGetNextResolution params:&cachedVDResolution])
                    307:     && ((SInt32) cachedVDResolution.csDisplayModeID > 0) )
                    308:     {
                    309:        cachedVDResolution.csPreviousDisplayModeID = cachedVDResolution.csDisplayModeID;
                    310:        if( cachedVDResolution.csDisplayModeID == modeID)
                    311:            return( noErr);
                    312:     }
                    313:     cachedVDResolution.csDisplayModeID = -1;
                    314:     return( IO_R_UNDEFINED_MODE);
                    315: }
                    316: 
                    317: - (IOReturn)
                    318:     getDisplayModeInformation:(IOFBDisplayModeID)modeID info:(IOFBDisplayModeInformation *)info 
                    319: {
                    320:     IOReturn                   err;
                    321:     VDResolutionInfoRec        *       resInfo;
                    322: 
                    323:     do {
                    324:        err = [self getResInfoForMode:modeID info:&resInfo];
                    325:        if( err)
                    326:            continue;
                    327:        info->displayModeID     = resInfo->csDisplayModeID;
                    328:        info->maxDepthIndex     = resInfo->csMaxDepthMode - kDepthMode1;
                    329:        info->nominalWidth      = resInfo->csHorizontalPixels;
                    330:        info->nominalHeight     = resInfo->csVerticalLines;
                    331:        info->refreshRate       = resInfo->csRefreshRate;
                    332:        return( noErr);
                    333:     } while( false);
                    334: 
                    335:     return( IO_R_UNDEFINED_MODE);
                    336: }
                    337: 
                    338: 
                    339: - (IOReturn)
                    340:     getPixelInformationForDisplayMode:(IOFBDisplayModeID)modeID andDepthIndex:(IOFBIndex)depthIndex
                    341:        pixelInfo:(IOFBPixelInformation *)info
                    342: {
                    343:     SInt32             err;
                    344: 
                    345:     VDVideoParametersInfoRec   pixelParams;
                    346:     VPBlock                    pixelInfo;
                    347:     VDResolutionInfoRec        *       resInfo;
                    348: 
                    349:     do {
                    350:        err = [self getResInfoForMode:modeID info:&resInfo];
                    351:        if( err)
                    352:            continue;
                    353:        pixelParams.csDisplayModeID = modeID;
                    354:        pixelParams.csDepthMode = depthIndex + kDepthMode1;
                    355:        pixelParams.csVPBlockPtr = &pixelInfo;
                    356:        err = [self doStatus:cscGetVideoParameters params:&pixelParams];
                    357:        if( err)
                    358:            continue;
                    359:     
                    360:        info->flags                     = 0;
                    361:        info->rowBytes                  = pixelInfo.vpRowBytes & 0x7fff;
                    362:        info->width                     = pixelInfo.vpBounds.right;
                    363:        info->height                    = pixelInfo.vpBounds.bottom;
                    364:        info->refreshRate               = resInfo->csRefreshRate;
                    365:        info->pageCount                 = 1;
                    366:        info->pixelType                 = (pixelInfo.vpPixelSize <= 8) ?
                    367:                                        kIOFBRGBCLUTPixelType : kIOFBDirectRGBPixelType;
                    368:        info->bitsPerPixel              = pixelInfo.vpPixelSize;
                    369: //     info->channelMasks              =    
                    370: 
                    371:     } while( false);
                    372: 
                    373:     return( err);
                    374: }
                    375: 
                    376: - (IOReturn) open
                    377: {
                    378:     IOReturn   err;
                    379: 
                    380:     do {
                    381:        err = [self checkDriver];
                    382:        if( err)
                    383:            continue;
                    384:        err = [super open];
                    385: 
                    386:     } while( false);
                    387: 
                    388:     return( err);
                    389: }
                    390: 
                    391: - (IOReturn) checkDriver
                    392: {
                    393:     OSStatus                   err = noErr;
                    394:     struct  DriverInitInfo     initInfo;
                    395:     CntrlParam                 pb;
                    396:     IOFBConfiguration          config;
                    397:     VDClutBehavior             clutSetting = kSetClutAtSetEntries;
                    398: 
                    399:     if( ndrvState == 0) {
                    400:        do {
                    401:            initInfo.refNum = 0xffcd;                   // ...sure.
                    402:            MAKE_REG_ENTRY(initInfo.deviceEntry, ioDevice)
                    403:     
                    404:            err = NDRVDoDriverIO( doDriverIO, 0, &initInfo, kInitializeCommand, kImmediateIOCommandKind );
                    405:            if( err) continue;
                    406:        
                    407:            err = NDRVDoDriverIO( doDriverIO, 0, &pb, kOpenCommand, kImmediateIOCommandKind );
                    408:            if( err) continue;
                    409:     
                    410:        } while( false);
                    411:        if( err)
                    412:            return( err);
                    413: 
                    414:        {
                    415:            VDVideoParametersInfoRec    pixelParams;
                    416:            VPBlock                     pixelInfo;
                    417:            VDResolutionInfoRec         vdRes;
                    418:            UInt32                      size;
                    419: 
                    420:            vramLength = 0;
                    421:            vdRes.csPreviousDisplayModeID = kDisplayModeIDFindFirstResolution;
                    422:            while(
                    423:                (noErr == [self doStatus:cscGetNextResolution params:&vdRes])
                    424:            && ((SInt32) vdRes.csDisplayModeID > 0) )
                    425:            {
                    426:     
                    427:                pixelParams.csDisplayModeID = vdRes.csDisplayModeID;
                    428:                pixelParams.csDepthMode = vdRes.csMaxDepthMode;
                    429:                pixelParams.csVPBlockPtr = &pixelInfo;
                    430:                err = [self doStatus:cscGetVideoParameters params:&pixelParams];
                    431:                if( err)
                    432:                    continue;
                    433: 
                    434:                 // Control hangs its framebuffer off the end of the aperture to support
                    435:                 // 832 x 624 @ 32bpp. The commented out version will correctly calculate
                    436:                // the vram length, but DPS needs the full extent to be mapped, so we'll
                    437:                 // end up mapping an extra page that will address vram through the little
                    438:                 // endian aperture. No other drivers like this known.
                    439: #if 1
                    440:                size = 0x40 + pixelInfo.vpBounds.bottom * (pixelInfo.vpRowBytes & 0x7fff);
                    441: #else
                    442:                size = ( (pixelInfo.vpBounds.right * pixelInfo.vpPixelSize) / 8)        // last line
                    443:                        + (pixelInfo.vpBounds.bottom - 1) * (pixelInfo.vpRowBytes & 0x7fff);
                    444: #endif
                    445:                if( size > vramLength)
                    446:                    vramLength = size;
                    447:     
                    448:                vdRes.csPreviousDisplayModeID = vdRes.csDisplayModeID;
                    449:            }
                    450:    
                    451:            err = [self getConfiguration:&config];
                    452:            vramBase = config.physicalFramebuffer;
                    453:            vramLength = (vramLength + (vramBase & 0xffff) + 0xffff) & 0xffff0000;
                    454:            vramBase &= 0xffff0000;
                    455: 
                    456: #if 1
                    457:            // Declare range for pmap'ing into user space
                    458:            // Shouldn't be here but it's too expensive to do it for all devices
                    459:            err = pmap_add_physical_memory( vramBase,
                    460:                                            vramBase + vramLength, FALSE, PTE_WIMG_IO);
                    461:            if(err)
                    462:                kprintf("%s: pmap_add_physical_memory: %d for 0x%08x - 0x%08x\n",
                    463:                        [self name], err, vramBase, vramBase + vramLength );
                    464: #endif
                    465:        }
                    466: 
                    467:        // Set CLUT immediately since there's no VBL.
                    468:        [self doControl:cscSetClutBehavior params:&clutSetting];
                    469: 
                    470:        ndrvState = 1;
                    471:     }
                    472:     return( noErr);
                    473: }
                    474: 
                    475: 
                    476: - (IOReturn)
                    477:     setDisplayMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex page:(IOFBIndex)pageIndex;
                    478: {
                    479:     SInt32             err;
                    480:     VDSwitchInfoRec    switchInfo;
                    481:     VDPageInfo         pageInfo;
                    482: 
                    483:     switchInfo.csData = modeID;
                    484:     switchInfo.csMode = depthIndex + kDepthMode1;
                    485:     switchInfo.csPage = pageIndex;
                    486:     err = [self doControl:cscSwitchMode params:&switchInfo];
                    487:     if(err)
                    488:        IOLog("%s: cscSwitchMode:%d\n",[self name],(int)err);
                    489: 
                    490:     // duplicate QD InitGDevice
                    491:     pageInfo.csMode = switchInfo.csMode;
                    492:     pageInfo.csData = 0;
                    493:     pageInfo.csPage = pageIndex;
                    494:     [self doControl:cscSetMode params:&pageInfo];
                    495:     [self doControl:cscGrayPage params:&pageInfo];
                    496: 
                    497:     return( err);
                    498: }
                    499: 
                    500: - (IOReturn)
                    501:     setStartupMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex;
                    502: {
                    503:     SInt32             err;
                    504:     VDSwitchInfoRec    switchInfo;
                    505: 
                    506:     switchInfo.csData = modeID;
                    507:     switchInfo.csMode = depthIndex + kDepthMode1;
                    508:     err = [self doControl:cscSavePreferredConfiguration params:&switchInfo];
                    509:     return( err);
                    510: }
                    511: 
                    512: - (IOReturn)
                    513:     getStartupMode:(IOFBDisplayModeID *)modeID depth:(IOFBIndex *)depthIndex
                    514: {
                    515:     SInt32             err;
                    516:     VDSwitchInfoRec    switchInfo;
                    517: 
                    518:     err = [self doStatus:cscGetPreferredConfiguration params:&switchInfo];
                    519:     if( err == noErr) {
                    520:        *modeID         = switchInfo.csData;
                    521:        *depthIndex     = switchInfo.csMode - kDepthMode1;
                    522:     }
                    523:     return( err);
                    524: }
                    525: 
                    526: 
                    527: - (IOReturn)
                    528:     getConfiguration:(IOFBConfiguration *)config;
                    529: {
                    530:     IOReturn           err;
                    531:     VDSwitchInfoRec    switchInfo;
                    532:     VDGrayRecord       grayRec;
                    533: 
                    534:     bzero( config, sizeof( IOFBConfiguration));
                    535: 
                    536:     grayRec.csMode = 0;                        // turn off luminance map
                    537:     err = [self doControl:cscSetGray params:&grayRec];
                    538:     if( (noErr == err) && (0 != grayRec.csMode))
                    539:         // driver refused => mono display
                    540:        config->flags |= kFBLuminanceMapped;
                    541: 
                    542:     err = [self doStatus:cscGetCurMode params:&switchInfo];
                    543:     config->displayMode                = switchInfo.csData;
                    544:     config->depth              = switchInfo.csMode - kDepthMode1;
                    545:     config->page               = switchInfo.csPage;
                    546:     config->physicalFramebuffer        = ((UInt32) switchInfo.csBaseAddr);
                    547:     config->mappedFramebuffer  = config->physicalFramebuffer;          // assuming 1-1
                    548: 
                    549:     return( err);
                    550: }
                    551: 
                    552: - (IOReturn)
                    553:     getApertureInformationByIndex:(IOFBIndex)apertureIndex
                    554:        apertureInfo:(IOFBApertureInformation *)apertureInfo
                    555: {
                    556:     IOReturn           err;
                    557: 
                    558:     if( apertureIndex == 0) {
                    559:        apertureInfo->physicalAddress   =       vramBase;
                    560:        apertureInfo->mappedAddress     =       vramBase;
                    561:        apertureInfo->length            =       vramLength;
                    562:        apertureInfo->cacheMode         =       0;
                    563:        apertureInfo->type              =       kIOFBGraphicsMemory;
                    564:        err = noErr;
                    565:     } else
                    566:        err = IO_R_UNDEFINED_MODE;
                    567: 
                    568:     return( err);
                    569: }
                    570: 
                    571: #if 0
                    572: 
                    573: - (IOReturn) getInterruptFunctionsTV:(UInt32)member
                    574:                        refCon:(void **)refCon,
                    575:                        handler:(TVector *) handler,
                    576:                        enabler:(TVector *) enabler,
                    577:                        disabler:(TVector *) disabler
                    578: 
                    579: {
                    580:     OSStatus   err;
                    581: 
                    582:     err = [interrupt getInterruptFunctionsTV:member refCon:refCon handler:handler
                    583:                        enabler:enabler disabler:disabler];
                    584:     return( err);
                    585: }
                    586: 
                    587: 
                    588: SInt32 StdIntHandler( InterruptSetMember setMember, void *refCon, UInt32 theIntCount)
                    589: {
                    590:     return( kIsrIsComplete);
                    591: }
                    592: void    StdIntEnabler( InterruptSetMember setMember, void *refCon)
                    593: {
                    594:     return;
                    595: }
                    596: Boolean StdIntDisabler( InterruptSetMember setMember, void *refCon)
                    597: {
                    598:     return( false);
                    599: }
                    600: 
                    601: 
                    602: - (IOReturn) setInterruptFunctionsTV:(UInt32)member
                    603:                        refCon:(void *)refCon,
                    604:                        handler:(TVector *) handler,
                    605:                        enabler:(TVector *) enabler,
                    606:                        disabler:(TVector *) disabler
                    607: {
                    608: 
                    609:    if( handler != NULL)
                    610:        currentIntHandler = handler;
                    611:    if( enabler != NULL)
                    612:        currentIntEnabler = enabler;
                    613:    if( disabler != NULL)
                    614:        currentIntDisabler = disabler;
                    615: 
                    616:     err = [interrupt setInterruptFunctions:member refCon:refCon handler:currentIntHandler
                    617:                        enabler:enabler disabler:disabler];
                    618: 
                    619: }
                    620: 
                    621: - (IOReturn) setInterruptFunctions:(UInt32)member
                    622:                        refCon:(void *)refCon,
                    623:                        handler:(InterruptHandler) handler,
                    624:                        enabler:(InterruptEnabler) enabler,
                    625:                        disabler:(InterruptDisabler) disabler
                    626: 
                    627: 
                    628: 
                    629: - (IOReturn) getInterruptFunctions:(UInt32)member
                    630:                        refCon:(void **)refCon,
                    631:                        handler:(InterruptHandler *) handler,
                    632:                        enabler:(InterruptEnabler *) enabler,
                    633:                        disabler:(InterruptDisabler *) disabler
                    634: 
                    635: #endif
                    636: 
                    637: //////////////////////////////////////////////////////////////////////////////////////////
                    638: 
                    639: - (IOReturn) getAppleSense:(IOFBIndex)connectIndex info:(IOFBAppleSenseInfo *)info;
                    640: {
                    641:     OSStatus                   err;
                    642:     VDDisplayConnectInfoRec    displayConnect;
                    643: 
                    644:     err = [self doStatus:cscGetConnection params:&displayConnect];
                    645:     if( err)
                    646:        return( err);
                    647: 
                    648:     if( displayConnect.csConnectFlags & ((1<<kReportsTagging) | (1<<kTaggingInfoNonStandard))
                    649:        != ((1<<kReportsTagging)) )
                    650: 
                    651:        err = IO_R_UNSUPPORTED;
                    652: 
                    653:     else {
                    654: //     info->standardDisplayType       = displayConnect.csDisplayType;
                    655:        info->primarySense      = displayConnect.csConnectTaggedType;
                    656:        info->extendedSense = displayConnect.csConnectTaggedData;
                    657:        if( (info->primarySense == 0) && (info->extendedSense == 6)) {
                    658:            info->primarySense          = kRSCSix;
                    659:            info->extendedSense         = kESCSixStandard;
                    660:        }
                    661:        if( (info->primarySense == 0) && (info->extendedSense == 4)) {
                    662:            info->primarySense          = kRSCFour;
                    663:            info->extendedSense         = kESCFourNTSC;
                    664:        }
                    665:     }
                    666:     return( err);
                    667: }
                    668: 
                    669: - (BOOL) hasDDCConnect:(IOFBIndex)connectIndex
                    670: {
                    671:     OSStatus                   err;
                    672:     VDDisplayConnectInfoRec    displayConnect;
                    673:     enum               {       kNeedFlags = (1<<kReportsDDCConnection) | (1<<kHasDDCConnection) };
                    674: 
                    675:     err = [self doStatus:cscGetConnection params:&displayConnect];
                    676:     if( err)
                    677:         return( NO);
                    678: 
                    679:     return( (displayConnect.csConnectFlags & kNeedFlags) == kNeedFlags );
                    680: }
                    681: 
                    682: - (IOReturn) getDDCBlock:(IOFBIndex)connectIndex blockNumber:(UInt32)num blockType:(OSType)type
                    683:        options:(UInt32)options data:(UInt8 *)data length:(ByteCount *)length
                    684: {
                    685:     OSStatus           err = 0;
                    686:     VDDDCBlockRec      ddcRec;
                    687:     ByteCount          actualLength = *length;
                    688: 
                    689:     ddcRec.ddcBlockNumber      = num;
                    690:     ddcRec.ddcBlockType        = type;
                    691:     ddcRec.ddcFlags            = options;
                    692: 
                    693:     err = [self doStatus:cscGetDDCBlock params:&ddcRec];
                    694: 
                    695:     if( err == noErr) {
                    696: 
                    697:        actualLength = (actualLength < kDDCBlockSize) ? actualLength : kDDCBlockSize;
                    698:         bcopy( ddcRec.ddcBlockData, data, actualLength);
                    699:        *length = actualLength;
                    700:     }
                    701:     return( err);
                    702: }
                    703: 
                    704: //////////////////////////////////////////////////////////////////////////////////////////
                    705: 
                    706: - (IOReturn)getIntValues:(unsigned *)parameterArray
                    707:                forParameter:(IOParameterName)parameterName
                    708:                count:(unsigned int *)count
                    709: {
                    710:        
                    711:     if (strcmp(parameterName, "IOGetTransferTable") == 0) {
                    712:        return( [self getTransferTable:&parameterArray[0] count:count] );
                    713: 
                    714:     } else
                    715:        return [super getIntValues:parameterArray
                    716:            forParameter:parameterName
                    717:            count:count];
                    718: }
                    719: 
                    720: 
                    721: 
                    722: //////////////////////////////////////////////////////////////////////////////////////////
                    723: // IOCallDeviceMethods:
                    724: 
                    725: // Should be in NDRV class?
                    726: - (IOReturn) IONDRVGetDriverName:(char *)outputParams size:(unsigned *) outputCount
                    727: {
                    728:     char *     name;
                    729:     UInt32     len, plen;
                    730: 
                    731:     name = theDriverDesc->driverOSRuntimeInfo.driverName;
                    732: 
                    733:     plen = *(name++);
                    734:     len = *outputCount - 1;
                    735:     *outputCount = plen + 1;
                    736:     if( plen < len)
                    737:        len = plen;
                    738:     strncpy( outputParams, name, len);
                    739:     outputParams[ len ] = 0;
                    740: 
                    741:     return( noErr);
                    742: }
                    743: 
                    744: - (IOReturn) IONDRVDoControl:(UInt32 *)inputParams inputSize:(unsigned) inputCount 
                    745:                params:(void *)outputParams outputSize:(unsigned *) outputCount
                    746:                privileged:(host_priv_t *)privileged
                    747: {
                    748:     IOReturn   err = noErr;
                    749:     UInt32     callSelect;
                    750: 
                    751:     if( privileged == NULL)
                    752:        err = IO_R_PRIVILEGE;
                    753:     else {
                    754:        callSelect = *inputParams;
                    755:        err = [self doControl:callSelect params:(inputParams + 1 )];
                    756:        bcopy( inputParams, outputParams, *outputCount);
                    757:     }
                    758:     return( err);
                    759: }
                    760: 
                    761: //////////////////////////////////////////////////////////////////////////////////////////
                    762: 
                    763: - (IOReturn) IONDRVDoStatus:(UInt32 *)inputParams inputSize:(unsigned) inputCount 
                    764:                params:(void *)outputParams outputSize:(unsigned *) outputCount
                    765: {
                    766:     IOReturn   err = noErr;
                    767:     UInt32     callSelect;
                    768: 
                    769:     callSelect = *inputParams;
                    770:     err = [self doStatus:callSelect params:(inputParams + 1 )];
                    771:     bcopy( inputParams, outputParams, *outputCount);
                    772:     return( err);
                    773: 
                    774: }
                    775: 
                    776: @end
                    777: 
                    778: //////////////////////////////////////////////////////////////////////////////////////////
                    779: // DACrap
                    780: 
                    781: @implementation IONDRVFramebuffer (ProgramDAC)
                    782: 
                    783: - setTheTable
                    784: {
                    785:     IOReturn   err;
                    786:     ColorSpec * table = transferTable;
                    787:     VDSetEntryRecord   setEntryRec;
                    788:     int                i, code;
                    789: 
                    790:     if( transferTableCount != 0) {
                    791:        if( brightnessLevel != EV_SCREEN_MAX_BRIGHTNESS) {
                    792:            if( !scaledTable)
                    793:                scaledTable = IOMalloc( 256 * sizeof( ColorSpec));
                    794:            if( scaledTable) {
                    795:                for( i = 0; i < transferTableCount; i++ ) {
                    796:                    scaledTable[ i ].rgb.red    = EV_SCALE_BRIGHTNESS( brightnessLevel, table[ i ].rgb.red);
                    797:                    scaledTable[ i ].rgb.green  = EV_SCALE_BRIGHTNESS( brightnessLevel, table[ i ].rgb.green);
                    798:                    scaledTable[ i ].rgb.blue   = EV_SCALE_BRIGHTNESS( brightnessLevel, table[ i ].rgb.blue);
                    799:                }
                    800:                table = scaledTable;
                    801:            }
                    802:        } else {
                    803:            if( scaledTable) {
                    804:                IOFree( scaledTable, transferTableCount * sizeof( ColorSpec));
                    805:                scaledTable = 0;
                    806:            }
                    807:        }
                    808: 
                    809:        setEntryRec.csTable = table;
                    810:        setEntryRec.csStart = 0;
                    811:        setEntryRec.csCount = transferTableCount - 1;
                    812:        if( [self displayInfo]->bitsPerPixel == IO_8BitsPerPixel)
                    813:            code = cscSetEntries;
                    814:        else
                    815:            code = cscDirectSetEntries;
                    816:        err = [self doControl:code params:&setEntryRec];
                    817:     }
                    818:     return self;
                    819: }
                    820: 
                    821: - setBrightness:(int)level token:(int)t
                    822: {
                    823:     if ((level < EV_SCREEN_MIN_BRIGHTNESS) || 
                    824:         (level > EV_SCREEN_MAX_BRIGHTNESS)){
                    825:             IOLog("Display: Invalid arg to setBrightness: %d\n",
                    826:                 level);
                    827:             return nil;
                    828:     }   
                    829:     brightnessLevel = level;    
                    830:     [self setTheTable];
                    831:     return self;
                    832: }
                    833: 
                    834: #define Expand8To16(x)  (((x) << 8) | (x))
                    835: 
                    836: 
                    837: - setTransferTable:(const unsigned int *)table count:(int)count
                    838: {
                    839: 
                    840: // no checking table count vs. depth ??
                    841: 
                    842:     int         k;
                    843:     IOBitsPerPixel  bpp;
                    844:     IOColorSpace    cspace;
                    845:     VDGammaRecord              gammaRec;
                    846: 
                    847:     bpp = [self displayInfo]->bitsPerPixel;
                    848:     cspace = [self displayInfo]->colorSpace;
                    849: 
                    850:     if( table) {
                    851:         transferTableCount = count;
                    852:         if (bpp == IO_8BitsPerPixel && cspace == IO_OneIsWhiteColorSpace) {
                    853:             for (k = 0; k < count; k++) {
                    854:                 transferTable[k].rgb.red = transferTable[k].rgb.green = transferTable[k].rgb.blue
                    855:                     = Expand8To16(table[k] & 0xFF);
                    856:             }
                    857:         } else if (cspace == IO_RGBColorSpace &&
                    858:             ((bpp == IO_8BitsPerPixel) ||
                    859:             (bpp == IO_15BitsPerPixel) ||
                    860:             (bpp == IO_24BitsPerPixel))) {
                    861:             for (k = 0; k < count; k++) {
                    862:                 transferTable[k].rgb.red    = Expand8To16((table[k] >> 24) & 0xFF);
                    863:                 transferTable[k].rgb.green  = Expand8To16((table[k] >> 16) & 0xFF);
                    864:                 transferTable[k].rgb.blue   = Expand8To16((table[k] >>  8) & 0xFF);
                    865:             }
                    866:         } else {
                    867:             transferTableCount = 0;
                    868:         }
                    869:     }
                    870: 
                    871:     if( NO == gammaKilled) {
                    872:        gammaRec.csGTable = 0;
                    873:        [self doControl:cscSetGamma params:&gammaRec];
                    874:        gammaKilled = YES;
                    875:     }
                    876: 
                    877:     [self setTheTable];
                    878:     return self;
                    879: }
                    880: 
                    881: - (IOReturn)getTransferTable:(unsigned int *)table count:(int *)count
                    882: {
                    883:     int        k;
                    884: 
                    885:     if( *count != transferTableCount)
                    886:        return( IO_R_INVALID_ARG);
                    887: 
                    888:     for (k = 0; k < transferTableCount; k++) {
                    889:        table[k] = ((transferTable[k].rgb.red << 16) & 0xff000000)
                    890:                |  ((transferTable[k].rgb.green << 8) & 0xff0000)
                    891:                |  ((transferTable[k].rgb.blue) & 0xff00)
                    892:                |  ((transferTable[k].rgb.blue >> 8) & 0xff);
                    893:     }
                    894:     return( IO_R_SUCCESS);
                    895: }
                    896: 
                    897: // Apple style CLUT - pass thru gamma table
                    898: 
                    899: - (IOReturn)
                    900:     setCLUT:(IOFBColorEntry *) colors index:(UInt32)index numEntries:(UInt32)numEntries 
                    901:        brightness:(IOFixed)brightness options:(IOOptionBits)options
                    902: {
                    903:     IOReturn           err;
                    904:     VDSetEntryRecord   setEntryRec;
                    905:     int                        code;
                    906: 
                    907:     setEntryRec.csTable = (ColorSpec *)colors;
                    908:     setEntryRec.csStart = index;
                    909:     setEntryRec.csCount = numEntries - 1;
                    910:     if( [self displayInfo]->bitsPerPixel == IO_8BitsPerPixel)
                    911:        code = cscSetEntries;
                    912:     else
                    913:        code = cscDirectSetEntries;
                    914:     err = [self doControl:code params:&setEntryRec];
                    915: 
                    916:     return( err);
                    917: 
                    918: }
                    919: 
                    920: #if 0
                    921: - (void) interruptOccurred
                    922: {
                    923:     kprintf("\n[%s]\n", [self name]);
                    924:     [self enableAllInterrupts];
                    925: }
                    926: #endif
                    927: 
                    928: @end
                    929: 
                    930: //////////////////////////////////////////////////////////////////////////////////////////
                    931: 
                    932: // OpenFirmware shim
                    933: 
                    934: enum { kTheDisplayMode = 10 };
                    935: 
                    936: @implementation IOOFFramebuffer
                    937: 
                    938: //=======================================================================
                    939: 
                    940: - initFromDeviceDescription:(IOPCIDevice *) ioDevice
                    941: {
                    942:     id                 me = nil;
                    943:     kern_return_t      err = 0;
                    944:     UInt32             i;
                    945:     UInt32             numMaps = 8;
                    946:     IOApertureInfo     maps[ numMaps ];        // FIX
                    947:     IOApertureInfo   * map;
                    948: 
                    949:     do {
                    950:        numMaps = 8;
                    951:        err = [ioDevice getApertures:maps items:&numMaps];
                    952:        if( err)
                    953:            continue;
                    954:     
                    955:        err = -1;
                    956:        for( i = 0, map = maps; i < numMaps; i++, map++) {
                    957: 
                    958:            if( (((UInt32)bootDisplayInfo.frameBuffer) >= ((UInt32)map->physical))
                    959:            &&  (((UInt32)bootDisplayInfo.frameBuffer) < (map->length + (UInt32)map->physical)) ) {
                    960: 
                    961:                // Declare range for pmap'ing into user space
                    962:                // Shouldn't be here but it's too expensive to do it for all devices
                    963:                err = pmap_add_physical_memory( map->physical,
                    964:                                                map->physical + map->length, FALSE, PTE_WIMG_IO);
                    965:                if(err)
                    966:                    kprintf("%s: pmap_add_physical_memory:%d for 0x%08x - 0x%08x\n",
                    967:                            [self name], err, map->physical, map->physical + map->length);
                    968:            }
                    969:        }
                    970:        if( err)
                    971:            continue;
                    972: 
                    973:        if (nil == [super initFromDeviceDescription:ioDevice])
                    974:            continue;
                    975:        err = [self open];
                    976:        if( err)
                    977:            continue;
                    978: 
                    979:        me = self;                      // Success
                    980: 
                    981:     } while( false);
                    982: 
                    983:     if( me == nil)
                    984:        [super free];
                    985: 
                    986:     return( me);
                    987: }
                    988: 
                    989: - (IOReturn)
                    990:     getDisplayModeByIndex:(IOFBIndex)modeIndex displayMode:(IOFBDisplayModeID *)displayModeID
                    991: {
                    992:     if( modeIndex)
                    993:        return( IO_R_UNDEFINED_MODE);
                    994:     *displayModeID = kTheDisplayMode;
                    995:     return( noErr);
                    996: }
                    997: 
                    998: - (IOReturn)
                    999:     getDisplayModeInformation:(IOFBDisplayModeID)modeID info:(IOFBDisplayModeInformation *)info 
                   1000: {
                   1001:     if( modeID == kTheDisplayMode) {
                   1002:        info->displayModeID     = modeID;
                   1003:        info->maxDepthIndex     = 0;
                   1004:        info->nominalWidth      = bootDisplayInfo.width;
                   1005:        info->nominalHeight     = bootDisplayInfo.height;
                   1006:        info->refreshRate       = bootDisplayInfo.refreshRate << 16;
                   1007:        return( noErr);
                   1008:     }
                   1009:     return( IO_R_UNDEFINED_MODE);
                   1010: }
                   1011: 
                   1012: 
                   1013: - (IOReturn)
                   1014:     getPixelInformationForDisplayMode:(IOFBDisplayModeID)modeID andDepthIndex:(IOFBIndex)depthIndex
                   1015:        pixelInfo:(IOFBPixelInformation *)info
                   1016: {
                   1017: 
                   1018:     if( (modeID == kTheDisplayMode) && (depthIndex == 0)) {
                   1019:     
                   1020:        info->flags                     = 0;
                   1021:        info->rowBytes                  = bootDisplayInfo.rowBytes;
                   1022:        info->width                     = bootDisplayInfo.width;
                   1023:        info->height                    = bootDisplayInfo.height;
                   1024:        info->refreshRate               = bootDisplayInfo.refreshRate << 16;
                   1025:        info->pageCount                 = 1;
                   1026:        info->pixelType                 = kIOFBRGBCLUTPixelType;
                   1027:        info->bitsPerPixel              = 8;
                   1028: //     info->channelMasks              =    
                   1029:        return( noErr);
                   1030:     }
                   1031:     return( IO_R_UNDEFINED_MODE);
                   1032: }
                   1033: 
                   1034: - (IOReturn)
                   1035:     setDisplayMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex page:(IOFBIndex)pageIndex
                   1036: {
                   1037:     if( (modeID == kTheDisplayMode) && (depthIndex == 0) && (pageIndex == 0) )
                   1038:        return( noErr);
                   1039:     else
                   1040:        return( IO_R_UNDEFINED_MODE);
                   1041: }
                   1042: 
                   1043: 
                   1044: - (IOReturn)
                   1045:     getStartupMode:(IOFBDisplayModeID *)modeID depth:(IOFBIndex *)depthIndex
                   1046: {
                   1047:     *modeID            = kTheDisplayMode;
                   1048:     *depthIndex                = 0;
                   1049: 
                   1050:     return( noErr);
                   1051: }
                   1052: 
                   1053: 
                   1054: - (IOReturn)
                   1055:     getConfiguration:(IOFBConfiguration *)config
                   1056: {
                   1057:     bzero( config, sizeof( IOFBConfiguration));
                   1058: 
                   1059:     config->displayMode                = kTheDisplayMode;
                   1060:     config->depth              = 0;
                   1061:     config->page               = 0;
                   1062:     config->physicalFramebuffer        = (IOPhysicalAddress) bootDisplayInfo.frameBuffer;
                   1063:     config->mappedFramebuffer  = (IOVirtualAddress) bootDisplayInfo.frameBuffer;               // assuming 1-1
                   1064: 
                   1065:     return( noErr);
                   1066: }
                   1067: 
                   1068: - (IOReturn)
                   1069:     getDisplayModeTiming:(IOFBIndex)connectIndex mode:(IOFBDisplayModeID)modeID
                   1070:                 timingInfo:(IOFBTimingInformation *)info connectFlags:(UInt32 *)flags
                   1071: {
                   1072: 
                   1073:     info->standardTimingID = timingInvalid;
                   1074:     if( modeID == kTheDisplayMode) {
                   1075:         *flags = kDisplayModeValidFlag | kDisplayModeSafeFlag | kDisplayModeDefaultFlag;
                   1076:         return( noErr);
                   1077:     } else {
                   1078:         *flags = 0;
                   1079:         return( IO_R_UNDEFINED_MODE);
                   1080:     }
                   1081: }
                   1082: 
                   1083: 
                   1084: - setBrightness:(int)level token:(int)t
                   1085: {
                   1086:     return self;
                   1087: }
                   1088: 
                   1089: - setTransferTable:(const unsigned int *)table count:(int)count
                   1090: {
                   1091:     return self;
                   1092: }
                   1093: 
                   1094: - (IOReturn)getIntValues:(unsigned *)parameterArray
                   1095:                forParameter:(IOParameterName)parameterName
                   1096:                count:(unsigned int *)count
                   1097: {
                   1098:     const UInt8 *      clut;
                   1099:     int                        i;
                   1100:     extern const UInt8  appleClut8[ 256 * 3 ];
                   1101: 
                   1102:     if( (0 == strcmp(parameterName, "IOGetTransferTable"))
                   1103:        && (*count == 256)) {
                   1104:        for( clut = appleClut8, i = 0; i < 256; i++, clut += 3)
                   1105:            *(parameterArray++) = (clut[0] << 24) | (clut[1] << 16) | (clut[3] << 8) | 0xff;
                   1106:        return( noErr);
                   1107: 
                   1108:     } else
                   1109:        return [super getIntValues:parameterArray
                   1110:            forParameter:parameterName
                   1111:            count:count];
                   1112: }
                   1113: 
                   1114: @end
                   1115: 
                   1116: //////////////////////////////////////////////////////////////////////////////////////////
                   1117: 
                   1118: // ATI patches. getStartupMode doesn't.
                   1119: 
                   1120: @implementation IOATINDRV
                   1121: 
                   1122: - (IOReturn)
                   1123:     getStartupMode:(IOFBDisplayModeID *)modeID depth:(IOFBIndex *)depthIndex
                   1124: {
                   1125: 
                   1126:     IOReturn           err;
                   1127:     UInt16     *       nvram;
                   1128:     ByteCount          propSize = 8;
                   1129: 
                   1130:     err = [[ioDevice propertyTable] getProperty:"Sime" flags:kReferenceProperty
                   1131:                value:(void *)&nvram length:&propSize];
                   1132:     if( err == noErr) {
                   1133:        *modeID = nvram[ 0 ];   // 1 is physDisplayMode
                   1134:        *depthIndex = nvram[ 2 ] - kDepthMode1;
                   1135:     }
                   1136:     return( err);
                   1137: }
                   1138: 
                   1139: @end
                   1140: 
                   1141: // ix3D patches
                   1142: 
                   1143: @implementation IOIX3DNDRV
                   1144: 
                   1145: enum {
                   1146:        kPantherOff_Regs                = 0x06000000L,
                   1147:         kPantherOff_SSTATUS            = 0x000000ECL,
                   1148: };
                   1149: 
                   1150: void regwNoswap( volatile UInt8 * io, UInt32 regindex, UInt32 regdata) {
                   1151: 
                   1152:     *((UInt32 *)(io + regindex)) = (regdata);
                   1153:     __asm__ volatile("eieio");
                   1154: }
                   1155: 
                   1156: void
                   1157: ix3dInterruptHandler( void * interrupt, void * istate, IOIX3DNDRV * vars )
                   1158: {
                   1159:     regwNoswap(vars->panther, kPantherOff_SSTATUS, 0x30 );
                   1160: 
                   1161:     IOEnableInterrupt( interrupt);
                   1162: }
                   1163: 
                   1164: - (BOOL) getHandler:(IOInterruptHandler *)handler
                   1165:               level:(unsigned int *)ipl
                   1166:           argument:(unsigned int *) arg
                   1167:        forInterrupt:(unsigned int) localInterrupt
                   1168: {
                   1169:     *handler = (IOInterruptHandler) ix3dInterruptHandler;
                   1170:     *ipl = 30;
                   1171:     *arg = (unsigned int)self;
                   1172: 
                   1173:     return( YES);
                   1174: }
                   1175: 
                   1176: - (IOReturn)
                   1177:     setDisplayMode:(IOFBDisplayModeID)modeID depth:(IOFBIndex)depthIndex page:(IOFBIndex)pageIndex
                   1178: {
                   1179:     IOReturn                   err;
                   1180: 
                   1181:     [self disableInterrupt:0];
                   1182:     err = [super setDisplayMode:modeID depth:depthIndex page:pageIndex];
                   1183:     [self enableInterrupt:0];
                   1184:     return( err);
                   1185: }
                   1186: 
                   1187: - (IOReturn) open
                   1188: {
                   1189:     IOReturn                   err;
                   1190:     IOFBConfiguration          config;
                   1191: 
                   1192:     err = [super open];
                   1193:     if( err == noErr) {
                   1194:         [self getConfiguration:&config];
                   1195:         panther = (volatile UInt8 *)(((UInt32)config.mappedFramebuffer) & 0xffff0000)
                   1196:                        + kPantherOff_Regs;
                   1197:        [self enableInterrupt:0];
                   1198:     }
                   1199:     return( err);
                   1200: }
                   1201: 
                   1202: @end
                   1203: 
                   1204: 
                   1205: 

unix.superglobalmegacorp.com

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