|
|
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.0 (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-1998 by Apple Computer, Inc., All rights reserved. ! 26: * Copyright 1994-1997 NeXT Software, Inc., All rights reserved. ! 27: * ! 28: * IdeCnt.h - Interface for Ide Controller class. ! 29: * ! 30: * HISTORY ! 31: * ! 32: * 07-Jul-1994 Rakesh Dubey at NeXT ! 33: * Created from original driver written by David Somayajulu. ! 34: */ ! 35: ! 36: #ifdef DRIVER_PRIVATE ! 37: ! 38: #ifndef _BSD_DEV_I386_IDECNT_H_ ! 39: #define _BSD_DEV_I386_IDECNT_H_ ! 40: ! 41: #import <driverkit/return.h> ! 42: #import <driverkit/driverTypes.h> ! 43: #import <driverkit/IODevice.h> ! 44: #import <driverkit/machine/directDevice.h> ! 45: #import <driverkit/generalFuncs.h> ! 46: #import <sys/types.h> ! 47: #import "IdeCntPublic.h" ! 48: #import "AtapiCntPublic.h" ! 49: #import <driverkit/IOPower.h> ! 50: #import <string.h> // bzero ! 51: // #import <stdlib.h> // strtol ! 52: ! 53: /* ! 54: * Disable mach messaging, but instead use thead sleep/wakeup. ! 55: */ ! 56: // #define NO_IRQ_MSG 1 ! 57: ! 58: typedef enum { ! 59: IDE_PM_SLEEP = 0, IDE_PM_STANDBY, IDE_PM_IDLE, IDE_PM_ACTIVE ! 60: } idePowerState_t; ! 61: ! 62: typedef enum { ! 63: IDE_TRANSFER_PIO = 0, ! 64: IDE_TRANSFER_SW_DMA, ! 65: IDE_TRANSFER_MW_DMA, ! 66: IDE_TRANSFER_ULTRA_DMA, ! 67: } ideTransferType_t; ! 68: ! 69: typedef enum { ! 70: IDE_TRANSFER_16_BIT = 0, IDE_TRANSFER_32_BIT ! 71: } ideTransferWidth_t; ! 72: ! 73: __private_extern__ unsigned int _ide_debug; ! 74: ! 75: /* ! 76: * Structure used to keep track of PRD table memory within the driver. ! 77: */ ! 78: typedef struct { ! 79: void *ptr; ! 80: unsigned int size; ! 81: void *ptrReal; ! 82: unsigned int sizeReal; ! 83: } memStruct_t; ! 84: ! 85: /* ! 86: * ATA transfer Modes. ! 87: */ ! 88: #define ATA_MODE_NONE 0x0 ! 89: #define ATA_MODE_0 0x01 ! 90: #define ATA_MODE_1 0x02 ! 91: #define ATA_MODE_2 0x04 ! 92: #define ATA_MODE_3 0x08 ! 93: #define ATA_MODE_4 0x10 ! 94: #define ATA_MODE_5 0x20 ! 95: ! 96: /* ! 97: * Define type to encode a single mode, or a mask to represent a group ! 98: * of allowable modes. ! 99: */ ! 100: typedef unsigned char ata_mode_t; ! 101: typedef ata_mode_t ata_mask_t; ! 102: ! 103: /* ! 104: * ATA Transfer mode capability struct. This encodes all the transfer ! 105: * modes that a controller or a drive can support. ! 106: */ ! 107: typedef union { ! 108: struct { ! 109: ata_mask_t pio; ! 110: ata_mask_t swdma; ! 111: ata_mask_t mwdma; ! 112: ata_mask_t udma; ! 113: } mode; ! 114: struct { ! 115: ata_mask_t mode[4]; // indexed by ideTransferType_t ! 116: } array; ! 117: unsigned int modes; ! 118: } txferModes_t; ! 119: ! 120: /* ! 121: * Information stored for a given drive. ! 122: */ ! 123: typedef struct { ! 124: // For All IDE devices ! 125: BOOL biosGeometry; /* using BIOS? */ ! 126: ideDriveInfo_t ideInfo; ! 127: BOOL ideIdentifyInfoSupported; ! 128: ideIdentifyInfo_t *ideIdentifyInfo; ! 129: u_short dmaChannel; ! 130: u_short multiSector; ! 131: u_char addressMode; /* LBA or CHS */ ! 132: txferModes_t driveModes; /* supported modes */ ! 133: txferModes_t driveMasks; /* masks */ ! 134: ideTransferType_t transferType; /* selected type */ ! 135: ata_mode_t transferMode; /* selected mode */ ! 136: ! 137: // ATAPI only ! 138: BOOL atapiDevice; ! 139: BOOL atapiCommandActive; ! 140: u_char atapiCmdLen; ! 141: u_char atapiCmdDrqType; ! 142: } driveInfo_t; ! 143: ! 144: __private_extern__ unsigned char ata_mode_to_num(unsigned char mode); ! 145: __private_extern__ ata_mode_t ata_mask_to_mode(ata_mask_t mask); ! 146: __private_extern__ ata_mask_t ata_mode_to_mask(ata_mode_t mode); ! 147: ! 148: ! 149: @interface IdeController:IODirectDevice<IdeControllerPublic, ! 150: AtapiControllerPublic, IOPower> ! 151: { ! 152: @private ! 153: id _ideCmdLock; /* NXLock */ ! 154: ideRegsAddrs_t _ideRegsAddrs; ! 155: port_t _ideDevicePort; ! 156: port_t _ideInterruptPort; ! 157: unsigned int _interruptTimeOut; ! 158: ! 159: /* ! 160: * This is used for communication between ideSendCommand and methods for ! 161: * individual commands. ! 162: */ ! 163: unsigned char _driveNum; /* target drive */ ! 164: unsigned char _controllerNum; /* our number */ ! 165: ! 166: /* ! 167: * Information for the drives attached to this controller. ! 168: */ ! 169: driveInfo_t _drives[MAX_IDE_DRIVES]; ! 170: ! 171: /* ! 172: * User settings. ! 173: */ ! 174: BOOL _multiSectorRequested; /* user option */ ! 175: ! 176: /* ! 177: * IDE Controller information ! 178: */ ! 179: BOOL _EIDESupport; /* EIDE enabled? */ ! 180: BOOL _IOCHRDYSupport; /* Host side */ ! 181: txferModes_t _controllerModes; /* Masks of transfer modes supported */ ! 182: ! 183: /* ! 184: * PCI related ivars. ! 185: */ ! 186: ideTransferWidth_t _transferWidth; // 16 or 32 bits ! 187: unsigned long _controllerID; // PCI IDE controller's ID ! 188: unsigned short _bmRegs; // I/O mapped bus master registers ! 189: memStruct_t _prdTable; // descriptor table memory ! 190: unsigned int _tablePhyAddr; // table's physical address ! 191: BOOL _busMaster; // YES for bus master controllers ! 192: enum { ! 193: PCI_CHANNEL_PRIMARY, // 0x1f0, 14 ! 194: PCI_CHANNEL_SECONDARY, // 0x170, 15 ! 195: PCI_CHANNEL_OTHER, ! 196: } _ideChannel; ! 197: ! 198: /* ! 199: * Power management related ivars. ! 200: */ ! 201: idePowerState_t _drivePowerState; /* PM state for both drives */ ! 202: BOOL _driveSleepRequest; ! 203: ! 204: #ifdef NO_IRQ_MSG ! 205: BOOL interruptOccurred; ! 206: int waitQueue; ! 207: #endif NO_IRQ_MSG ! 208: ! 209: #ifdef DEBUG ! 210: /* For testing */ ! 211: BOOL _printWaitForNotBusy; ! 212: #endif DEBUG ! 213: } ! 214: ! 215: /* ! 216: * Exported methods. ! 217: */ ! 218: + (BOOL)probe:(IODeviceDescription *)devDesc; ! 219: ! 220: - (void)enableInterrupts; ! 221: - (void)disableInterrupts; ! 222: ! 223: - (void)setInterruptTimeOut:(unsigned int)timeOut; ! 224: - (unsigned int)interruptTimeOut; ! 225: ! 226: - (ide_return_t)ideWaitForInterrupt:(unsigned int)command ! 227: ideStatus:(unsigned char *)status; ! 228: - (void)clearInterrupts; ! 229: ! 230: - free; ! 231: ! 232: /* ! 233: * Controller status checks. ! 234: */ ! 235: - (ide_return_t)waitForNotBusy; ! 236: - (ide_return_t)waitForDeviceReady; ! 237: - (ide_return_t)waitForDataReady; ! 238: - (ide_return_t)waitForDeviceIdle; ! 239: ! 240: - (ide_return_t)ataIdeReadGetInfoCommonWaitForDataReady; ! 241: ! 242: /* ! 243: * Miscellaneous methods. ! 244: */ ! 245: - (void)xferData:(caddr_t)addr read:(BOOL)read client:(struct vm_map *)client ! 246: length:(unsigned)length; ! 247: ! 248: - (void)ideCntrlrLock; ! 249: - (void)ideCntrlrUnLock; ! 250: ! 251: - (void)atapiCntrlrLock; ! 252: - (void)atapiCntrlrUnLock; ! 253: ! 254: - (BOOL)isMultiSectorAllowed:(unsigned int)unit; ! 255: - (void)getIdeRegisters:(ideRegsVal_t *)rvp Print:(char *)printString; ! 256: ! 257: - (BOOL) isDmaSupported:(unsigned int)unit; ! 258: ! 259: /* ! 260: * Number of sectors that can be transferred via READ_MULTIPLE or ! 261: * WRITE_MULTIPLE command. ! 262: */ ! 263: - (unsigned int)getMultiSectorValue:(unsigned int)unit; ! 264: ! 265: /* ! 266: * ATAPI related methods. ! 267: */ ! 268: - (unsigned int)numDevices; /* max devices on ATA bus */ ! 269: - (BOOL)isAtapiDevice:(unsigned char)unit; ! 270: - (BOOL)isAtapiCommandActive:(unsigned char)unit; ! 271: - (void)setAtapiCommandActive:(BOOL)state forUnit:(unsigned char)unit; ! 272: ! 273: /* ! 274: * Power management methods. ! 275: */ ! 276: - (idePowerState_t)drivePowerState; ! 277: - (void)setDrivePowerState:(idePowerState_t)state; ! 278: - (void)putDriveToSleep; ! 279: - (void)wakeUpDrive; ! 280: - (BOOL)spinUpDrive:(unsigned int)unit; ! 281: - (BOOL)startUpAttachedDevices; ! 282: ! 283: /* ! 284: * The PM state is per controller, not per device. ! 285: */ ! 286: - (IOReturn) getPowerState:(PMPowerState *)state_p; ! 287: - (IOReturn) setPowerState:(PMPowerState)state; ! 288: - (IOReturn) getPowerManagement:(PMPowerManagementState *)state_p; ! 289: - (IOReturn) setPowerManagement:(PMPowerManagementState)state; ! 290: ! 291: @end ! 292: ! 293: #define MAX_BUSY_DELAY (10 * 1000 * 1000) // 10 seconds ! 294: #define MAX_DATA_READY_DELAY (10 * 1000 * 1000) ! 295: ! 296: #define CMOSADDR 0x70 ! 297: #define CMOSDATA 0x71 ! 298: #define HDTYPE 0x12 ! 299: ! 300: #define HD0_EXTTYPE 0x19 ! 301: #define HD1_EXTTYPE 0x1a ! 302: ! 303: #define CMOS_IDE_TABLE 0xfe401 ! 304: #define SIZE_OF_IDE_TABLE 16 ! 305: ! 306: /* ! 307: * This is actually quite a long time but it is mandated by the spec. ! 308: */ ! 309: #define IDE_INTR_TIMEOUT (30*1000) // thirty seconds ! 310: ! 311: #endif _BSD_DEV_I386_IDECNT_H_ ! 312: ! 313: #endif DRIVER_PRIVATE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.