Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


3fd752d818bf337ca23863679388674a8ef67cdf
[palacios.git] / palacios / src / devices / atapi-types.h
1 /* 
2  * This file is part of the Palacios Virtual Machine Monitor developed
3  * by the V3VEE Project with funding from the United States National 
4  * Science Foundation and the Department of Energy.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
10  * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
11  * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
12  * All rights reserved.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20
21 #ifndef __DEVICES_ATAPI_TYPES_H__
22 #define __DEVICES_ATAPI_TYPES_H__
23
24 #ifdef __V3VEE__
25
26 #include <palacios/vmm_types.h>
27
28 typedef enum {
29     ATAPI_SEN_NONE = 0, 
30     ATAPI_SEN_NOT_RDY = 2, 
31     ATAPI_SEN_ILL_REQ = 5,
32     ATAPI_SEN_UNIT_ATTNT = 6
33 } atapi_sense_key_t ;
34
35 typedef enum  {
36     ASC_INV_CMD_FIELD = 0x24,
37     ASC_MEDIA_NOT_PRESENT = 0x3a,
38     ASC_SAVE_PARAM_NOT_SUPPORTED = 0x39,    
39     ASC_LOG_BLK_OOR = 0x21                  /* LOGICAL BLOCK OUT OF RANGE */
40 } atapi_add_sense_code_t ; 
41
42 struct atapi_irq_flags {
43     uint8_t c_d    : 1; 
44     uint8_t io_dir : 1; 
45     uint8_t rel    : 1; 
46     uint8_t tag    : 5;
47 } __attribute__((packed));
48
49
50
51 struct atapi_sense_data {
52     union {
53         uint8_t buf[18];
54         struct {
55             uint8_t header;
56             uint8_t rsvd1;
57             uint8_t sense_key; // atapi_sense_key_t
58             uint8_t info[4];
59             uint8_t read_len; // num bytes past this point
60             uint8_t spec_info[4];
61             uint8_t asc;   // atapi_add_sense_code_t
62             uint8_t ascq; // ??
63             uint8_t fruc; // ??
64             uint8_t key_spec[3];
65         } __attribute__((packed));
66     } __attribute__((packed));
67 } __attribute__((packed));
68
69
70
71
72 struct atapi_read10_cmd {
73     uint8_t atapi_cmd;
74     uint8_t rel_addr       : 1;
75     uint8_t rsvd1          : 2;
76     uint8_t force_access   : 1; // can't use cache for data
77     uint8_t disable_pg_out : 1;
78     uint8_t lun            : 3;
79     uint32_t lba;
80     uint8_t rsvd2;
81     uint16_t xfer_len;
82     uint8_t ctrl;
83 } __attribute__((packed));
84
85
86 struct atapi_mode_sense_cmd {
87     uint8_t atapi_cmd;  // 0x5a
88     uint8_t rsvd1            : 3;
89     uint8_t disable_blk_desc : 1;
90     uint8_t long_lba_acc     : 1;
91     uint8_t lun              : 3;
92     uint8_t page_code        : 6;
93     uint8_t page_ctrl        : 2;
94     uint8_t sub_page_code;
95     uint8_t rsvd2[3];
96     uint16_t alloc_len;
97     uint8_t link             : 1;
98     uint8_t flag             : 1;
99     uint8_t naca             : 1;
100     uint8_t rsvd3            : 3;
101     uint8_t vendor_specific  : 2;
102 } __attribute__((packed));
103
104 struct atapi_mode_sense_hdr {
105     uint16_t mode_data_len;
106     uint8_t media_type_code;
107     uint8_t rsvd[2];
108     uint16_t blk_desc_len;
109 } __attribute__((packed));
110
111
112 struct atapi_rd_capacity_cmd {
113     uint8_t atapi_cmd;  // 0x25
114     uint8_t obsolete         : 1;
115     uint8_t rsvd1            : 4;
116     uint8_t lun              : 3;
117     uint32_t lba;
118     uint16_t rsvd2;
119     uint8_t pmi;
120     uint8_t rsvd3            : 7;
121     uint8_t link             : 1;
122     uint8_t flag             : 1;
123     uint8_t naca             : 1;
124     uint8_t rsvd4            : 3;
125     uint8_t vendor_spec      : 2;
126 } __attribute__((packed));
127
128
129 struct atapi_rd_capacity_resp {
130     uint32_t lba;
131     uint32_t block_len;
132 } __attribute__((packed));
133
134 struct atapi_config_cmd {
135     uint8_t atapi_cmd;  // 0x46
136     uint8_t rt               : 2;
137     uint8_t rsvd1            : 3;
138     uint8_t lun              : 3;
139     uint16_t start_feature_num;
140     uint8_t rsvd2[3];
141     uint16_t alloc_len;
142     uint8_t link             : 1;
143     uint8_t flag             : 1;
144     uint8_t naca             : 1;
145     uint8_t rsvd3            : 3;
146     uint8_t vendor_specific  : 2;
147 } __attribute__((packed));
148
149 struct atapi_config_resp {
150     uint32_t data_len;
151     uint16_t rsvd;
152     uint16_t cur_profile;
153 } __attribute__((packed));
154
155
156 struct atapi_rd_toc_cmd {
157     uint8_t atapi_cmd;  // 0x43
158     uint8_t rsvd1            : 1;
159     uint8_t msf              : 1;
160     uint8_t rsvd2            : 3;
161     uint8_t lun              : 3;
162     uint8_t format           : 4;
163     uint8_t rsvd3            : 4;
164     uint8_t rsvd4[3];
165     uint8_t track_num;
166     uint16_t alloc_len;
167     uint8_t link             : 1;
168     uint8_t flag             : 1;
169     uint8_t naca             : 1;
170     uint8_t rsvd5            : 3;
171     uint8_t vendor_specific  : 2;
172 } __attribute__((packed));
173
174 struct atapi_rd_toc_resp {
175     uint16_t data_len;
176     uint8_t first_track_num;
177     uint8_t last_track_num;
178     
179     struct {
180         uint8_t rsvd;
181         uint8_t ctrl         : 4;
182         uint8_t adr          : 4;
183         uint8_t track_num;
184         uint8_t rsvd2;
185         uint32_t start_addr;
186     } track_descs[0] __attribute__((packed)) ;
187
188 } __attribute__((packed));
189
190
191 struct atapi_mech_status_cmd {
192     uint8_t atapi_cmd;   // 0xbd
193     uint8_t rsvd1        : 5;
194     uint8_t lun          : 3;
195     uint8_t rsvd2[6];
196     uint16_t alloc_len;
197     uint8_t rsvd3;
198     uint8_t link             : 1;
199     uint8_t flag             : 1;
200     uint8_t naca             : 1;
201     uint8_t rsvd5            : 3;
202     uint8_t vendor_specific  : 2;
203 } __attribute__((packed));
204
205 struct atapi_mech_status_resp {
206     uint8_t cur_slot          : 5;
207     uint8_t changer_state     : 2;
208     uint8_t fault             : 1;
209     uint8_t rsvd1             : 4;
210     uint8_t door_open         : 1;
211     uint8_t cd_dvd_mech_state : 3;
212     uint32_t lba;
213     uint8_t num_slots         : 6;
214     uint8_t rsvd2             : 2;
215     uint16_t slot_table_len;
216 } __attribute__((packed));
217
218
219 struct atapi_inquiry_cmd {
220     uint8_t atapi_cmd;  // 0x12
221     uint8_t evpd           : 1; 
222     uint8_t obsolete       : 1;
223     uint8_t rsvd           : 3;
224     uint8_t lun            : 3;
225     uint8_t pg_op_code;
226     uint16_t alloc_len;
227     uint8_t link             : 1;
228     uint8_t flag             : 1;
229     uint8_t naca             : 1;
230     uint8_t rsvd5            : 3;
231     uint8_t vendor_specific  : 2;
232 } __attribute__((packed));
233
234
235 struct atapi_inquiry_resp {
236 #define DEV_TYPE_CDROM 0x05 
237     uint8_t dev_type         : 5;
238     uint8_t rsvd1            : 3; // not used in ATAPI
239     uint8_t rsvd2            : 7;
240     uint8_t removable_media  : 1;
241     uint8_t version;
242     uint8_t resp_data_fmt    : 4;
243     uint8_t atapi_trans_ver  : 4;
244     uint8_t additional_len;
245     uint8_t protect          : 1;
246     uint8_t rsvd3            : 2;
247     uint8_t spc_3pc          : 1; // no idea
248     uint8_t tpgs             : 2;
249     uint8_t acc              : 1;
250     uint8_t sccs             : 1;
251     uint8_t addr16           : 1;
252     uint8_t addr32           : 1;
253     uint8_t ack_req_q        : 1;
254     uint8_t media_changer    : 1;
255     uint8_t multi_port       : 1;
256     uint8_t vs               : 1;
257     uint8_t enc_services     : 1;
258     uint8_t basic_queueing   : 1;
259     uint8_t rsvd4;
260     uint8_t vs2              : 1;
261     uint8_t cmd_queue        : 1;
262     uint8_t tran_dis         : 1;
263     uint8_t linked           : 1;
264     uint8_t sync             : 1;
265     uint8_t wbus_16          : 1;
266     uint8_t wbus_32          : 1;
267     uint8_t rel_addr         : 1;
268     uint8_t rsvd5;
269     uint8_t t10_vendor_id[8];
270     uint8_t product_id[16];
271     uint8_t product_rev[4];
272     /* We'll ignore these for now...
273       uint8_t vendor_specific[20];
274       uint8_t ius              : 1;
275       uint8_t qas              : 1;
276       uint8_t clocking         : 2;
277       uint8_t rsvd6            : 4;
278       uint8_t rsvd7;
279       uint16_t version_desc[8];
280     */
281 } __attribute__((packed));
282
283
284
285 struct atapi_error_recovery {
286     uint8_t page_code     : 6;
287     uint8_t rsvd          : 1;
288     uint8_t page_ctrl     : 1;
289     uint8_t page_len;
290     uint8_t dcr           : 1;
291     uint8_t dte           : 1;
292     uint8_t per           : 1;
293     uint8_t rsvd1         : 1;
294     uint8_t rc            : 1;
295     uint8_t tb            : 1;
296     uint8_t arre          : 1;
297     uint8_t awre          : 1;
298     uint8_t rd_retry_cnt;
299     uint8_t correct_spin;
300     uint8_t head_offset;
301     uint8_t data_strobe_offset;
302     uint8_t emcdr         : 2;
303     uint8_t rsvd2         : 6;
304     uint8_t wr_retry_cnt;
305     uint8_t rsvd3;
306     uint16_t recovery_time_limit;
307 } __attribute__((packed));
308
309
310 struct atapi_cdrom_caps {
311     uint8_t page_code     : 6;
312     uint8_t rsvd          : 1;
313     uint8_t page_ctrl     : 1;
314     uint8_t page_len;
315     uint8_t cdr_rd        : 1;
316     uint8_t cdrw_rd       : 1;
317     uint8_t mthd_2        : 1;
318     uint8_t dvdrom_rd     : 1;
319     uint8_t dvdr_rd       : 1;
320     uint8_t dvdram_rd     : 1;
321     uint8_t rsvd1         : 2;
322     uint8_t cdr_wr        : 1;
323     uint8_t cdrw_wr       : 1;
324     uint8_t tst_wr        : 1;
325     uint8_t rsvd2         : 1;
326     uint8_t dvdr_wr       : 1;
327     uint8_t dvdram_wr     : 1;
328     uint8_t rsvd3         : 2;
329     uint8_t audio_play    : 1;
330     uint8_t composite     : 1;
331     uint8_t digi_port1    : 1;
332     uint8_t digi_port2    : 1;
333     uint8_t mode2_form1   : 1;
334     uint8_t mode2_form2   : 1;
335     uint8_t multisession  : 1;
336     uint8_t BUF           : 1;
337     uint8_t cd_da         : 1;
338     uint8_t cdda_str_acc  : 1;
339     uint8_t rw_supported  : 1;
340     uint8_t rw_dc         : 1;
341     uint8_t c2_ptrs_supp  : 1;
342     uint8_t isrc          : 1;
343     uint8_t upc           : 1;
344     uint8_t rd_bar_cd_cap : 1;
345     uint8_t lock          : 1;
346     uint8_t lock_state    : 1;
347     uint8_t prevent_jmpr  : 1;
348     uint8_t eject         : 1;
349     uint8_t rsvd4         : 1;
350     uint8_t lmt           : 3;
351     uint8_t sep_vol       : 1;
352     uint8_t sep_chnl_mute : 1;
353     uint8_t sdp           : 1;
354     uint8_t sss           : 1;
355     uint8_t side_chg_cap  : 1;
356     uint8_t rw_in_lead_rd : 1;
357     uint8_t rsvd5         : 2;
358     uint16_t obsolete1;
359     uint16_t num_vols_supp;
360     uint16_t lun_buf_size; // in KBytes
361     uint16_t obsolete2;
362     uint8_t obsolete3;
363     uint8_t rsvd6         : 1;
364     uint8_t bckf          : 1;
365     uint8_t rck           : 1;
366     uint8_t lsbf          : 1;
367     uint8_t len           : 2;
368     uint8_t rsvd7         : 2;
369     uint16_t obsolete4[2];
370     uint16_t cp_mgmnt_rev_supp;
371     uint8_t rsvd8;
372     uint8_t rot_ctrl_sel  : 2;
373     uint8_t rsvd9         : 6;
374     uint16_t cur_wr_spd; // KBytes/sec
375     uint16_t num_lun_wr_spd_dsc_tbls;
376     // lun write speed descriptor tables
377 } __attribute__((packed));
378
379 #endif
380
381 #endif