1/* 2 * Copyright (c) 2003 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/* 24 * 25 * IOFireWireAVCTargetSpace.h 26 * 27 * Class to centralize the AVC Target mode support 28 * 29 */ 30 31#ifndef _IOKIT_IOFIREWIREAVCTARGETSPACE_H 32#define _IOKIT_IOFIREWIREAVCTARGETSPACE_H 33 34#include <IOKit/IOUserClient.h> 35#include <IOKit/IOBufferMemoryDescriptor.h> 36 37#include <IOKit/firewire/IOFWAddressSpace.h> 38#include <IOKit/firewire/IOLocalConfigDirectory.h> 39#include <IOKit/avc/IOFireWireAVCConsts.h> 40#include <IOKit/avc/IOFireWireAVCUserClientCommon.h> 41 42class IOFireWireAVCProtocolUserClient; 43class AVCCommandHandlerInfo; 44class AVCSubunitInfo; 45 46typedef void (*IOFireWireAVCTargetCommandHandlerCallback)(const AVCCommandHandlerInfo *pCmdInfo, 47 UInt32 generation, 48 UInt16 nodeID, 49 const void *command, 50 UInt32 cmdLen, 51 IOFWSpeed &speed, 52 UInt32 handlerSearchIndex); 53 54typedef void (*IOFireWireAVCSubunitPlugHandlerCallback)(const AVCSubunitInfo *pSubunitInfo, 55 IOFWAVCSubunitPlugMessages plugMessage, 56 IOFWAVCPlugTypes plugType, 57 UInt32 plugNum, 58 UInt32 messageParams, 59 UInt32 generation, 60 UInt16 nodeID); 61 62/*! 63@class AVCCommandHandlerInfo 64@abstract internal class to manage installed command handlers 65*/ 66class AVCCommandHandlerInfo : public OSObject 67{ 68 OSDeclareDefaultStructors(AVCCommandHandlerInfo) 69public: 70 IOFireWireAVCProtocolUserClient * userClient; 71 IOFireWireAVCTargetCommandHandlerCallback callBack; 72 OSAsyncReference64 asyncRef; 73 UInt32 subUnitTypeAndID; 74 UInt32 opCode; 75 uint64_t userCallBack; 76 uint64_t userRefCon; 77}; 78 79typedef struct _AVCSubunitPlugRecord 80{ 81 UInt32 plugSignalFormat; 82 UInt32 connectionCount; 83}AVCSubunitPlugRecord; 84 85/*! 86@class AVCSubunitInfo 87@abstract internal class to manage installed subunits 88*/ 89class AVCSubunitInfo : public OSObject 90{ 91 OSDeclareDefaultStructors(AVCSubunitInfo) 92 bool init(); 93 void free(); 94public: 95 static AVCSubunitInfo *create(); 96 IOFireWireAVCProtocolUserClient * userClient; 97 IOFireWireAVCSubunitPlugHandlerCallback callBack; 98 OSAsyncReference64 asyncRef; 99 UInt32 subunitTypeAndID; 100 UInt32 numSourcePlugs; 101 UInt32 numDestPlugs; 102 uint64_t userCallBack; 103 uint64_t userRefCon; 104 AVCSubunitPlugRecord *sourcePlugRecords; 105 AVCSubunitPlugRecord *destPlugRecords; 106}; 107 108typedef struct _AVCUnitPlugRecord 109{ 110 UInt32 connectionCount; 111}AVCUnitPlugRecord; 112 113typedef struct _AVCUnitPlugs 114{ 115 UInt32 numIsochInPlugs; 116 UInt32 numIsochOutPlugs; 117 UInt32 numExternalInPlugs; 118 UInt32 numExternalOutPlugs; 119 AVCUnitPlugRecord isochInPlugRecord[kAVCMaxNumPlugs]; 120 AVCUnitPlugRecord isochOutPlugRecord[kAVCMaxNumPlugs]; 121 AVCUnitPlugRecord externalInPlugRecord[kAVCMaxNumPlugs]; 122 AVCUnitPlugRecord externalOutPlugRecord[kAVCMaxNumPlugs]; 123}AVCUnitPlugs; 124 125/*! 126@class UCInfo 127@abstract internal class to manage multiple protocol user clients 128*/ 129class UCInfo : public OSObject 130{ 131 OSDeclareDefaultStructors(UCInfo) 132public: 133 IOFireWireAVCProtocolUserClient *fUserClient; 134}; 135 136/*! 137@class AVCConnectionRecord 138@abstract internal class to manage AVC connections 139*/ 140class AVCConnectionRecord : public OSObject 141{ 142 OSDeclareDefaultStructors(AVCConnectionRecord) 143public: 144 UInt32 sourceSubunitTypeAndID; 145 IOFWAVCPlugTypes sourcePlugType; 146 UInt32 sourcePlugNum; 147 UInt32 destSubunitTypeAndID; 148 IOFWAVCPlugTypes destPlugType; 149 UInt32 destPlugNum; 150 bool lockConnection; 151 bool permConnection; 152}; 153 154/*! 155@class IOFireWireAVCTargetSpace 156@abstract object to centralize the AVC Target mode support 157*/ 158class IOFireWireAVCTargetSpace : public IOFWPseudoAddressSpace 159{ 160 OSDeclareDefaultStructors(IOFireWireAVCTargetSpace) 161 162protected: 163 UInt32 fBuf[512]; 164 UInt32 fActivations; 165 IOFireWireController *fController; 166 IOLocalConfigDirectory * fAVCLocalConfigDirectory; 167 OSArray * fUserClients; 168 OSArray * fCommandHandlers; 169 OSArray * fSubunits; 170 OSArray * fConnectionRecords; 171 AVCUnitPlugs fUnitPlugs; 172 IORecursiveLock * fLock; 173 174 /*! @struct ExpansionData 175 @discussion This structure will be used to expand the capablilties of the class in the future. 176 */ 177 struct ExpansionData { }; 178 179 /*! @var reserved 180 Reserved for future use. (Internal use only) */ 181 ExpansionData *reserved; 182 183 virtual UInt32 doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len, 184 const void *buf, IOFWRequestRefCon refcon); 185 186 187 IOReturn targetSendAVCResponse(UInt32 generation, UInt16 nodeID, IOBufferMemoryDescriptor *pBufMemDesc, UInt32 size); 188 189 // Internal AVC Target Command Handlers 190 IOReturn handleUnitInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 191 IOReturn handleSubUnitInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 192 IOReturn handlePlugInfoCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 193 IOReturn handlePowerCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 194 IOReturn handleConnectCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 195 IOReturn handleDisconnectCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 196 IOReturn handleInputPlugSignalFormatCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 197 IOReturn handleOutputPlugSignalFormatCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 198 IOReturn handleConnectionsCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 199 IOReturn handleSignalSourceCommand(UInt16 nodeID, UInt32 generation, const char *buf, UInt32 len); 200 201 UInt32 subUnitOfTypeCount(UInt32 type); 202 AVCSubunitInfo *getSubunitInfo(UInt32 subunitTypeAndID); 203 bool canConnectDestPlug(UInt32 destSubunitTypeAndID, 204 IOFWAVCPlugTypes destPlugType, 205 UInt32 *destPlugNum); 206 207public: 208 209 // Activate/Deactivate Functions 210 virtual IOReturn activateWithUserClient(IOFireWireAVCProtocolUserClient *userClient); 211 virtual void deactivateWithUserClient(IOFireWireAVCProtocolUserClient *userClient); 212 213 /*! 214 @function init 215 @abstract initializes the IOFireWireAVCTargetSpace object 216 */ 217 virtual bool init(IOFireWireController *controller); 218 219 /*! 220 @function getAVCTargetSpace 221 @abstract returns the IOFireWireAVCTargetSpace object for the given FireWire bus 222 @param bus The FireWire bus 223 */ 224 static IOFireWireAVCTargetSpace *getAVCTargetSpace(IOFireWireController *controller); 225 226 /*! 227 @function publishAVCUnitDirectory 228 @abstract Creates a local AVC Unit directory if it doesn't already exist 229 */ 230 virtual IOReturn publishAVCUnitDirectory(void); 231 232 virtual IOReturn installAVCCommandHandler(IOFireWireAVCProtocolUserClient *userClient, 233 IOFireWireAVCTargetCommandHandlerCallback callBack, 234 OSAsyncReference64 asyncRef, 235 UInt32 subUnitTypeAndID, 236 UInt32 opCode, 237 uint64_t userCallBack, 238 uint64_t userRefCon); 239 240 virtual IOReturn addSubunit(IOFireWireAVCProtocolUserClient *userClient, 241 IOFireWireAVCSubunitPlugHandlerCallback callBack, 242 OSAsyncReference64 asyncRef, 243 UInt32 subunitType, 244 UInt32 numSourcePlugs, 245 UInt32 numDestPlugs, 246 uint64_t userCallBack, 247 uint64_t userRefCon, 248 UInt32 *subUnitID); 249 250 virtual IOReturn setSubunitPlugSignalFormat(IOFireWireAVCProtocolUserClient *userClient, 251 UInt32 subunitTypeAndID, 252 IOFWAVCPlugTypes plugType, 253 UInt32 plugNum, 254 UInt32 signalFormat); 255 256 virtual IOReturn getSubunitPlugSignalFormat(IOFireWireAVCProtocolUserClient *userClient, 257 UInt32 subunitTypeAndID, 258 IOFWAVCPlugTypes plugType, 259 UInt32 plugNum, 260 UInt32 *pSignalFormat); 261 262 virtual IOReturn connectTargetPlugs(IOFireWireAVCProtocolUserClient *userClient, 263 AVCConnectTargetPlugsInParams *inParams, 264 AVCConnectTargetPlugsOutParams *outParams); 265 266 virtual IOReturn disconnectTargetPlugs(IOFireWireAVCProtocolUserClient *userClient, 267 UInt32 sourceSubunitTypeAndID, 268 IOFWAVCPlugTypes sourcePlugType, 269 UInt32 sourcePlugNum, 270 UInt32 destSubunitTypeAndID, 271 IOFWAVCPlugTypes destPlugType, 272 UInt32 destPlugNum); 273 274 virtual IOReturn getTargetPlugConnection(IOFireWireAVCProtocolUserClient *userClient, 275 AVCGetTargetPlugConnectionInParams *inParams, 276 AVCGetTargetPlugConnectionOutParams *outParams); 277 278 virtual IOReturn findAVCRequestHandler(IOFireWireAVCProtocolUserClient *userClient, 279 UInt32 generation, 280 UInt16 nodeID, 281 IOFWSpeed speed, 282 UInt32 handlerSearchIndex, 283 const char *pCmdBuf, 284 UInt32 cmdLen); 285 286 virtual void pcrModified(IOFWAVCPlugTypes plugType, 287 UInt32 plugNum, 288 UInt32 newValue); 289 290private: 291 OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 0); 292 OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 1); 293 OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 2); 294 OSMetaClassDeclareReservedUnused(IOFireWireAVCTargetSpace, 3); 295}; 296 297#endif /*_IOKIT_IOFIREWIREAVCTARGETSPACE_H */