Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: dvdio.h,v 1.8 2005/12/26 18:41:36 perry Exp $	*/
      2 
      3 #ifndef _SYS_DVDIO_H_
      4 #define _SYS_DVDIO_H_
      5 
      6 #include <sys/types.h>
      7 #include <sys/ioccom.h>
      8 
      9 /* DVD-ROM Specific ioctls */
     10 #define DVD_READ_STRUCT		_IOWR('d', 0, dvd_struct)
     11 #define DVD_WRITE_STRUCT	_IOWR('d', 1, dvd_struct)
     12 #define DVD_AUTH		_IOWR('d', 2, dvd_authinfo)
     13 
     14 #define GPCMD_READ_DVD_STRUCTURE	0xad
     15 #define GPCMD_SEND_DVD_STRUCTURE	0xad
     16 #define GPCMD_REPORT_KEY		0xa4
     17 #define GPCMD_SEND_KEY			0xa3
     18 
     19 /* DVD struct types */
     20 #define DVD_STRUCT_PHYSICAL		0x00
     21 #define DVD_STRUCT_COPYRIGHT		0x01
     22 #define DVD_STRUCT_DISCKEY		0x02
     23 #define DVD_STRUCT_BCA			0x03
     24 #define DVD_STRUCT_MANUFACT		0x04
     25 
     26 struct dvd_layer {
     27 	uint8_t book_version	: 4;
     28 	uint8_t book_type	: 4;
     29 	uint8_t min_rate	: 4;
     30 	uint8_t disc_size	: 4;
     31 	uint8_t layer_type	: 4;
     32 	uint8_t track_path	: 1;
     33 	uint8_t nlayers	: 2;
     34 	uint8_t track_density	: 4;
     35 	uint8_t linear_density	: 4;
     36 	uint8_t bca		: 1;
     37 	uint32_t start_sector;
     38 	uint32_t end_sector;
     39 	uint32_t end_sector_l0;
     40 };
     41 
     42 struct dvd_physical {
     43 	uint8_t type;
     44 	uint8_t layer_num;
     45 	struct dvd_layer layer[4];
     46 };
     47 
     48 struct dvd_copyright {
     49 	uint8_t type;
     50 
     51 	uint8_t layer_num;
     52 	uint8_t cpst;
     53 	uint8_t rmi;
     54 };
     55 
     56 struct dvd_disckey {
     57 	uint8_t type;
     58 
     59 	unsigned agid		: 2;
     60 	uint8_t value[2048];
     61 };
     62 
     63 struct dvd_bca {
     64 	uint8_t type;
     65 
     66 	int len;
     67 	uint8_t value[188];
     68 };
     69 
     70 struct dvd_manufact {
     71 	uint8_t type;
     72 
     73 	uint8_t layer_num;
     74 	int len;
     75 	uint8_t value[2048];
     76 };
     77 
     78 typedef union {
     79 	uint8_t type;
     80 
     81 	struct dvd_physical	physical;
     82 	struct dvd_copyright	copyright;
     83 	struct dvd_disckey	disckey;
     84 	struct dvd_bca		bca;
     85 	struct dvd_manufact	manufact;
     86 } dvd_struct;
     87 
     88 /*
     89  * DVD authentication ioctl
     90  */
     91 
     92 /* Authentication states */
     93 #define DVD_LU_SEND_AGID	0
     94 #define DVD_HOST_SEND_CHALLENGE	1
     95 #define DVD_LU_SEND_KEY1	2
     96 #define DVD_LU_SEND_CHALLENGE	3
     97 #define DVD_HOST_SEND_KEY2	4
     98 
     99 /* Termination states */
    100 #define DVD_AUTH_ESTABLISHED	5
    101 #define DVD_AUTH_FAILURE	6
    102 
    103 /* Other functions */
    104 #define DVD_LU_SEND_TITLE_KEY	7
    105 #define DVD_LU_SEND_ASF		8
    106 #define DVD_INVALIDATE_AGID	9
    107 #define DVD_LU_SEND_RPC_STATE	10
    108 #define DVD_HOST_SEND_RPC_STATE	11
    109 
    110 /* State data */
    111 typedef uint8_t dvd_key[5];		/* 40-bit value, MSB is first elem. */
    112 typedef uint8_t dvd_challenge[10];	/* 80-bit value, MSB is first elem. */
    113 
    114 struct dvd_lu_send_agid {
    115 	uint8_t type;
    116 	unsigned agid		: 2;
    117 };
    118 
    119 struct dvd_host_send_challenge {
    120 	uint8_t type;
    121 	unsigned agid		: 2;
    122 
    123 	dvd_challenge chal;
    124 };
    125 
    126 struct dvd_send_key {
    127 	uint8_t type;
    128 	unsigned agid		: 2;
    129 
    130 	dvd_key key;
    131 };
    132 
    133 struct dvd_lu_send_challenge {
    134 	uint8_t type;
    135 	unsigned agid		: 2;
    136 
    137 	dvd_challenge chal;
    138 };
    139 
    140 #define DVD_CPM_NO_COPYRIGHT	0
    141 #define DVD_CPM_COPYRIGHTED	1
    142 
    143 #define DVD_CP_SEC_NONE		0
    144 #define DVD_CP_SEC_EXIST	1
    145 
    146 #define DVD_CGMS_UNRESTRICTED	0
    147 #define DVD_CGMS_SINGLE		2
    148 #define DVD_CGMS_RESTRICTED	3
    149 
    150 struct dvd_lu_send_title_key {
    151 	uint8_t type;
    152 	unsigned agid		: 2;
    153 
    154 	dvd_key title_key;
    155 	int lba;
    156 	unsigned cpm		: 1;
    157 	unsigned cp_sec		: 1;
    158 	unsigned cgms		: 2;
    159 };
    160 
    161 struct dvd_lu_send_asf {
    162 	uint8_t type;
    163 	unsigned agid		: 2;
    164 
    165 	unsigned asf		: 1;
    166 };
    167 
    168 struct dvd_host_send_rpcstate {
    169 	uint8_t type;
    170 	uint8_t pdrc;
    171 };
    172 
    173 struct dvd_lu_send_rpcstate {
    174 	uint8_t type		: 2;
    175 	uint8_t vra		: 3;
    176 	uint8_t ucca		: 3;
    177 	uint8_t region_mask;
    178 	uint8_t rpc_scheme;
    179 };
    180 
    181 typedef union {
    182 	uint8_t type;
    183 
    184 	struct dvd_lu_send_agid		lsa;
    185 	struct dvd_host_send_challenge	hsc;
    186 	struct dvd_send_key		lsk;
    187 	struct dvd_lu_send_challenge	lsc;
    188 	struct dvd_send_key		hsk;
    189 	struct dvd_lu_send_title_key	lstk;
    190 	struct dvd_lu_send_asf		lsasf;
    191 	struct dvd_host_send_rpcstate	hrpcs;
    192 	struct dvd_lu_send_rpcstate	lrpcs;
    193 } dvd_authinfo;
    194 
    195 typedef struct {
    196 	uint16_t report_key_length;
    197 	uint8_t reserved1[2];
    198 	uint8_t ucca		: 3;
    199 	uint8_t vra		: 3;
    200 	uint8_t type_code	: 2;
    201 	uint8_t region_mask;
    202 	uint8_t rpc_scheme;
    203 	uint8_t reserved2;
    204 } dvd_rpc_state_t;
    205 
    206 #endif /* _SYS_DVDIO_H_ */
    207