|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: // Copyright 1997 by Apple Computer, Inc., all rights reserved. ! 26: /* ! 27: * Copyright (c) 1991-1997 NeXT Software, Inc. All rights reserved. ! 28: * ! 29: * IdeCnt.h - Interface for Ide Controller class. ! 30: * ! 31: * HISTORY ! 32: * ! 33: * 07-Jul-1994 Rakesh Dubey at NeXT ! 34: * Created from original driver written by David Somayajulu. ! 35: */ ! 36: ! 37: #ifdef DRIVER_PRIVATE ! 38: ! 39: #ifndef _BSD_DEV_I386_IDECNT_H_ ! 40: #define _BSD_DEV_I386_IDECNT_H_ ! 41: ! 42: #define __APPLE_TYPES_DEFINED__ 1 ! 43: ! 44: #import <driverkit/return.h> ! 45: #import <driverkit/driverTypes.h> ! 46: #import <driverkit/IODevice.h> ! 47: #import <driverkit/ppc/IOTreeDevice.h> ! 48: #import <driverkit/ppc/IODBDMA.h> ! 49: #import <driverkit/ppc/directDevice.h> ! 50: #import <driverkit/generalFuncs.h> ! 51: #import <sys/types.h> ! 52: #import "IdeCntPublic.h" ! 53: #import "AtapiCntPublic.h" ! 54: #import <driverkit/IOPower.h> ! 55: ! 56: ! 57: typedef enum { ! 58: IDE_PM_SLEEP = 0, IDE_PM_STANDBY, IDE_PM_IDLE, IDE_PM_ACTIVE ! 59: } idePowerState_t; ! 60: ! 61: typedef enum { ! 62: IDE_TRANSFER_PIO = 0, IDE_TRANSFER_SW_DMA, IDE_TRANSFER_MW_DMA, IDE_TRANSFER_ULTRA_DMA, ! 63: } ideTransferType_t; ! 64: ! 65: typedef enum { ! 66: IDE_TRANSFER_16_BIT = 0, IDE_TRANSFER_32_BIT ! 67: } ideTransferWidth_t; ! 68: ! 69: typedef enum { ! 70: IDE_PIO_ACCESS_BASE = 0, ! 71: IDE_PIO_ACCESS_MIN = 4, ! 72: IDE_PIO_RECOVERY_BASE = 4, ! 73: IDE_PIO_RECOVERY_MIN = 1, ! 74: ! 75: IDE_DMA_ACCESS_BASE = 0, ! 76: IDE_DMA_ACCESS_MIN = 1, ! 77: IDE_DMA_RECOVERY_BASE = 1, ! 78: IDE_DMA_RECOVERY_MIN = 1, ! 79: } ideDMAConfigLimits_t; ! 80: ! 81: typedef enum { ! 82: IDE_DMA_NONE, IDE_DMA_SINGLEWORD, IDE_DMA_MULTIWORD, IDE_DMA_ULTRA ! 83: } ideDMATypes_t; ! 84: ! 85: typedef struct _Cmd646xRegs ! 86: { ! 87: u_int8_t cntrlReg; ! 88: u_int8_t arttimReg; ! 89: u_int8_t cmdtimReg; ! 90: u_int8_t drwtimRegPIO; ! 91: u_int8_t drwtimRegDMA; ! 92: u_int8_t udidetcrReg; ! 93: } Cmd646xRegs_t; ! 94: ! 95: ! 96: typedef struct ! 97: { ! 98: BOOL fChanged; ! 99: BOOL useDMA; ! 100: int pioMode; ! 101: int pioAccessTime; ! 102: int pioCycleTime; ! 103: ideDMATypes_t dmaType; ! 104: int dmaMode; ! 105: int dmaAccessTime; ! 106: int dmaCycleTime; ! 107: union ! 108: { ! 109: u_int32_t dbdmaConfig; ! 110: Cmd646xRegs_t cmd646XConfig; ! 111: } ideConfig; ! 112: } ideCycleTimes_t; ! 113: ! 114: ! 115: @interface IdeController:IODirectDevice<IdeControllerPublic, ! 116: AtapiControllerPublic, IOPower> ! 117: { ! 118: @private ! 119: id _ideCmdLock; /* NXLock */ ! 120: ! 121: ideRegsAddrs_t _ideRegsAddrs; ! 122: ! 123: volatile IODBDMAChannelRegisters *_ideDMARegs; ! 124: volatile IODBDMADescriptor *_ideDMACommands; ! 125: uint _ideDMACommandsPhys; ! 126: ! 127: port_t _ideDevicePort; ! 128: port_t _ideInterruptPort; ! 129: unsigned int _interruptTimeOut; ! 130: ! 131: unsigned int _busNum; ! 132: /* ! 133: * From BIOS/CMOS. We use this only if the user asks for it. The ideInfo ! 134: * structure is like the INT41 table. We fill this in even if we do not ! 135: * use BIOS and get all our info from the drive using IDE_IDENTIFY_DRIVE. ! 136: */ ! 137: ideDriveInfo_t _ideInfo[MAX_IDE_DRIVES]; ! 138: ! 139: /* ! 140: * This is used for communication between ideSendCommand and methods for ! 141: * individual commands. ! 142: */ ! 143: unsigned char _driveNum; /* target drive */ ! 144: ! 145: unsigned char _controllerNum; /* our number */ ! 146: ! 147: unsigned char _controllerType; ! 148: /* ! 149: * Information from IDE_IDENTIFY_DRIVE commnad. ! 150: */ ! 151: BOOL _ideIdentifyInfoSupported[MAX_IDE_DRIVES]; ! 152: ideIdentifyInfo_t _ideIdentifyInfo[MAX_IDE_DRIVES]; ! 153: BOOL _dmaSupported[MAX_IDE_DRIVES]; ! 154: unsigned char _driveReset[MAX_IDE_DRIVES]; ! 155: ! 156: BOOL _multiSectorRequested; /* user option */ ! 157: unsigned short _multiSector[MAX_IDE_DRIVES]; ! 158: unsigned char _addressMode[MAX_IDE_DRIVES]; /* LBA or CHS */ ! 159: ideCycleTimes_t _cycleTimes[MAX_IDE_DRIVES]; ! 160: ! 161: BOOL _IOCHRDYSupport; /* Host side */ ! 162: ! 163: /* ! 164: * ATAPI related ivars. ! 165: */ ! 166: BOOL _atapiDevice[MAX_IDE_DRIVES]; ! 167: BOOL _atapiCommandActive[MAX_IDE_DRIVES]; ! 168: unsigned char _atapiCmdLen[MAX_IDE_DRIVES]; ! 169: unsigned char _atapiCmdDrqType[MAX_IDE_DRIVES]; ! 170: ! 171: /* ! 172: * Power management related ivars. ! 173: */ ! 174: idePowerState_t _drivePowerState; /* PM state for both drives */ ! 175: BOOL _driveSleepRequest; ! 176: } ! 177: ! 178: /* ! 179: * Exported methods. ! 180: */ ! 181: + (BOOL)probe:(IOTreeDevice *)devDesc; ! 182: ! 183: - (void)enableInterrupts; ! 184: - (void)disableInterrupts; ! 185: ! 186: - (void)setInterruptTimeOut:(unsigned int)timeOut; ! 187: - (unsigned int)interruptTimeOut; ! 188: ! 189: - (ide_return_t)ideWaitForInterrupt:(unsigned int)command ! 190: ideStatus:(unsigned char *)status; ! 191: - (void)clearInterrupts; ! 192: ! 193: /* ! 194: * Controller status checks. ! 195: */ ! 196: - (ide_return_t)waitForNotBusy; ! 197: - (ide_return_t)waitForDeviceReady; ! 198: - (ide_return_t)waitForDataReady; ! 199: ! 200: - (ide_return_t)ataIdeReadGetInfoCommonWaitForDataReady; ! 201: ! 202: /* ! 203: * Miscellaneous methods. ! 204: */ ! 205: ! 206: - (void) configWriteByte: (u_int32_t)reg value: (u_int8_t)cfgByte; ! 207: - (void) configReadByte: (u_int32_t)reg value: (u_int8_t *)cfgByte; ! 208: ! 209: ! 210: - (IOReturn) ideExecuteCmd:(ideIoReq_t *)ideIoReq ToDrive:(unsigned char)drive; ! 211: ! 212: - (void)xferData:(caddr_t)addr read:(BOOL)read client:(struct vm_map *)client ! 213: length:(unsigned)length; ! 214: ! 215: - (void)ideCntrlrLock; ! 216: - (void)ideCntrlrUnLock; ! 217: ! 218: - (u_int) numberOfDrives; ! 219: ! 220: - (void)atapiCntrlrLock; ! 221: - (void)atapiCntrlrUnLock; ! 222: ! 223: - (BOOL)isMultiSectorAllowed:(unsigned int)unit; ! 224: - (unsigned int)getMultiSectorValue:(unsigned int)unit; ! 225: - (ideIdentifyInfo_t *) getIdeIdentifyInfo:(unsigned int)unit; ! 226: - (ideDriveInfo_t *) getIdeDriveInfo:(unsigned int)unit; ! 227: - (void)getIdeRegisters:(ideRegsVal_t *)rvp Print:(char *)printString; ! 228: - (BOOL) isDmaSupported:(unsigned int)unit; ! 229: ! 230: -(void) setTransferRate: (int) unit UseDMA:(BOOL)fUseDMA; ! 231: -(void) setTransferMode:(int) unit; ! 232: ! 233: /* ! 234: * Number of sectors that can be transferred via READ_MULTIPLE or ! 235: * WRITE_MULTIPLE command. ! 236: */ ! 237: - (unsigned int)getMultiSectorValue:(unsigned int)unit; ! 238: ! 239: /* ! 240: * ATAPI related methods. ! 241: */ ! 242: - (unsigned int)numDevices; /* max devices on ATA bus */ ! 243: - (BOOL)isAtapiDevice:(unsigned char)unit; ! 244: - (BOOL)isAtapiCommandActive:(unsigned char)unit; ! 245: - (void)setAtapiCommandActive:(BOOL)state forUnit:(unsigned char)unit; ! 246: ! 247: /* ! 248: * Power management methods. ! 249: */ ! 250: - (idePowerState_t)drivePowerState; ! 251: - (void)setDrivePowerState:(idePowerState_t)state; ! 252: - (void)putDriveToSleep; ! 253: - (void)wakeUpDrive; ! 254: - (BOOL)spinUpDrive:(unsigned int)unit; ! 255: - (BOOL)startUpAttachedDevices; ! 256: ! 257: /* ! 258: * The PM state is per controller, not per device. ! 259: */ ! 260: - (IOReturn) getPowerState:(PMPowerState *)state_p; ! 261: - (IOReturn) setPowerState:(PMPowerState)state; ! 262: - (IOReturn) getPowerManagement:(PMPowerManagementState *)state_p; ! 263: - (IOReturn) setPowerManagement:(PMPowerManagementState)state; ! 264: ! 265: @end ! 266: ! 267: #define MAX_BUSY_DELAY (10 * 1000 * 1000) // 10 seconds ! 268: #define MAX_DATA_READY_DELAY (10 * 1000 * 1000) ! 269: ! 270: #define MEDIA_BAY_ID_MASK 0x0000ff00 ! 271: #define MEDIA_BAY_ID_CDROM 0x00003000 ! 272: ! 273: /* ! 274: * This is actually quite a long time but it is mandated by the spec. ! 275: */ ! 276: #define IDE_INTR_TIMEOUT (30*1000) // thirty seconds ! 277: ! 278: #endif _BSD_DEV_I386_IDECNT_H_ ! 279: ! 280: #endif DRIVER_PRIVATE ! 281:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.