2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2000, 2002 Kenneth D. Merry
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions, and the following disclaimer,
12 * without modification, immediately at the beginning of the file.
13 * 2. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * Written by Julian Elischer (julian@tfs.com)
31 * for TRW Financial Systems.
33 * TRW Financial Systems, in accordance with their agreement with Carnegie
34 * Mellon University, makes this software available to CMU to distribute
35 * or use in any manner that they see fit as long as this message is kept with
36 * the software. For this reason TFS also grants any other persons or
37 * organisations permission to use or modify this software.
39 * TFS supplies this software to be publicly redistributed
40 * on the understanding that TFS is not responsible for the correct
41 * functioning of this software in any circumstances.
43 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
45 * from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter 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
60 struct scsi_get_config
64 #define SGC_RT_ALL 0x00
65 #define SGC_RT_CURRENT 0x01
66 #define SGC_RT_SPECIFIC 0x02
67 #define SGC_RT_MASK 0x03
68 uint8_t starting_feature[2];
74 struct scsi_get_config_header
76 uint8_t data_length[4];
78 uint8_t current_profile[2];
81 struct scsi_get_config_feature
83 uint8_t feature_code[2];
85 #define SGC_F_CURRENT 0x01
86 #define SGC_F_PERSISTENT 0x02
87 #define SGC_F_VERSION_MASK 0x2C
88 #define SGC_F_VERSION_SHIFT 2
90 uint8_t feature_data[];
93 struct scsi_get_event_status
97 #define SGESN_POLLED 1
100 uint8_t reserved2[2];
105 struct scsi_get_event_status_header
107 uint8_t descr_length[4];
109 #define SGESN_NEA 0x80
110 uint8_t supported_class;
113 struct scsi_get_event_status_descr
116 uint8_t event_info[];
119 struct scsi_mechanism_status
128 struct scsi_mechanism_status_header
134 uint8_t slots_length[2];
162 struct scsi_play_track
188 uint8_t byte2; /* same as above */
195 struct scsi_play_rel_12
198 uint8_t byte2; /* same as above */
205 struct scsi_read_header
215 struct scsi_read_subchannel
220 #define SRS_SUBQ 0x40
221 uint8_t subchan_format;
233 #define SRTOC_FORMAT_TOC 0x00
234 #define SRTOC_FORMAT_LAST_ADDR 0x01
235 #define SRTOC_FORMAT_QSUB_TOC 0x02
236 #define SRTOC_FORMAT_QSUB_PMA 0x03
237 #define SRTOC_FORMAT_ATIP 0x04
238 #define SRTOC_FORMAT_CD_TEXT 0x05
245 struct scsi_read_toc_hdr
247 uint8_t data_length[2];
252 struct scsi_read_toc_type01_descr
256 uint8_t track_number;
258 uint8_t track_start[4];
261 struct scsi_read_cd_capacity
265 uint8_t addr_3; /* Most Significant */
268 uint8_t addr_0; /* Least Significant */
273 struct scsi_set_speed
277 uint8_t readspeed[2];
278 uint8_t writespeed[2];
283 struct scsi_report_key
288 uint8_t reserved1[2];
289 uint8_t alloc_len[2];
290 uint8_t agid_keyformat;
291 #define RK_KF_AGID_MASK 0xc0
292 #define RK_KF_AGID_SHIFT 6
293 #define RK_KF_KEYFORMAT_MASK 0x3f
294 #define RK_KF_AGID 0x00
295 #define RK_KF_CHALLENGE 0x01
296 #define RF_KF_KEY1 0x02
297 #define RK_KF_KEY2 0x03
298 #define RF_KF_TITLE 0x04
299 #define RF_KF_ASF 0x05
300 #define RK_KF_RPC_SET 0x06
301 #define RF_KF_RPC_REPORT 0x08
302 #define RF_KF_INV_AGID 0x3f
307 * See the report key structure for key format and AGID definitions.
313 uint8_t param_len[2];
314 uint8_t agid_keyformat;
318 struct scsi_read_dvd_structure
323 uint8_t layer_number;
325 #define RDS_FORMAT_PHYSICAL 0x00
326 #define RDS_FORMAT_COPYRIGHT 0x01
327 #define RDS_FORMAT_DISC_KEY 0x02
328 #define RDS_FORMAT_BCA 0x03
329 #define RDS_FORMAT_MANUFACTURER 0x04
330 #define RDS_FORMAT_CMGS_CPM 0x05
331 #define RDS_FORMAT_PROT_DISCID 0x06
332 #define RDS_FORMAT_DISC_KEY_BLOCK 0x07
333 #define RDS_FORMAT_DDS 0x08
334 #define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09
335 #define RDS_FORMAT_SPARE_AREA 0x0a
336 #define RDS_FORMAT_RMD_BORDEROUT 0x0c
337 #define RDS_FORMAT_RMD 0x0d
338 #define RDS_FORMAT_LEADIN 0x0e
339 #define RDS_FORMAT_DISC_ID 0x0f
340 #define RDS_FORMAT_DCB 0x30
341 #define RDS_FORMAT_WRITE_PROT 0xc0
342 #define RDS_FORMAT_STRUCTURE_LIST 0xff
343 uint8_t alloc_len[2];
351 #define READ_CD_CAPACITY 0x25 /* slightly different from disk */
352 #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */
353 #define READ_TOC 0x43 /* cdrom read TOC */
354 #define READ_HEADER 0x44 /* cdrom read header */
355 #define PLAY_10 0x45 /* cdrom play 'play audio' mode */
356 #define GET_CONFIGURATION 0x46 /* Get device configuration */
357 #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */
358 #define PLAY_TRACK 0x48 /* cdrom play track/index mode */
359 #define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */
360 #define GET_EVENT_STATUS 0x4a /* Get event status notification */
361 #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */
362 #define SEND_KEY 0xa3 /* dvd send key command */
363 #define REPORT_KEY 0xa4 /* dvd report key command */
364 #define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */
365 #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */
366 #define READ_DVD_STRUCTURE 0xad /* read dvd structure */
367 #define SET_CD_SPEED 0xbb /* set c/dvd speed */
368 #define MECHANISM_STATUS 0xbd /* get status of c/dvd mechanics */
370 struct scsi_report_key_data_header
376 struct scsi_report_key_data_agid
381 #define RKD_AGID_MASK 0xc0
382 #define RKD_AGID_SHIFT 6
385 struct scsi_report_key_data_challenge
388 uint8_t reserved0[2];
389 uint8_t challenge_key[10];
390 uint8_t reserved1[2];
393 struct scsi_report_key_data_key1_key2
396 uint8_t reserved0[2];
398 uint8_t reserved1[3];
401 struct scsi_report_key_data_title
404 uint8_t reserved0[2];
406 #define RKD_TITLE_CPM 0x80
407 #define RKD_TITLE_CPM_SHIFT 7
408 #define RKD_TITLE_CP_SEC 0x40
409 #define RKD_TITLE_CP_SEC_SHIFT 6
410 #define RKD_TITLE_CMGS_MASK 0x30
411 #define RKD_TITLE_CMGS_SHIFT 4
412 #define RKD_TITLE_CMGS_NO_RST 0x00
413 #define RKD_TITLE_CMGS_RSVD 0x10
414 #define RKD_TITLE_CMGS_1_GEN 0x20
415 #define RKD_TITLE_CMGS_NO_COPY 0x30
416 uint8_t title_key[5];
417 uint8_t reserved1[2];
420 struct scsi_report_key_data_asf
425 #define RKD_ASF_SUCCESS 0x01
428 struct scsi_report_key_data_rpc
432 #define RKD_RPC_SCHEME_UNKNOWN 0x00
433 #define RKD_RPC_SCHEME_PHASE_II 0x01
436 #define RKD_RPC_TYPE_MASK 0xC0
437 #define RKD_RPC_TYPE_SHIFT 6
438 #define RKD_RPC_TYPE_NONE 0x00
439 #define RKD_RPC_TYPE_SET 0x40
440 #define RKD_RPC_TYPE_LAST_CHANCE 0x80
441 #define RKD_RPC_TYPE_PERM 0xC0
442 #define RKD_RPC_VENDOR_RESET_MASK 0x38
443 #define RKD_RPC_VENDOR_RESET_SHIFT 3
444 #define RKD_RPC_USER_RESET_MASK 0x07
445 #define RKD_RPC_USER_RESET_SHIFT 0
451 struct scsi_send_key_data_rpc
454 uint8_t reserved0[2];
456 uint8_t reserved1[3];
460 * Common header for the return data from the READ DVD STRUCTURE command.
462 struct scsi_read_dvd_struct_data_header
468 struct scsi_read_dvd_struct_data_layer_desc
470 uint8_t book_type_version;
471 #define RDSD_BOOK_TYPE_DVD_ROM 0x00
472 #define RDSD_BOOK_TYPE_DVD_RAM 0x10
473 #define RDSD_BOOK_TYPE_DVD_R 0x20
474 #define RDSD_BOOK_TYPE_DVD_RW 0x30
475 #define RDSD_BOOK_TYPE_DVD_PRW 0x90
476 #define RDSD_BOOK_TYPE_MASK 0xf0
477 #define RDSD_BOOK_TYPE_SHIFT 4
478 #define RDSD_BOOK_VERSION_MASK 0x0f
480 * The lower 4 bits of this field is referred to as the "minimum
481 * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh.
483 uint8_t disc_size_max_rate;
484 #define RDSD_DISC_SIZE_120MM 0x00
485 #define RDSD_DISC_SIZE_80MM 0x10
486 #define RDSD_DISC_SIZE_MASK 0xf0
487 #define RDSD_DISC_SIZE_SHIFT 4
488 #define RDSD_MAX_RATE_0252 0x00
489 #define RDSD_MAX_RATE_0504 0x01
490 #define RDSD_MAX_RATE_1008 0x02
491 #define RDSD_MAX_RATE_NOT_SPEC 0x0f
492 #define RDSD_MAX_RATE_MASK 0x0f
494 #define RDSD_NUM_LAYERS_MASK 0x60
495 #define RDSD_NUM_LAYERS_SHIFT 5
496 #define RDSD_NL_ONE_LAYER 0x00
497 #define RDSD_NL_TWO_LAYERS 0x20
498 #define RDSD_TRACK_PATH_MASK 0x10
499 #define RDSD_TRACK_PATH_SHIFT 4
500 #define RDSD_TP_PTP 0x00
501 #define RDSD_TP_OTP 0x10
502 #define RDSD_LAYER_TYPE_RO 0x01
503 #define RDSD_LAYER_TYPE_RECORD 0x02
504 #define RDSD_LAYER_TYPE_RW 0x04
505 #define RDSD_LAYER_TYPE_MASK 0x0f
507 #define RDSD_LIN_DENSITY_0267 0x00
508 #define RDSD_LIN_DENSITY_0293 0x10
509 #define RDSD_LIN_DENSITY_0409_0435 0x20
510 #define RDSD_LIN_DENSITY_0280_0291 0x40
511 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
512 #define RDSD_LIN_DENSITY_0353 0x80
513 #define RDSD_LIN_DENSITY_MASK 0xf0
514 #define RDSD_LIN_DENSITY_SHIFT 4
515 #define RDSD_TRACK_DENSITY_074 0x00
516 #define RDSD_TRACK_DENSITY_080 0x01
517 #define RDSD_TRACK_DENSITY_0615 0x02
518 #define RDSD_TRACK_DENSITY_MASK 0x0f
520 uint8_t main_data_start[3];
521 #define RDSD_MAIN_DATA_START_DVD_RO 0x30000
522 #define RDSD_MAIN_DATA_START_DVD_RW 0x31000
524 uint8_t main_data_end[3];
526 uint8_t end_sector_layer0[3];
528 #define RDSD_BCA 0x80
529 #define RDSD_BCA_MASK 0x80
530 #define RDSD_BCA_SHIFT 7
531 uint8_t media_specific[2031];
534 struct scsi_read_dvd_struct_data_physical
538 struct scsi_read_dvd_struct_data_layer_desc layer_desc;
541 struct scsi_read_dvd_struct_data_copyright
544 uint8_t reserved0[2];
546 #define RDSD_CPS_NOT_PRESENT 0x00
547 #define RDSD_CPS_DATA_EXISTS 0x01
549 uint8_t reserved1[2];
552 struct scsi_read_dvd_struct_data_disc_key
556 uint8_t disc_key[2048];
559 struct scsi_read_dvd_struct_data_bca
563 uint8_t bca_info[188]; /* XXX 12-188 bytes */
566 struct scsi_read_dvd_struct_data_manufacturer
570 uint8_t manuf_info[2048];
573 struct scsi_read_dvd_struct_data_copy_manage
576 uint8_t reserved0[2];
578 #define RDSD_CPM_NO_COPYRIGHT 0x00
579 #define RDSD_CPM_HAS_COPYRIGHT 0x80
580 #define RDSD_CPM_MASK 0x80
581 #define RDSD_CMGS_COPY_ALLOWED 0x00
582 #define RDSD_CMGS_ONE_COPY 0x20
583 #define RDSD_CMGS_NO_COPIES 0x30
584 #define RDSD_CMGS_MASK 0x30
585 uint8_t reserved1[3];
588 struct scsi_read_dvd_struct_data_prot_discid
592 uint8_t prot_discid_data[16];
595 struct scsi_read_dvd_struct_data_disc_key_blk
598 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
603 uint8_t disc_key_pack_data[28668];
605 struct scsi_read_dvd_struct_data_dds
609 uint8_t dds_info[2048];
612 struct scsi_read_dvd_struct_data_medium_status
615 uint8_t reserved0[2];
617 #define RDSD_MS_CARTRIDGE 0x80
618 #define RDSD_MS_OUT 0x40
619 #define RDSD_MS_MSWI 0x08
620 #define RDSD_MS_CWP 0x04
621 #define RDSD_MS_PWP 0x02
622 uint8_t disc_type_id;
623 #define RDSD_DT_NEED_CARTRIDGE 0x00
624 #define RDSD_DT_NO_CART_NEEDED 0x01
626 uint8_t ram_swi_info;
627 #define RDSD_SWI_NO_BARE 0x01
628 #define RDSD_SWI_UNSPEC 0xff
631 struct scsi_read_dvd_struct_data_spare_area
635 uint8_t unused_primary[4];
636 uint8_t unused_supl[4];
637 uint8_t allocated_supl[4];
640 struct scsi_read_dvd_struct_data_rmd_borderout
644 uint8_t rmd[30720]; /* maximum is 30720 bytes */
647 struct scsi_read_dvd_struct_data_rmd
651 uint8_t last_sector_num[4];
652 uint8_t rmd_bytes[32768]; /* This is the maximum */
656 * XXX KDM this is the MMC2 version of the structure.
657 * The variable positions have changed (in a semi-conflicting way) in the
658 * MMC3 spec, although the overall length of the structure is the same.
660 struct scsi_read_dvd_struct_data_leadin
663 uint8_t reserved0[2];
666 uint8_t disc_physical_data;
667 uint8_t last_addr[3];
668 uint8_t reserved1[2];
671 uint8_t rwp_wavelength;
672 uint8_t optimum_write_strategy;
673 uint8_t reserved2[4];
675 uint8_t manuf_id_17_12[6];
678 uint8_t manuf_id_11_6[6];
681 uint8_t manuf_id_5_0[6];
682 uint8_t reserved5[25];
685 struct scsi_read_dvd_struct_data_disc_id
689 uint8_t random_num[2];
698 struct scsi_read_dvd_struct_data_generic_dcb
700 uint8_t content_desc[4];
702 uint8_t unknown_desc_actions[4];
703 #define RDSD_ACTION_RECORDING 0x0001
704 #define RDSD_ACTION_READING 0x0002
705 #define RDSD_ACTION_FORMAT 0x0004
706 #define RDSD_ACTION_MODIFY_DCB 0x0008
707 uint8_t vendor_id[32];
708 uint8_t dcb_data[32728];
711 struct scsi_read_dvd_struct_data_dcb
715 struct scsi_read_dvd_struct_data_generic_dcb dcb;
718 struct read_dvd_struct_write_prot
721 uint8_t reserved0[2];
722 uint8_t write_prot_status;
723 #define RDSD_WPS_MSWI 0x08
724 #define RDSD_WPS_CWP 0x04
725 #define RDSD_WPS_PWP 0x02
726 #define RDSD_WPS_SWPP 0x01
730 struct read_dvd_struct_list_entry
734 #define RDSD_SDS_NOT_WRITEABLE 0x00
735 #define RDSD_SDS_WRITEABLE 0x80
736 #define RDSD_SDS_MASK 0x80
737 #define RDSD_RDS_NOT_READABLE 0x00
738 #define RDSD_RDS_READABLE 0x40
739 #define RDSD_RDS_MASK 0x40
740 uint8_t struct_len[2];
743 struct read_dvd_struct_data_list
747 struct read_dvd_struct_list_entry entries[0];
750 struct scsi_read_cd_cap_data
752 uint8_t addr_3; /* Most significant */
755 uint8_t addr_0; /* Least significant */
756 uint8_t length_3; /* Most significant */
759 uint8_t length_0; /* Least significant */
765 #define CD_PAGE_CODE 0x3F
766 #define AUDIO_PAGE 0x0e
767 #define CD_PAGE_PS 0x80
770 #define CD_PA_SOTC 0x02
771 #define CD_PA_IMMED 0x04
774 #define CD_PA_FORMAT_LBA 0x0F
775 #define CD_PA_APR_VALID 0x80
776 uint8_t lb_per_sec[2];
785 #define LEFT_CHANNEL CHANNEL_0
786 #define RIGHT_CHANNEL CHANNEL_1
793 struct scsi_cddvd_capabilities_page_sd {
795 uint8_t rotation_control;
796 uint8_t write_speed_supported[2];
799 struct scsi_cddvd_capabilities_page {
801 #define SMS_CDDVD_CAPS_PAGE 0x2a
810 uint8_t nvol_levels[2];
811 uint8_t buffer_size[2];
812 uint8_t obsolete2[2];
816 uint8_t copy_management;
818 uint8_t rotation_control;
819 uint8_t cur_write_speed;
820 uint8_t num_speed_descr;
821 struct scsi_cddvd_capabilities_page_sd speed_descr[];
826 struct cd_audio_page audio;
829 struct cd_mode_data_10
831 struct scsi_mode_header_10 header;
832 struct scsi_mode_blk_desc blk_desc;
838 struct scsi_mode_header_6 header;
839 struct scsi_mode_blk_desc blk_desc;
843 union cd_mode_data_6_10
845 struct cd_mode_data mode_data_6;
846 struct cd_mode_data_10 mode_data_10;
849 struct cd_mode_params
851 STAILQ_ENTRY(cd_mode_params) links;
858 void scsi_report_key(struct ccb_scsiio *csio, uint32_t retries,
859 void (*cbfcnp)(struct cam_periph *, union ccb *),
860 uint8_t tag_action, uint32_t lba, uint8_t agid,
861 uint8_t key_format, uint8_t *data_ptr,
862 uint32_t dxfer_len, uint8_t sense_len,
865 void scsi_send_key(struct ccb_scsiio *csio, uint32_t retries,
866 void (*cbfcnp)(struct cam_periph *, union ccb *),
867 uint8_t tag_action, uint8_t agid, uint8_t key_format,
868 uint8_t *data_ptr, uint32_t dxfer_len, uint8_t sense_len,
871 void scsi_read_dvd_structure(struct ccb_scsiio *csio, uint32_t retries,
872 void (*cbfcnp)(struct cam_periph *, union ccb *),
873 uint8_t tag_action, uint32_t address,
874 uint8_t layer_number, uint8_t format,
875 uint8_t agid, uint8_t *data_ptr,
876 uint32_t dxfer_len, uint8_t sense_len,
879 void scsi_read_toc(struct ccb_scsiio *csio, uint32_t retries,
880 void (*cbfcnp)(struct cam_periph *, union ccb *),
881 uint8_t tag_action, uint8_t byte1_flags, uint8_t format,
882 uint8_t track, uint8_t *data_ptr, uint32_t dxfer_len,
883 int sense_len, int timeout);
887 #endif /*_SCSI_SCSI_CD_H*/