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 | |