xref: /netbsd/sys/sys/dvdio.h (revision 144515ce)
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