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.


added more ATAPI functions, should now boot Linux
[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_error_recovery {
192     uint8_t page_code     : 6;
193     uint8_t rsvd          : 1;
194     uint8_t page_ctrl     : 1;
195     uint8_t page_len;
196     uint8_t dcr           : 1;
197     uint8_t dte           : 1;
198     uint8_t per           : 1;
199     uint8_t rsvd1         : 1;
200     uint8_t rc            : 1;
201     uint8_t tb            : 1;
202     uint8_t arre          : 1;
203     uint8_t awre          : 1;
204     uint8_t rd_retry_cnt;
205     uint8_t correct_spin;
206     uint8_t head_offset;
207     uint8_t data_strobe_offset;
208     uint8_t emcdr         : 2;
209     uint8_t rsvd2         : 6;
210     uint8_t wr_retry_cnt;
211     uint8_t rsvd3;
212     uint16_t recovery_time_limit;
213 } __attribute__((packed));
214
215
216 struct atapi_cdrom_caps {
217     uint8_t page_code     : 6;
218     uint8_t rsvd          : 1;
219     uint8_t page_ctrl     : 1;
220     uint8_t page_len;
221     uint8_t cdr_rd        : 1;
222     uint8_t cdrw_rd       : 1;
223     uint8_t mthd_2        : 1;
224     uint8_t dvdrom_rd     : 1;
225     uint8_t dvdr_rd       : 1;
226     uint8_t dvdram_rd     : 1;
227     uint8_t rsvd1         : 2;
228     uint8_t cdr_wr        : 1;
229     uint8_t cdrw_wr       : 1;
230     uint8_t tst_wr        : 1;
231     uint8_t rsvd2         : 1;
232     uint8_t dvdr_wr       : 1;
233     uint8_t dvdram_wr     : 1;
234     uint8_t rsvd3         : 2;
235     uint8_t audio_play    : 1;
236     uint8_t composite     : 1;
237     uint8_t digi_port1    : 1;
238     uint8_t digi_port2    : 1;
239     uint8_t mode2_form1   : 1;
240     uint8_t mode2_form2   : 1;
241     uint8_t multisession  : 1;
242     uint8_t BUF           : 1;
243     uint8_t cd_da         : 1;
244     uint8_t cdda_str_acc  : 1;
245     uint8_t rw_supported  : 1;
246     uint8_t rw_dc         : 1;
247     uint8_t c2_ptrs_supp  : 1;
248     uint8_t isrc          : 1;
249     uint8_t upc           : 1;
250     uint8_t rd_bar_cd_cap : 1;
251     uint8_t lock          : 1;
252     uint8_t lock_state    : 1;
253     uint8_t prevent_jmpr  : 1;
254     uint8_t eject         : 1;
255     uint8_t rsvd4         : 1;
256     uint8_t lmt           : 3;
257     uint8_t sep_vol       : 1;
258     uint8_t sep_chnl_mute : 1;
259     uint8_t sdp           : 1;
260     uint8_t sss           : 1;
261     uint8_t side_chg_cap  : 1;
262     uint8_t rw_in_lead_rd : 1;
263     uint8_t rsvd5         : 2;
264     uint16_t obsolete1;
265     uint16_t num_vols_supp;
266     uint16_t lun_buf_size; // in KBytes
267     uint16_t obsolete2;
268     uint8_t obsolete3;
269     uint8_t rsvd6         : 1;
270     uint8_t bckf          : 1;
271     uint8_t rck           : 1;
272     uint8_t lsbf          : 1;
273     uint8_t len           : 2;
274     uint8_t rsvd7         : 2;
275     uint16_t obsolete4[2];
276     uint16_t cp_mgmnt_rev_supp;
277     uint8_t rsvd8;
278     uint8_t rot_ctrl_sel  : 2;
279     uint8_t rsvd9         : 6;
280     uint16_t cur_wr_spd; // KBytes/sec
281     uint16_t num_lun_wr_spd_dsc_tbls;
282     // lun write speed descriptor tables
283 } __attribute__((packed));
284
285 #endif
286
287 #endif