2 * Copyright (c) 2000, 2002 Kenneth D. Merry
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions, and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. The name of the author may not be used to endorse or promote products
12 * derived from this software without specific prior written permission.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
18 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * Written by Julian Elischer (julian@tfs.com)
29 * for TRW Financial Systems.
31 * TRW Financial Systems, in accordance with their agreement with Carnegie
32 * Mellon University, makes this software available to CMU to distribute
33 * or use in any manner that they see fit as long as this message is kept with
34 * the software. For this reason TFS also grants any other persons or
35 * organisations permission to use or modify this software.
37 * TFS supplies this software to be publicly redistributed
38 * on the understanding that TFS is not responsible for the correct
39 * functioning of this software in any circumstances.
41 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
43 * from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter Exp $
44 * $FreeBSD: src/sys/cam/scsi/scsi_cd.h,v 1.2.6.3 2003/08/24 03:26:38 ken Exp $
45 * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.h,v 1.3 2003/12/29 06:42:10 dillon Exp $
47 #ifndef _SCSI_SCSI_CD_H
48 #define _SCSI_SCSI_CD_H 1
51 * Define two bits always in the same place in byte 2 (flag byte)
53 #define CD_RELADDR 0x01
85 struct scsi_play_track
102 u_int8_t blk_addr[4];
104 u_int8_t xfer_len[2];
111 u_int8_t byte2; /* same as above */
112 u_int8_t blk_addr[4];
113 u_int8_t xfer_len[4];
118 struct scsi_play_rel_12
121 u_int8_t byte2; /* same as above */
122 u_int8_t blk_addr[4];
123 u_int8_t xfer_len[4];
128 struct scsi_read_header
132 u_int8_t blk_addr[4];
134 u_int8_t data_len[2];
138 struct scsi_read_subchannel
143 #define SRS_SUBQ 0x40
144 u_int8_t subchan_format;
147 u_int8_t data_len[2];
157 u_int8_t data_len[2];
162 struct scsi_read_cd_capacity
166 u_int8_t addr_3; /* Most Significant */
169 u_int8_t addr_0; /* Least Significant */
174 struct scsi_set_speed
178 u_int8_t readspeed[2];
179 u_int8_t writespeed[2];
180 u_int8_t reserved[5];
184 struct scsi_report_key
189 u_int8_t reserved1[2];
190 u_int8_t alloc_len[2];
191 u_int8_t agid_keyformat;
192 #define RK_KF_AGID_MASK 0xc0
193 #define RK_KF_AGID_SHIFT 6
194 #define RK_KF_KEYFORMAT_MASK 0x3f
195 #define RK_KF_AGID 0x00
196 #define RK_KF_CHALLENGE 0x01
197 #define RF_KF_KEY1 0x02
198 #define RK_KF_KEY2 0x03
199 #define RF_KF_TITLE 0x04
200 #define RF_KF_ASF 0x05
201 #define RK_KF_RPC_SET 0x06
202 #define RF_KF_RPC_REPORT 0x08
203 #define RF_KF_INV_AGID 0x3f
208 * See the report key structure for key format and AGID definitions.
213 u_int8_t reserved[7];
214 u_int8_t param_len[2];
215 u_int8_t agid_keyformat;
219 struct scsi_read_dvd_structure
224 u_int8_t layer_number;
226 #define RDS_FORMAT_PHYSICAL 0x00
227 #define RDS_FORMAT_COPYRIGHT 0x01
228 #define RDS_FORMAT_DISC_KEY 0x02
229 #define RDS_FORMAT_BCA 0x03
230 #define RDS_FORMAT_MANUFACTURER 0x04
231 #define RDS_FORMAT_CMGS_CPM 0x05
232 #define RDS_FORMAT_PROT_DISCID 0x06
233 #define RDS_FORMAT_DISC_KEY_BLOCK 0x07
234 #define RDS_FORMAT_DDS 0x08
235 #define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09
236 #define RDS_FORMAT_SPARE_AREA 0x0a
237 #define RDS_FORMAT_RMD_BORDEROUT 0x0c
238 #define RDS_FORMAT_RMD 0x0d
239 #define RDS_FORMAT_LEADIN 0x0e
240 #define RDS_FORMAT_DISC_ID 0x0f
241 #define RDS_FORMAT_DCB 0x30
242 #define RDS_FORMAT_WRITE_PROT 0xc0
243 #define RDS_FORMAT_STRUCTURE_LIST 0xff
244 u_int8_t alloc_len[2];
252 #define READ_CD_CAPACITY 0x25 /* slightly different from disk */
253 #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */
254 #define READ_TOC 0x43 /* cdrom read TOC */
255 #define READ_HEADER 0x44 /* cdrom read header */
256 #define PLAY_10 0x45 /* cdrom play 'play audio' mode */
257 #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */
258 #define PLAY_TRACK 0x48 /* cdrom play track/index mode */
259 #define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */
260 #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */
261 #define SEND_KEY 0xa3 /* dvd send key command */
262 #define REPORT_KEY 0xa4 /* dvd report key command */
263 #define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */
264 #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */
265 #define READ_DVD_STRUCTURE 0xad /* read dvd structure */
266 #define SET_CD_SPEED 0xbb /* set c/dvd speed */
268 struct scsi_report_key_data_header
270 u_int8_t data_len[2];
271 u_int8_t reserved[2];
274 struct scsi_report_key_data_agid
276 u_int8_t data_len[2];
277 u_int8_t reserved[5];
279 #define RKD_AGID_MASK 0xc0
280 #define RKD_AGID_SHIFT 6
283 struct scsi_report_key_data_challenge
285 u_int8_t data_len[2];
286 u_int8_t reserved0[2];
287 u_int8_t challenge_key[10];
288 u_int8_t reserved1[2];
291 struct scsi_report_key_data_key1_key2
293 u_int8_t data_len[2];
294 u_int8_t reserved0[2];
296 u_int8_t reserved1[3];
299 struct scsi_report_key_data_title
301 u_int8_t data_len[2];
302 u_int8_t reserved0[2];
304 #define RKD_TITLE_CPM 0x80
305 #define RKD_TITLE_CPM_SHIFT 7
306 #define RKD_TITLE_CP_SEC 0x40
307 #define RKD_TITLE_CP_SEC_SHIFT 6
308 #define RKD_TITLE_CMGS_MASK 0x30
309 #define RKD_TITLE_CMGS_SHIFT 4
310 #define RKD_TITLE_CMGS_NO_RST 0x00
311 #define RKD_TITLE_CMGS_RSVD 0x10
312 #define RKD_TITLE_CMGS_1_GEN 0x20
313 #define RKD_TITLE_CMGS_NO_COPY 0x30
314 u_int8_t title_key[5];
315 u_int8_t reserved1[2];
318 struct scsi_report_key_data_asf
320 u_int8_t data_len[2];
321 u_int8_t reserved[5];
323 #define RKD_ASF_SUCCESS 0x01
326 struct scsi_report_key_data_rpc
328 u_int8_t data_len[2];
329 u_int8_t rpc_scheme0;
330 #define RKD_RPC_SCHEME_UNKNOWN 0x00
331 #define RKD_RPC_SCHEME_PHASE_II 0x01
334 #define RKD_RPC_TYPE_MASK 0xC0
335 #define RKD_RPC_TYPE_SHIFT 6
336 #define RKD_RPC_TYPE_NONE 0x00
337 #define RKD_RPC_TYPE_SET 0x40
338 #define RKD_RPC_TYPE_LAST_CHANCE 0x80
339 #define RKD_RPC_TYPE_PERM 0xC0
340 #define RKD_RPC_VENDOR_RESET_MASK 0x38
341 #define RKD_RPC_VENDOR_RESET_SHIFT 3
342 #define RKD_RPC_USER_RESET_MASK 0x07
343 #define RKD_RPC_USER_RESET_SHIFT 0
344 u_int8_t region_mask;
345 u_int8_t rpc_scheme1;
349 struct scsi_send_key_data_rpc
351 u_int8_t data_len[2];
352 u_int8_t reserved0[2];
353 u_int8_t region_code;
354 u_int8_t reserved1[3];
358 * Common header for the return data from the READ DVD STRUCTURE command.
360 struct scsi_read_dvd_struct_data_header
362 u_int8_t data_len[2];
363 u_int8_t reserved[2];
366 struct scsi_read_dvd_struct_data_layer_desc
368 u_int8_t book_type_version;
369 #define RDSD_BOOK_TYPE_DVD_ROM 0x00
370 #define RDSD_BOOK_TYPE_DVD_RAM 0x10
371 #define RDSD_BOOK_TYPE_DVD_R 0x20
372 #define RDSD_BOOK_TYPE_DVD_RW 0x30
373 #define RDSD_BOOK_TYPE_DVD_PRW 0x90
374 #define RDSD_BOOK_TYPE_MASK 0xf0
375 #define RDSD_BOOK_TYPE_SHIFT 4
376 #define RDSD_BOOK_VERSION_MASK 0x0f
378 * The lower 4 bits of this field is referred to as the "minimum
379 * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh.
381 u_int8_t disc_size_max_rate;
382 #define RDSD_DISC_SIZE_120MM 0x00
383 #define RDSD_DISC_SIZE_80MM 0x10
384 #define RDSD_DISC_SIZE_MASK 0xf0
385 #define RDSD_DISC_SIZE_SHIFT 4
386 #define RDSD_MAX_RATE_0252 0x00
387 #define RDSD_MAX_RATE_0504 0x01
388 #define RDSD_MAX_RATE_1008 0x02
389 #define RDSD_MAX_RATE_NOT_SPEC 0x0f
390 #define RDSD_MAX_RATE_MASK 0x0f
392 #define RDSD_NUM_LAYERS_MASK 0x60
393 #define RDSD_NUM_LAYERS_SHIFT 5
394 #define RDSD_NL_ONE_LAYER 0x00
395 #define RDSD_NL_TWO_LAYERS 0x20
396 #define RDSD_TRACK_PATH_MASK 0x10
397 #define RDSD_TRACK_PATH_SHIFT 4
398 #define RDSD_TP_PTP 0x00
399 #define RDSD_TP_OTP 0x10
400 #define RDSD_LAYER_TYPE_RO 0x01
401 #define RDSD_LAYER_TYPE_RECORD 0x02
402 #define RDSD_LAYER_TYPE_RW 0x04
403 #define RDSD_LAYER_TYPE_MASK 0x0f
405 #define RDSD_LIN_DENSITY_0267 0x00
406 #define RDSD_LIN_DENSITY_0293 0x10
407 #define RDSD_LIN_DENSITY_0409_0435 0x20
408 #define RDSD_LIN_DENSITY_0280_0291 0x40
409 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
410 #define RDSD_LIN_DENSITY_0353 0x80
411 #define RDSD_LIN_DENSITY_MASK 0xf0
412 #define RDSD_LIN_DENSITY_SHIFT 4
413 #define RDSD_TRACK_DENSITY_074 0x00
414 #define RDSD_TRACK_DENSITY_080 0x01
415 #define RDSD_TRACK_DENSITY_0615 0x02
416 #define RDSD_TRACK_DENSITY_MASK 0x0f
418 u_int8_t main_data_start[3];
419 #define RDSD_MAIN_DATA_START_DVD_RO 0x30000
420 #define RDSD_MAIN_DATA_START_DVD_RW 0x31000
422 u_int8_t main_data_end[3];
424 u_int8_t end_sector_layer0[3];
426 #define RDSD_BCA 0x80
427 #define RDSD_BCA_MASK 0x80
428 #define RDSD_BCA_SHIFT 7
429 u_int8_t media_specific[2031];
432 struct scsi_read_dvd_struct_data_physical
434 u_int8_t data_len[2];
435 u_int8_t reserved[2];
436 struct scsi_read_dvd_struct_data_layer_desc layer_desc;
439 struct scsi_read_dvd_struct_data_copyright
441 u_int8_t data_len[2];
442 u_int8_t reserved0[2];
444 #define RDSD_CPS_NOT_PRESENT 0x00
445 #define RDSD_CPS_DATA_EXISTS 0x01
446 u_int8_t region_info;
447 u_int8_t reserved1[2];
450 struct scsi_read_dvd_struct_data_disc_key
452 u_int8_t data_len[2];
453 u_int8_t reserved[2];
454 u_int8_t disc_key[2048];
457 struct scsi_read_dvd_struct_data_bca
459 u_int8_t data_len[2];
460 u_int8_t reserved[2];
461 u_int8_t bca_info[188]; /* XXX 12-188 bytes */
464 struct scsi_read_dvd_struct_data_manufacturer
466 u_int8_t data_len[2];
467 u_int8_t reserved[2];
468 u_int8_t manuf_info[2048];
471 struct scsi_read_dvd_struct_data_copy_manage
473 u_int8_t data_len[2];
474 u_int8_t reserved0[2];
476 #define RDSD_CPM_NO_COPYRIGHT 0x00
477 #define RDSD_CPM_HAS_COPYRIGHT 0x80
478 #define RDSD_CPM_MASK 0x80
479 #define RDSD_CMGS_COPY_ALLOWED 0x00
480 #define RDSD_CMGS_ONE_COPY 0x20
481 #define RDSD_CMGS_NO_COPIES 0x30
482 #define RDSD_CMGS_MASK 0x30
483 u_int8_t reserved1[3];
486 struct scsi_read_dvd_struct_data_prot_discid
488 u_int8_t data_len[2];
489 u_int8_t reserved[2];
490 u_int8_t prot_discid_data[16];
493 struct scsi_read_dvd_struct_data_disc_key_blk
496 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
498 u_int8_t data_len[2];
500 u_int8_t total_packs;
501 u_int8_t disc_key_pack_data[28668];
503 struct scsi_read_dvd_struct_data_dds
505 u_int8_t data_len[2];
506 u_int8_t reserved[2];
507 u_int8_t dds_info[2048];
510 struct scsi_read_dvd_struct_data_medium_status
512 u_int8_t data_len[2];
513 u_int8_t reserved0[2];
515 #define RDSD_MS_CARTRIDGE 0x80
516 #define RDSD_MS_OUT 0x40
517 #define RDSD_MS_MSWI 0x08
518 #define RDSD_MS_CWP 0x04
519 #define RDSD_MS_PWP 0x02
520 u_int8_t disc_type_id;
521 #define RDSD_DT_NEED_CARTRIDGE 0x00
522 #define RDSD_DT_NO_CART_NEEDED 0x01
524 u_int8_t ram_swi_info;
525 #define RDSD_SWI_NO_BARE 0x01
526 #define RDSD_SWI_UNSPEC 0xff
529 struct scsi_read_dvd_struct_data_spare_area
531 u_int8_t data_len[2];
532 u_int8_t reserved[2];
533 u_int8_t unused_primary[4];
534 u_int8_t unused_supl[4];
535 u_int8_t allocated_supl[4];
538 struct scsi_read_dvd_struct_data_rmd_borderout
540 u_int8_t data_len[2];
541 u_int8_t reserved[2];
542 u_int8_t rmd[30720]; /* maximum is 30720 bytes */
545 struct scsi_read_dvd_struct_data_rmd
547 u_int8_t data_len[2];
548 u_int8_t reserved[2];
549 u_int8_t last_sector_num[4];
550 u_int8_t rmd_bytes[32768]; /* This is the maximum */
554 * XXX KDM this is the MMC2 version of the structure.
555 * The variable positions have changed (in a semi-conflicting way) in the
556 * MMC3 spec, although the overall length of the structure is the same.
558 struct scsi_read_dvd_struct_data_leadin
560 u_int8_t data_len[2];
561 u_int8_t reserved0[2];
564 u_int8_t disc_physical_data;
565 u_int8_t last_addr[3];
566 u_int8_t reserved1[2];
569 u_int8_t rwp_wavelength;
570 u_int8_t optimum_write_strategy;
571 u_int8_t reserved2[4];
573 u_int8_t manuf_id_17_12[6];
576 u_int8_t manuf_id_11_6[6];
579 u_int8_t manuf_id_5_0[6];
580 u_int8_t reserved5[25];
583 struct scsi_read_dvd_struct_data_disc_id
585 u_int8_t data_len[2];
586 u_int8_t reserved[4];
587 u_int8_t random_num[2];
596 struct scsi_read_dvd_struct_data_generic_dcb
598 u_int8_t content_desc[4];
600 u_int8_t unknown_desc_actions[4];
601 #define RDSD_ACTION_RECORDING 0x0001
602 #define RDSD_ACTION_READING 0x0002
603 #define RDSD_ACTION_FORMAT 0x0004
604 #define RDSD_ACTION_MODIFY_DCB 0x0008
605 u_int8_t vendor_id[32];
606 u_int8_t dcb_data[32728];
609 struct scsi_read_dvd_struct_data_dcb
611 u_int8_t data_len[2];
612 u_int8_t reserved[2];
613 struct scsi_read_dvd_struct_data_generic_dcb dcb;
616 struct read_dvd_struct_write_prot
618 u_int8_t data_len[2];
619 u_int8_t reserved0[2];
620 u_int8_t write_prot_status;
621 #define RDSD_WPS_MSWI 0x08
622 #define RDSD_WPS_CWP 0x04
623 #define RDSD_WPS_PWP 0x02
624 #define RDSD_WPS_SWPP 0x01
625 u_int8_t reserved[3];
628 struct read_dvd_struct_list_entry
630 u_int8_t format_code;
632 #define RDSD_SDS_NOT_WRITEABLE 0x00
633 #define RDSD_SDS_WRITEABLE 0x80
634 #define RDSD_SDS_MASK 0x80
635 #define RDSD_RDS_NOT_READABLE 0x00
636 #define RDSD_RDS_READABLE 0x40
637 #define RDSD_RDS_MASK 0x40
638 u_int8_t struct_len[2];
641 struct read_dvd_struct_data_list
643 u_int8_t data_len[2];
644 u_int8_t reserved[2];
645 struct read_dvd_struct_list_entry entries[0];
648 struct scsi_read_cd_cap_data
650 u_int8_t addr_3; /* Most significant */
653 u_int8_t addr_0; /* Least significant */
654 u_int8_t length_3; /* Most significant */
657 u_int8_t length_0; /* Least significant */
663 #define CD_PAGE_CODE 0x3F
664 #define AUDIO_PAGE 0x0e
665 #define CD_PAGE_PS 0x80
668 #define CD_PA_SOTC 0x02
669 #define CD_PA_IMMED 0x04
672 #define CD_PA_FORMAT_LBA 0x0F
673 #define CD_PA_APR_VALID 0x80
674 u_int8_t lb_per_sec[2];
683 #define LEFT_CHANNEL CHANNEL_0
684 #define RIGHT_CHANNEL CHANNEL_1
693 struct cd_audio_page audio;
696 struct cd_mode_data_10
698 struct scsi_mode_header_10 header;
699 struct scsi_mode_blk_desc blk_desc;
705 struct scsi_mode_header_6 header;
706 struct scsi_mode_blk_desc blk_desc;
710 union cd_mode_data_6_10
712 struct cd_mode_data mode_data_6;
713 struct cd_mode_data_10 mode_data_10;
716 struct cd_mode_params
718 STAILQ_ENTRY(cd_mode_params) links;
725 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
726 void (*cbfcnp)(struct cam_periph *, union ccb *),
727 u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
728 u_int8_t key_format, u_int8_t *data_ptr,
729 u_int32_t dxfer_len, u_int8_t sense_len,
732 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
733 void (*cbfcnp)(struct cam_periph *, union ccb *),
734 u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
735 u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
738 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
739 void (*cbfcnp)(struct cam_periph *, union ccb *),
740 u_int8_t tag_action, u_int32_t address,
741 u_int8_t layer_number, u_int8_t format,
742 u_int8_t agid, u_int8_t *data_ptr,
743 u_int32_t dxfer_len, u_int8_t sense_len,
748 #endif /*_SCSI_SCSI_CD_H*/