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