Annotation of XNU/iokit/Families/IOFireWire/IOFWDCLProgram.cpp, revision 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) 1999 Apple Computer, Inc.  All rights reserved.
        !            24:  *
        !            25:  * HISTORY
        !            26:  *
        !            27:  */
        !            28: 
        !            29: #include <IOKit/IOLib.h>
        !            30: #include <IOKit/firewire/IOFWDCLProgram.h>
        !            31: 
        !            32: #define super OSObject
        !            33: 
        !            34: OSDefineMetaClass( IODCLProgram, OSObject )
        !            35: OSDefineAbstractStructors(IODCLProgram, OSObject)
        !            36: 
        !            37: bool IODCLProgram::init(IOFireWireBus::DCLTaskInfo *info)
        !            38: {
        !            39:     bool ok;
        !            40:     ok = OSObject::init();
        !            41:     if(!ok || info == NULL)
        !            42:        return ok;
        !            43:     do {
        !            44:        // Have to map DCL as read/write because timestamp opcode writes
        !            45:        // into the DCL.
        !            46:         fDCLDesc = IOMemoryDescriptor::withAddress(info->fDCLBaseAddr,
        !            47:                info->fDCLSize, kIODirectionOutIn, info->fTask);
        !            48:         if(!fDCLDesc) {
        !            49:             ok = false;
        !            50:             break;
        !            51:         }
        !            52:         fDataDesc = IOMemoryDescriptor::withAddress(info->fDataBaseAddr,
        !            53:                 info->fDataSize, kIODirectionOutIn, info->fTask);
        !            54:         if(!fDataDesc) {
        !            55:             ok = false;
        !            56:             break;
        !            57:         }
        !            58:        // 6250 is the total bandwidth per frame at 400Mb/sec, seems a reasonable limit!
        !            59:         fDataCursor = IONaturalMemoryCursor::withSpecification(PAGE_SIZE, 6250);
        !            60:         if(!fDataCursor) {
        !            61:             ok = false;
        !            62:             break;
        !            63:         }
        !            64:         vm_address_t kernelDCL;
        !            65:         IOReturn res;
        !            66:         IOByteCount len;
        !            67:         res = fDCLDesc->prepare(kIODirectionOutIn);
        !            68:         if(res != kIOReturnSuccess) {
        !            69:             ok = false;
        !            70:             break;
        !            71:        }
        !            72:         kernelDCL = (vm_address_t)fDCLDesc->getVirtualSegment(0, &len);
        !            73:         assert(len >= info->fDCLSize);
        !            74:         fDCLTaskToKernel = kernelDCL - info->fDCLBaseAddr;
        !            75:         res = fDataDesc->prepare(kIODirectionOutIn);
        !            76:         if(res != kIOReturnSuccess) {
        !            77:             ok = false;
        !            78:             break;
        !            79:         }
        !            80:         fCallUser = info->fCallUser;
        !            81:         fCallRefCon = info->fCallRefCon;
        !            82:         fDataBase = info->fDataBaseAddr;
        !            83:     } while (false);
        !            84:     if(!ok) {
        !            85:        if(fDCLDesc)
        !            86:             fDCLDesc->release();
        !            87:         if(fDataDesc)
        !            88:             fDataDesc->release();
        !            89:         if(fDataCursor)
        !            90:             fDataCursor->release();
        !            91:     }
        !            92:     return ok;
        !            93: }
        !            94: 
        !            95: void IODCLProgram::free()
        !            96: {
        !            97:     if(fDCLDesc) {
        !            98:         fDCLDesc->complete(kIODirectionOutIn);
        !            99:        fDCLDesc->release();
        !           100:     }
        !           101:     if(fDataDesc) {
        !           102:         fDataDesc->complete(kIODirectionOutIn);
        !           103:        fDataDesc->release();
        !           104:     }
        !           105:     if(fDataCursor)
        !           106:         fDataCursor->release();
        !           107:     OSObject::free();
        !           108: }
        !           109: 
        !           110: UInt32 IODCLProgram::getPhysicalSegs(void *addr, IOByteCount len,
        !           111:        IOMemoryCursor::PhysicalSegment segs[], UInt32 maxSegs)
        !           112: {
        !           113:     UInt32 nSegs;
        !           114:     if(fDataDesc && fDataCursor) {
        !           115:         nSegs = fDataCursor->genPhysicalSegments(fDataDesc, (IOByteCount)addr - fDataBase, segs, maxSegs, len);
        !           116:     }
        !           117:     else {
        !           118:        UInt32 i;
        !           119:         vm_address_t pos;
        !           120:         pos = (vm_address_t)addr;
        !           121:         nSegs = (round_page(pos+len) - trunc_page(pos))/(PAGE_SIZE);
        !           122:        if (nSegs > maxSegs) {
        !           123:             IOLog("IODCLProgram::getPhysicalSegs(): Data descriptor too complex for compiler!\n");
        !           124:             nSegs = 0;
        !           125:         }
        !           126:         for(i = 0; i<nSegs; i++) {
        !           127:             IOByteCount segLen;
        !           128:             segs[i].location = pmap_extract(kernel_pmap, pos);
        !           129:             segLen = PAGE_SIZE - (pos & (PAGE_SIZE - 1));
        !           130:             if(segLen > len)
        !           131:                 segLen = len;
        !           132:             segs[i].length = segLen;
        !           133:             pos += segLen;
        !           134:             len -= segLen;
        !           135:        }
        !           136:     }
        !           137:     return nSegs;
        !           138: }
        !           139: 
        !           140: void IODCLProgram::dumpDCL(DCLCommand *op)
        !           141: {
        !           142:     while(op) {
        !           143:         UInt32         opcode;
        !           144:         IOLog("(0x%x)", op);
        !           145:         op = convertDCLPtrToKernel(op);
        !           146:         // Dispatch off of opcode.
        !           147:         opcode = op->opcode & ~kFWDCLOpFlagMask;
        !           148:         IOLog("Opcode 0x%x:", op);
        !           149:         switch(opcode) {
        !           150:             case kDCLReceivePacketStartOp :
        !           151:             {
        !           152:                 DCLTransferPacketPtr t = (DCLTransferPacketPtr) op;
        !           153: 
        !           154:                 IOLog("ReceivePacketStartDCL to 0x%x, size %d", t->buffer, t->size);
        !           155:                 break;
        !           156:             }
        !           157:             case kDCLReceivePacketOp :
        !           158:             {
        !           159:                 DCLTransferPacketPtr t = (DCLTransferPacketPtr) op;
        !           160: 
        !           161:                 IOLog("ReceivePacketDCL to 0x%x, size %d", t->buffer, t->size);
        !           162:                 break;
        !           163:             }
        !           164: 
        !           165:             case kDCLSendPacketStartOp :
        !           166:             {
        !           167:                 DCLTransferPacketPtr t = (DCLTransferPacketPtr) op;
        !           168: 
        !           169:                 IOLog("SendPacketStartDCL from 0x%x, size %d", t->buffer, t->size);
        !           170:                 break;
        !           171:             }
        !           172: 
        !           173:             case kDCLSendPacketWithHeaderStartOp :
        !           174:             {
        !           175:                 DCLTransferPacketPtr t = (DCLTransferPacketPtr) op;
        !           176: 
        !           177:                 IOLog("SendPacketWithHeaderStartDCL from 0x%x, size %d", t->buffer, t->size);
        !           178:                 break;
        !           179:             }
        !           180: 
        !           181:             case kDCLSendPacketOp :
        !           182:             {
        !           183:                 DCLTransferPacketPtr t = (DCLTransferPacketPtr) op;
        !           184: 
        !           185:                 IOLog("SendPacketDCL from 0x%x, size %d", t->buffer, t->size);
        !           186:                 break;
        !           187:             }
        !           188: 
        !           189:             case kDCLCallProcOp :
        !           190:             {
        !           191:                 DCLCallProcPtr t = (DCLCallProcPtr) op;
        !           192: 
        !           193:                 IOLog("CallProcDCL calling 0x%x(0x%x)", t->proc, t->procData);
        !           194:                 break;
        !           195:             }
        !           196:             case kDCLJumpOp :
        !           197:                 IOLog("JumpDCL to 0x%x", ((DCLJumpPtr)op)->pJumpDCLLabel);
        !           198:                 break;
        !           199: 
        !           200:             case kDCLLabelOp :
        !           201:                 IOLog("LabelDCL");
        !           202:                 break;
        !           203: 
        !           204:             case kDCLSetTagSyncBitsOp :
        !           205:                 IOLog("SetTagSyncBitsDCL");
        !           206:                 break;
        !           207: 
        !           208:             case kDCLUpdateDCLListOp :
        !           209:             {
        !           210:                 int i;
        !           211:                 DCLUpdateDCLListPtr t = (DCLUpdateDCLListPtr) op;
        !           212:                 DCLCommandPtr *p = t->dclCommandList;
        !           213:                 IOLog("updateDCLListDCL:");
        !           214:                 for(i=0; i<t->numDCLCommands; i++)
        !           215:                     IOLog("0x%x ", *p++);
        !           216:                 break;
        !           217:             }
        !           218: 
        !           219:             case kDCLTimeStampOp :
        !           220:                 IOLog("timeStampDCL");
        !           221:                 break;
        !           222:             default: IOLog("Unknown opcode %d", opcode);
        !           223:                 break;
        !           224:         }
        !           225:         IOLog("\n");
        !           226:         op = op->pNextDCLCommand;
        !           227:     }
        !           228: }

unix.superglobalmegacorp.com

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