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.


checkpoint changes to get "reset to BIOS" working.
[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 struct atapi_error_recovery {
71     union {
72         uint8_t buf[12];
73         struct {
74             uint8_t page_code     : 6;
75             uint8_t rsvd          : 1;
76             uint8_t page_ctrl     : 1;
77             uint8_t page_len;
78             uint8_t dcr           : 1;
79             uint8_t dte           : 1;
80             uint8_t per           : 1;
81             uint8_t rsvd1         : 1;
82             uint8_t rc            : 1;
83             uint8_t tb            : 1;
84             uint8_t arre          : 1;
85             uint8_t awre          : 1;
86             uint8_t rd_retry_cnt;
87             uint8_t correct_spin;
88             uint8_t head_offset;
89             uint8_t data_strobe_offset;
90             uint8_t emcdr         : 2;
91             uint8_t rsvd2         : 6;
92             uint8_t wr_retry_cnt;
93             uint8_t rsvd3;
94             uint16_t recovery_time_limit;
95         } __attribute__((packed));
96     } __attribute__((packed));
97 } __attribute__((packed));
98
99
100
101
102 struct atapi_read10_cmd {
103     uint8_t atapi_cmd;
104     uint8_t rel_addr       : 1;
105     uint8_t rsvd1          : 2;
106     uint8_t force_access   : 1; // can't use cache for data
107     uint8_t disable_pg_out : 1;
108     uint8_t lun            : 3;
109     uint32_t lba;
110     uint8_t rsvd2;
111     uint16_t xfer_len;
112     uint8_t ctrl;
113 } __attribute__((packed));
114
115
116 struct atapi_mode_sense_cmd {
117     uint8_t atapi_cmd;  // 0x5a
118     uint8_t rsvd1            : 3;
119     uint8_t disable_blk_desc : 1;
120     uint8_t long_lba_acc     : 1;
121     uint8_t lun              : 3;
122     uint8_t page_code        : 6;
123     uint8_t page_ctrl        : 2;
124     uint8_t sub_page_code;
125     uint8_t rsvd2[3];
126     uint16_t alloc_len;
127     uint8_t link             : 1;
128     uint8_t flag             : 1;
129     uint8_t naca             : 1;
130     uint8_t rsvd3            : 3;
131     uint8_t vendor_specific  : 2;
132 } __attribute__((packed));
133
134 struct atapi_mode_sense_hdr {
135     uint16_t mode_data_len;
136     uint8_t media_type_code;
137     uint8_t rsvd[2];
138     uint16_t blk_desc_len;
139 } __attribute__((packed));
140
141
142 struct atapi_rd_capacity_cmd {
143     uint8_t atapi_cmd;  // 0x25
144     uint8_t obsolete         : 1;
145     uint8_t rsvd1            : 4;
146     uint8_t lun              : 3;
147     uint32_t lba;
148     uint16_t rsvd2;
149     uint8_t pmi;
150     uint8_t rsvd3            : 7;
151     uint8_t link             : 1;
152     uint8_t flag             : 1;
153     uint8_t naca             : 1;
154     uint8_t rsvd4            : 3;
155     uint8_t vendor_spec      : 2;
156 } __attribute__((packed));
157
158
159 struct atapi_rd_capacity_resp {
160     uint32_t lba;
161     uint32_t block_len;
162 } __attribute__((packed));
163
164 struct atapi_config_cmd {
165     uint8_t atapi_cmd;  // 0x46
166     uint8_t rt               : 2;
167     uint8_t rsvd1            : 3;
168     uint8_t lun              : 3;
169     uint16_t start_feature_num;
170     uint8_t rsvd2[3];
171     uint16_t alloc_len;
172     uint8_t link             : 1;
173     uint8_t flag             : 1;
174     uint8_t naca             : 1;
175     uint8_t rsvd3            : 3;
176     uint8_t vendor_specific  : 2;
177 } __attribute__((packed));
178
179 struct atapi_config_resp {
180     uint32_t data_len;
181     uint16_t rsvd;
182     uint16_t cur_profile;
183 } __attribute__((packed));
184
185
186 struct atapi_rd_toc_cmd {
187     uint8_t atapi_cmd;  // 0x43
188     uint8_t rsvd1            : 1;
189     uint8_t msf              : 1;
190     uint8_t rsvd2            : 3;
191     uint8_t lun              : 3;
192     uint8_t format           : 4;
193     uint8_t rsvd3            : 4;
194     uint8_t rsvd4[3];
195     uint8_t track_num;
196     uint16_t alloc_len;
197     uint8_t link             : 1;
198     uint8_t flag             : 1;
199     uint8_t naca             : 1;
200     uint8_t rsvd5            : 3;
201     uint8_t vendor_specific  : 2;
202 } __attribute__((packed));
203
204 struct atapi_rd_toc_resp {
205     uint16_t data_len;
206     uint8_t first_track_num;
207     uint8_t last_track_num;
208     
209     struct {
210         uint8_t rsvd;
211         uint8_t ctrl         : 4;
212         uint8_t adr          : 4;
213         uint8_t track_num;
214         uint8_t rsvd2;
215         uint32_t start_addr;
216     } track_descs[0] __attribute__((packed)) ;
217
218 } __attribute__((packed));
219
220
221 struct atapi_mech_status_cmd {
222     uint8_t atapi_cmd;   // 0xbd
223     uint8_t rsvd1        : 5;
224     uint8_t lun          : 3;
225     uint8_t rsvd2[6];
226     uint16_t alloc_len;
227     uint8_t rsvd3;
228     uint8_t link             : 1;
229     uint8_t flag             : 1;
230     uint8_t naca             : 1;
231     uint8_t rsvd5            : 3;
232     uint8_t vendor_specific  : 2;
233 } __attribute__((packed));
234
235 struct atapi_mech_status_resp {
236     uint8_t cur_slot          : 5;
237     uint8_t changer_state     : 2;
238     uint8_t fault             : 1;
239     uint8_t rsvd1             : 4;
240     uint8_t door_open         : 1;
241     uint8_t cd_dvd_mech_state : 3;
242     uint32_t lba;
243     uint8_t num_slots         : 6;
244     uint8_t rsvd2             : 2;
245     uint16_t slot_table_len;
246 } __attribute__((packed));
247
248
249 struct atapi_inquiry_cmd {
250     uint8_t atapi_cmd;  // 0x12
251     uint8_t evpd           : 1; 
252     uint8_t obsolete       : 1;
253     uint8_t rsvd           : 3;
254     uint8_t lun            : 3;
255     uint8_t pg_op_code;
256     uint16_t alloc_len;
257     uint8_t link             : 1;
258     uint8_t flag             : 1;
259     uint8_t naca             : 1;
260     uint8_t rsvd5            : 3;
261     uint8_t vendor_specific  : 2;
262 } __attribute__((packed));
263
264
265 struct atapi_inquiry_resp {
266 #define DEV_TYPE_CDROM 0x05 
267     uint8_t dev_type         : 5;
268     uint8_t rsvd1            : 3; // not used in ATAPI
269     uint8_t rsvd2            : 7;
270     uint8_t removable_media  : 1;
271     uint8_t version;
272     uint8_t resp_data_fmt    : 4;
273     uint8_t atapi_trans_ver  : 4;
274     uint8_t additional_len;
275     uint8_t protect          : 1;
276     uint8_t rsvd3            : 2;
277     uint8_t spc_3pc          : 1; // no idea
278     uint8_t tpgs             : 2;
279     uint8_t acc              : 1;
280     uint8_t sccs             : 1;
281     uint8_t addr16           : 1;
282     uint8_t addr32           : 1;
283     uint8_t ack_req_q        : 1;
284     uint8_t media_changer    : 1;
285     uint8_t multi_port       : 1;
286     uint8_t vs               : 1;
287     uint8_t enc_services     : 1;
288     uint8_t basic_queueing   : 1;
289     uint8_t rsvd4;
290     uint8_t vs2              : 1;
291     uint8_t cmd_queue        : 1;
292     uint8_t tran_dis         : 1;
293     uint8_t linked           : 1;
294     uint8_t sync             : 1;
295     uint8_t wbus_16          : 1;
296     uint8_t wbus_32          : 1;
297     uint8_t rel_addr         : 1;
298     uint8_t rsvd5;
299     uint8_t t10_vendor_id[8];
300     uint8_t product_id[16];
301     uint8_t product_rev[4];
302     /* We'll ignore these for now...
303       uint8_t vendor_specific[20];
304       uint8_t ius              : 1;
305       uint8_t qas              : 1;
306       uint8_t clocking         : 2;
307       uint8_t rsvd6            : 4;
308       uint8_t rsvd7;
309       uint16_t version_desc[8];
310     */
311 } __attribute__((packed));
312
313
314
315
316
317 struct atapi_cdrom_caps {
318     uint8_t page_code     : 6;
319     uint8_t rsvd          : 1;
320     uint8_t page_ctrl     : 1;
321     uint8_t page_len;
322     uint8_t cdr_rd        : 1;
323     uint8_t cdrw_rd       : 1;
324     uint8_t mthd_2        : 1;
325     uint8_t dvdrom_rd     : 1;
326     uint8_t dvdr_rd       : 1;
327     uint8_t dvdram_rd     : 1;
328     uint8_t rsvd1         : 2;
329     uint8_t cdr_wr        : 1;
330     uint8_t cdrw_wr       : 1;
331     uint8_t tst_wr        : 1;
332     uint8_t rsvd2         : 1;
333     uint8_t dvdr_wr       : 1;
334     uint8_t dvdram_wr     : 1;
335     uint8_t rsvd3         : 2;
336     uint8_t audio_play    : 1;
337     uint8_t composite     : 1;
338     uint8_t digi_port1    : 1;
339     uint8_t digi_port2    : 1;
340     uint8_t mode2_form1   : 1;
341     uint8_t mode2_form2   : 1;
342     uint8_t multisession  : 1;
343     uint8_t BUF           : 1;
344     uint8_t cd_da         : 1;
345     uint8_t cdda_str_acc  : 1;
346     uint8_t rw_supported  : 1;
347     uint8_t rw_dc         : 1;
348     uint8_t c2_ptrs_supp  : 1;
349     uint8_t isrc          : 1;
350     uint8_t upc           : 1;
351     uint8_t rd_bar_cd_cap : 1;
352     uint8_t lock          : 1;
353     uint8_t lock_state    : 1;
354     uint8_t prevent_jmpr  : 1;
355     uint8_t eject         : 1;
356     uint8_t rsvd4         : 1;
357     uint8_t lmt           : 3;
358     uint8_t sep_vol       : 1;
359     uint8_t sep_chnl_mute : 1;
360     uint8_t sdp           : 1;
361     uint8_t sss           : 1;
362     uint8_t side_chg_cap  : 1;
363     uint8_t rw_in_lead_rd : 1;
364     uint8_t rsvd5         : 2;
365     uint16_t obsolete1;
366     uint16_t num_vols_supp;
367     uint16_t lun_buf_size; // in KBytes
368     uint16_t obsolete2;
369     uint8_t obsolete3;
370     uint8_t rsvd6         : 1;
371     uint8_t bckf          : 1;
372     uint8_t rck           : 1;
373     uint8_t lsbf          : 1;
374     uint8_t len           : 2;
375     uint8_t rsvd7         : 2;
376     uint16_t obsolete4[2];
377     uint16_t cp_mgmnt_rev_supp;
378     uint8_t rsvd8;
379     uint8_t rot_ctrl_sel  : 2;
380     uint8_t rsvd9         : 6;
381     uint16_t cur_wr_spd; // KBytes/sec
382     uint16_t num_lun_wr_spd_dsc_tbls;
383     // lun write speed descriptor tables
384 } __attribute__((packed));
385
386 #endif
387
388 #endif