1/*	$NetBSD: cdio.h,v 1.34 2015/09/06 06:01:02 dholland Exp $	*/
  2
  3#ifndef _SYS_CDIO_H_
  4#define _SYS_CDIO_H_
  5
  6#include <sys/ioccom.h>
  7
  8/* Shared between kernel & process */
  9
 10union msf_lba {
 11	struct {
 12		u_char unused;
 13		u_char minute;
 14		u_char second;
 15		u_char frame;
 16	} msf;
 17	uint32_t lba;
 18	u_char	addr[4];
 19};
 20
 21struct cd_toc_entry {
 22	u_char		nothing1;
 23#if BYTE_ORDER == LITTLE_ENDIAN
 24	uint32_t	control:4;
 25	uint32_t	addr_type:4;
 26#endif
 27#if BYTE_ORDER == BIG_ENDIAN
 28	uint32_t	addr_type:4;
 29	uint32_t	control:4;
 30#endif
 31	u_char		track;
 32	u_char		nothing2;
 33	union msf_lba	addr;
 34};
 35
 36struct cd_sub_channel_header {
 37	u_char	nothing1;
 38	u_char	audio_status;
 39#define CD_AS_AUDIO_INVALID	0x00
 40#define CD_AS_PLAY_IN_PROGRESS	0x11
 41#define CD_AS_PLAY_PAUSED	0x12
 42#define CD_AS_PLAY_COMPLETED	0x13
 43#define CD_AS_PLAY_ERROR	0x14
 44#define CD_AS_NO_STATUS		0x15
 45	u_char	data_len[2];
 46};
 47
 48struct cd_sub_channel_q_data {
 49	u_char		data_format;
 50#if BYTE_ORDER == LITTLE_ENDIAN
 51	uint32_t	control:4;
 52	uint32_t	addr_type:4;
 53#endif
 54#if BYTE_ORDER == BIG_ENDIAN
 55	uint32_t	addr_type:4;
 56	uint32_t	control:4;
 57#endif
 58	u_char		track_number;
 59	u_char		index_number;
 60	u_char		absaddr[4];
 61	u_char		reladdr[4];
 62#if BYTE_ORDER == LITTLE_ENDIAN
 63        uint32_t  	:7;
 64        uint32_t	mc_valid:1;
 65#endif
 66#if BYTE_ORDER == BIG_ENDIAN
 67        uint32_t	mc_valid:1;
 68        uint32_t	:7;
 69#endif
 70        u_char  mc_number[15];
 71#if BYTE_ORDER == LITTLE_ENDIAN
 72        uint32_t	:7;
 73        uint32_t	ti_valid:1;
 74#endif
 75#if BYTE_ORDER == BIG_ENDIAN
 76        uint32_t	ti_valid:1;
 77        uint32_t	:7;
 78#endif
 79        u_char		ti_number[15];
 80};
 81
 82struct cd_sub_channel_position_data {
 83	u_char		data_format;
 84#if BYTE_ORDER == LITTLE_ENDIAN
 85	uint32_t	control:4;
 86	uint32_t	addr_type:4;
 87#endif
 88#if BYTE_ORDER == BIG_ENDIAN
 89	uint32_t	addr_type:4;
 90	uint32_t	control:4;
 91#endif
 92	u_char		track_number;
 93	u_char		index_number;
 94	union msf_lba	absaddr;
 95	union msf_lba	reladdr;
 96};
 97
 98struct cd_sub_channel_media_catalog {
 99	u_char		data_format;
100	u_char		nothing1;
101	u_char		nothing2;
102	u_char		nothing3;
103#if BYTE_ORDER == LITTLE_ENDIAN
104	uint32_t	:7;
105	uint32_t	mc_valid:1;
106#endif
107#if BYTE_ORDER == BIG_ENDIAN
108	uint32_t	mc_valid:1;
109	uint32_t	:7;
110#endif
111	u_char		mc_number[15];
112};
113
114struct cd_sub_channel_track_info {
115	u_char		data_format;
116	u_char		nothing1;
117	u_char		track_number;
118	u_char		nothing2;
119#if BYTE_ORDER == LITTLE_ENDIAN
120	uint32_t	:7;
121	uint32_t	ti_valid:1;
122#endif
123#if BYTE_ORDER == BIG_ENDIAN
124	uint32_t	ti_valid:1;
125	uint32_t	:7;
126#endif
127	u_char		ti_number[15];
128};
129
130struct cd_sub_channel_info {
131	struct cd_sub_channel_header header;
132	union {
133		struct cd_sub_channel_q_data q_data;
134		struct cd_sub_channel_position_data position;
135		struct cd_sub_channel_media_catalog media_catalog;
136		struct cd_sub_channel_track_info track_info;
137	} what;
138};
139
140/*
141 * Ioctls for the CD drive
142 */
143struct ioc_play_track {
144	u_char	start_track;
145	u_char	start_index;
146	u_char	end_track;
147	u_char	end_index;
148};
149
150#define	CDIOCPLAYTRACKS	_IOW('c', 1, struct ioc_play_track)
151struct ioc_play_blocks {
152	int	blk;
153	int	len;
154};
155#define	CDIOCPLAYBLOCKS	_IOW('c', 2, struct ioc_play_blocks)
156
157struct ioc_read_subchannel {
158	u_char	address_format;
159#define CD_LBA_FORMAT		1
160#define CD_MSF_FORMAT		2
161	u_char	data_format;
162#define CD_SUBQ_DATA		0
163#define CD_CURRENT_POSITION	1
164#define CD_MEDIA_CATALOG	2
165#define CD_TRACK_INFO		3
166	u_char	track;
167	int	data_len;
168	struct	cd_sub_channel_info *data;
169};
170#define CDIOCREADSUBCHANNEL _IOWR('c', 3, struct ioc_read_subchannel )
171
172#ifdef _KERNEL
173/* As above, but with the buffer following the request for in-kernel users. */
174struct ioc_read_subchannel_buf {
175	struct ioc_read_subchannel req;
176	struct cd_sub_channel_info info;
177};
178#define CDIOCREADSUBCHANNEL_BUF _IOWR('c', 3, struct ioc_read_subchannel_buf)
179#endif
180
181struct ioc_toc_header {
182	u_short	len;
183	u_char	starting_track;
184	u_char	ending_track;
185};
186
187#define CDIOREADTOCHEADER _IOR('c', 4, struct ioc_toc_header)
188
189struct ioc_read_toc_entry {
190	u_char	address_format;
191	u_char	starting_track;
192	u_short	data_len;
193	struct	cd_toc_entry *data;
194};
195#define CDIOREADTOCENTRIES _IOWR('c', 5, struct ioc_read_toc_entry)
196#define CDIOREADTOCENTRYS CDIOREADTOCENTRIES
197
198#ifdef _KERNEL
199/* As above, but with the buffer following the request for in-kernel users. */
200struct ioc_read_toc_entry_buf {
201	struct ioc_read_toc_entry req;
202	struct cd_toc_entry       entry[100];   /* NB: 8 bytes each */
203};
204#define CDIOREADTOCENTRIES_BUF _IOWR('c', 5, struct ioc_read_toc_entry_buf)
205#endif
206
207/* read LBA start of a given session; 0=last, others not yet supported */
208#define CDIOREADMSADDR _IOWR('c', 6, int)
209
210struct	ioc_patch {
211	u_char	patch[4];	/* one for each channel */
212};
213#define	CDIOCSETPATCH	_IOW('c', 9, struct ioc_patch)
214
215struct	ioc_vol {
216	u_char	vol[4];	/* one for each channel */
217};
218#define	CDIOCGETVOL	_IOR('c', 10, struct ioc_vol)
219#define	CDIOCSETVOL	_IOW('c', 11, struct ioc_vol)
220#define	CDIOCSETMONO	_IO('c', 12)
221#define	CDIOCSETSTEREO	_IO('c', 13)
222#define	CDIOCSETMUTE	_IO('c', 14)
223#define	CDIOCSETLEFT	_IO('c', 15)
224#define	CDIOCSETRIGHT	_IO('c', 16)
225#define	CDIOCSETDEBUG	_IO('c', 17)
226#define	CDIOCCLRDEBUG	_IO('c', 18)
227#define	CDIOCPAUSE	_IO('c', 19)
228#define	CDIOCRESUME	_IO('c', 20)
229#define	CDIOCRESET	_IO('c', 21)
230#define	CDIOCSTART	_IO('c', 22)
231#define	CDIOCSTOP	_IO('c', 23)
232#define	CDIOCEJECT	_IO('c', 24)
233#define	CDIOCALLOW	_IO('c', 25)
234#define	CDIOCPREVENT	_IO('c', 26)
235#define	CDIOCCLOSE	_IO('c', 27)
236
237struct ioc_play_msf {
238	u_char	start_m;
239	u_char	start_s;
240	u_char	start_f;
241	u_char	end_m;
242	u_char	end_s;
243	u_char	end_f;
244};
245#define	CDIOCPLAYMSF	_IOW('c', 25, struct ioc_play_msf)
246
247struct ioc_load_unload {
248	u_char options;
249#define	CD_LU_ABORT	0x1	/* NOTE: These are the same as the ATAPI */
250#define	CD_LU_UNLOAD	0x2	/* op values for the LOAD_UNLOAD command */
251#define	CD_LU_LOAD	0x3
252	u_char slot;
253};
254#define		CDIOCLOADUNLOAD	_IOW('c', 26, struct ioc_load_unload)
255
256
257#if defined(_KERNEL) || defined(_EXPOSE_MMC)
258/* not exposed to userland yet until its completely mature */
259/*
260 * MMC device abstraction interface.
261 *
262 * It gathers information from GET_CONFIGURATION, READ_DISCINFO,
263 * READ_TRACKINFO, READ_TOC2, READ_CD_CAPACITY and GET_CONFIGURATION
264 * SCSI/ATAPI calls regardless if its a legacy CD-ROM/DVD-ROM device or a MMC
265 * standard recordable device.
266 */
267struct mmc_discinfo {
268	uint16_t	mmc_profile;
269	uint16_t	mmc_class;
270
271	uint8_t		disc_state;
272	uint8_t		last_session_state;
273	uint8_t		bg_format_state;
274	uint8_t		link_block_penalty;	/* in sectors		   */
275
276	uint64_t	mmc_cur;		/* current MMC_CAPs        */
277	uint64_t	mmc_cap;		/* possible MMC_CAPs       */
278
279	uint32_t	disc_flags;		/* misc flags              */
280
281	uint32_t	disc_id;
282	uint64_t	disc_barcode;
283	uint8_t		application_code;	/* 8 bit really            */
284
285	uint8_t		unused1[3];		/* padding                 */
286
287	uint32_t	last_possible_lba;	/* last leadout start adr. */
288	uint32_t	sector_size;
289
290	uint16_t	num_sessions;
291	uint16_t	num_tracks;		/* derived */
292
293	uint16_t	first_track;
294	uint16_t	first_track_last_session;
295	uint16_t	last_track_last_session;
296
297	uint16_t	unused2;		/* padding/misc info resv. */
298
299	uint16_t	reserved1[4];		/* MMC-5 track resources   */
300	uint32_t	reserved2[3];		/* MMC-5 POW resources     */
301
302	uint32_t	reserved3[8];		/* MMC-5+ */
303};
304#define MMCGETDISCINFO	_IOR('c', 28, struct mmc_discinfo)
305
306#define MMC_CLASS_UNKN  0
307#define MMC_CLASS_DISC	1
308#define MMC_CLASS_CD	2
309#define MMC_CLASS_DVD	3
310#define MMC_CLASS_MO	4
311#define MMC_CLASS_BD	5
312#define MMC_CLASS_FILE	0xffff	/* emulation mode */
313
314#define MMC_DFLAGS_BARCODEVALID	(1 <<  0)  /* barcode is present and valid   */
315#define MMC_DFLAGS_DISCIDVALID  (1 <<  1)  /* discid is present and valid    */
316#define MMC_DFLAGS_APPCODEVALID (1 <<  2)  /* application code valid         */
317#define MMC_DFLAGS_UNRESTRICTED (1 <<  3)  /* restricted, then set app. code */
318
319#define MMC_DFLAGS_FLAGBITS \
320    "\10\1BARCODEVALID\2DISCIDVALID\3APPCODEVALID\4UNRESTRICTED"
321
322#define MMC_CAP_SEQUENTIAL	(1 <<  0)  /* sequential writable only       */
323#define MMC_CAP_RECORDABLE	(1 <<  1)  /* record-able; i.e. not static   */
324#define MMC_CAP_ERASABLE	(1 <<  2)  /* drive can erase sectors        */
325#define MMC_CAP_BLANKABLE	(1 <<  3)  /* media can be blanked           */
326#define MMC_CAP_FORMATTABLE	(1 <<  4)  /* media can be formatted         */
327#define MMC_CAP_REWRITABLE	(1 <<  5)  /* media can be rewritten         */
328#define MMC_CAP_MRW		(1 <<  6)  /* Mount Rainier formatted        */
329#define MMC_CAP_PACKET		(1 <<  7)  /* using packet recording         */
330#define MMC_CAP_STRICTOVERWRITE	(1 <<  8)  /* only writes a packet at a time */
331#define MMC_CAP_PSEUDOOVERWRITE (1 <<  9)  /* overwrite through replacement  */
332#define MMC_CAP_ZEROLINKBLK	(1 << 10)  /* zero link block length capable */
333#define MMC_CAP_HW_DEFECTFREE	(1 << 11)  /* hardware defect management     */
334
335#define MMC_CAP_FLAGBITS \
336    "\10\1SEQUENTIAL\2RECORDABLE\3ERASABLE\4BLANKABLE\5FORMATTABLE" \
337    "\6REWRITABLE\7MRW\10PACKET\11STRICTOVERWRITE\12PSEUDOOVERWRITE" \
338    "\13ZEROLINKBLK\14HW_DEFECTFREE"
339
340#define MMC_STATE_EMPTY		0
341#define MMC_STATE_INCOMPLETE	1
342#define MMC_STATE_FULL		2
343#define MMC_STATE_CLOSED	3
344
345#define MMC_BGFSTATE_UNFORM	0
346#define MMC_BGFSTATE_STOPPED	1
347#define MMC_BGFSTATE_RUNNING	2
348#define	MMC_BGFSTATE_COMPLETED	3
349
350
351struct mmc_trackinfo {
352	uint16_t	tracknr;	/* IN/OUT */
353	uint16_t	sessionnr;
354
355	uint8_t		track_mode;
356	uint8_t		data_mode;
357
358	uint16_t	flags;
359
360	uint32_t	track_start;
361	uint32_t	next_writable;
362	uint32_t	free_blocks;
363	uint32_t	packet_size;
364	uint32_t	track_size;
365	uint32_t	last_recorded;
366};
367#define MMCGETTRACKINFO	_IOWR('c', 29, struct mmc_trackinfo)
368
369#define MMC_TRACKINFO_COPY		(1 <<  0)
370#define MMC_TRACKINFO_DAMAGED		(1 <<  1)
371#define MMC_TRACKINFO_FIXED_PACKET	(1 <<  2)
372#define MMC_TRACKINFO_INCREMENTAL	(1 <<  3)
373#define MMC_TRACKINFO_BLANK		(1 <<  4)
374#define MMC_TRACKINFO_RESERVED		(1 <<  5)
375#define MMC_TRACKINFO_NWA_VALID		(1 <<  6)
376#define MMC_TRACKINFO_LRA_VALID		(1 <<  7)
377#define MMC_TRACKINFO_DATA		(1 <<  8)
378#define MMC_TRACKINFO_AUDIO		(1 <<  9)
379#define MMC_TRACKINFO_AUDIO_4CHAN	(1 << 10)
380#define MMC_TRACKINFO_PRE_EMPH		(1 << 11)
381
382#define MMC_TRACKINFO_FLAGBITS \
383    "\10\1COPY\2DAMAGED\3FIXEDPACKET\4INCREMENTAL\5BLANK" \
384    "\6RESERVED\7NWA_VALID\10LRA_VALID\11DATA\12AUDIO" \
385    "\13AUDIO_4CHAN\14PRE_EMPH"
386
387struct mmc_op {
388	uint16_t	operation;		/* IN */
389	uint16_t	mmc_profile;		/* IN */
390
391	/* parameters to operation */
392	uint16_t	tracknr;		/* IN */
393	uint16_t	sessionnr;		/* IN */
394	uint32_t	extent;			/* IN */
395
396	uint32_t	reserved[4];
397};
398#define MMCOP _IOWR('c', 30, struct mmc_op)
399
400#define MMC_OP_SYNCHRONISECACHE		 1
401#define MMC_OP_CLOSETRACK		 2
402#define MMC_OP_CLOSESESSION		 3
403#define MMC_OP_FINALISEDISC		 4
404#define MMC_OP_RESERVETRACK		 5
405#define MMC_OP_RESERVETRACK_NWA		 6
406#define MMC_OP_UNRESERVETRACK		 7
407#define MMC_OP_REPAIRTRACK		 8
408#define MMC_OP_UNCLOSELASTSESSION	 9
409#define MMC_OP_MAX			 9
410
411struct mmc_writeparams {
412	uint16_t	tracknr;		/* IN */
413	uint16_t	mmc_class;		/* IN */
414	uint32_t	mmc_cur;		/* IN */
415	uint32_t	blockingnr;		/* IN */
416
417	/* when tracknr == 0 */
418	uint8_t		track_mode;		/* IN; normally 5 */
419	uint8_t		data_mode;		/* IN; normally 2 */
420};
421#define MMC_TRACKMODE_DEFAULT	5		/* data, incremental recording */
422#define MMC_DATAMODE_DEFAULT	2		/* CDROM XA disc */
423#define MMCSETUPWRITEPARAMS _IOW('c', 31, struct mmc_writeparams)
424
425#endif /* _KERNEL || _EXPOSE_MMC */
426
427#endif /* !_SYS_CDIO_H_ */