master
  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
 26struct 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
 42struct dvd_physical {
 43	uint8_t type;
 44	uint8_t layer_num;
 45	struct dvd_layer layer[4];
 46};
 47
 48struct dvd_copyright {
 49	uint8_t type;
 50
 51	uint8_t layer_num;
 52	uint8_t cpst;
 53	uint8_t rmi;
 54};
 55
 56struct dvd_disckey {
 57	uint8_t type;
 58
 59	unsigned agid		: 2;
 60	uint8_t value[2048];
 61};
 62
 63struct dvd_bca {
 64	uint8_t type;
 65
 66	int len;
 67	uint8_t value[188];
 68};
 69
 70struct dvd_manufact {
 71	uint8_t type;
 72
 73	uint8_t layer_num;
 74	int len;
 75	uint8_t value[2048];
 76};
 77
 78typedef 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 */
111typedef uint8_t dvd_key[5];		/* 40-bit value, MSB is first elem. */
112typedef uint8_t dvd_challenge[10];	/* 80-bit value, MSB is first elem. */
113
114struct dvd_lu_send_agid {
115	uint8_t type;
116	unsigned agid		: 2;
117};
118
119struct dvd_host_send_challenge {
120	uint8_t type;
121	unsigned agid		: 2;
122
123	dvd_challenge chal;
124};
125
126struct dvd_send_key {
127	uint8_t type;
128	unsigned agid		: 2;
129
130	dvd_key key;
131};
132
133struct 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
150struct 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
161struct dvd_lu_send_asf {
162	uint8_t type;
163	unsigned agid		: 2;
164
165	unsigned asf		: 1;
166};
167
168struct dvd_host_send_rpcstate {
169	uint8_t type;
170	uint8_t pdrc;
171};
172
173struct 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
181typedef 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
195typedef 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_ */