|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.