Annotation of XNU/iokit/Families/IOGraphics/IOFramebuffer.cpp, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * Copyright (c) 1998 Apple Computer, Inc.  All rights reserved. 
                     24:  *
                     25:  * HISTORY
                     26:  *
                     27:  * 01 Sep 92   Portions from Joe Pasqua, Created. 
                     28:  */
                     29: 
                     30: 
                     31: #include <IOKit/IOLib.h>
                     32: #include <libkern/c++/OSContainers.h>
                     33: 
                     34: #include <IOKit/IOWorkLoop.h>
                     35: #include <IOKit/IOInterruptEventSource.h>
                     36: #include <IOKit/IOPlatformExpert.h>
                     37: #include <IOKit/IOBufferMemoryDescriptor.h>
                     38: 
                     39: #define IOFRAMEBUFFER_PRIVATE
                     40: #include <IOKit/graphics/IOFramebuffer.h>
                     41: #include <IOKit/graphics/IODisplay.h>
                     42: 
                     43: #include "IOFramebufferUserClient.h"
                     44: #include "IODisplayWrangler.h"
                     45: #include "IOFramebufferReallyPrivate.h"
                     46: 
                     47: #include <string.h>
                     48: #include <IOKit/assert.h>
                     49: 
                     50: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     51: 
                     52: #undef super
                     53: #define super IOGraphicsDevice
                     54: 
                     55: OSDefineMetaClass( IOFramebuffer, IOGraphicsDevice )
                     56: OSDefineAbstractStructors( IOFramebuffer, IOGraphicsDevice )
                     57: 
                     58: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     59: 
                     60: #define        GetShmem(instance)      ((StdFBShmem_t *)(instance->priv))
                     61: 
                     62: #define CLEARSEMA(shmem)       ev_unlock(&shmem->cursorSema)
                     63: #define SETSEMA(shmem)         \
                     64:         if (!ev_try_lock(&shmem->cursorSema)) return;
                     65: #define TOUCHBOUNDS(one, two) \
                     66:         (((one.minx < two.maxx) && (two.minx < one.maxx)) && \
                     67:         ((one.miny < two.maxy) && (two.miny < one.maxy)))
                     68: 
                     69: /*
                     70:  * Cursor rendering
                     71:  */
                     72: 
                     73: #include "IOCursorBlits.h"
                     74: 
                     75: inline void IOFramebuffer::StdFBDisplayCursor( IOFramebuffer * inst )
                     76: {
                     77:     StdFBShmem_t *shmem;
                     78:     Bounds saveRect;
                     79:     volatile unsigned char *vramPtr;   /* screen data pointer */
                     80:     unsigned int cursStart;
                     81:     unsigned int cursorWidth;
                     82:     int width;
                     83:     int height;
                     84: 
                     85:     shmem = GetShmem(inst);
                     86:     saveRect = shmem->cursorRect;
                     87:     /* Clip saveRect vertical within screen bounds */
                     88:     if (saveRect.miny < shmem->screenBounds.miny)
                     89:         saveRect.miny = shmem->screenBounds.miny;
                     90:     if (saveRect.maxy > shmem->screenBounds.maxy)
                     91:         saveRect.maxy = shmem->screenBounds.maxy;
                     92:     if (saveRect.minx < shmem->screenBounds.minx)
                     93:         saveRect.minx = shmem->screenBounds.minx;
                     94:     if (saveRect.maxx > shmem->screenBounds.maxx)
                     95:         saveRect.maxx = shmem->screenBounds.maxx;
                     96:     shmem->saveRect = saveRect; /* Remember save rect for RemoveCursor */
                     97: 
                     98:     vramPtr = inst->frameBuffer +
                     99:         (inst->rowBytes * (saveRect.miny - shmem->screenBounds.miny)) +
                    100:         (inst->bytesPerPixel * (saveRect.minx - shmem->screenBounds.minx));
                    101: 
                    102:     width = saveRect.maxx - saveRect.minx;
                    103:     height = saveRect.maxy - saveRect.miny;
                    104:     cursorWidth = shmem->cursorSize[shmem->frame].width;
                    105: 
                    106:     cursStart = (saveRect.miny - shmem->cursorRect.miny) * cursorWidth +
                    107:                 (saveRect.minx - shmem->cursorRect.minx);
                    108: 
                    109:     if( inst->cursorBlitProc)
                    110:         inst->cursorBlitProc( inst,
                    111:                    (void *) shmem,
                    112:                     vramPtr,
                    113:                     cursStart,
                    114:                     inst->totalWidth - width,   /* vramRow */
                    115:                     cursorWidth - width,       /* cursRow */
                    116:                     width,
                    117:                     height);
                    118: }
                    119: 
                    120: // Description:        RemoveCursor erases the cursor by replacing the background
                    121: //             image that was saved by the previous call to DisplayCursor.
                    122: //             If the frame buffer is cacheable, flush at the end of the
                    123: //             drawing operation.
                    124: 
                    125: inline void IOFramebuffer::StdFBRemoveCursor( IOFramebuffer * inst )
                    126: {
                    127:     StdFBShmem_t *shmem;
                    128:     volatile unsigned char *vramPtr;   /* screen data pointer */
                    129:     unsigned int vramRow;
                    130:     int width;
                    131:     int height;
                    132: 
                    133:     shmem = GetShmem(inst);
                    134:         
                    135:     vramRow = inst->totalWidth;        /* Scanline width in pixels */
                    136: 
                    137:     vramPtr = inst->frameBuffer +
                    138:         (inst->rowBytes * (shmem->saveRect.miny - shmem->screenBounds.miny))
                    139:        + (inst->bytesPerPixel *
                    140:                (shmem->saveRect.minx - shmem->screenBounds.minx));
                    141: 
                    142:     width = shmem->saveRect.maxx - shmem->saveRect.minx;
                    143:     height = shmem->saveRect.maxy - shmem->saveRect.miny;
                    144:     vramRow -= width;
                    145: 
                    146:     if( inst->cursorRemoveProc)
                    147:         inst->cursorRemoveProc( inst, (void *)shmem,
                    148:                                vramPtr, vramRow, width, height);
                    149: }
                    150: 
                    151: inline void IOFramebuffer::RemoveCursor( IOFramebuffer * inst )
                    152: {
                    153:     StdFBShmem_t *     shmem = GetShmem(inst);
                    154: 
                    155:     if( shmem->hardwareCursorActive ) {
                    156:         Point *                hs;
                    157: 
                    158:         hs = &shmem->hotSpot[shmem->frame];
                    159:        inst->setCursorState(
                    160:                shmem->cursorLoc.x - hs->x - shmem->screenBounds.minx,
                    161:                shmem->cursorLoc.y - hs->y - shmem->screenBounds.miny, false );
                    162:     } else
                    163:         StdFBRemoveCursor(inst);
                    164: }
                    165: 
                    166: inline void IOFramebuffer::DisplayCursor( IOFramebuffer * inst )
                    167: {
                    168:     Point       *      hs;
                    169:     StdFBShmem_t *     shmem = GetShmem(inst);
                    170:     SInt32             x, y;
                    171: 
                    172:     hs = &shmem->hotSpot[shmem->frame];
                    173:     x  = shmem->cursorLoc.x - hs->x;
                    174:     y  = shmem->cursorLoc.y - hs->y;
                    175: 
                    176:     if( shmem->hardwareCursorActive )
                    177:        inst->setCursorState( x - shmem->screenBounds.minx,
                    178:                                y - shmem->screenBounds.miny, true );
                    179:     else {
                    180:         shmem->cursorRect.maxx = (shmem->cursorRect.minx = x)
                    181:                + shmem->cursorSize[shmem->frame].width;
                    182:         shmem->cursorRect.maxy = (shmem->cursorRect.miny = y)
                    183:                + shmem->cursorSize[shmem->frame].height;
                    184:         StdFBDisplayCursor(inst);
                    185:         shmem->oldCursorRect = shmem->cursorRect;
                    186:     }
                    187: }
                    188: 
                    189: inline void IOFramebuffer::SysHideCursor( IOFramebuffer * inst )
                    190: {
                    191:     if (!GetShmem(inst)->cursorShow++)
                    192:        RemoveCursor(inst);
                    193: }
                    194: 
                    195: inline void IOFramebuffer::SysShowCursor( IOFramebuffer * inst )
                    196: {
                    197:     StdFBShmem_t *shmem;
                    198:     
                    199:     shmem = GetShmem(inst);
                    200: 
                    201:     if (shmem->cursorShow)
                    202:        if (!--(shmem->cursorShow))
                    203:            DisplayCursor(inst);
                    204: }
                    205: 
                    206: inline void IOFramebuffer::CheckShield( IOFramebuffer * inst )
                    207: {
                    208:     Point *            hs;
                    209:     int                intersect;
                    210:     Bounds             tempRect;
                    211:     StdFBShmem_t *     shmem = GetShmem(inst);
                    212:     
                    213:     /* Calculate temp cursorRect */
                    214:     hs = &shmem->hotSpot[shmem->frame];
                    215:     tempRect.maxx = (tempRect.minx = (shmem->cursorLoc).x - hs->x)
                    216:                                   + shmem->cursorSize[shmem->frame].width;
                    217:     tempRect.maxy = (tempRect.miny = (shmem->cursorLoc).y - hs->y)
                    218:                                   + shmem->cursorSize[shmem->frame].height;
                    219: 
                    220:     intersect = TOUCHBOUNDS(tempRect, shmem->shieldRect);
                    221:     if (intersect != shmem->shielded)
                    222:        (shmem->shielded = intersect) ?
                    223:            SysHideCursor(inst) : SysShowCursor(inst);
                    224: }
                    225: 
                    226: /**
                    227:  ** external methods
                    228:  **/
                    229: 
                    230: void IOFramebuffer::setupCursor( IOPixelInformation * info )
                    231: {
                    232:     StdFBShmem_t *             shmem   = GetShmem(this);
                    233:     volatile unsigned char *   bits;
                    234:     IOByteCount                        cursorImageBytes;
                    235: 
                    236:     rowBytes = info->bytesPerRow;
                    237:     totalWidth = (rowBytes * 8) / info->bitsPerPixel;
                    238:     bytesPerPixel = info->bitsPerPixel / 8;
                    239:     frameBuffer = (volatile unsigned char *) vramMap->getVirtualAddress();
                    240: 
                    241: #ifdef __i386__
                    242: {
                    243: // FIX!!!
                    244:     extern void * vid_start;
                    245:     frameBuffer = (volatile unsigned char *) vid_start;
                    246: }
                    247: #endif
                    248: 
                    249:     if( shmem) {
                    250:         // a default if no one calls IOFBSetBounds()
                    251:         shmem->screenBounds.maxx = info->activeWidth;
                    252:         shmem->screenBounds.maxy = info->activeHeight;
                    253: 
                    254:         cursorImageBytes = maxCursorSize.width * maxCursorSize.height
                    255:                             * bytesPerPixel;
                    256:         bits = shmem->cursor;
                    257:         for( int i = 0; i < kIOFBNumCursorFrames; i++ ) {
                    258:             cursorImages[i] = bits;
                    259:             bits += cursorImageBytes;
                    260:            shmem->cursorSize[i] = maxCursorSize;
                    261:         }
                    262:         if( info->bitsPerPixel <= 8) {
                    263:             for( int i = 0; i < kIOFBNumCursorFrames; i++ ) {
                    264:                 cursorMasks[i] = bits;
                    265:                 bits += cursorImageBytes;
                    266:             }
                    267:         }
                    268:         cursorSave = bits;
                    269:     }
                    270: 
                    271:     switch( info->bitsPerPixel) {
                    272:         case 8:
                    273:             if( colorConvert.t._bm256To38SampleTable
                    274:              && colorConvert.t._bm38To256SampleTable) {
                    275:                 cursorBlitProc = (CursorBlitProc) StdFBDisplayCursor8P;
                    276:                 cursorRemoveProc = (CursorRemoveProc) StdFBRemoveCursor8;
                    277:             }
                    278:             break;
                    279:         case 16:
                    280:             if( colorConvert.t._bm34To35SampleTable
                    281:              && colorConvert.t._bm35To34SampleTable) {
                    282:                 cursorBlitProc = (CursorBlitProc) StdFBDisplayCursor555;
                    283:                 cursorRemoveProc = (CursorRemoveProc) StdFBRemoveCursor16;
                    284:             }
                    285:             break;
                    286:         case 32:
                    287:             if( colorConvert.t._bm256To38SampleTable
                    288:              && colorConvert.t._bm38To256SampleTable) {
                    289:                 cursorBlitProc = (CursorBlitProc) StdFBDisplayCursor32Axxx;
                    290:                 cursorRemoveProc = (CursorRemoveProc) StdFBRemoveCursor32;
                    291:             }
                    292:             break;
                    293:         default:
                    294:             IOLog("%s: can't do cursor at depth %ld\n",
                    295:                getName(), info->bitsPerPixel);
                    296:             cursorBlitProc = (CursorBlitProc) NULL;
                    297:             cursorRemoveProc = (CursorRemoveProc) NULL;
                    298:             break;
                    299:     }
                    300: }
                    301: 
                    302: void IOFramebuffer::stopCursor( void )
                    303: {
                    304:     cursorBlitProc = (CursorBlitProc) NULL;
                    305:     cursorRemoveProc = (CursorRemoveProc) NULL;
                    306: }
                    307: 
                    308: IOReturn IOFramebuffer::createSharedCursor(
                    309:                int shmemVersion, int maxWidth, int maxHeight )
                    310: {
                    311:     StdFBShmem_t *             shmem;
                    312:     IOByteCount                        size, maxImageSize;
                    313: 
                    314:     kprintf("createSharedCursor vers = %d, %d x %d\n",
                    315:        shmemVersion, maxWidth, maxHeight);
                    316: 
                    317:     if( shmemVersion != kIOFBCurrentShmemVersion)
                    318:        return( kIOReturnUnsupported);
                    319: 
                    320:     shmemClientVersion = shmemVersion;
                    321:     if( sharedCursor) {
                    322:        sharedCursor->release();
                    323:        priv = 0;
                    324:     }
                    325: 
                    326:     maxImageSize = (maxWidth * maxHeight * kIOFBMaxCursorDepth) / 8;
                    327: 
                    328:     size = sizeof( StdFBShmem_t)
                    329:         + ((kIOFBNumCursorFrames + 1) * maxImageSize);
                    330: 
                    331:     sharedCursor = IOBufferMemoryDescriptor::withCapacity(
                    332:                        round_page(size), kIODirectionNone, false );
                    333:     if( !sharedCursor)
                    334:         return( kIOReturnNoMemory );
                    335:     sharedCursor->setLength( size );
                    336: 
                    337:     shmem = (StdFBShmem_t *) sharedCursor->getBytesNoCopy();
                    338:     priv = shmem;
                    339: 
                    340:     // Init shared memory area
                    341:     bzero( shmem, size );
                    342:     shmem->version = kIOFBCurrentShmemVersion;
                    343:     shmem->structSize = size;
                    344:     shmem->cursorShow = 1;
                    345:     shmem->hardwareCursorCapable = haveHWCursor;
                    346: 
                    347:     maxCursorSize.width = maxWidth;
                    348:     maxCursorSize.height = maxHeight;
                    349: 
                    350:     doSetup( false );
                    351: 
                    352:     return( kIOReturnSuccess);
                    353: }
                    354: 
                    355: IOReturn IOFramebuffer::setBoundingRect( Bounds * bounds )
                    356: {
                    357:     StdFBShmem_t *shmem;
                    358: 
                    359:     shmem = GetShmem(this);
                    360:     if( NULL == shmem)
                    361:        return( kIOReturnUnsupported);
                    362: 
                    363:     shmem->screenBounds = *bounds;
                    364: 
                    365:     return( kIOReturnSuccess);
                    366: }
                    367: 
                    368: /**
                    369:  ** IOUserClient methods
                    370:  **/
                    371: 
                    372: IOReturn IOFramebuffer::newUserClient(  task_t         owningTask,
                    373:                                         void *                 security_id,
                    374:                                         UInt32         type,
                    375:                                         IOUserClient **        handler )
                    376: 
                    377: {
                    378: #if 1
                    379:     static UInt8 data[] = { 0x00, 0x03, 0x04, 0x07, 0x08, 0x0b, 0x0c, 0x0f,
                    380:                             0x10, 0x13, 0x14, 0x17, 0x18, 0x1b, 0x1c, 0x1f,
                    381: 
                    382:                            0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03,
                    383:                            0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07,
                    384:                            0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0b, 0x0b,
                    385:                            0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0e, 0x0f, 0x0f };
                    386:     colorConvert.t._bm34To35SampleTable = data;
                    387:     colorConvert.t._bm35To34SampleTable = data + 16;
                    388: #endif
                    389: 
                    390:     IOReturn           err = kIOReturnSuccess;
                    391:     IOUserClient *     newConnect = 0;
                    392:     IOUserClient *     theConnect = 0;
                    393: 
                    394:     switch( type ) {
                    395: 
                    396:         case kIOFBServerConnectType:
                    397:             if( serverConnect)
                    398:                 err = kIOReturnExclusiveAccess;
                    399:             else {
                    400: 
                    401:                 if( isConsoleDevice())
                    402:                     getPlatform()->setConsoleInfo( 0, kPEReleaseScreen);
                    403: 
                    404:                err = IODisplayWrangler::clientStart( this );
                    405:                if( kIOReturnSuccess == err)
                    406:                     newConnect = IOFramebufferUserClient::withTask(owningTask);
                    407:            }
                    408:            break;
                    409: 
                    410:         case kIOFBSharedConnectType:
                    411:             if( sharedConnect) {
                    412:                 theConnect = sharedConnect;
                    413:                 theConnect->retain();
                    414:             } else if( serverConnect)
                    415:                 newConnect = IOFramebufferSharedUserClient::withTask(owningTask);
                    416:             else
                    417:                 err = kIOReturnNotOpen;
                    418:            break;
                    419: 
                    420:         case kIOFBEngineControllerConnectType:
                    421:         case kIOFBEngineConnectType:
                    422:             newConnect = IOGraphicsEngineClient::withTask(owningTask);
                    423:            break;
                    424: 
                    425:        default:
                    426:            err = kIOReturnBadArgument;
                    427:     }
                    428: 
                    429:     if( newConnect) {
                    430:        if( (false == newConnect->attach( this ))
                    431:          || (false == newConnect->start( this ))) {
                    432:             newConnect->detach( this );
                    433:             newConnect->release();
                    434:         } else
                    435:             theConnect = newConnect;
                    436:     }
                    437: 
                    438:     *handler = theConnect;
                    439:     return( err );
                    440: }
                    441: 
                    442: IOReturn IOFramebuffer::extGetDisplayModeCount( IOItemCount * count )
                    443: {
                    444:     *count = getDisplayModeCount();
                    445:     return( kIOReturnSuccess);
                    446: }
                    447: 
                    448: IOReturn IOFramebuffer::extGetDisplayModes( IODisplayModeID * allModes, IOByteCount * size )
                    449: {
                    450:     IOReturn           err;
                    451:     IOByteCount                outSize;
                    452: 
                    453:     outSize = getDisplayModeCount() * sizeof( IODisplayModeID);
                    454: 
                    455:     if( *size < outSize)
                    456:        return( kIOReturnBadArgument);
                    457: 
                    458:     *size = outSize;
                    459:     err = getDisplayModes( allModes );
                    460: 
                    461:     return( err);
                    462: }
                    463: 
                    464: IOReturn IOFramebuffer::extGetVRAMMapOffset( IOPixelAperture /* aperture */, 
                    465:                                        IOByteCount * offset )
                    466: {
                    467:     *offset = vramMapOffset;
                    468: 
                    469:     return( kIOReturnSuccess );
                    470: }
                    471: 
                    472: IOReturn IOFramebuffer::extSetBounds( Bounds * bounds )
                    473: {
                    474:     StdFBShmem_t *shmem;
                    475: 
                    476:     shmem = GetShmem(this);
                    477:     if( shmem)
                    478:         shmem->screenBounds = *bounds;
                    479: 
                    480:     return( kIOReturnSuccess );
                    481: }
                    482: 
                    483: IOReturn IOFramebuffer::extSetColorConvertTable( UInt32 select,
                    484:                                                  UInt8 * data, IOByteCount length )
                    485: {
                    486:     static const IOByteCount checkLength[] = {
                    487:         16 * sizeof( UInt8),
                    488:         32 * sizeof( UInt8),
                    489:         256 * sizeof( UInt32),
                    490:         5 * 256 * sizeof( UInt8) };
                    491: 
                    492:     UInt8 *    table;
                    493: 
                    494:     if( select > 3)
                    495:         return( kIOReturnBadArgument );
                    496: 
                    497:     if( length != checkLength[select])
                    498:         return( kIOReturnBadArgument );
                    499: 
                    500:     table = colorConvert.tables[select];
                    501:     if( 0 == table) {
                    502:         table = (UInt8 *) IOMalloc( length );
                    503:         colorConvert.tables[select] = table;
                    504:     }
                    505: 
                    506:     if( table) {
                    507:         bcopy( data, table, length );
                    508:         if( select == 3)
                    509:             white = data[data[255] + data[511] + data[767] + 1024];
                    510:         return( kIOReturnSuccess );
                    511:     } else
                    512:         return( kIOReturnNoMemory );
                    513: }
                    514: 
                    515: IOReturn IOFramebuffer::extSetCLUTWithEntries( UInt32 index, IOOptionBits options,
                    516:                                         IOColorEntry * colors, IOByteCount inputCount )
                    517: {
                    518:     IOReturn   kr;
                    519: 
                    520:     kr = setCLUTWithEntries( colors, index,
                    521:                             inputCount / sizeof( IOColorEntry),
                    522:                             options );
                    523: 
                    524:     return( kr );
                    525: }
                    526: 
                    527: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    528: 
                    529: //
                    530: // BEGIN:      Implementation of the evScreen protocol
                    531: //
                    532: 
                    533: void IOFramebuffer::hideCursor( void )
                    534: {
                    535:     StdFBShmem_t *shmem = GetShmem(this);
                    536: 
                    537:     SETSEMA(shmem);
                    538:     SysHideCursor(this);
                    539:     CLEARSEMA(shmem);
                    540: }
                    541: 
                    542: #if 0
                    543: void IOFramebuffer::free()
                    544: {
                    545:     if( vblSemaphore)
                    546:         semaphore_destroy(kernel_task, vblSemaphore);
                    547:     super::free();
                    548: }
                    549: #endif
                    550: 
                    551: void IOFramebuffer::deferredMoveCursor( IOFramebuffer * inst, void * ref )
                    552: {
                    553:     StdFBShmem_t *     shmem = GetShmem(inst);
                    554:     IOReturn           err = kIOReturnSuccess;
                    555: 
                    556:     if( shmem)
                    557:         clock_get_uptime( &shmem->vblTime );
                    558:     if( inst->vblSemaphore)
                    559:         semaphore_signal_all(inst->vblSemaphore);
                    560:     
                    561:     if( !inst->needCursorService)
                    562:        return;
                    563: 
                    564:     SETSEMA(shmem);
                    565:     shmem->frame = inst->nextCursorFrame;
                    566:     shmem->cursorLoc = inst->nextCursorLoc;
                    567: 
                    568:     if( shmem->hardwareCursorActive ) {
                    569: 
                    570:         if (shmem->cursorObscured) {
                    571:             shmem->cursorObscured = 0;
                    572:             if (shmem->cursorShow)
                    573:                 --shmem->cursorShow;
                    574:         }
                    575:        if (!shmem->cursorShow) {
                    576:             Point * hs;
                    577:             hs = &shmem->hotSpot[shmem->frame];
                    578:             err = inst->setCursorState(
                    579:                shmem->cursorLoc.x - hs->x - shmem->screenBounds.minx,
                    580:                shmem->cursorLoc.y - hs->y - shmem->screenBounds.miny, true );
                    581:        }
                    582: 
                    583:     } else {
                    584: 
                    585:         if (!shmem->cursorShow++)
                    586:             RemoveCursor(inst);
                    587:         if (shmem->cursorObscured) {
                    588:             shmem->cursorObscured = 0;
                    589:             if (shmem->cursorShow)
                    590:                 --shmem->cursorShow;
                    591:         }
                    592:         if (shmem->shieldFlag) CheckShield(inst);
                    593:         if (shmem->cursorShow)
                    594:             if (!--shmem->cursorShow)
                    595:                 DisplayCursor(inst);
                    596: 
                    597:        inst->flushCursor();
                    598:     }
                    599:     inst->needCursorService = (kIOReturnBusy == err);
                    600: 
                    601:     CLEARSEMA(shmem);
                    602: }
                    603: 
                    604: void IOFramebuffer::moveCursor( Point * cursorLoc, int frame )
                    605: {
                    606:     nextCursorLoc = *cursorLoc;
                    607:     nextCursorFrame = frame;
                    608:     needCursorService = true;
                    609:     if( !haveVBLService)
                    610:        deferredMoveCursor( this, 0 );
                    611: }
                    612: 
                    613: void IOFramebuffer::showCursor( Point * cursorLoc, int frame )
                    614: {
                    615:     StdFBShmem_t *shmem;
                    616:     
                    617:     shmem = GetShmem(this);
                    618:     SETSEMA(shmem);
                    619:     shmem->frame = frame;
                    620:     shmem->cursorLoc = *cursorLoc;
                    621:     if (shmem->shieldFlag) CheckShield(this);
                    622:     SysShowCursor(this);
                    623:     CLEARSEMA(shmem);
                    624: }
                    625: 
                    626: void IOFramebuffer::setBrightness( int /* level */ )
                    627: {
                    628: }
                    629: 
                    630: void IOFramebuffer::getBoundingRect( Bounds ** bounds )
                    631: {
                    632:     StdFBShmem_t *shmem;
                    633: 
                    634:     shmem = GetShmem(this);
                    635:     if( NULL == shmem)
                    636:         *bounds = NULL;
                    637:     else
                    638:         *bounds = &shmem->screenBounds;
                    639: }
                    640: 
                    641: //
                    642: // END:                Implementation of the evScreen protocol
                    643: //
                    644: 
                    645: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    646: 
                    647: IOReturn IOFramebuffer::getNotificationSemaphore(
                    648:                                   IOSelect interruptType, semaphore_t * semaphore )
                    649: {
                    650:     kern_return_t      kr;
                    651:     semaphore_t                sema;
                    652: 
                    653:     if( interruptType != kIOFBVBLInterruptType)
                    654:         return( kIOReturnUnsupported );
                    655: 
                    656:     if( !haveVBLService)
                    657:         return( kIOReturnNoResources );
                    658: 
                    659:     if( MACH_PORT_NULL == vblSemaphore) {
                    660:         kr = semaphore_create(kernel_task, &sema, SYNC_POLICY_FIFO, 0);
                    661:         if( kr == KERN_SUCCESS)
                    662:             vblSemaphore = sema;
                    663:     } else
                    664:         kr = KERN_SUCCESS;
                    665: 
                    666:     if( kr == KERN_SUCCESS)
                    667:         *semaphore = vblSemaphore;
                    668: 
                    669:     return( kr );
                    670: }
                    671: 
                    672: IOReturn IOFramebuffer::extSetCursorVisible( bool visible )
                    673: {
                    674:     IOReturn           err;
                    675:     Point *            hs;
                    676:     StdFBShmem_t *     shmem = GetShmem(this);
                    677: 
                    678:     if( shmem->hardwareCursorActive ) {
                    679:         hs = &shmem->hotSpot[shmem->frame];
                    680:        err = setCursorState(
                    681:                shmem->cursorLoc.x - hs->x - shmem->screenBounds.minx,
                    682:                shmem->cursorLoc.y - hs->y - shmem->screenBounds.miny,
                    683:                visible );
                    684:     } else
                    685:        err = kIOReturnBadArgument;
                    686: 
                    687:     return( err );
                    688: }
                    689: 
                    690: IOReturn IOFramebuffer::extSetCursorPosition( SInt32 x, SInt32 y )
                    691: {
                    692:     return( kIOReturnUnsupported );
                    693: }
                    694: 
                    695: IOReturn IOFramebuffer::extSetNewCursor( void * cursor, IOIndex frame,
                    696:                                        IOOptionBits options )
                    697: {
                    698:     StdFBShmem_t *     shmem = GetShmem(this);
                    699:     IOReturn           err;
                    700: 
                    701:     if( cursor || options || (frame >= kIOFBNumCursorFrames))
                    702:        err = kIOReturnBadArgument;
                    703:     else {
                    704: 
                    705:        if( (shmem->cursorSize[frame].width > maxCursorSize.width)
                    706:         || (shmem->cursorSize[frame].height > maxCursorSize.height))
                    707:             err = kIOReturnBadArgument;
                    708: 
                    709:        else if( haveHWCursor)
                    710:             err = setCursorImage( (void *) frame );
                    711:         else
                    712:             err = kIOReturnUnsupported;
                    713:     }
                    714: 
                    715:     shmem->hardwareCursorActive = (kIOReturnSuccess == err);
                    716: 
                    717:     return( err );
                    718: }
                    719: 
                    720: bool IOFramebuffer::convertCursorImage( void * cursorImage,
                    721:                                     IOHardwareCursorDescriptor * hwDesc,
                    722:                                     IOHardwareCursorInfo * hwCursorInfo )
                    723: {
                    724:     StdFBShmem_t *             shmem = GetShmem(this);
                    725:     UInt8 *                    dataOut = hwCursorInfo->hardwareCursorData;
                    726:     IOColorEntry *             clut = hwCursorInfo->colorMap;
                    727:     UInt32                     maxColors = hwDesc->numColors;
                    728:     int                                frame = (int) cursorImage;
                    729: 
                    730:     volatile unsigned short *  cursPtr16;
                    731:     volatile unsigned int *    cursPtr32;
                    732:     SInt32                     x, y;
                    733:     UInt32                     index, numColors = 0;
                    734:     UInt16                     alpha, red, green, blue;
                    735:     UInt16                     s16;
                    736:     UInt32                     s32;
                    737:     UInt8                      data = 0;
                    738:     UInt8                      pixel = 0;
                    739:     bool                       ok = true;
                    740: 
                    741:     assert( frame < kIOFBNumCursorFrames );
                    742: 
                    743:     if( bytesPerPixel == 4) {
                    744:         cursPtr32 = (volatile unsigned int *) cursorImages[ frame ];
                    745:         cursPtr16 = 0;
                    746:     } else if( bytesPerPixel == 2) {
                    747:         cursPtr32 = 0;
                    748:         cursPtr16 = (volatile unsigned short *) cursorImages[ frame ];
                    749:     } else
                    750:        return( false );
                    751: 
                    752:     x = shmem->cursorSize[frame].width;
                    753:     y = shmem->cursorSize[frame].height;
                    754: 
                    755:     if( (x > (SInt32) hwDesc->width) || (y > (SInt32) hwDesc->height))
                    756:        return( false );
                    757: #if 0
                    758:     hwCursorInfo->cursorWidth = x;
                    759:     hwCursorInfo->cursorHeight = y;
                    760:     while( (--y != -1) ) {
                    761:         x = shmem->cursorSize[frame].width;
                    762:         while( (--x != -1) ) {
                    763: 
                    764:            if( cursPtr32) {
                    765:                s32 = *(cursPtr32++);
                    766:                alpha = (s32 >> 28) & 0xf;
                    767:                 if( alpha && (alpha != 0xf))
                    768:                     *(cursPtr32 - 1) = 0x00ffffff;
                    769: 
                    770:            } else {
                    771:                s16 = *(cursPtr16++);
                    772:                alpha = s16 & 0x000F;
                    773:                 if( alpha && (alpha != 0xf))
                    774:                     *(cursPtr16 - 1) = 0xfff0;
                    775:             }
                    776:         }
                    777:     }
                    778: #endif
                    779: 
                    780:     hwCursorInfo->cursorWidth = x;
                    781:     hwCursorInfo->cursorHeight = y;
                    782: 
                    783:     while( ok && (--y != -1) ) {
                    784:         x = shmem->cursorSize[frame].width;
                    785:         while( ok && (--x != -1) ) {
                    786: 
                    787:            if( cursPtr32) {
                    788:                s32 = *(cursPtr32++);
                    789:                alpha = (s32 >> 28) & 0xf;
                    790:                red = (s32 >> 16) & 0xff;
                    791:                red |= (red << 8);
                    792:                green = (s32 >> 8) & 0xff;
                    793:                green |= (green << 8);
                    794:                blue = (s32) & 0xff;
                    795:                blue |= (blue << 8);
                    796: 
                    797:            } else {
                    798: #define RMASK16        0xF000
                    799: #define GMASK16        0x0F00
                    800: #define BMASK16        0x00F0
                    801: #define AMASK16        0x000F
                    802:                s16 = *(cursPtr16++);
                    803:                alpha = s16 & AMASK16;
                    804:                 red = s16 & RMASK16;
                    805:                red |= (red >> 4) | (red >> 8) | (red >> 12);
                    806:                green = s16 & GMASK16;
                    807:                green |= (green << 4) | (green >> 4) | (green >> 8);
                    808:                blue = s16 & BMASK16;
                    809:                blue |= (blue << 8) | (blue << 4) | (blue >> 4);
                    810:            }
                    811: 
                    812:             if( alpha == 0 ) {
                    813: 
                    814:                 if( 0 == (red | green | blue)) {
                    815:                     /* Transparent black area.  Leave dst as is. */
                    816:                     if( kTransparentEncodedPixel
                    817:                             & hwDesc->supportedSpecialEncodings)
                    818:                         pixel = hwDesc->specialEncodings[kTransparentEncoding];
                    819:                     else
                    820:                         ok = false;
                    821:                 } else if (0xffff == (red & green & blue)) {
                    822:                     /* Transparent white area.  Invert dst. */
                    823:                     if( kInvertingEncodedPixel
                    824:                             & hwDesc->supportedSpecialEncodings)
                    825:                         pixel = hwDesc->specialEncodings[kInvertingEncoding];
                    826:                     else
                    827:                         ok = false;
                    828:                 } else
                    829:                     ok = false;
                    830: 
                    831:             } else if( alpha == 0xf ) {
                    832: 
                    833:                /* Opaque cursor pixel.  Mark it. */
                    834:                for( index = 0; index < numColors; index++ ) {
                    835:                    if( (red   == clut[ index ].red)
                    836:                     && (green == clut[ index ].green)
                    837:                     && (blue  == clut[ index ].blue) ) {
                    838: 
                    839:                        pixel = clut[ index ].index;
                    840:                        break;
                    841:                    }
                    842:                }
                    843:                if( index == numColors) {
                    844:                    ok = (numColors < maxColors);
                    845:                    if( ok) {
                    846:                         pixel = hwDesc->colorEncodings[ numColors++ ];
                    847:                         clut[ index ].red   = red;
                    848:                         clut[ index ].green = green;
                    849:                         clut[ index ].blue  = blue;
                    850:                         clut[ index ].index = pixel;
                    851:                    }
                    852:                }
                    853: 
                    854:             } else {
                    855:                 /* Alpha is not 0 or 1.0.  Sover the cursor. */
                    856:                 ok = false;
                    857:                 break;
                    858:            }
                    859: 
                    860:            data <<= hwDesc->bitDepth;
                    861:            data |= pixel;
                    862: 
                    863:            if( 0 == (x & ((8 / hwDesc->bitDepth) - 1)))
                    864:                *dataOut++ = data;
                    865:        } /* x */
                    866:     } /* y */
                    867: 
                    868: //    if( !ok) kprintf("Couldnt do a hw curs\n");
                    869: 
                    870:     return( ok );
                    871: }
                    872: 
                    873: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    874: 
                    875: void IOFramebuffer::initialize()
                    876: {
                    877: #if 0
                    878: static IOWorkLoop * gIOFramebufferWorkloop;
                    879: static IOLock * gIOFramebufferLock;
                    880: 
                    881:     gIOFramebufferLock = IOLockAlloc();
                    882: 
                    883:     gIOFramebufferWorkloop = IOWorkLoop::workLoop();
                    884: 
                    885:     assert( gIOFramebufferLock && gIOFramebufferWorkloop );
                    886: #endif
                    887: }
                    888: 
                    889: 
                    890: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    891: 
                    892: static bool serializeInfoCB( void * target, void * ref, OSSerialize * s )
                    893: {
                    894:     return( ((IOFramebuffer *)target)->serializeInfo(s) );
                    895: }
                    896: 
                    897: bool IOFramebuffer::start( IOService * provider )
                    898: {
                    899:     OSSerializer * infoSerializer;
                    900: 
                    901:     if( ! super::start( provider))
                    902:        return( false );
                    903: 
                    904:     userAccessRanges = OSArray::withCapacity( 1 );
                    905:     engineAccessRanges = OSArray::withCapacity( 1 );
                    906: 
                    907:     infoSerializer = OSSerializer::forTarget( (void *) this, &serializeInfoCB );
                    908:     if( !infoSerializer)
                    909:        return( false );
                    910: 
                    911:     setProperty( kIOFramebufferInfoKey, infoSerializer );
                    912:     infoSerializer->release();
                    913: 
                    914: #if 0
                    915: 
                    916:     IOInterruptEventSource *   eventSrc;
                    917: 
                    918:     eventSrc = IOInterruptEventSource::interruptEventSource(
                    919:        this, autopollArrived);
                    920:     if (!eventSrc || 
                    921:        kIOReturnSuccess != workLoop->addEventSource(eventSrc) ) {
                    922:         kprintf("Start is bailing\n");
                    923:        return false;
                    924:     }
                    925: #endif
                    926: 
                    927:     closed = true;
                    928:     registerService();
                    929: 
                    930:     // initialize superclass power management variables
                    931:     PMinit();
                    932:     // attach into the power management hierarchy
                    933:     provider->joinPMtree(this);
                    934:     // clamp power on (the user client will change that when appropriate)
                    935:     changeStateToPriv(pm_vars->theNumberOfPowerStates - 1);
                    936: 
                    937:     return( true );
                    938: }
                    939: 
                    940: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                    941: 
                    942: // Apple standard 8-bit CLUT
                    943: 
                    944: UInt8 appleClut8[ 256 * 3 ] = {
                    945: // 00
                    946:        0xFF,0xFF,0xFF, 0xFF,0xFF,0xCC, 0xFF,0xFF,0x99, 0xFF,0xFF,0x66,
                    947:        0xFF,0xFF,0x33, 0xFF,0xFF,0x00, 0xFF,0xCC,0xFF, 0xFF,0xCC,0xCC,
                    948:        0xFF,0xCC,0x99, 0xFF,0xCC,0x66, 0xFF,0xCC,0x33, 0xFF,0xCC,0x00,
                    949:        0xFF,0x99,0xFF, 0xFF,0x99,0xCC, 0xFF,0x99,0x99, 0xFF,0x99,0x66,
                    950: // 10
                    951:        0xFF,0x99,0x33, 0xFF,0x99,0x00, 0xFF,0x66,0xFF, 0xFF,0x66,0xCC,
                    952:        0xFF,0x66,0x99, 0xFF,0x66,0x66, 0xFF,0x66,0x33, 0xFF,0x66,0x00,
                    953:        0xFF,0x33,0xFF, 0xFF,0x33,0xCC, 0xFF,0x33,0x99, 0xFF,0x33,0x66,
                    954:        0xFF,0x33,0x33, 0xFF,0x33,0x00, 0xFF,0x00,0xFF, 0xFF,0x00,0xCC,
                    955: // 20
                    956:        0xFF,0x00,0x99, 0xFF,0x00,0x66, 0xFF,0x00,0x33, 0xFF,0x00,0x00,
                    957:        0xCC,0xFF,0xFF, 0xCC,0xFF,0xCC, 0xCC,0xFF,0x99, 0xCC,0xFF,0x66,
                    958:        0xCC,0xFF,0x33, 0xCC,0xFF,0x00, 0xCC,0xCC,0xFF, 0xCC,0xCC,0xCC,
                    959:        0xCC,0xCC,0x99, 0xCC,0xCC,0x66, 0xCC,0xCC,0x33, 0xCC,0xCC,0x00,
                    960: // 30
                    961:        0xCC,0x99,0xFF, 0xCC,0x99,0xCC, 0xCC,0x99,0x99, 0xCC,0x99,0x66,
                    962:        0xCC,0x99,0x33, 0xCC,0x99,0x00, 0xCC,0x66,0xFF, 0xCC,0x66,0xCC,
                    963:        0xCC,0x66,0x99, 0xCC,0x66,0x66, 0xCC,0x66,0x33, 0xCC,0x66,0x00,
                    964:        0xCC,0x33,0xFF, 0xCC,0x33,0xCC, 0xCC,0x33,0x99, 0xCC,0x33,0x66,
                    965: // 40
                    966:        0xCC,0x33,0x33, 0xCC,0x33,0x00, 0xCC,0x00,0xFF, 0xCC,0x00,0xCC,
                    967:        0xCC,0x00,0x99, 0xCC,0x00,0x66, 0xCC,0x00,0x33, 0xCC,0x00,0x00,
                    968:        0x99,0xFF,0xFF, 0x99,0xFF,0xCC, 0x99,0xFF,0x99, 0x99,0xFF,0x66,
                    969:        0x99,0xFF,0x33, 0x99,0xFF,0x00, 0x99,0xCC,0xFF, 0x99,0xCC,0xCC,
                    970: // 50
                    971:        0x99,0xCC,0x99, 0x99,0xCC,0x66, 0x99,0xCC,0x33, 0x99,0xCC,0x00,
                    972:        0x99,0x99,0xFF, 0x99,0x99,0xCC, 0x99,0x99,0x99, 0x99,0x99,0x66,
                    973:        0x99,0x99,0x33, 0x99,0x99,0x00, 0x99,0x66,0xFF, 0x99,0x66,0xCC,
                    974:        0x99,0x66,0x99, 0x99,0x66,0x66, 0x99,0x66,0x33, 0x99,0x66,0x00,
                    975: // 60
                    976:        0x99,0x33,0xFF, 0x99,0x33,0xCC, 0x99,0x33,0x99, 0x99,0x33,0x66,
                    977:        0x99,0x33,0x33, 0x99,0x33,0x00, 0x99,0x00,0xFF, 0x99,0x00,0xCC,
                    978:        0x99,0x00,0x99, 0x99,0x00,0x66, 0x99,0x00,0x33, 0x99,0x00,0x00,
                    979:        0x66,0xFF,0xFF, 0x66,0xFF,0xCC, 0x66,0xFF,0x99, 0x66,0xFF,0x66,
                    980: // 70
                    981:        0x66,0xFF,0x33, 0x66,0xFF,0x00, 0x66,0xCC,0xFF, 0x66,0xCC,0xCC,
                    982:        0x66,0xCC,0x99, 0x66,0xCC,0x66, 0x66,0xCC,0x33, 0x66,0xCC,0x00,
                    983:        0x66,0x99,0xFF, 0x66,0x99,0xCC, 0x66,0x99,0x99, 0x66,0x99,0x66,
                    984:        0x66,0x99,0x33, 0x66,0x99,0x00, 0x66,0x66,0xFF, 0x66,0x66,0xCC,
                    985: // 80
                    986:        0x66,0x66,0x99, 0x66,0x66,0x66, 0x66,0x66,0x33, 0x66,0x66,0x00,
                    987:        0x66,0x33,0xFF, 0x66,0x33,0xCC, 0x66,0x33,0x99, 0x66,0x33,0x66,
                    988:        0x66,0x33,0x33, 0x66,0x33,0x00, 0x66,0x00,0xFF, 0x66,0x00,0xCC,
                    989:        0x66,0x00,0x99, 0x66,0x00,0x66, 0x66,0x00,0x33, 0x66,0x00,0x00,
                    990: // 90
                    991:        0x33,0xFF,0xFF, 0x33,0xFF,0xCC, 0x33,0xFF,0x99, 0x33,0xFF,0x66,
                    992:        0x33,0xFF,0x33, 0x33,0xFF,0x00, 0x33,0xCC,0xFF, 0x33,0xCC,0xCC,
                    993:        0x33,0xCC,0x99, 0x33,0xCC,0x66, 0x33,0xCC,0x33, 0x33,0xCC,0x00,
                    994:        0x33,0x99,0xFF, 0x33,0x99,0xCC, 0x33,0x99,0x99, 0x33,0x99,0x66,
                    995: // a0
                    996:        0x33,0x99,0x33, 0x33,0x99,0x00, 0x33,0x66,0xFF, 0x33,0x66,0xCC,
                    997:        0x33,0x66,0x99, 0x33,0x66,0x66, 0x33,0x66,0x33, 0x33,0x66,0x00,
                    998:        0x33,0x33,0xFF, 0x33,0x33,0xCC, 0x33,0x33,0x99, 0x33,0x33,0x66,
                    999:        0x33,0x33,0x33, 0x33,0x33,0x00, 0x33,0x00,0xFF, 0x33,0x00,0xCC,
                   1000: // b0
                   1001:        0x33,0x00,0x99, 0x33,0x00,0x66, 0x33,0x00,0x33, 0x33,0x00,0x00,
                   1002:        0x00,0xFF,0xFF, 0x00,0xFF,0xCC, 0x00,0xFF,0x99, 0x00,0xFF,0x66,
                   1003:        0x00,0xFF,0x33, 0x00,0xFF,0x00, 0x00,0xCC,0xFF, 0x00,0xCC,0xCC,
                   1004:        0x00,0xCC,0x99, 0x00,0xCC,0x66, 0x00,0xCC,0x33, 0x00,0xCC,0x00,
                   1005: // c0
                   1006:        0x00,0x99,0xFF, 0x00,0x99,0xCC, 0x00,0x99,0x99, 0x00,0x99,0x66,
                   1007:        0x00,0x99,0x33, 0x00,0x99,0x00, 0x00,0x66,0xFF, 0x00,0x66,0xCC,
                   1008:        0x00,0x66,0x99, 0x00,0x66,0x66, 0x00,0x66,0x33, 0x00,0x66,0x00,
                   1009:        0x00,0x33,0xFF, 0x00,0x33,0xCC, 0x00,0x33,0x99, 0x00,0x33,0x66,
                   1010: // d0
                   1011:        0x00,0x33,0x33, 0x00,0x33,0x00, 0x00,0x00,0xFF, 0x00,0x00,0xCC,
                   1012:        0x00,0x00,0x99, 0x00,0x00,0x66, 0x00,0x00,0x33, 0xEE,0x00,0x00,
                   1013:        0xDD,0x00,0x00, 0xBB,0x00,0x00, 0xAA,0x00,0x00, 0x88,0x00,0x00,
                   1014:        0x77,0x00,0x00, 0x55,0x00,0x00, 0x44,0x00,0x00, 0x22,0x00,0x00,
                   1015: // e0
                   1016:        0x11,0x00,0x00, 0x00,0xEE,0x00, 0x00,0xDD,0x00, 0x00,0xBB,0x00,
                   1017:        0x00,0xAA,0x00, 0x00,0x88,0x00, 0x00,0x77,0x00, 0x00,0x55,0x00,
                   1018:        0x00,0x44,0x00, 0x00,0x22,0x00, 0x00,0x11,0x00, 0x00,0x00,0xEE,
                   1019:        0x00,0x00,0xDD, 0x00,0x00,0xBB, 0x00,0x00,0xAA, 0x00,0x00,0x88,
                   1020: // f0
                   1021:        0x00,0x00,0x77, 0x00,0x00,0x55, 0x00,0x00,0x44, 0x00,0x00,0x22,
                   1022:        0x00,0x00,0x11, 0xEE,0xEE,0xEE, 0xDD,0xDD,0xDD, 0xBB,0xBB,0xBB,
                   1023:        0xAA,0xAA,0xAA, 0x88,0x88,0x88, 0x77,0x77,0x77, 0x55,0x55,0x55,
                   1024:        0x44,0x44,0x44, 0x22,0x22,0x22, 0x11,0x11,0x11, 0x00,0x00,0x00
                   1025: };
                   1026: 
                   1027: 
                   1028: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1029: // disallowPowerDown
                   1030: //
                   1031: // Called by the User Client to disallow powering down the frame buffer.
                   1032: // This condition exists between the instantiation of the User Client and
                   1033: // the Window Server registering with it for power state notifications.
                   1034: //
                   1035: // As policy-maker, we request the highest power state, and this clamps
                   1036: // the power on.
                   1037: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1038: 
                   1039: void IOFramebuffer::disallowPowerDown( void )
                   1040: {
                   1041:     changeStateToPriv(pm_vars->theNumberOfPowerStates - 1);
                   1042: }
                   1043: 
                   1044: 
                   1045: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1046: // allowPowerDown
                   1047: //
                   1048: // Called by the User Client to allow powering down the frame buffer.
                   1049: // This condition exists after the Window Server registers with it for power
                   1050: // state notifications and when the Window Server closes, regardless of
                   1051: // whether or not it ever registered.
                   1052: //
                   1053: // As policy-maker, we request the lowest power state.  The power state
                   1054: // is therefore controlled by the desires of our children (the displays).
                   1055: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1056: 
                   1057: void IOFramebuffer::allowPowerDown( void )
                   1058: {
                   1059:     changeStateToPriv(0);
                   1060: }
                   1061: 
                   1062: 
                   1063: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1064: // powerStateWillChangeTo
                   1065: //
                   1066: // We are informed, as an Interested Driver, that our device is about to
                   1067: // change power state.  If the new state is unusable, we warn the console
                   1068: // to stop accessing the frame buffer for a while, since it will be powered off.
                   1069: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1070: 
                   1071: IOReturn IOFramebuffer::powerStateWillChangeTo( IOPMPowerFlags newState,
                   1072:                                unsigned long,  IOService* whatDevice )
                   1073: {
                   1074:     if ( ! (newState & IOPMDeviceUsable) ) {
                   1075:         if( isConsoleDevice()) {
                   1076:             getPlatform()->setConsoleInfo( 0, kPEDisableScreen);
                   1077:         }
                   1078:     }
                   1079:     return 0;
                   1080: }
                   1081: 
                   1082: 
                   1083: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1084: // powerStateDidChangeTo
                   1085: //
                   1086: // We are informed, as an Interested Driver, that our device has changed
                   1087: // power state.  If the new state is usable, we tell the console that it may
                   1088: // access the frame buffer now, since it has powered on.
                   1089: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1090: 
                   1091: IOReturn IOFramebuffer::powerStateDidChangeTo( IOPMPowerFlags newState,
                   1092:                                unsigned long, IOService* whatDevice )
                   1093: {
                   1094:     if ( newState & IOPMDeviceUsable ) {
                   1095:         if( isConsoleDevice()) {
                   1096:             getPlatform()->setConsoleInfo( 0, kPEEnableScreen);
                   1097:         }
                   1098:     }
                   1099:     return 0;
                   1100: }
                   1101: 
                   1102: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1103: 
                   1104: IODeviceMemory * IOFramebuffer::getVRAMRange( void )
                   1105: {
                   1106:     return( getApertureRange( kIOFBSystemAperture ));
                   1107: }
                   1108: 
                   1109: void  IOFramebuffer::close( void )     // called by the user client when
                   1110: {                                      // the window server exits
                   1111: 
                   1112: }
                   1113: 
                   1114: 
                   1115: 
                   1116: IOReturn IOFramebuffer::open( void )
                   1117: {
                   1118:     IOReturn           err = kIOReturnSuccess;
                   1119:     UInt32             value;
                   1120: 
                   1121:     do {
                   1122:        if( opened)
                   1123:            continue;
                   1124: 
                   1125:         // tell the console if it's on this display, it's going away
                   1126:        if( isConsoleDevice())
                   1127:             getPlatform()->setConsoleInfo( 0, kPEDisableScreen);
                   1128: 
                   1129:         deliverFramebufferNotification( kIOFBNotifyDisplayModeWillChange );
                   1130: 
                   1131:        err = enableController();
                   1132:        if( kIOReturnSuccess != err)
                   1133:            continue;
                   1134: 
                   1135:        err = registerForInterruptType( kIOFBVBLInterruptType, 
                   1136:                        (IOFBInterruptProc) &deferredMoveCursor, 
                   1137:                        this, priv, &vblInterrupt );
                   1138:        haveVBLService = (err == kIOReturnSuccess );
                   1139: 
                   1140:        err = getAttribute( kIOHardwareCursorAttribute, &value );
                   1141:        haveHWCursor = ((err == kIOReturnSuccess ) && value);
                   1142: 
                   1143:        err = kIOReturnSuccess;
                   1144:         opened = true;
                   1145: 
                   1146:     } while( false );
                   1147: 
                   1148:     return( err );
                   1149: }
                   1150: 
                   1151: IOReturn IOFramebuffer::setUserRanges( void )
                   1152: {
                   1153: #if 1          /* print ranges */
                   1154: 
                   1155:     UInt32             i, numRanges;
                   1156:     IODeviceMemory *   mem;
                   1157: 
                   1158:        numRanges = userAccessRanges->getCount();
                   1159:        IOLog("%s: user ranges num:%ld", getName(), numRanges);
                   1160:        for( i = 0; i < numRanges; i++) {
                   1161:            mem = (IODeviceMemory *) userAccessRanges->getObject( i );
                   1162:            if( 0 == mem)
                   1163:                continue;
                   1164:            IOLog(" start:%lx size:%lx",
                   1165:                mem->getPhysicalAddress(), mem->getLength() );
                   1166:        }
                   1167:         IOLog("\n");
                   1168: 
                   1169: #endif
                   1170:     return( kIOReturnSuccess);
                   1171: }
                   1172: 
                   1173: IOReturn IOFramebuffer::setupForCurrentConfig( void )
                   1174: {
                   1175:     return( doSetup( true ));
                   1176: }
                   1177: 
                   1178: IOReturn IOFramebuffer::doSetup( bool full )
                   1179: {
                   1180:     IOReturn                   err;
                   1181:     IODisplayModeID            mode;
                   1182:     IOIndex                    depth;
                   1183:     IOPixelInformation         info;
                   1184:     IODisplayModeInformation   dmInfo;
                   1185:     IODeviceMemory *           mem;
                   1186:     IODeviceMemory *           fbRange;
                   1187:     IOPhysicalAddress          base;
                   1188:     PE_Video                   newConsole;
                   1189: 
                   1190:     err = getCurrentDisplayMode( &mode, &depth );
                   1191:     if( err)
                   1192:         IOLog("%s: getCurrentDisplayMode %d\n", getName(), err);
                   1193: 
                   1194:     err = getPixelInformation( mode, depth, kIOFBSystemAperture, &info );
                   1195:     if( err)
                   1196:        IOLog("%s: getPixelInformation %d\n", getName(),  err);
                   1197: 
                   1198:     if( full && (clutValid == false) && (info.pixelType == kIOCLUTPixels)) {
                   1199: 
                   1200:        IOColorEntry    *       tempTable;
                   1201:        int                     i;
                   1202: 
                   1203:        tempTable = (IOColorEntry *) IOMalloc( 256 * sizeof( *tempTable));
                   1204:        if( tempTable) {
                   1205: 
                   1206:            for( i = 0; i < 256; i++) {
                   1207:                 if( currentMono) {
                   1208:                     UInt32     lum;
                   1209: 
                   1210:                    lum = 0x0101 * i;
                   1211:                     tempTable[ i ].red   = lum;
                   1212:                     tempTable[ i ].green = lum;
                   1213:                     tempTable[ i ].blue  = lum;
                   1214:                 } else {
                   1215:                     tempTable[ i ].red   = (appleClut8[ i * 3 + 0 ] << 8)
                   1216:                                          | appleClut8[ i * 3 + 0 ];
                   1217:                     tempTable[ i ].green = (appleClut8[ i * 3 + 1 ] << 8)
                   1218:                                          | appleClut8[ i * 3 + 1 ];
                   1219:                     tempTable[ i ].blue  = (appleClut8[ i * 3 + 2 ] << 8)
                   1220:                                          | appleClut8[ i * 3 + 2 ];
                   1221:                }
                   1222:            }
                   1223:            setCLUTWithEntries( tempTable, 0, 256, 1 * kSetCLUTImmediately );
                   1224:            IOFree( tempTable, 256 * sizeof( *tempTable));
                   1225:        }
                   1226:         clutValid = true;
                   1227:     }
                   1228: 
                   1229:     fbRange = getApertureRange( kIOFBSystemAperture );
                   1230: 
                   1231:     if( full && fbRange) {
                   1232: 
                   1233:         userAccessRanges->removeObject( kIOFBSystemAperture );
                   1234:         userAccessRanges->setObject( kIOFBSystemAperture, fbRange );
                   1235:         err = setUserRanges();
                   1236: 
                   1237:        base = fbRange->getPhysicalAddress();
                   1238:         if( (mem = getVRAMRange())) {
                   1239:             vramMapOffset = base - mem->getPhysicalAddress();
                   1240:             mem->release();
                   1241:        }
                   1242: 
                   1243:        if( vramMap)
                   1244:            vramMap->release();
                   1245:        vramMap = fbRange->map();
                   1246:        assert( vramMap );
                   1247:        if( vramMap)
                   1248:            base = vramMap->getVirtualAddress();
                   1249: 
                   1250:         // console now available
                   1251:         if( info.activeWidth >= 128) {
                   1252:             newConsole.v_baseAddr      = base;
                   1253:             newConsole.v_rowBytes      = info.bytesPerRow;
                   1254:             newConsole.v_width         = info.activeWidth;
                   1255:             newConsole.v_height                = info.activeHeight;
                   1256:             newConsole.v_depth         = info.bitsPerPixel;
                   1257:             // strcpy( consoleInfo->v_pixelFormat, "PPPPPPPP");
                   1258:             getPlatform()->setConsoleInfo( &newConsole, kPEEnableScreen );
                   1259:         }
                   1260: 
                   1261:         deliverFramebufferNotification( kIOFBNotifyDisplayModeDidChange, 0 );
                   1262: 
                   1263:         (void) getInformationForDisplayMode( mode, &dmInfo );
                   1264:         IOLog( "%s: using (%ldx%ld@%ldHz,%ld bpp)\n", getName(),
                   1265:                     info.activeWidth, info.activeHeight,
                   1266:                     (dmInfo.refreshRate + 0x8000) >> 16, info.bitsPerPixel );
                   1267:     }
                   1268: 
                   1269:     if( fbRange)
                   1270:         fbRange->release();
                   1271:     if( vramMap)
                   1272:         setupCursor( &info );
                   1273: 
                   1274:     return( kIOReturnSuccess );
                   1275: }
                   1276: 
                   1277: IOReturn IOFramebuffer::extSetDisplayMode( IODisplayModeID displayMode,
                   1278:                                IOIndex depth )
                   1279: {
                   1280:     IOReturn   err;
                   1281: 
                   1282:     stopCursor();
                   1283: 
                   1284:     if( isConsoleDevice())
                   1285:         getPlatform()->setConsoleInfo( 0, kPEDisableScreen);
                   1286: 
                   1287:     deliverFramebufferNotification( kIOFBNotifyDisplayModeWillChange );
                   1288: 
                   1289:     err = setDisplayMode( displayMode, depth );
                   1290: 
                   1291:     clutValid = false;
                   1292: 
                   1293:     setupForCurrentConfig();
                   1294: 
                   1295:     return( err );
                   1296: }
                   1297: 
                   1298: IOReturn IOFramebuffer::extGetInformationForDisplayMode(
                   1299:                IODisplayModeID mode, IODisplayModeInformation * info )
                   1300: {
                   1301:     UInt32     flags = 0;
                   1302:     IOReturn   err;
                   1303: 
                   1304:     err = getInformationForDisplayMode( mode, info );
                   1305:     if( kIOReturnSuccess == err) {
                   1306:        err = IODisplayWrangler::getFlagsForDisplayMode( this, mode, &flags);
                   1307:        if( kIOReturnSuccess == err) {
                   1308:            info->flags &= ~kDisplayModeSafetyFlags;
                   1309:            info->flags |= flags;
                   1310:        }
                   1311:     }
                   1312: 
                   1313:     return( err );
                   1314: }
                   1315: 
                   1316: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1317: 
                   1318: bool IOFramebuffer::setNumber( OSDictionary * dict, const char * key,
                   1319:                                UInt32 value )
                   1320: {
                   1321:     OSNumber * num;
                   1322:     bool       ok;
                   1323: 
                   1324:     num = OSNumber::withNumber( value, 32 );
                   1325:     if( !num)
                   1326:        return( false );
                   1327: 
                   1328:     ok = dict->setObject( key, num );
                   1329:     num->release();
                   1330: 
                   1331:     return( ok );
                   1332: }
                   1333: 
                   1334: bool IOFramebuffer::serializeInfo( OSSerialize * s )
                   1335: {
                   1336:     IOReturn                   err;
                   1337:     IODisplayModeInformation   info;
                   1338:     IOPixelInformation         pixelInfo;
                   1339:     IODisplayModeID *          modeIDs;
                   1340:     IOItemCount                        modeCount, modeNum, aperture;
                   1341:     IOIndex                    depthNum;
                   1342:     OSDictionary *             infoDict;
                   1343:     OSDictionary *             modeDict;
                   1344:     OSDictionary *             pixelDict;
                   1345:     char                       keyBuf[12];
                   1346:     bool                       ok = true;
                   1347: 
                   1348:     modeCount = getDisplayModeCount();
                   1349:     modeIDs = IONew( IODisplayModeID, modeCount );
                   1350:     if( !modeIDs)
                   1351:        return( false );
                   1352: 
                   1353:     err = getDisplayModes( modeIDs );
                   1354:     if( err)
                   1355:        return( false );
                   1356: 
                   1357:     infoDict = OSDictionary::withCapacity( 10 );
                   1358:     if( !infoDict)
                   1359:        return( false );
                   1360: 
                   1361:     for( modeNum = 0; modeNum < modeCount; modeNum++ ) {
                   1362: 
                   1363:        err = getInformationForDisplayMode( modeIDs[ modeNum ], &info );
                   1364:        if( err)
                   1365:            continue;
                   1366: 
                   1367:        modeDict = OSDictionary::withCapacity( 10 );
                   1368:        if( !modeDict)
                   1369:            break;
                   1370: 
                   1371:        ok = setNumber( modeDict, kIOFBWidthKey,
                   1372:                        info.nominalWidth )
                   1373:         && setNumber( modeDict, kIOFBHeightKey,
                   1374:                        info.nominalHeight )
                   1375:         && setNumber( modeDict, kIOFBRefreshRateKey,
                   1376:                        info.refreshRate )
                   1377:         && setNumber( modeDict, kIOFBFlagsKey,
                   1378:                        info.flags );
                   1379:        if( !ok)
                   1380:            break;
                   1381: 
                   1382:        for( depthNum = 0; depthNum < info.maxDepthIndex; depthNum++ ) {
                   1383:            
                   1384:            for( aperture = 0; ; aperture++ ) {
                   1385: 
                   1386:                err = getPixelInformation( modeIDs[ modeNum ], depthNum,
                   1387:                                        aperture, &pixelInfo );
                   1388:                if( err)
                   1389:                    break;
                   1390: 
                   1391:                pixelDict = OSDictionary::withCapacity( 10 );
                   1392:                if( !pixelDict)
                   1393:                    continue;
                   1394: 
                   1395:                ok = setNumber( pixelDict, kIOFBBytesPerRowKey,
                   1396:                                pixelInfo.bytesPerRow )
                   1397:                  && setNumber( pixelDict, kIOFBBytesPerPlaneKey,
                   1398:                                pixelInfo.bytesPerPlane )
                   1399:                  && setNumber( pixelDict, kIOFBBitsPerPixelKey,
                   1400:                                pixelInfo.bitsPerPixel )
                   1401:                  && setNumber( pixelDict, kIOFBComponentCountKey,
                   1402:                                pixelInfo.componentCount )
                   1403:                  && setNumber( pixelDict, kIOFBBitsPerComponentKey,
                   1404:                                pixelInfo.bitsPerComponent )
                   1405:                  && setNumber( pixelDict, kIOFBFlagsKey,
                   1406:                                pixelInfo.flags )
                   1407:                  && setNumber( pixelDict, kIOFBWidthKey,
                   1408:                                pixelInfo.activeWidth )
                   1409:                  && setNumber( pixelDict, kIOFBHeightKey,
                   1410:                                pixelInfo.activeHeight );
                   1411:                if( !ok)
                   1412:                    break;
                   1413: 
                   1414:                sprintf( keyBuf, "%lx", depthNum + (aperture << 16) );
                   1415:                 modeDict->setObject( keyBuf, pixelDict );
                   1416:                pixelDict->release();
                   1417:            }
                   1418:        }
                   1419: 
                   1420:         sprintf( keyBuf, "%lx", modeIDs[ modeNum ] );
                   1421:         infoDict->setObject( keyBuf, modeDict );
                   1422:        modeDict->release();
                   1423:     }
                   1424: 
                   1425:     IODelete( modeIDs, IODisplayModeID, modeCount );
                   1426: 
                   1427:     ok &= infoDict->serialize( s );
                   1428:     infoDict->release();
                   1429: 
                   1430:     return( ok );
                   1431: }
                   1432: 
                   1433: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1434: 
                   1435: OSDefineMetaClassAndStructors(_IOFramebufferNotifier, IONotifier)
                   1436: #define LOCKNOTIFY()
                   1437: #define UNLOCKNOTIFY()
                   1438: 
                   1439: void _IOFramebufferNotifier::remove()
                   1440: {
                   1441:     LOCKNOTIFY();
                   1442: 
                   1443:     if( whence) {
                   1444:         whence->removeObject( (OSObject *) this );
                   1445:         whence = 0;
                   1446:     }
                   1447: 
                   1448:     fEnable = false;
                   1449: 
                   1450:     UNLOCKNOTIFY();
                   1451:     
                   1452:     release();
                   1453: }
                   1454: 
                   1455: bool _IOFramebufferNotifier::disable()
                   1456: {
                   1457:     bool       ret;
                   1458: 
                   1459:     LOCKNOTIFY();
                   1460:     ret = fEnable;
                   1461:     fEnable = false;
                   1462:     UNLOCKNOTIFY();
                   1463: 
                   1464:     return( ret );
                   1465: }
                   1466: 
                   1467: void _IOFramebufferNotifier::enable( bool was )
                   1468: {
                   1469:     LOCKNOTIFY();
                   1470:     fEnable = was;
                   1471:     UNLOCKNOTIFY();
                   1472: }
                   1473: 
                   1474: IONotifier * IOFramebuffer::addFramebufferNotification(
                   1475:        IOFramebufferNotificationHandler handler,
                   1476:        OSObject * self, void * ref)
                   1477: {
                   1478:     _IOFramebufferNotifier *   notify = 0;
                   1479: 
                   1480:     notify = new _IOFramebufferNotifier;
                   1481:     if( notify && !notify->init()) {
                   1482:         notify->release();
                   1483:         notify = 0;
                   1484:     }
                   1485: 
                   1486:     if( notify) {
                   1487:         notify->handler = handler;
                   1488:         notify->self = self;
                   1489:         notify->ref = ref;
                   1490:        notify->fEnable = true;
                   1491: 
                   1492:         if( 0 == fbNotifications)
                   1493:             fbNotifications = OSSet::withCapacity(1);
                   1494: 
                   1495:         notify->whence = fbNotifications;
                   1496:         if( fbNotifications)
                   1497:             fbNotifications->setObject( notify );
                   1498:     }
                   1499: 
                   1500:     return( notify );
                   1501: }
                   1502: 
                   1503: IOReturn IOFramebuffer::deliverFramebufferNotification(
                   1504:                IOIndex event, void * info = 0 )
                   1505: {
                   1506:     OSIterator *               iter;
                   1507:     _IOFramebufferNotifier *   notify;
                   1508:     IOReturn                   ret = kIOReturnSuccess;
                   1509:     IOReturn                   r;
                   1510: 
                   1511:     LOCKNOTIFY();
                   1512: 
                   1513:     iter = OSCollectionIterator::withCollection( fbNotifications );
                   1514: 
                   1515:     if( iter) {
                   1516:         while( (notify = (_IOFramebufferNotifier *) iter->getNextObject())) {
                   1517: 
                   1518:             if( notify->fEnable) {
                   1519:                r = (*notify->handler)( notify->self, notify->ref, this,
                   1520:                                        event, info );
                   1521:                if( kIOReturnSuccess != ret)
                   1522:                    ret = r;
                   1523:            }
                   1524:         }
                   1525:         iter->release();
                   1526:     }
                   1527: 
                   1528:     UNLOCKNOTIFY();
                   1529: 
                   1530:     return( ret );
                   1531: }
                   1532: 
                   1533: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                   1534: 
                   1535: // Some stubs
                   1536: 
                   1537: IOReturn IOFramebuffer::enableController ( void )
                   1538: {
                   1539:     return( kIOReturnSuccess );
                   1540: }
                   1541: 
                   1542: bool IOFramebuffer::isConsoleDevice( void )
                   1543: {
                   1544:     return( false );
                   1545: }
                   1546: 
                   1547:     // Set display mode and depth
                   1548: IOReturn IOFramebuffer::setDisplayMode( IODisplayModeID /* displayMode */,
                   1549:                             IOIndex /* depth */ )
                   1550: {
                   1551:     return( kIOReturnUnsupported);
                   1552: }
                   1553: 
                   1554: // For pages
                   1555: IOReturn IOFramebuffer::setApertureEnable(
                   1556:                IOPixelAperture /* aperture */, IOOptionBits /* enable */ )
                   1557: {
                   1558:     return( kIOReturnUnsupported);
                   1559: }
                   1560: 
                   1561: // Display mode and depth for startup
                   1562: IOReturn IOFramebuffer::setStartupDisplayMode(
                   1563:                        IODisplayModeID /* displayMode */, IOIndex /* depth */ )
                   1564: {
                   1565:     return( kIOReturnUnsupported);
                   1566: }
                   1567: 
                   1568: IOReturn IOFramebuffer::getStartupDisplayMode(
                   1569:                IODisplayModeID * /* displayMode */, IOIndex * /* depth */ )
                   1570: {
                   1571:     return( kIOReturnUnsupported);
                   1572: }
                   1573: 
                   1574: //// CLUTs
                   1575: 
                   1576: IOReturn IOFramebuffer::setCLUTWithEntries(
                   1577:            IOColorEntry * /* colors */, UInt32 /* index */,
                   1578:             UInt32 /* numEntries */, IOOptionBits /* options */ )
                   1579: {
                   1580:     return( kIOReturnUnsupported);
                   1581: }
                   1582: 
                   1583: //// Gamma
                   1584: 
                   1585: IOReturn IOFramebuffer::setGammaTable( UInt32 /* channelCount */,
                   1586:                UInt32 /* dataCount */, UInt32 /* dataWidth */, void * /* data */ )
                   1587: {
                   1588:     return( kIOReturnUnsupported);
                   1589: }
                   1590: 
                   1591: //// Controller attributes
                   1592: 
                   1593: IOReturn IOFramebuffer::setAttribute( IOSelect /* attribute */, UInt32 /* value */ )
                   1594: {
                   1595:     return( kIOReturnUnsupported);
                   1596: }
                   1597: 
                   1598: IOReturn IOFramebuffer::getAttribute( IOSelect /* attribute */,
                   1599:                UInt32 * /* value */ )
                   1600: {
                   1601:     return( kIOReturnUnsupported);
                   1602: }
                   1603: 
                   1604: //// Display mode timing information
                   1605: 
                   1606: IOReturn IOFramebuffer::getTimingInfoForDisplayMode(
                   1607:            IODisplayModeID /* displayMode */,
                   1608:             IOTimingInformation * /* info */ )
                   1609: {
                   1610:     return( kIOReturnUnsupported);
                   1611: }
                   1612: 
                   1613: //// Connections
                   1614: 
                   1615: IOItemCount IOFramebuffer::getConnectionCount( void )
                   1616: {
                   1617:     return( 1);
                   1618: }
                   1619: 
                   1620: IOReturn IOFramebuffer::setAttributeForConnection( IOIndex /* connectIndex */,
                   1621:                 IOSelect /* attribute */, UInt32 /* value */ )
                   1622: {
                   1623:     return( kIOReturnUnsupported);
                   1624: }
                   1625: 
                   1626: IOReturn IOFramebuffer::getAttributeForConnection( IOIndex /* connectIndex */,
                   1627:                 IOSelect /* attribute */, UInt32  * /* value */ )
                   1628: {
                   1629:     return( kIOReturnUnsupported);
                   1630: }
                   1631: 
                   1632: //// HW Cursors
                   1633: 
                   1634: IOReturn IOFramebuffer::setCursorImage( void * cursorImage )
                   1635: {
                   1636:     return( kIOReturnUnsupported);
                   1637: }
                   1638: 
                   1639: IOReturn IOFramebuffer::setCursorState( SInt32 x, SInt32 y, bool visible )
                   1640: {
                   1641:     return( kIOReturnUnsupported);
                   1642: }
                   1643: 
                   1644: void IOFramebuffer::flushCursor( void )
                   1645: {
                   1646: }
                   1647: 
                   1648: //// Interrupts
                   1649: 
                   1650: IOReturn IOFramebuffer::registerForInterruptType( IOSelect interruptType,
                   1651:                    IOFBInterruptProc proc, OSObject * target, void * ref,
                   1652:                    void ** interruptRef )
                   1653: {
                   1654:     return( kIOReturnUnsupported);
                   1655: }
                   1656: 
                   1657: IOReturn IOFramebuffer::unregisterInterrupt( void * interruptRef )
                   1658: {
                   1659:     return( kIOReturnUnsupported);
                   1660: }
                   1661: 
                   1662: IOReturn IOFramebuffer::setInterruptState( void * interruptRef, UInt32 state )
                   1663: {
                   1664:     return( kIOReturnUnsupported);
                   1665: }
                   1666: 
                   1667: // Apple sensing
                   1668: 
                   1669: IOReturn IOFramebuffer::getAppleSense(
                   1670:            IOIndex  /* connectIndex */,
                   1671:             UInt32 * /* senseType */,
                   1672:             UInt32 * /* primary */,
                   1673:             UInt32 * /* extended */,
                   1674:             UInt32 * /* displayType */ )
                   1675: {
                   1676:     return( kIOReturnUnsupported);
                   1677: }
                   1678: 
                   1679: IOReturn IOFramebuffer::connectFlags( IOIndex /* connectIndex */,
                   1680:                     IODisplayModeID /* displayMode */, IOOptionBits * /* flags */ )
                   1681: {
                   1682:     return( kIOReturnUnsupported);
                   1683: }
                   1684: 
                   1685: //// IOLowLevelDDCSense
                   1686: 
                   1687: void IOFramebuffer::setDDCClock( IOIndex /* connectIndex */, UInt32 /* value */ )
                   1688: {
                   1689: }
                   1690: 
                   1691: void IOFramebuffer::setDDCData( IOIndex /* connectIndex */, UInt32 /* value */ )
                   1692: {
                   1693: }
                   1694: 
                   1695: bool IOFramebuffer::readDDCClock( IOIndex /* connectIndex */ )
                   1696: {
                   1697:     return( false);
                   1698: }
                   1699: 
                   1700: bool IOFramebuffer::readDDCData( IOIndex /* connectIndex */ )
                   1701: {
                   1702:     return( false);
                   1703: }
                   1704: 
                   1705: IOReturn IOFramebuffer::enableDDCRaster( bool /* enable */ )
                   1706: {
                   1707:     return( kIOReturnUnsupported);
                   1708: }
                   1709: 
                   1710: 
                   1711: //// IOHighLevelDDCSense
                   1712: 
                   1713: bool IOFramebuffer::hasDDCConnect( IOIndex /* connectIndex */ )
                   1714: {
                   1715:     return( kIOReturnUnsupported);
                   1716: }
                   1717: 
                   1718: IOReturn IOFramebuffer::getDDCBlock( IOIndex /* connectIndex */, UInt32 /* blockNumber */,
                   1719:                     IOSelect /* blockType */, IOOptionBits /* options */,
                   1720:                     UInt8 * /* data */, IOByteCount * /* length */ )
                   1721: {
                   1722:     return( kIOReturnUnsupported);
                   1723: }
                   1724: 

unix.superglobalmegacorp.com

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