1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * -- <linux/cdrom.h>
4 * General header file for linux CD-ROM drivers
5 * Copyright (C) 1992         David Giller, rafetmad@oxy.edu
6 *               1994, 1995   Eberhard M��nkeberg, emoenke@gwdg.de
7 *               1996         David van Leeuwen, david@tm.tno.nl
8 *               1997, 1998   Erik Andersen, andersee@debian.org
9 *               1998-2002    Jens Axboe, axboe@suse.de
10 */
11#ifndef	_LINUX_CDROM_H
12#define	_LINUX_CDROM_H
13
14#include <linux/fs.h>		/* not really needed, later.. */
15#include <linux/list.h>
16#include <linux/blkdev.h>
17#include <scsi/scsi_common.h>
18#include <uapi/linux/cdrom.h>
19
20struct packet_command
21{
22	unsigned char 		cmd[CDROM_PACKET_SIZE];
23	unsigned char 		*buffer;
24	unsigned int 		buflen;
25	int			stat;
26	struct scsi_sense_hdr	*sshdr;
27	unsigned char		data_direction;
28	int			quiet;
29	int			timeout;
30	void			*reserved[1];
31};
32
33/*
34 * _OLD will use PIO transfer on atapi devices, _BPC_* will use DMA
35 */
36#define CDDA_OLD		0	/* old style */
37#define CDDA_BPC_SINGLE		1	/* single frame block pc */
38#define CDDA_BPC_FULL		2	/* multi frame block pc */
39
40/* Uniform cdrom data structures for cdrom.c */
41struct cdrom_device_info {
42	const struct cdrom_device_ops *ops; /* link to device_ops */
43	struct list_head list;		/* linked list of all device_info */
44	struct gendisk *disk;		/* matching block layer disk */
45	void *handle;		        /* driver-dependent data */
46/* specifications */
47	int mask;                       /* mask of capability: disables them */
48	int speed;			/* maximum speed for reading data */
49	int capacity;			/* number of discs in jukebox */
50/* device-related storage */
51	unsigned int options	: 30;	/* options flags */
52	unsigned mc_flags	: 2;	/* media change buffer flags */
53	unsigned int vfs_events;	/* cached events for vfs path */
54	unsigned int ioctl_events;	/* cached events for ioctl path */
55    	int use_count;                  /* number of times device opened */
56    	char name[20];                  /* name of the device type */
57/* per-device flags */
58        __u8 sanyo_slot		: 2;	/* Sanyo 3 CD changer support */
59        __u8 keeplocked		: 1;	/* CDROM_LOCKDOOR status */
60        __u8 reserved		: 5;	/* not used yet */
61	int cdda_method;		/* see flags */
62	__u8 last_sense;
63	__u8 media_written;		/* dirty flag, DVD+RW bookkeeping */
64	unsigned short mmc3_profile;	/* current MMC3 profile */
65	int (*exit)(struct cdrom_device_info *);
66	int mrw_mode_page;
67	bool opened_for_data;
68	__s64 last_media_change_ms;
69};
70
71struct cdrom_device_ops {
72/* routines */
73	int (*open) (struct cdrom_device_info *, int);
74	void (*release) (struct cdrom_device_info *);
75	int (*drive_status) (struct cdrom_device_info *, int);
76	unsigned int (*check_events) (struct cdrom_device_info *cdi,
77				      unsigned int clearing, int slot);
78	int (*tray_move) (struct cdrom_device_info *, int);
79	int (*lock_door) (struct cdrom_device_info *, int);
80	int (*select_speed) (struct cdrom_device_info *, int);
81	int (*get_last_session) (struct cdrom_device_info *,
82				 struct cdrom_multisession *);
83	int (*get_mcn) (struct cdrom_device_info *,
84			struct cdrom_mcn *);
85	/* hard reset device */
86	int (*reset) (struct cdrom_device_info *);
87	/* play stuff */
88	int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
89
90	/* handle uniform packets for scsi type devices (scsi,atapi) */
91	int (*generic_packet) (struct cdrom_device_info *,
92			       struct packet_command *);
93	int (*read_cdda_bpc)(struct cdrom_device_info *cdi, void __user *ubuf,
94			       u32 lba, u32 nframes, u8 *last_sense);
95/* driver specifications */
96	const int capability;   /* capability flags */
97};
98
99int cdrom_multisession(struct cdrom_device_info *cdi,
100		struct cdrom_multisession *info);
101int cdrom_read_tocentry(struct cdrom_device_info *cdi,
102		struct cdrom_tocentry *entry);
103
104/* the general block_device operations structure: */
105int cdrom_open(struct cdrom_device_info *cdi, blk_mode_t mode);
106void cdrom_release(struct cdrom_device_info *cdi);
107int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
108		unsigned int cmd, unsigned long arg);
109extern unsigned int cdrom_check_events(struct cdrom_device_info *cdi,
110				       unsigned int clearing);
111
112extern int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi);
113extern void unregister_cdrom(struct cdrom_device_info *cdi);
114
115typedef struct {
116    int data;
117    int audio;
118    int cdi;
119    int xa;
120    long error;
121} tracktype;
122
123extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
124extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
125extern int cdrom_mode_select(struct cdrom_device_info *cdi,
126			     struct packet_command *cgc);
127extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
128			    struct packet_command *cgc,
129			    int page_code, int page_control);
130extern void init_cdrom_command(struct packet_command *cgc,
131			       void *buffer, int len, int type);
132extern int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,
133				      struct packet_command *cgc);
134
135/* The SCSI spec says there could be 256 slots. */
136#define CDROM_MAX_SLOTS	256
137
138struct cdrom_mechstat_header {
139#if defined(__BIG_ENDIAN_BITFIELD)
140	__u8 fault         : 1;
141	__u8 changer_state : 2;
142	__u8 curslot       : 5;
143	__u8 mech_state    : 3;
144	__u8 door_open     : 1;
145	__u8 reserved1     : 4;
146#elif defined(__LITTLE_ENDIAN_BITFIELD)
147	__u8 curslot       : 5;
148	__u8 changer_state : 2;
149	__u8 fault         : 1;
150	__u8 reserved1     : 4;
151	__u8 door_open     : 1;
152	__u8 mech_state    : 3;
153#endif
154	__u8     curlba[3];
155	__u8     nslots;
156	__u16 slot_tablelen;
157};
158
159struct cdrom_slot {
160#if defined(__BIG_ENDIAN_BITFIELD)
161	__u8 disc_present : 1;
162	__u8 reserved1    : 6;
163	__u8 change       : 1;
164#elif defined(__LITTLE_ENDIAN_BITFIELD)
165	__u8 change       : 1;
166	__u8 reserved1    : 6;
167	__u8 disc_present : 1;
168#endif
169	__u8 reserved2[3];
170};
171
172struct cdrom_changer_info {
173	struct cdrom_mechstat_header hdr;
174	struct cdrom_slot slots[CDROM_MAX_SLOTS];
175};
176
177typedef enum {
178	mechtype_caddy = 0,
179	mechtype_tray  = 1,
180	mechtype_popup = 2,
181	mechtype_individual_changer = 4,
182	mechtype_cartridge_changer  = 5
183} mechtype_t;
184
185typedef struct {
186#if defined(__BIG_ENDIAN_BITFIELD)
187	__u8 ps			: 1;
188	__u8 reserved1		: 1;
189	__u8 page_code		: 6;
190        __u8 page_length;
191	__u8 reserved2		: 1;
192	__u8 bufe		: 1;
193	__u8 ls_v		: 1;
194	__u8 test_write		: 1;
195        __u8 write_type		: 4;
196	__u8 multi_session	: 2; /* or border, DVD */
197	__u8 fp			: 1;
198	__u8 copy		: 1;
199	__u8 track_mode		: 4;
200	__u8 reserved3		: 4;
201	__u8 data_block_type	: 4;
202#elif defined(__LITTLE_ENDIAN_BITFIELD)
203	__u8 page_code		: 6;
204	__u8 reserved1		: 1;
205	__u8 ps			: 1;
206        __u8 page_length;
207        __u8 write_type		: 4;
208	__u8 test_write		: 1;
209	__u8 ls_v		: 1;
210	__u8 bufe		: 1;
211	__u8 reserved2		: 1;
212	__u8 track_mode		: 4;
213	__u8 copy		: 1;
214	__u8 fp			: 1;
215	__u8 multi_session	: 2; /* or border, DVD */
216	__u8 data_block_type	: 4;
217	__u8 reserved3		: 4;
218#endif
219	__u8 link_size;
220	__u8 reserved4;
221#if defined(__BIG_ENDIAN_BITFIELD)
222	__u8 reserved5		: 2;
223	__u8 app_code		: 6;
224#elif defined(__LITTLE_ENDIAN_BITFIELD)
225	__u8 app_code		: 6;
226	__u8 reserved5		: 2;
227#endif
228	__u8 session_format;
229	__u8 reserved6;
230	__be32 packet_size;
231	__u16 audio_pause;
232	__u8 mcn[16];
233	__u8 isrc[16];
234	__u8 subhdr0;
235	__u8 subhdr1;
236	__u8 subhdr2;
237	__u8 subhdr3;
238} __attribute__((packed)) write_param_page;
239
240struct modesel_head
241{
242	__u8	reserved1;
243	__u8	medium;
244	__u8	reserved2;
245	__u8	block_desc_length;
246	__u8	density;
247	__u8	number_of_blocks_hi;
248	__u8	number_of_blocks_med;
249	__u8	number_of_blocks_lo;
250	__u8	reserved3;
251	__u8	block_length_hi;
252	__u8	block_length_med;
253	__u8	block_length_lo;
254};
255
256typedef struct {
257	__u16 report_key_length;
258	__u8 reserved1;
259	__u8 reserved2;
260#if defined(__BIG_ENDIAN_BITFIELD)
261	__u8 type_code			: 2;
262	__u8 vra			: 3;
263	__u8 ucca			: 3;
264#elif defined(__LITTLE_ENDIAN_BITFIELD)
265	__u8 ucca			: 3;
266	__u8 vra			: 3;
267	__u8 type_code			: 2;
268#endif
269	__u8 region_mask;
270	__u8 rpc_scheme;
271	__u8 reserved3;
272} rpc_state_t;
273
274struct event_header {
275	__be16 data_len;
276#if defined(__BIG_ENDIAN_BITFIELD)
277	__u8 nea		: 1;
278	__u8 reserved1		: 4;
279	__u8 notification_class	: 3;
280#elif defined(__LITTLE_ENDIAN_BITFIELD)
281	__u8 notification_class	: 3;
282	__u8 reserved1		: 4;
283	__u8 nea		: 1;
284#endif
285	__u8 supp_event_class;
286};
287
288struct media_event_desc {
289#if defined(__BIG_ENDIAN_BITFIELD)
290	__u8 reserved1		: 4;
291	__u8 media_event_code	: 4;
292	__u8 reserved2		: 6;
293	__u8 media_present	: 1;
294	__u8 door_open		: 1;
295#elif defined(__LITTLE_ENDIAN_BITFIELD)
296	__u8 media_event_code	: 4;
297	__u8 reserved1		: 4;
298	__u8 door_open		: 1;
299	__u8 media_present	: 1;
300	__u8 reserved2		: 6;
301#endif
302	__u8 start_slot;
303	__u8 end_slot;
304};
305
306extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
307
308static inline void lba_to_msf(int lba, u8 *m, u8 *s, u8 *f)
309{
310	lba += CD_MSF_OFFSET;
311	lba &= 0xffffff;  /* negative lbas use only 24 bits */
312	*m = lba / (CD_SECS * CD_FRAMES);
313	lba %= (CD_SECS * CD_FRAMES);
314	*s = lba / CD_FRAMES;
315	*f = lba % CD_FRAMES;
316}
317
318static inline int msf_to_lba(u8 m, u8 s, u8 f)
319{
320	return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
321}
322#endif  /* _LINUX_CDROM_H */
323