|
|
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: * ata_extern.h -- Externally used data structures and constants for IDE
29: * disk driver
30: *
31: * KERNEL VERSION
32: *
33: * HISTORY
34: * 04-Mar-1997 Scott Vail at NeXT
35: * Changes made to ideDriveInfo_t struct. No longer stores
36: * capacity, only total sectors.
37: *
38: * 07-Jul-1994 Rakesh Dubey at NeXT
39: * Created from original driver written by David Somayajulu.
40: */
41:
42: #ifdef DRIVER_PRIVATE
43:
44: #ifndef _BSD_DEV_ATA_EXTERN_H
45: #define _BSD_DEV_ATA_EXTERN_H
46:
47: #import <sys/types.h>
48: #import <sys/ioctl.h>
49: #if (IO_DRIVERKIT_VERSION == 330)
50: #ifdef KERNEL
51: #import <machdep/machine/pmap.h>
52: #import <vm/vm_map.h>
53: #endif KERNEL
54: #endif
55: #import <mach/boolean.h>
56: #import <mach/vm_param.h>
57:
58: #define MAX_IDE_DRIVES 2 /* for a PC AT connector */
59: #define MAX_IDE_CONTROLLERS 2 /* that we support */
60:
61: /*
62: * This should be removed when CDIS stops looking for NIDE_PCAT.
63: */
64: #define NIDE_PCAT MAX_IDE_DRIVES
65:
66: /*
67: * This struct stores the info returned from the BIOS.
68: */
69: typedef struct _ideDriveInfo {
70: unsigned short type; /* from CMOS RAM */
71: unsigned char control_byte;
72: unsigned char interleave; /* interleave factor */
73: unsigned int total_sectors; /* total number of sectors */
74: unsigned short cylinders; /* number of cylinders */
75: unsigned char heads; /* total number of heads */
76: unsigned char sectors_per_trk; /* sectors per track */
77: unsigned bytes_per_sector; /* bytes per sector */
78: unsigned access_time; /* average access time */
79: unsigned short precomp; /* not used anymore */
80: unsigned short landing_zone;
81: } ideDriveInfo_t;
82:
83: /*
84: * Port addresses for IDE controller registers on PC AT. Don't change the
85: * identifiers without changing the #define's in AtapiCnt.h as well. This is
86: * because the ATAPI interface uses the same registers but has different
87: * names for them.
88: */
89:
90: typedef struct _ideRegsAddrs {
91:
92: /* Command block registers */
93: unsigned data; /* data register base port (read/write) */
94: unsigned features; /* features register (write only) */
95: unsigned error; /* error register (read only) */
96: unsigned sectCnt; /* sector count (read/write) */
97: unsigned sectNum; /* sector number (read/write) */
98: unsigned cylLow; /* cylinder low (read/write) */
99: unsigned cylHigh; /* cylinder high (read/write) */
100: unsigned drHead; /* drive, head select register (read/write) */
101: unsigned status; /* status register (read only) */
102: unsigned command; /* command register (write only) */
103:
104: /* Control Block Registers */
105: unsigned deviceControl; /* control register */
106: unsigned altStatus; /* shadow of status register but read does */
107: /* not clear a pending interrupt */
108: unsigned driveAddress; /* not used */
109: } ideRegsAddrs_t;
110:
111: /*
112: * Register values for IDE controller for PC AT.
113: */
114:
115: typedef struct _ideRegsVal {
116: unsigned short data; /* data register */
117: unsigned char features; /* features register */
118: unsigned char error; /* error register */
119: unsigned char sectCnt; /* sector count */
120: unsigned char sectNum; /* sector number */
121: unsigned char cylLow; /* cylinder low */
122: unsigned char cylHigh; /* cylinder high */
123: unsigned char drHead; /* drive, head select (write first) */
124: unsigned char status; /* status register */
125: unsigned char command; /* command register */
126: } ideRegsVal_t;
127:
128: /*
129: * Defines for error register.
130: */
131: #define BAD_BLOCK 0x80
132: #define ECC_ERROR 0x40
133: #define ID_NOT_FOUND 0x10
134: #define CMD_ABORTED 0x04
135: #define TRK0_NOT_FOUND 0x02
136: #define DAM_NOT_FOUND 0x01
137:
138:
139: /*
140: * Defines for drive, head select register.
141: */
142: #define SEL_DRIVE0 0x00
143: #define SEL_DRIVE1 0x10
144:
145: /*
146: * Addressing method, LBA or CHS.
147: */
148: #define ADDRESS_MODE_CHS 0xa0
149: #define ADDRESS_MODE_LBA 0xe0
150:
151: /*
152: * Defines for the status register.
153: */
154:
155: #define BUSY 0x80
156: #define READY 0x40
157: #define WRITE_FAULT 0x20
158: #define SEEK_COMPLETE 0x10
159: #define DREQUEST 0x08
160: #define ERROR_CORRECTED 0x04 /* really not used */
161: #define INDEX 0x02
162: #define ERROR 0x01 /* Last command failed */
163:
164: /*
165: * Defines for control register.
166: */
167: #define HEADSEL3_ENABLE 0x08
168: #define DISK_RESET_ENABLE 0x04
169: #define DISK_INTERRUPT_ENABLE 0x00
170: #define DISK_INTERRUPT_DISABLE 0x02
171:
172: /*
173: * End of IDE register related defines.
174: */
175:
176: /*
177: * IDE commands -- as defined in the ATA spec.
178: */
179:
180: /*
181: * Mandatory commands.
182: */
183: #define IDE_READ 0x20
184: #define IDE_WRITE 0x30
185: #define IDE_SEEK 0x70
186: #define IDE_RESTORE 0x10
187: #define IDE_FORMAT_TRACK 0x50 /* do not use */
188: #define IDE_READ_VERIFY 0x40
189: #define IDE_DIAGNOSE 0x90
190: #define IDE_SET_PARAMS 0x91
191:
192: /*
193: * Optional commands.
194: */
195:
196: #define IDE_IDENTIFY_DRIVE 0xec
197: #define IDE_SET_MULTIPLE 0xc6
198: #define IDE_READ_MULTIPLE 0xc4
199: #define IDE_WRITE_MULTIPLE 0xc5
200: #define IDE_READ_DMA 0xc8
201: #define IDE_WRITE_DMA 0xca
202: #define IDE_SET_FEATURES 0xef
203: #define IDE_IDLE 0xe3
204: #define IDE_SLEEP 0xe6
205:
206: typedef int ide_return_t;
207:
208: /*
209: * Return values for IDE commmands to the controller.
210: */
211:
212: #define IDER_SUCCESS 0 /* OK */
213: #define IDER_TIMEOUT 1 /* cmd timed out */
214: #define IDER_MEMALLOC 2 /* couldn't allocate memory */
215: #define IDER_MEMFAIL 3 /* memory transfer error */
216: #define IDER_REJECT 4 /* bad field in ideIoReq_t */
217: #define IDER_BADDRV 5 /* drive not present */
218: #define IDER_CMD_ERROR 6 /* basic command failure */
219: #define IDER_VOLUNAVAIL 7 /* Requested Volume not available */
220: #define IDER_SPURIOUS 8 /* spurious interrupt */
221: #define IDER_CNTRL_REJECT 9 /* controller has rejected */
222: #define IDER_RETRY 10 /* controller requests retrying */
223: #define IDER_DEV_NOT_READY 11 /* DRQ bit not set (status reg) */
224: #define IDER_DEV_BUSY 12 /* BUSY bit is set */
225: #define IDER_ERROR 13 /* other IDE error */
226: #define IDER_ABORT 14 /* ABRT bit is set */
227:
228:
229: /*
230: * I/O request struct. Used in IDEIOCREQ ioctl to specify one command
231: * sequence to be executed.
232: */
233:
234: typedef struct _ideIoReq {
235:
236: /*
237: * Inputs to driver
238: */
239: unsigned cmd;
240:
241: /* Starting block for IDE_READ, IDE_WRITE, IDE_READ_VERIFY, IDE_SEEK */
242: unsigned block;
243: /* Number of blocks for IDE_READ, IDE_SEEK IDE_WRITE, IDE_READ_VERIFY */
244: unsigned blkcnt;
245:
246: /* Starting address for IDE_READ, IDE_WRITE and IDE_IDENTIFY_DRIVE */
247: caddr_t addr;
248:
249: unsigned timeout; /* milliseconds */
250: unsigned char maxSectorsPerIntr; /* Only for IDE_SET_MULTIPLE */
251:
252: /*
253: * Outputs from driver.
254: */
255:
256: ide_return_t status; /* IDER_SUCCESS, etc. */
257: unsigned blocks_xfered; /* Blocks actually transfered */
258: ideRegsVal_t regValues; /* Valid if status is IDER_CMD_ERROR */
259: unsigned diagResult; /* Result if cmd was IDE_DIAGNOSE */
260:
261: /*
262: * Used internally by the driver.
263: */
264: #ifdef KERNEL
265: struct vm_map *map; /* Map of requestor's task */
266: #else
267: void *map;
268: #endif KERNEL
269:
270: } ideIoReq_t;
271:
272: /*
273: * Ioctls specific to IDE.
274: */
275:
276: #define IDEDIOCINFO _IOR('i',1, struct _ideDriveInfo)
277:
278: #define IDEDIOCREQ _IOWR('i',2, struct _ideIoReq)
279:
280: #define MAX_CMOS_IDETYPE 0x00ff
281: #define MIN_CMOS_IDETYPE 0x0001
282:
283: #define MAX_BLOCKS_PER_XFER 256
284: #define IDE_SECTOR_SIZE 512 /* bytes */
285: #define IDE_MAX_PHYS_IO (MAX_BLOCKS_PER_XFER * IDE_SECTOR_SIZE)
286:
287: /*
288: * Structure returned by (optional) IDE_IDENTIFY_DRIVE command. Field
289: * definitions from standard X3T9.2 791D Rev4 (17-Mar-93). Some of these
290: * definitions have changed in proposed ATA-2 standard.
291: */
292: #define IDE_MULTI_SECTOR_MASK 0x00ff
293:
294: #define IDE_CAP_LBA_SUPPORTED 0x0200
295: #define IDE_CAP_DMA_SUPPORTED 0x0100
296: #define IDE_CAP_IORDY_SUPPORTED 0x0800 /* from ATA-2 */
297:
298: #define IDE_PIO_TIMING_MODE_MASK 0xff00
299: #define IDE_DMA_TIMING_MODE_MASK 0xff00
300:
301: #define IDE_TRANSLATION_VALID 0x0001
302:
303: #define IDE_MULTI_SECTOR_VALID 0x0100
304: #define IDE_SECTORS_PER_INTERRUPT 0x00ff
305:
306: #define IDE_SW_DMA_ACTIVE 0xff00
307: #define IDE_SW_DMA_SUPPORTED 0x00ff
308: #define IDE_MW_DMA_ACTIVE 0xff00
309: #define IDE_MW_DMA_SUPPORTED 0x00ff
310: #define IDE_UDMA_ACTIVE 0xff00
311: #define IDE_UDMA_SUPPORTED 0x00ff
312:
313: #define IDE_FC_PIO_MODE_3_SUPPORTED 0x0001
314: #define IDE_FC_PIO_MODE_4_SUPPORTED 0x0002
315: #define IDE_FC_PIO_MODE_5_SUPPORTED 0x0004
316:
317: /*
318: * fieldValidity bit definitions.
319: */
320: #define IDE_WORDS54_TO_58_SUPPORTED 0x0001
321: #define IDE_WORDS64_TO_70_SUPPORTED 0x0002
322: #define IDE_WORDS64_TO_68_SUPPORTED IDE_WORDS64_TO_70_SUPPORTED
323: #define IDE_WORD88_SUPPORTED 0x0004 /* UDMA support */
324:
325: typedef struct _ideIdentifyInfo {
326: unsigned short genConfig;
327: unsigned short cylinders;
328: unsigned short reserved_2;
329: unsigned short heads;
330: unsigned short unformattedBytesPerTrack; /* retired */
331: unsigned short unformattedBytesPerSector; /* retired */
332: unsigned short sectorsPerTrack;
333: unsigned short vendorSpecific0[3]; /* retired */
334: unsigned char serialNumber[20];
335: unsigned short bufferType; /* retired */
336: unsigned short bufferSize; /* retired */
337: unsigned short eccBytes; /* obsolete */
338: unsigned char firmwareRevision[8];
339: unsigned char modelNumber[40];
340: unsigned short multipleSectors;
341: unsigned short doubleWordIO; /* Vendor Unique */
342: unsigned short capabilities;
343:
344: unsigned short capabilities2;
345: unsigned short pioDataTransferCyleTimingMode;
346: unsigned short dmaDataTransferCyleTimingMode; /* retired */
347: unsigned short fieldValidity;
348:
349: unsigned short currentCylinders;
350: unsigned short currentHeads;
351: unsigned short currentSectorsPerTrack;
352: unsigned short capacity[2];
353: unsigned short multiSectorInfo;
354: unsigned userAddressableSectors; /* LBA mode only */
355: unsigned short swDma; /* retired */
356: unsigned short mwDma;
357: unsigned short fcPioDataTransferCyleTimingMode;
358: unsigned short minMwDMATransferCycleTimePerWord;
359: unsigned short RecommendedMwDMACycleTime;
360: unsigned short MinPIOTransferCycleTimeWithoutFlowControl;
361: unsigned short MinPIOTransferCycleTimeWithIORDY;
362:
363: /* ATA4/ATA3 additions */
364: unsigned short reserved_69_74[6];
365: unsigned short queueDepth;
366: unsigned short reserved_76_79[4];
367: unsigned short majorVersionNumber;
368: unsigned short minorVersionNumber;
369: unsigned short commandSetSupported[2]; /* word 82-83 */
370: unsigned short commandSetExtension; /* word 84 */
371: unsigned short commandSetEnabled[2]; /* word 85-86 */
372: unsigned short commandSetDefault; /* word 87 */
373: unsigned short UDma; /* word 88 */
374: unsigned short timeForSecurityErase; /* word 89 */
375: unsigned short timeForEnhancedErase; /* word 90 */
376: unsigned short currentAPMValue; /* word 91 */
377: unsigned short reserved_92_126[35];
378: unsigned short removableMediaStatusSupport; /* word 127 */
379: unsigned short securityStatus; /* word 128 */
380: unsigned short reserved_129_159[31];
381: unsigned short reserved_160_255[96];
382: } ideIdentifyInfo_t;
383:
384: /*
385: * Maximum Number of bytes of data that can be transfered via DMA using
386: * IDEDIOCREQ ioctl command.
387: */
388:
389: #ifdef KERNEL
390: #define IDE_MAX_DMA_SIZE PAGE_SIZE
391: #else KERNEL
392: #define IDE_MAX_DMA_SIZE vm_page_size
393: #endif KERNEL
394:
395: /*
396: * Register and mask definitions for IDE_SET_FEATURES command.
397: */
398:
399: #define FEATURE_SET_TRANSFER_MODE 0x03
400: #define FEATURE_ENABLE_POWER_ON_DEFAULTS 0xcc
401: #define FEATURE_DISABLE_POWER_ON_DEFAULTS 0x66
402:
403: #define PIO_FLOW_CONTROL_TM_MASK 0x000f
404: #define DMA_FLOW_CONTROL_TM_MASK 0x0017
405:
406: #endif _BSD_DEV_ATA_EXTERN_H
407:
408: #endif DRIVER_PRIVATE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.