home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Headers / bsd / dev / ide_extern.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-30  |  8.4 KB  |  284 lines

  1. /*    
  2.  *
  3.  * ide_extern.h -- Externally used data structures and constants for IDE
  4.  *        Disk driver
  5.  *
  6.  * KERNEL VERSION
  7.  *
  8.  * HISTORY
  9.  * 22-Nov-1992 David Somayajulu at Next Computer Inc.,
  10.  *    Created.
  11.  *
  12.  */
  13.  
  14. #ifndef    _BSD_DEV_IDE_EXTERN_
  15. #define _BSD_DEV_IDE_EXTERN_
  16.  
  17. #import <sys/types.h>
  18. #import <sys/ioctl.h>
  19. #ifdef    KERNEL
  20. #import <machdep/machine/pmap.h>
  21. #import <vm/vm_map.h>
  22. #endif    KERNEL
  23. #import <mach/boolean.h>
  24. #import <mach/vm_param.h>
  25.  
  26. #define NIDE_PCAT         2 // number of IDE drives on AT bus
  27.  
  28. typedef struct _ideDriveInfo {
  29.     unsigned short    type;        // as given in the CMOS R*M space 
  30.     unsigned char    control_byte;    
  31.     unsigned char    interleave;    // interleave 
  32.     unsigned    capacity;    // formatted capacity in bytes
  33.     unsigned short    cylinders;    // number of cylinders 
  34.     unsigned char     heads;        // total number of heads 
  35.     unsigned char    sectors_per_trk;// sectors per track 
  36.     unsigned    bytes_per_sector;// bytes per sector 
  37.     unsigned    access_time;    // average access time 
  38.     unsigned short    precomp;    // cylinder where precompensation 
  39.     unsigned short    landing_zone;
  40. } ideDriveInfo_t;
  41.  
  42. // Port Addresses for Ide Controller Registers on PC AT 
  43.  
  44. typedef struct _ideRegsAddrs {
  45.     unsigned data;        // data register base port (read/write) 
  46.     unsigned error;        // error register (read only) 
  47.     unsigned sectCnt;    // sector count (read/write) 
  48.     unsigned sectNum;    // sector number (read/write) 
  49.     unsigned cylLow;    // cylinder low (read/write) 
  50.     unsigned cylHigh;    // cylinder high (read/write) 
  51.     unsigned drHead;    // drive, head select register (read/write)
  52.     unsigned status;    // status register (read only)
  53.     unsigned command;    // command register (write only) 
  54.     unsigned cntrlAddr;     // control register; also known as 
  55.                 // digital output register
  56.     unsigned altStatus;     // same as status expect that it does not
  57.                 // clear a pending interrupt 
  58. } ideRegsAddrs_t; 
  59.  
  60. // Register values for IDE Controller for PC AT
  61.  
  62. typedef struct _ideRegsVal {
  63.     unsigned short    data;    // data register base port (read/write) 
  64.     unsigned char    error;    // error register (read only) 
  65.     unsigned char    sectCnt;// sector count (read/write) 
  66.     unsigned char    sectNum;// sector number (read/write) 
  67.     unsigned char    cylLow;    // cylinder low (read/write) 
  68.     unsigned char    cylHigh;// cylinder high (read/write) 
  69.     unsigned char    drHead;    // drive, head select register (read/write)
  70.     unsigned char    status;    // status register (read only)
  71.     unsigned char    command;// command register (write only) 
  72. } ideRegsVal_t; 
  73.  
  74. // defines for error register 
  75.  
  76. #define BAD_BLOCK        0x80
  77. #define ECC_ERROR        0x40
  78. #define ID_NOT_FOUND        0x10
  79. #define CMD_ABORTED        0x04
  80. #define TRK000_NOT_FOUND    0x02
  81. #define DAM_NOT_FOUND        0x01
  82.  
  83.  
  84. // defines for drive, head select register 
  85.  
  86. #define DRHD_FIXED        0xa0
  87. #define DRIVE_SEL        0x10
  88. #define     SEL_DRIVE0    0x00
  89. #define        SEL_DRIVE1    0x10
  90. #define    HEAD_SEL        0x0F
  91.  
  92. // defines for status register 
  93.  
  94. #define BUSY            0x80
  95. #define READY            0x40
  96. #define WRITE_FAULT        0x20
  97. #define SEEK_COMPLETE        0x10
  98. #define DREQUEST        0x08
  99. #define ERROR_CORRECTED        0x04
  100. #define INDEX            0x02
  101. #define ERROR            0x01 // previous command ended in error 
  102.  
  103. // defines for control register
  104.  
  105. #define HEADSEL3_ENABLE            0x08
  106. #define DISK_RESET_ENABLE        0x04
  107. #define DISK_INTERRUPT_ENABLE_NOT    0x02
  108.  
  109. // end of IDE register related defines 
  110.  
  111.  
  112. typedef    int ide_return_t;        /* see IDER_xxx, below */
  113.  
  114. //
  115. // I/O request struct. Used in IDEIOCREQ ioctl to specify one command sequence
  116. // to be executed.
  117. //
  118.  
  119. typedef struct _ideIoReq {
  120.  
  121.     //  inputs to driver:
  122.  
  123.     unsigned         cmd;    
  124.  
  125.     // mandatory commands
  126.     
  127. #define     IDE_READ        0x20
  128. #define     IDE_WRITE        0x30
  129. #define     IDE_SEEK        0x70
  130. #define        IDE_RESTORE        0x10
  131. #define        IDE_FORMAT_TRACK    0x50 // under dispute not implemented 
  132. #define     IDE_READ_VERIFY        0x40
  133. #define        IDE_DIAGNOSE        0x90
  134. #define        IDE_SET_PARAMS        0x91
  135.  
  136.     // optional commands
  137.  
  138. #define        IDE_GET_INFO        0xEC
  139. #define        IDE_SET_MULTIPLE    0xC6
  140. #define        IDE_READ_MULTIPLE    0xC4
  141. #define        IDE_WRITE_MULTIPLE    0xC5
  142. #define        IDE_READ_DMA        0xC8
  143. #define        IDE_WRITE_DMA        0xCA
  144.  
  145.     unsigned         block;    // starting block for IDE_READ,                                             
  146.                     // IDE_WRITE, IDE_READ_VERIFY, 
  147.                     // IDE_SEEK 
  148.     unsigned         blkcnt;    // no. of blocks for IDE_READ,     
  149.                     // IDE_SEEK                                                 
  150.                     // IDE_WRITE and IDE_READ_VERIFY 
  151.  
  152.     caddr_t             addr;    // starting address for IDE_READ,                                         
  153.                     // IDE_WRITE and IDE_GET_INFO
  154.                                         
  155.     unsigned         timeout;// timeout value in milliseconds 
  156.     unsigned char        maxSectorsPerIntr;// Only for IDE_SET_MULTIPLE. 
  157.                     // this gives the number of sectors to
  158.                     // transfered per interrupt
  159.  
  160.     // outputs from driver 
  161.  
  162.     ide_return_t        status;    // IDER_SUCCESS, etc. 
  163.     unsigned        blocks_xfered;// no. of blocks actually
  164.                     // transfered 
  165.     ideRegsVal_t         regValues;// dump of registers when status 
  166.                     // equals IDER_CMD_ERROR 
  167.     unsigned         diagResult; // result if cmd == IDE_DIAGNOSE
  168.  
  169.     // used internally by driver
  170. #ifdef KERNEL
  171.     vm_map_t        map;    // map of requestor's task 
  172. #else
  173.     void        *map;
  174. #endif KERNEL
  175.  
  176. }ideIoReq_t;
  177.  
  178. // defines for ide_return_t
  179.  
  180. #define IDER_SUCCESS        0    // OK 
  181. #define IDER_TIMEOUT        1    // cmd has not completed in the value 
  182.                     // specified
  183. #define IDER_MEMALLOC        2    // couldn't allocate memory 
  184. #define IDER_MEMFAIL        3    // memory transfer error 
  185. #define IDER_REJECT        4    // bad field in ideIoReq_t 
  186. #define IDER_BADDRV        5    // drive not present 
  187. #define IDER_CMD_ERROR        6     // basic command failure
  188. #define IDER_VOLUNAVAIL        7    // Requested Volume not available 
  189. #define IDER_SPURIOUS        8    // spurious interrupt 
  190. #define IDER_CNTRL_REJECT    9    // controller has rejected
  191.  
  192. // Defines for ioctls specific to IDE 
  193.  
  194. #define IDEDIOCINFO        _IOR('i',1, struct _ideDriveInfo)
  195.  
  196. #define IDEDIOCREQ        _IOWR('i',2, struct _ideIoReq)
  197.  
  198.  
  199. #define MAX_IDETYPE        0xFF
  200. #define MIN_IDETYPE        1
  201.  
  202. #define MAX_BLOCKS_PER_XFER    256
  203. #define IDE_MAX_PHYS_IO        (64 * 1024)
  204.  
  205. #define IDE_SECTOR_SIZE        512 //sector size in bytes
  206. // structure returned by IDE_GET_INFO command
  207.  
  208. typedef    struct    _ideIdentifyInfo {
  209.     unsigned short    genConfig;
  210.     unsigned short    cylinders;
  211.     unsigned short    reserved0;
  212.     unsigned short    heads;
  213.     unsigned short    unformattedBytesPerTrack;
  214.     unsigned short    unformattedBytesPerSector;
  215.     unsigned short    sectorsPerTrack;
  216.     unsigned short    vendorSpecific0[3];
  217.     unsigned short    serialNumber[10];// 0x0000 => not specified
  218.     unsigned short    bufferType;
  219.     unsigned short    bufferSize;     //in 512 byte increments 0x0000 => not 
  220.                     //specified 
  221.     unsigned short    eccBytes;     //number of ECC bytes available on
  222.                     //Read/Write Long Commands 
  223.                     //0x0000 => not specified
  224.     unsigned char     firmwareRevision[8];    
  225.     unsigned char    modelNumber[40];
  226.     unsigned short    multipleSectors;
  227. #define    IDE_MULTI_SECTOR_MASK    0xFF
  228.                     //maximum number of sectors that can
  229.                     //be transfered per single interrupt 
  230.                     //on IDE_READ_MULTIPLE and
  231.                     //IDE_WRITE_MULTIPLE commands 
  232.                     // 0x00 => IDE_WRITE_MULTIPLE and
  233.                     //IDE_READ_MULTIPLE are not 
  234.                     //implemented
  235.     unsigned short    doubleWordIO;    //0x0000 => can perform doubleword I/O
  236.                     //0x0001 => cannot perform doubleword 
  237.                     //        I/O
  238.     unsigned short    capabilities;
  239. #define    IDE_CAP_LBA_SUPPORTED    0x0200
  240. #define IDE_CAP_DMA_SUPPORTED    0x0100
  241.     
  242.     unsigned short    reserved1;
  243.     unsigned short    pioDataTransferCyleTimingMode;
  244. #define IDE_PIO_TIMING_MODE_MASK 0xFF
  245.     unsigned short    dmaDataTransferCyleTimingMode;
  246. #define IDE_DMA_TIMING_MODE_MASK 0xFF
  247.     unsigned short    translationValid;
  248. #define    IDE_TRANSLATION_VALID        0x0001 //fields reported in 
  249.                     //translation mode valid
  250. #define IDE_TRANSLATION_MAYBE_VALID_NOT    0x0000 //fields reported in
  251.                     //translation mode may be valid
  252.                     
  253.     unsigned short    currentCylinders;
  254.     unsigned short    currentHeads;
  255.     unsigned short    currentSectorsPerTrack;
  256.     unsigned short    capacity[2];     //capacity in sectors
  257.     unsigned short    multiSectorInfo;
  258. #define    IDE_MULTI_SECTOR_VALID        0x01
  259. #define IDE_SECTORS_PER_INTERRUPT    0xFF
  260.     unsigned     userAddressableSectors;    //total number of user 
  261.                         //addressabel sectors for 
  262.                         //LBA mode
  263.     unsigned short    swDma;    
  264. #define IDE_SW_DMA_ACTIVE    0xFF00//single word dma transfer mode active
  265. #define IDE_SW_DMA_SUPPORTED    0x00FF//single word dma transfer mode
  266.                     //supported
  267.     unsigned short    mwDma;    
  268. #define IDE_MW_DMA_ACTIVE    0xFF00//multi word dma transfer mode active
  269. #define IDE_MW_DMA_SUPPORTED    0x00FF//multi word dma transfer mode
  270.                     //supported        
  271.     unsigned short    reserved2[64];
  272.     unsigned short    vendorSpecific[32];
  273.     unsigned short    reserved3[96];        
  274. } ideIdentifyInfo_t;
  275.  
  276. #if i386
  277. #define IDE_MAX_DMA_SIZE    PAGE_SIZE  // Maximum Number of bytes of data
  278.                        // that can be transfered via DMA 
  279.                        // using IDEDIOCREQ ioctl command
  280. #endif
  281.  
  282. #endif    _BSD_DEV_IDE_EXTERN_
  283.  
  284.