1/* 2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * Copyright (c) 1997 Apple Computer, Inc. 30 * 31 * 32 * HISTORY 33 * 34 * Simon Douglas 10 Nov 97 35 * - first checked in, mostly from MacOS DBDMA.i, machdep/ppc/dbdma.h 36 * but use byte reverse ops. 37 */ 38 39#ifndef _IODBDMA_H_ 40#define _IODBDMA_H_ 41 42#include <IOKit/IOTypes.h> 43#include <libkern/OSByteOrder.h> 44 45 46/* DBDMA definitions */ 47 48struct IODBDMAChannelRegisters { 49 volatile unsigned long channelControl; 50 volatile unsigned long channelStatus; 51 volatile unsigned long commandPtrHi; /* implementation optional*/ 52 volatile unsigned long commandPtrLo; 53 volatile unsigned long interruptSelect; /* implementation optional*/ 54 volatile unsigned long branchSelect; /* implementation optional*/ 55 volatile unsigned long waitSelect; /* implementation optional*/ 56 volatile unsigned long transferModes; /* implementation optional*/ 57 volatile unsigned long data2PtrHi; /* implementation optional*/ 58 volatile unsigned long data2PtrLo; /* implementation optional*/ 59 60 volatile unsigned long reserved1; 61 volatile unsigned long addressHi; /* implementation optional*/ 62 volatile unsigned long reserved2[4]; 63 volatile unsigned long unimplemented[16]; 64 65/* This structure must remain fully padded to 256 bytes.*/ 66 volatile unsigned long undefined[32]; 67}; 68typedef struct IODBDMAChannelRegisters IODBDMAChannelRegisters; 69 70/* These constants define the DB-DMA channel control words and status flags.*/ 71 72enum { 73 kdbdmaRun = 0x00008000, 74 kdbdmaPause = 0x00004000, 75 kdbdmaFlush = 0x00002000, 76 kdbdmaWake = 0x00001000, 77 kdbdmaDead = 0x00000800, 78 kdbdmaActive = 0x00000400, 79 kdbdmaBt = 0x00000100, 80 kdbdmaS7 = 0x00000080, 81 kdbdmaS6 = 0x00000040, 82 kdbdmaS5 = 0x00000020, 83 kdbdmaS4 = 0x00000010, 84 kdbdmaS3 = 0x00000008, 85 kdbdmaS2 = 0x00000004, 86 kdbdmaS1 = 0x00000002, 87 kdbdmaS0 = 0x00000001 88}; 89 90 91#define IOSetDBDMAChannelControlBits(mask) ( ((mask) | (mask) << 16) ) 92#define IOClearDBDMAChannelControlBits(mask) ( (mask) << 16) 93 94 95/* This structure defines the DB-DMA channel command descriptor.*/ 96 97/* 98 *** WARNING: Endian-ness issues must be considered when performing load/store! *** 99*/ 100 101struct IODBDMADescriptor { 102 unsigned long operation; /* cmd || key || i || b || w || reqCount*/ 103 unsigned long address; 104 volatile unsigned long cmdDep; 105 volatile unsigned long result; /* xferStatus || resCount*/ 106}; 107typedef struct IODBDMADescriptor IODBDMADescriptor; 108 109/* These constants define the DB-DMA channel command operations and modifiers.*/ 110 111 112enum { 113/* Command.cmd operations*/ 114 kdbdmaOutputMore = 0, 115 kdbdmaOutputLast = 1, 116 kdbdmaInputMore = 2, 117 kdbdmaInputLast = 3, 118 kdbdmaStoreQuad = 4, 119 kdbdmaLoadQuad = 5, 120 kdbdmaNop = 6, 121 kdbdmaStop = 7 122}; 123 124 125enum { 126/* Command.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE)*/ 127 kdbdmaKeyStream0 = 0, /* default modifier*/ 128 kdbdmaKeyStream1 = 1, 129 kdbdmaKeyStream2 = 2, 130 kdbdmaKeyStream3 = 3, 131 kdbdmaKeyRegs = 5, 132 kdbdmaKeySystem = 6, 133 kdbdmaKeyDevice = 7, 134 135 kdbdmaIntNever = 0, /* default modifier*/ 136 kdbdmaIntIfTrue = 1, 137 kdbdmaIntIfFalse = 2, 138 kdbdmaIntAlways = 3, 139 140 kdbdmaBranchNever = 0, /* default modifier*/ 141 kdbdmaBranchIfTrue = 1, 142 kdbdmaBranchIfFalse = 2, 143 kdbdmaBranchAlways = 3, 144 145 kdbdmaWaitNever = 0, /* default modifier*/ 146 kdbdmaWaitIfTrue = 1, 147 kdbdmaWaitIfFalse = 2, 148 kdbdmaWaitAlways = 3, 149 150 kdbdmaCommandMask = (long)0xFFFF0000, 151 kdbdmaReqCountMask = 0x0000FFFF 152}; 153 154 155/* These constants define the DB-DMA channel command results.*/ 156 157enum { 158 /* result masks*/ 159 kdbdmaStatusRun = kdbdmaRun << 16, 160 kdbdmaStatusPause = kdbdmaPause << 16, 161 kdbdmaStatusFlush = kdbdmaFlush << 16, 162 kdbdmaStatusWake = kdbdmaWake << 16, 163 kdbdmaStatusDead = kdbdmaDead << 16, 164 kdbdmaStatusActive = kdbdmaActive << 16, 165 kdbdmaStatusBt = kdbdmaBt << 16, 166 kdbdmaStatusS7 = kdbdmaS7 << 16, 167 kdbdmaStatusS6 = kdbdmaS6 << 16, 168 kdbdmaStatusS5 = kdbdmaS5 << 16, 169 kdbdmaStatusS4 = kdbdmaS4 << 16, 170 kdbdmaStatusS3 = kdbdmaS3 << 16, 171 kdbdmaStatusS2 = kdbdmaS2 << 16, 172 kdbdmaStatusS1 = kdbdmaS1 << 16, 173 kdbdmaStatusS0 = kdbdmaS0 << 16, 174 kdbdmaResCountMask = 0x0000FFFF, 175 kdbdmaXferStatusMask = 0xFFFF0000 176}; 177 178 179/* These macros are are IODBDMAChannelRegisters accessor functions. */ 180 181#define IOSetDBDMAChannelRegister(registerSetPtr,field,value) \ 182OSWriteSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters,field),value) 183 184#define IOGetDBDMAChannelRegister(registerSetPtr, field) \ 185OSReadSwapInt32(registerSetPtr,offsetof(IODBDMAChannelRegisters, field)) 186 187 188/* void IOSetDBDMAChannelControl (IODBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue); */ 189 190#define IOSetDBDMAChannelControl(registerSetPtr,ctlValue) \ 191do { \ 192 eieio(); \ 193 IOSetDBDMAChannelRegister(registerSetPtr,channelControl,ctlValue); \ 194 eieio(); \ 195} while(0) 196 197/* unsigned long IOGetDBDMAChannelStatus (IODBDMAChannelRegisters *registerSetPtr); */ 198 199#define IOGetDBDMAChannelStatus(registerSetPtr) \ 200 IOGetDBDMAChannelRegister(registerSetPtr,channelStatus) 201 202/* unsigned long IOGetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr); */ 203 204#define IOGetDBDMACommandPtr(registerSetPtr) \ 205 IOGetDBDMAChannelRegister(registerSetPtr,commandPtrLo) 206 207/* void IOSetDBDMACommandPtr (IODBDMAChannelRegisters *registerSetPtr, unsigned long cclPtr); */ 208 209#define IOSetDBDMACommandPtr(registerSetPtr,cclPtr) \ 210do { \ 211 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrHi,0); \ 212 eieio(); \ 213 IOSetDBDMAChannelRegister(registerSetPtr,commandPtrLo,cclPtr); \ 214 eieio(); \ 215} while(0) 216 217 218/* unsigned long IOGetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr); */ 219 220#define IOGetDBDMAInterruptSelect(registerSetPtr) \ 221 IOGetDBDMAChannelRegister(registerSetPtr,interruptSelect) 222 223/* void IOSetDBDMAInterruptSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long intSelValue); */ 224 225#define IOSetDBDMAInterruptSelect(registerSetPtr,intSelValue) \ 226do { \ 227 IOSetDBDMAChannelRegister(registerSetPtr,interruptSelect,intSelValue); \ 228 eieio(); \ 229} while(0) 230 231/* unsigned long IOGetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr); */ 232 233#define IOGetDBDMABranchSelect(registerSetPtr) \ 234 IOGetDBDMAChannelRegister(registerSetPtr,branchSelect) 235 236/* void IOSetDBDMABranchSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long braSelValue); */ 237 238#define IOSetDBDMABranchSelect(registerSetPtr,braSelValue) \ 239do { \ 240 IOSetDBDMAChannelRegister(registerSetPtr,branchSelect,braSelValue); \ 241 eieio(); \ 242} while(0) 243 244/* unsigned long IOGetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr); */ 245 246#define IOGetDBDMAWaitSelect(registerSetPtr) \ 247 IOGetDBDMAChannelRegister(registerSetPtr,waitSelect) 248 249/* void IOSetDBDMAWaitSelect (IODBDMAChannelRegisters *registerSetPtr, unsigned long waitSelValue); */ 250 251#define IOSetDBDMAWaitSelect(registerSetPtr,waitSelValue) \ 252do { \ 253 IOSetDBDMAChannelRegister(registerSetPtr,waitSelect,waitSelValue); \ 254 eieio(); \ 255} while(0) 256 257 258/* These macros are IODBDMADescriptor accessor functions. */ 259 260#define IOSetDBDMADescriptor(descPtr,field,value) \ 261OSWriteSwapInt32( descPtr, offsetof( IODBDMADescriptor, field), value) 262 263#define IOGetDBDMADescriptor(descPtr,field) \ 264OSReadSwapInt32( descPtr, offsetof( IODBDMADescriptor, field)) 265 266#define IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count) \ 267 ( ((cmd) << 28) | ((key) << 24) | ((interrupt) << 20) \ 268 | ((branch) << 18) | ( (wait) << 16) | (count) ) 269 270/* void IOMakeDBDMADescriptor (IODBDMADescriptor *descPtr, 271 unsigned long cmd, 272 unsigned long key, 273 unsigned long interrupt, 274 unsigned long branch, 275 unsigned long wait, 276 unsigned long count, 277 unsigned long addr); */ 278 279#define IOMakeDBDMADescriptor(descPtr,cmd,key,interrupt,branch,wait,count,addr)\ 280do { \ 281 IOSetDBDMADescriptor(descPtr, address, addr); \ 282 IOSetDBDMADescriptor(descPtr, cmdDep, 0); \ 283 IOSetDBDMADescriptor(descPtr, result, 0); \ 284 eieio(); \ 285 IOSetDBDMADescriptor(descPtr, operation, \ 286 IOMakeDBDMAOperation(cmd,key,interrupt,branch,wait,count)); \ 287 eieio(); \ 288} while(0) 289 290/* void IOMakeDBDMADescriptorDep (IODBDMADescriptor *descPtr, 291 unsigned long cmd, 292 unsigned long key, 293 unsigned long interrupt, 294 unsigned long branch, 295 unsigned long wait, 296 unsigned long count, 297 unsigned long addr, 298 unsigned long dep); */ 299 300#define IOMakeDBDMADescriptorDep(descPtr,cmd,key,interrupt,branch,wait,count,addr,dep) \ 301do { \ 302 IOSetDBDMADescriptor(descPtr, address, addr); \ 303 IOSetDBDMADescriptor(descPtr, cmdDep, dep); \ 304 IOSetDBDMADescriptor(descPtr, result, 0); \ 305 eieio(); \ 306 IOSetDBDMADescriptor(descPtr, operation, \ 307 IOMakeDBDMAOperation(cmd, key, interrupt, branch, wait, count)); \ 308 eieio(); \ 309} while(0) 310 311/* Field accessors - NOTE: unsynchronized */ 312 313/* unsigned long IOGetDBDMAOperation (IODBDMADescriptor *descPtr) */ 314 315#define IOGetCCOperation(descPtr) \ 316 IOGetDBDMADescriptor(descPtr,operation) 317 318/* void IOSetCCOperation (IODBDMADescriptor *descPtr, unsigned long operationValue) */ 319 320#define IOSetCCOperation(descPtr,operationValue) \ 321 IOSetDBDMADescriptor(descPtr,operation,operationValue) 322 323/* unsigned long IOGetCCAddress (IODBDMADescriptor *descPtr) */ 324 325#define IOGetCCAddress(descPtr) \ 326 IOGetDBDMADescriptor(descPtr,address) 327 328/* void IOSetCCAddress (IODBDMADescriptor *descPtr, unsigned long addressValue) */ 329 330#define IOSetCCAddress(descPtr,addressValue) \ 331 IOSetDBDMADescriptor(descPtr,address, addressValue) 332 333/* unsigned long IOGetCCCmdDep (IODBDMADescriptor *descPtr) */ 334 335#define IOGetCCCmdDep(descPtr) \ 336 IOGetDBDMADescriptor(descPtr,cmdDep) 337 338/* void IOSetCCCmdDep (IODBDMADescriptor *descPtr, unsigned long cmdDepValue) */ 339 340#define IOSetCCCmdDep(descPtr,cmdDepValue) \ 341 IOSetDBDMADescriptor(descPtr,cmdDep,cmdDepValue) 342 343/* unsigned long IOGetCCResult (IODBDMADescriptor *descPtr) */ 344 345#define IOGetCCResult(descPtr) \ 346 IOGetDBDMADescriptor(descPtr,result) 347 348/* void IOSetCCResult (IODBDMADescriptor *descPtr, unsigned long resultValue) */ 349 350#define IOSetCCResult(descPtr,resultValue) \ 351 IOSetDBDMADescriptor(descPtr,result,resultValue) 352 353 354/* DBDMA routines */ 355 356extern void IODBDMAStart( volatile IODBDMAChannelRegisters *registerSetPtr, volatile IODBDMADescriptor *physicalDescPtr); 357extern void IODBDMAStop( volatile IODBDMAChannelRegisters *registerSetPtr); 358extern void IODBDMAFlush( volatile IODBDMAChannelRegisters *registerSetPtr); 359extern void IODBDMAReset( volatile IODBDMAChannelRegisters *registerSetPtr); 360extern void IODBDMAContinue( volatile IODBDMAChannelRegisters *registerSetPtr); 361extern void IODBDMAPause( volatile IODBDMAChannelRegisters *registerSetPtr); 362 363extern IOReturn IOAllocatePhysicallyContiguousMemory( unsigned int size, unsigned int options, 364 IOVirtualAddress * logical, IOPhysicalAddress * physical ); 365extern IOReturn IOFreePhysicallyContiguousMemory( IOVirtualAddress * logical, unsigned int size); 366 367#endif /* !defined(_IODBDMA_H_) */ 368