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_ */
207