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