1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #ifndef _SYS_CDIO_H
  28 #define _SYS_CDIO_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 /*
  35  * CDROM io controls type definitions
  36  */
  37 struct cdrom_msf {
  38         unsigned char   cdmsf_min0;     /* starting minute */
  39         unsigned char   cdmsf_sec0;     /* starting second */
  40         unsigned char   cdmsf_frame0;   /* starting frame  */
  41         unsigned char   cdmsf_min1;     /* ending minute   */
  42         unsigned char   cdmsf_sec1;     /* ending second   */
  43         unsigned char   cdmsf_frame1;   /* ending frame    */
  44 };
  45 
  46 struct cdrom_ti {
  47         unsigned char   cdti_trk0;      /* starting track */
  48         unsigned char   cdti_ind0;      /* starting index */
  49         unsigned char   cdti_trk1;      /* ending track */
  50         unsigned char   cdti_ind1;      /* ending index */
  51 };
  52 
  53 struct cdrom_tochdr {
  54         unsigned char   cdth_trk0;      /* starting track */
  55         unsigned char   cdth_trk1;      /* ending track */
  56 };
  57 
  58 struct cdrom_tocentry {
  59         unsigned char   cdte_track;
  60         unsigned        cdte_adr        :4;
  61         unsigned        cdte_ctrl       :4;
  62         unsigned char   cdte_format;
  63         union {
  64                 struct {
  65                         unsigned char   minute;
  66                         unsigned char   second;
  67                         unsigned char   frame;
  68                 } msf;
  69                 int     lba;
  70         } cdte_addr;
  71         unsigned char   cdte_datamode;
  72 };
  73 
  74 /*
  75  * CDROM address format definition, for use with struct cdrom_tocentry
  76  */
  77 #define CDROM_LBA       0x01
  78 #define CDROM_MSF       0x02
  79 
  80 /*
  81  * Bitmask for CD-ROM data track in the cdte_ctrl field
  82  * A track is either data or audio.
  83  */
  84 #define CDROM_DATA_TRACK        0x04
  85 
  86 /*
  87  * For CDROMREADTOCENTRY, set the cdte_track to CDROM_LEADOUT to get
  88  * the information for the leadout track.
  89  */
  90 #define CDROM_LEADOUT   0xAA
  91 
  92 struct cdrom_subchnl {
  93         unsigned char   cdsc_format;
  94         unsigned char   cdsc_audiostatus;
  95         unsigned        cdsc_adr:       4;
  96         unsigned        cdsc_ctrl:      4;
  97         unsigned char   cdsc_trk;
  98         unsigned char   cdsc_ind;
  99         union {
 100                 struct {
 101                         unsigned char   minute;
 102                         unsigned char   second;
 103                         unsigned char   frame;
 104                 } msf;
 105                 int     lba;
 106         } cdsc_absaddr;
 107         union {
 108                 struct {
 109                         unsigned char   minute;
 110                         unsigned char   second;
 111                         unsigned char   frame;
 112                 } msf;
 113                 int     lba;
 114         } cdsc_reladdr;
 115 };
 116 
 117 /*
 118  * Definition for audio status returned from Read Sub-channel
 119  */
 120 #define CDROM_AUDIO_INVALID     0x00    /* audio status not supported */
 121 #define CDROM_AUDIO_PLAY        0x11    /* audio play operation in progress */
 122 #define CDROM_AUDIO_PAUSED      0x12    /* audio play operation paused */
 123 #define CDROM_AUDIO_COMPLETED   0x13    /* audio play successfully completed */
 124 #define CDROM_AUDIO_ERROR       0x14    /* audio play stopped due to error */
 125 #define CDROM_AUDIO_NO_STATUS   0x15    /* no current audio status to return */
 126 
 127 /*
 128  * definition of audio volume control structure
 129  */
 130 struct cdrom_volctrl {
 131         unsigned char   channel0;
 132         unsigned char   channel1;
 133         unsigned char   channel2;
 134         unsigned char   channel3;
 135 };
 136 
 137 struct cdrom_read {
 138         int             cdread_lba;
 139         caddr_t         cdread_bufaddr;
 140         int             cdread_buflen;
 141 };
 142 
 143 #if defined(_SYSCALL32)
 144 
 145 struct cdrom_read32 {
 146         int             cdread_lba;
 147         caddr32_t       cdread_bufaddr;
 148         int             cdread_buflen;
 149 };
 150 
 151 #define cdrom_read32tocdrom_read(cdrd32, cdrd)                          \
 152         cdrd->cdread_lba     = cdrd32->cdread_lba;                        \
 153         cdrd->cdread_bufaddr = (caddr_t)(uintptr_t)cdrd32->cdread_bufaddr; \
 154         cdrd->cdread_buflen  = cdrd32->cdread_buflen
 155 
 156 #define cdrom_readtocdrom_read32(cdrd, cdrd32)                          \
 157         cdrd32->cdread_lba   = cdrd->cdread_lba;                  \
 158         cdrd32->cdread_bufaddr       = (caddr32_t)(uintptr_t)cdrd->cdread_bufaddr; \
 159         cdrd32->cdread_buflen        = cdrd->cdread_buflen
 160 
 161 #endif  /* _SYSCALL32 */
 162 
 163 /*
 164  * Definition of CD/DA structure
 165  */
 166 struct cdrom_cdda {
 167         unsigned int    cdda_addr;
 168         unsigned int    cdda_length;
 169         caddr_t         cdda_data;
 170         unsigned char   cdda_subcode;
 171 };
 172 
 173 #if defined(_SYSCALL32)
 174 struct cdrom_cdda32 {
 175         unsigned int    cdda_addr;
 176         unsigned int    cdda_length;
 177         caddr32_t       cdda_data;
 178         unsigned char   cdda_subcode;
 179 };
 180 
 181 #define cdrom_cdda32tocdrom_cdda(cdda32, cdda)                  \
 182         cdda->cdda_addr              = cdda32->cdda_addr;         \
 183         cdda->cdda_length    = cdda32->cdda_length;               \
 184         cdda->cdda_data              = (caddr_t)(uintptr_t)cdda32->cdda_data; \
 185         cdda->cdda_subcode   = cdda32->cdda_subcode
 186 
 187 #define cdrom_cddatocdrom_cdda32(cdda, cdda32)                  \
 188         cdda32->cdda_addr    = cdda->cdda_addr;           \
 189         cdda32->cdda_length  = cdda->cdda_length;         \
 190         cdda32->cdda_data    = (caddr32_t)(uintptr_t)cdda->cdda_data; \
 191         cdda32->cdda_subcode = cdda->cdda_subcode
 192 
 193 #endif  /* _SYSCALL32 */
 194 
 195 /*
 196  * Definitions for cdda_subcode field
 197  */
 198 #define CDROM_DA_NO_SUBCODE     0x00    /* CD/DA data with no subcode */
 199 #define CDROM_DA_SUBQ           0x01    /* CD/DA data with sub Q code */
 200 #define CDROM_DA_ALL_SUBCODE    0x02    /* CD/DA data with all subcode */
 201 #define CDROM_DA_SUBCODE_ONLY   0x03    /* All subcode only */
 202 
 203 /*
 204  * Definition of CD/XA structure
 205  */
 206 struct cdrom_cdxa {
 207         unsigned int    cdxa_addr;
 208         unsigned int    cdxa_length;
 209         caddr_t         cdxa_data;
 210         unsigned char   cdxa_format;
 211 };
 212 
 213 #if defined(_SYSCALL32)
 214 
 215 struct cdrom_cdxa32 {
 216         unsigned int    cdxa_addr;
 217         unsigned int    cdxa_length;
 218         caddr32_t       cdxa_data;
 219         unsigned char   cdxa_format;
 220 };
 221 
 222 #define cdrom_cdxa32tocdrom_cdxa(cdxa32, cdxa)                          \
 223         cdxa->cdxa_addr              = cdxa32->cdxa_addr;                 \
 224         cdxa->cdxa_length    = cdxa32->cdxa_length;                       \
 225         cdxa->cdxa_data              = (caddr_t)(uintptr_t)cdxa32->cdxa_data; \
 226         cdxa->cdxa_format    = cdxa32->cdxa_format
 227 
 228 #define cdrom_cdxatocdrom_cdxa32(cdxa, cdxa32)                          \
 229         cdxa32->cdxa_addr    = cdxa->cdxa_addr;                   \
 230         cdxa32->cdxa_length  = cdxa->cdxa_length;                 \
 231         cdxa32->cdxa_data    = (caddr32_t)(uintptr_t)cdxa->cdxa_data; \
 232         cdxa32->cdxa_format  = cdxa->cdxa_format
 233 
 234 #endif  /* _SYSCALL32 */
 235 
 236 /*
 237  * Definitions for cdxa_format field
 238  */
 239 #define CDROM_XA_DATA           0x00    /* CD/XA data only */
 240 #define CDROM_XA_SECTOR_DATA    0x01    /* CD/XA all sector data */
 241 #define CDROM_XA_DATA_W_ERROR   0x02    /* CD/XA data with error flags data */
 242 
 243 /*
 244  * Definition of subcode structure
 245  */
 246 struct cdrom_subcode {
 247         unsigned int    cdsc_length;
 248         caddr_t         cdsc_addr;
 249 };
 250 
 251 #if defined(_SYSCALL32)
 252 
 253 struct cdrom_subcode32 {
 254         unsigned int    cdsc_length;
 255         caddr32_t       cdsc_addr;
 256 };
 257 
 258 #define cdrom_subcode32tocdrom_subcode(cdsc32, cdsc)                    \
 259         cdsc->cdsc_length    = cdsc32->cdsc_length;                       \
 260         cdsc->cdsc_addr              = (caddr_t)(uintptr_t)cdsc32->cdsc_addr
 261 
 262 #define cdrom_subcodetocdrom_subcode32(cdsc, cdsc32)                    \
 263         cdsc32->cdsc_length  = cdsc->cdsc_length;                 \
 264         cdsc32->cdsc_addr    = (caddr32_t)(uintptr_t)cdsc->cdsc_addr
 265 
 266 #endif  /* _SYSCALL32 */
 267 
 268 /*
 269  * Definitions for block size supported
 270  */
 271 #define CDROM_BLK_512           512
 272 #define CDROM_BLK_1024          1024
 273 #define CDROM_BLK_2048          2048
 274 #define CDROM_BLK_2056          2056
 275 #define CDROM_BLK_2324          2324
 276 #define CDROM_BLK_2336          2336
 277 #define CDROM_BLK_2340          2340
 278 #define CDROM_BLK_2352          2352
 279 #define CDROM_BLK_2368          2368
 280 #define CDROM_BLK_2448          2448
 281 #define CDROM_BLK_2646          2646
 282 #define CDROM_BLK_2647          2647
 283 #define CDROM_BLK_SUBCODE       96
 284 
 285 /*
 286  * Definitions for drive speed supported
 287  */
 288 #define CDROM_NORMAL_SPEED      0x00
 289 #define CDROM_DOUBLE_SPEED      0x01
 290 #define CDROM_QUAD_SPEED        0x03
 291 #define CDROM_TWELVE_SPEED      0x0C
 292 #define CDROM_MAXIMUM_SPEED     0xff
 293 
 294 /*
 295  * CDROM io control commands
 296  */
 297 #define CDIOC                   (0x04 << 8)
 298 #define CDROMPAUSE              (CDIOC|151)     /* Pause Audio Operation */
 299 #define CDROMRESUME             (CDIOC|152) /* Resume paused Audio Operation */
 300 #define CDROMPLAYMSF            (CDIOC|153)     /* Play Audio MSF */
 301 #define CDROMPLAYTRKIND         (CDIOC|154)     /* Play Audio Track/index */
 302 #define CDROMREADTOCHDR         (CDIOC|155)     /* Read TOC header */
 303 #define CDROMREADTOCENTRY       (CDIOC|156)     /* Read a TOC entry */
 304 #define CDROMSTOP               (CDIOC|157)     /* Stop the cdrom drive */
 305 #define CDROMSTART              (CDIOC|158)     /* Start the cdrom drive */
 306 #define CDROMEJECT              (CDIOC|159)     /* Ejects the cdrom caddy */
 307 #define CDROMVOLCTRL            (CDIOC|160)     /* control output volume */
 308 #define CDROMSUBCHNL            (CDIOC|161)     /* read the subchannel data */
 309 #define CDROMREADMODE2          (CDIOC|162)     /* read CDROM mode 2 data */
 310 #define CDROMREADMODE1          (CDIOC|163)     /* read CDROM mode 1 data */
 311 
 312 #define CDROMREADOFFSET         (CDIOC|164)     /* read multi-session offset */
 313 
 314 #define CDROMGBLKMODE           (CDIOC|165)     /* get current block mode */
 315 #define CDROMSBLKMODE           (CDIOC|166)     /* set current block mode */
 316 #define CDROMCDDA               (CDIOC|167)     /* read CD/DA data */
 317 #define CDROMCDXA               (CDIOC|168)     /* read CD/XA data */
 318 #define CDROMSUBCODE            (CDIOC|169)     /* read subcode */
 319 #define CDROMGDRVSPEED          (CDIOC|170)     /* get current drive speed */
 320 #define CDROMSDRVSPEED          (CDIOC|171)     /* set current drive speed */
 321 
 322 #define CDROMCLOSETRAY          (CDIOC|172)     /* close cd tray,load media */
 323 
 324 /*
 325  * Additional commands for CD-ROM
 326  */
 327 /*
 328  *
 329  *      Group 2 Commands
 330  *
 331  */
 332 #define SCMD_READ_SUBCHANNEL    0x42            /* optional SCSI command */
 333 #define SCMD_READ_TOC           0x43            /* optional SCSI command */
 334 #define SCMD_READ_HEADER        0x44            /* optional SCSI command */
 335 #define SCMD_PLAYAUDIO10        0x45            /* optional SCSI command */
 336 #define SCMD_PLAYAUDIO_MSF      0x47            /* optional SCSI command */
 337 #define SCMD_PLAYAUDIO_TI       0x48            /* optional SCSI command */
 338 #define SCMD_PLAYTRACK_REL10    0x49            /* optional SCSI command */
 339 #define SCMD_PAUSE_RESUME       0x4B            /* optional SCSI command */
 340 
 341 /*
 342  *
 343  *      Group 5 Commands
 344  *
 345  */
 346 #define SCMD_PLAYAUDIO12        0xA5            /* optional SCSI command */
 347 #define SCMD_PLAYTRACK_REL12    0xA9            /* optional SCSI command */
 348 #define SCMD_SET_CDROM_SPEED    0xBB            /* optional SCSI command */
 349 #define SCMD_READ_CD            0xBE    /* Universal way of accessing CD data */
 350 
 351 /*
 352  * These defines are for SCMD_READ_CD command.
 353  * See Expected Sector Type Field Definition (SCSI MMC-2 Spec section 6.1.15)
 354  * This information is used to figure out which block size to use.
 355  */
 356 #define READ_CD_EST_ALLTYPE     0x0     /* All Types */
 357 #define READ_CD_EST_CDDA        0x1     /* Only CD-DA */
 358 #define READ_CD_EST_MODE1       0x2     /* Only Yellow Book 2048 bytes */
 359 #define READ_CD_EST_MODE2       0x3     /* Only Yellow Book 2336 byte sectors */
 360 #define READ_CD_EST_MODE2FORM1  0x4     /* Only sectors with 2048 bytes */
 361 #define READ_CD_EST_MODE2FORM2  0x5     /* Only sectors with 2324 bytes */
 362 #define READ_CD_EST_RSVD1       0x6     /* reserved */
 363 #define READ_CD_EST_RSVD2       0x7     /* reserved */
 364 
 365 
 366 /*
 367  *
 368  *      Group 6 Commands
 369  *
 370  */
 371 #define SCMD_CD_PLAYBACK_CONTROL 0xC9   /* SONY unique SCSI command */
 372 #define SCMD_CD_PLAYBACK_STATUS 0xC4    /* SONY unique SCSI command */
 373 #define SCMD_READ_CDDA          0xD8    /* Vendor unique SCSI command */
 374 #define SCMD_READ_CDXA          0xDB    /* Vendor unique SCSI command */
 375 #define SCMD_READ_ALL_SUBCODES  0xDF    /* Vendor unique SCSI command */
 376 
 377 #define CDROM_MODE2_SIZE        2336
 378 
 379 /*
 380  * scsi_key_strings for CDROM cdio SCMD_ definitions
 381  */
 382 #define SCSI_CMDS_KEY_STRINGS_CDIO                              \
 383 /* 0x42 */ { SCMD_READ_SUBCHANNEL,      "read_subchannel" },            \
 384 /* 0x43 */ { SCMD_READ_TOC,             "read_toc" },                   \
 385 /* 0x44 */ { SCMD_REPORT_DENSITIES |                                    \
 386                 SCMD_READ_HEADER,       "report_densities/read_header" }, \
 387 /* 0x45 */ { SCMD_PLAYAUDIO10,          "playaudio" },                  \
 388 /* 0x46 */ { SCMD_GET_CONFIGURATION,    "get_configuration" },          \
 389 /* 0x47 */ { SCMD_PLAYAUDIO_MSF,        "playaudio_msf" },              \
 390 /* 0x48 */ { SCMD_PLAYAUDIO_TI,         "playaudio_ti" },               \
 391 /* 0x49 */ { SCMD_PLAYTRACK_REL10,      "playaudio_rel" },              \
 392 /* 0x4b */ { SCMD_PAUSE_RESUME,         "pause_resume" },               \
 393                                                                         \
 394 /* 0xa5 */ { SCMD_PLAYAUDIO12,          "playaudio(12)" },              \
 395 /* 0xa9 */ { SCMD_PLAYTRACK_REL12,      "playtrack_rel" },              \
 396 /* 0xbb */ { SCMD_SET_CDROM_SPEED,      "set_cd_speed" },               \
 397 /* 0xbe */ { SCMD_READ_CD,              "read_cd" },                    \
 398                                                                         \
 399 /* 0xc4 */ { SCMD_CD_PLAYBACK_STATUS,   "cd_playback_status" },         \
 400 /* 0xc9 */ { SCMD_CD_PLAYBACK_CONTROL,  "cd_playback_control" },        \
 401 /* 0xd8 */ { SCMD_READ_CDDA,            "read_cdda" },                  \
 402 /* 0xdb */ { SCMD_READ_CDXA,            "read_cdxa" },                  \
 403 /* 0xdf */ { SCMD_READ_ALL_SUBCODES,    "read_all_subcodes" }
 404 
 405 #ifdef  __cplusplus
 406 }
 407 #endif
 408 
 409 #endif  /* _SYS_CDIO_H */