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