Annotation of XNU/iokit/Families/IOGraphics/AppleDDCDisplay.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) 1997-1998 Apple Computer, Inc.
                     24:  *
                     25:  *
                     26:  * HISTORY
                     27:  *
                     28:  * sdouglas  22 Oct 97 - first checked in.
                     29:  * sdouglas  23 Jul 98 - start IOKit
                     30:  * sdouglas  08 Dec 98 - start cpp
                     31:  */
                     32: 
                     33: #include <IOKit/graphics/IODisplay.h>
                     34: #include <libkern/c++/OSContainers.h>
                     35: #include <IOKit/IOLib.h>
                     36: 
                     37: #include <IOKit/assert.h>
                     38: 
                     39: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     40: 
                     41: struct EDID {
                     42:     UInt8      header[8];
                     43:     UInt8      vendorProduct[4];
                     44:     UInt8      serialNumber[4];
                     45:     UInt8      weekOfManufacture;
                     46:     UInt8      yearOfManufacture;
                     47:     UInt8      version;
                     48:     UInt8      revision;
                     49:     UInt8      displayParams[5];
                     50:     UInt8      colorCharacteristics[10];
                     51:     UInt8      establishedTimings[3];
                     52:     UInt16     standardTimings[8];
                     53:     UInt8      detailedTimings[72];
                     54:     UInt8      extension;
                     55:     UInt8      checksum;
                     56: };
                     57: 
                     58: struct TimingToEDID {
                     59:     UInt32     timingID;
                     60:     UInt8      spare;
                     61:     UInt8      establishedBit;
                     62:     UInt16     standardTiming;
                     63: };
                     64: 
                     65: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     66: 
                     67: class AppleDDCDisplay : public IODisplay
                     68: {
                     69:     OSDeclareDefaultStructors(AppleDDCDisplay)
                     70: 
                     71: private:
                     72:     OSData *           edidData;
                     73:     OSData *           additions;
                     74:     TimingToEDID *     timingToEDID;
                     75:     int                        numEDIDEntries;
                     76: 
                     77: public:
                     78:     virtual IOService * probe( IOService *     provider,
                     79:                                SInt32 *        score );
                     80: 
                     81:     virtual bool start( IOService * provider );
                     82: 
                     83:     virtual IOReturn getConnectFlagsForDisplayMode(
                     84:                IODisplayModeID mode, UInt32 * flags );
                     85: };
                     86: 
                     87: #undef super
                     88: #define super IODisplay
                     89: 
                     90: OSDefineMetaClassAndStructors(AppleDDCDisplay, IODisplay)
                     91: 
                     92: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
                     93: 
                     94: IOService * AppleDDCDisplay::probe(    IOService *     provider,
                     95:                                        SInt32 *        score )
                     96: {
                     97:     IODisplayConnect * connect;
                     98:     IOFramebuffer *    framebuffer;
                     99:     IOService *                ret = 0;
                    100: 
                    101:     do {
                    102: 
                    103:        if( 0 == super::probe( provider, score ))
                    104:             continue;
                    105: 
                    106:        connect = getConnection();
                    107:        framebuffer = connect->getFramebuffer();
                    108:        assert( framebuffer );
                    109: 
                    110:         if( kIOReturnSuccess != framebuffer->getAttributeForConnection(
                    111:                                connect->getConnection(),
                    112:                                kConnectionSupportsHLDDCSense, NULL ))
                    113:             continue;
                    114: 
                    115:        if( framebuffer->hasDDCConnect( connect->getConnection()))
                    116:             ret = this;
                    117: 
                    118:     } while( false);
                    119: 
                    120:     return( ret );
                    121: }
                    122: 
                    123: 
                    124: bool AppleDDCDisplay::start( IOService * provider )
                    125: {
                    126:     IOReturn           err;
                    127:     IODisplayConnect * connect;
                    128:     IOFramebuffer *    framebuffer;
                    129:     OSData *           data;
                    130:     OSArray *          array;
                    131:     OSDictionary *     dict;
                    132:     OSNumber *         off;
                    133:     IOByteCount                length;
                    134:     EDID               readEDID;
                    135:     UInt32             vendorProd;
                    136:     UInt32             index;
                    137: 
                    138:     if (false == super::start( provider ))
                    139:        return( false);
                    140: 
                    141:     connect = getConnection();
                    142:     framebuffer = connect->getFramebuffer();
                    143:     assert( framebuffer );
                    144: 
                    145:     do {
                    146:        length = sizeof( EDID);
                    147:        err = framebuffer->getDDCBlock( connect->getConnection(),
                    148:                1, kIODDCBlockTypeEDID, 0, (UInt8 *) &readEDID, &length );
                    149:        if( err || (length != sizeof( EDID)))
                    150:            continue;
                    151: 
                    152:        kprintf("%s EDID Version %d, Revision %d\n", framebuffer->getName(),
                    153:            readEDID.version, readEDID.revision );
                    154:        if( readEDID.version != 1)
                    155:            continue;
                    156: 
                    157:        if( (data = (OSData *) getProperty( "appleDDC" ))) {
                    158:            timingToEDID = (TimingToEDID *) data->getBytesNoCopy();
                    159:            numEDIDEntries = data->getLength() / sizeof(TimingToEDID);
                    160:        } else
                    161:           continue;
                    162: 
                    163:         setProperty( kIODisplayEDIDKey, &readEDID, sizeof( readEDID));
                    164: 
                    165:        vendorProd = (readEDID.vendorProduct[0] << 24)
                    166:                   | (readEDID.vendorProduct[1] << 16)
                    167:                   | (readEDID.vendorProduct[2] << 8)
                    168:                   | (readEDID.vendorProduct[3] << 0);
                    169: 
                    170: #if 1
                    171:         kprintf("Vendor/product 0x%08x, ", vendorProd );
                    172:        kprintf("Est: ");
                    173:        for( index = 0; index < 3; index++)
                    174:            kprintf(" 0x%02x,", readEDID.establishedTimings[ index ] );
                    175:        kprintf("\nStd: " );
                    176:        for( index = 0; index < 8; index++)
                    177:            kprintf(" 0x%04x,", readEDID.standardTimings[ index ] );
                    178:        kprintf("\n");
                    179: #endif
                    180: 
                    181:        data = 0;
                    182:        additions = 0;
                    183:        if( (array = OSDynamicCast(OSArray, getProperty("overrides")))) {
                    184:            for(   index = 0;
                    185:                  (dict = OSDynamicCast(OSDictionary, array->getObject(index)));
                    186:                   index++ ) {
                    187:                if( 0 == (off = OSDynamicCast(OSNumber, dict->getObject("ID"))))
                    188:                    continue;
                    189:                if( vendorProd == off->unsigned32BitValue()) {
                    190:                    data = OSDynamicCast(OSData,
                    191:                                dict->getObject( "EDID"));
                    192:                    additions = OSDynamicCast(OSData, 
                    193:                                dict->getObject("additions"));
                    194:                    break;
                    195:                }
                    196:            }
                    197:        }
                    198: 
                    199:        if( !data)
                    200:           data = (OSData *) getProperty( kIODisplayEDIDKey );
                    201:        if( !data)
                    202:            continue;
                    203:         edidData = data;
                    204: 
                    205:        return( true);
                    206: 
                    207:     } while( false);
                    208: 
                    209:     return( false);
                    210: }
                    211: 
                    212: IOReturn AppleDDCDisplay::getConnectFlagsForDisplayMode(
                    213:                IODisplayModeID mode, UInt32 * flags )
                    214: {
                    215:     IOReturn                   err;
                    216:     IODisplayConnect *         connect;
                    217:     IOFramebuffer *            framebuffer;
                    218:     IOTimingInformation        info;
                    219:     const TimingToEDID *       lookTiming;
                    220:     UInt32                     estBit, i;
                    221:     EDID *                     edid;
                    222:     UInt32 *                   addModes;
                    223:     UInt32                     numAdditions;
                    224:     UInt32                     appleTimingID;
                    225:     bool                       supported = false;
                    226:     enum {                     kSetFlags = (kDisplayModeValidFlag
                    227:                                           | kDisplayModeSafeFlag) };
                    228: 
                    229: 
                    230:     connect = getConnection();
                    231:     framebuffer = connect->getFramebuffer();
                    232:     assert( framebuffer );
                    233: 
                    234:     if( kIOReturnSuccess != framebuffer->connectFlags( connect->getConnection(),
                    235:                                                        mode, flags ))
                    236:        *flags = 0;
                    237: 
                    238:     err = framebuffer->getTimingInfoForDisplayMode( mode, &info );
                    239:     if( err != kIOReturnSuccess)
                    240:         return( err);
                    241: 
                    242:     appleTimingID = info.appleTimingID;
                    243: 
                    244:     if( additions) {
                    245:         numAdditions = additions->getLength() / sizeof( UInt32);
                    246:         addModes = (UInt32 *) additions->getBytesNoCopy();
                    247:         for( i = 0; (!supported) && (i < numAdditions); i++)
                    248:             supported = (addModes[ i ] == appleTimingID);
                    249:     }
                    250: 
                    251:     edid = (EDID *) edidData->getBytesNoCopy();
                    252:     assert( edid );
                    253:     for( lookTiming = timingToEDID;
                    254:         (!supported) && ((lookTiming - timingToEDID) < numEDIDEntries);
                    255:         lookTiming++ ) {
                    256: 
                    257:         if( lookTiming->timingID == appleTimingID) {
                    258:             estBit = lookTiming->establishedBit;
                    259:             if( estBit != 0xff)
                    260:                 supported = (0 != (edid->establishedTimings[ estBit / 8 ]
                    261:                                     & (1 << (estBit % 8))));
                    262: 
                    263:             for( i = 0; (!supported) && (i < 8); i++ )
                    264:                 supported = (lookTiming->standardTiming
                    265:                             == edid->standardTimings[i] );
                    266:         }
                    267:     }
                    268: 
                    269:     if( supported)
                    270:         *flags = kSetFlags;
                    271: 
                    272:     // Pass the existing flags (from framebuffer) thru
                    273:     return( err);
                    274: }
                    275: 

unix.superglobalmegacorp.com

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