]> git.proxmox.com Git - qemu.git/blob - hw/ide/core.c
change all rt_clock references to use millisecond resolution accessors
[qemu.git] / hw / ide / core.c
1 /*
2 * QEMU IDE disk and CD/DVD-ROM Emulator
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 * Copyright (c) 2006 Openedhand Ltd.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 */
25 #include <hw/hw.h>
26 #include <hw/pc.h>
27 #include <hw/pci.h>
28 #include <hw/scsi.h>
29 #include "qemu-error.h"
30 #include "qemu-timer.h"
31 #include "sysemu.h"
32 #include "dma.h"
33 #include "blockdev.h"
34
35 #include <hw/ide/internal.h>
36
37 static const int smart_attributes[][5] = {
38 /* id, flags, val, wrst, thrsh */
39 { 0x01, 0x03, 0x64, 0x64, 0x06}, /* raw read */
40 { 0x03, 0x03, 0x64, 0x64, 0x46}, /* spin up */
41 { 0x04, 0x02, 0x64, 0x64, 0x14}, /* start stop count */
42 { 0x05, 0x03, 0x64, 0x64, 0x36}, /* remapped sectors */
43 { 0x00, 0x00, 0x00, 0x00, 0x00}
44 };
45
46 /* XXX: DVDs that could fit on a CD will be reported as a CD */
47 static inline int media_present(IDEState *s)
48 {
49 return (s->nb_sectors > 0);
50 }
51
52 static inline int media_is_dvd(IDEState *s)
53 {
54 return (media_present(s) && s->nb_sectors > CD_MAX_SECTORS);
55 }
56
57 static inline int media_is_cd(IDEState *s)
58 {
59 return (media_present(s) && s->nb_sectors <= CD_MAX_SECTORS);
60 }
61
62 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
63 static int ide_handle_rw_error(IDEState *s, int error, int op);
64
65 static void padstr(char *str, const char *src, int len)
66 {
67 int i, v;
68 for(i = 0; i < len; i++) {
69 if (*src)
70 v = *src++;
71 else
72 v = ' ';
73 str[i^1] = v;
74 }
75 }
76
77 static void padstr8(uint8_t *buf, int buf_size, const char *src)
78 {
79 int i;
80 for(i = 0; i < buf_size; i++) {
81 if (*src)
82 buf[i] = *src++;
83 else
84 buf[i] = ' ';
85 }
86 }
87
88 static void put_le16(uint16_t *p, unsigned int v)
89 {
90 *p = cpu_to_le16(v);
91 }
92
93 static void ide_identify(IDEState *s)
94 {
95 uint16_t *p;
96 unsigned int oldsize;
97 IDEDevice *dev;
98
99 if (s->identify_set) {
100 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
101 return;
102 }
103
104 memset(s->io_buffer, 0, 512);
105 p = (uint16_t *)s->io_buffer;
106 put_le16(p + 0, 0x0040);
107 put_le16(p + 1, s->cylinders);
108 put_le16(p + 3, s->heads);
109 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
110 put_le16(p + 5, 512); /* XXX: retired, remove ? */
111 put_le16(p + 6, s->sectors);
112 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
113 put_le16(p + 20, 3); /* XXX: retired, remove ? */
114 put_le16(p + 21, 512); /* cache size in sectors */
115 put_le16(p + 22, 4); /* ecc bytes */
116 padstr((char *)(p + 23), s->version, 8); /* firmware version */
117 padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
118 #if MAX_MULT_SECTORS > 1
119 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
120 #endif
121 put_le16(p + 48, 1); /* dword I/O */
122 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
123 put_le16(p + 51, 0x200); /* PIO transfer cycle */
124 put_le16(p + 52, 0x200); /* DMA transfer cycle */
125 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
126 put_le16(p + 54, s->cylinders);
127 put_le16(p + 55, s->heads);
128 put_le16(p + 56, s->sectors);
129 oldsize = s->cylinders * s->heads * s->sectors;
130 put_le16(p + 57, oldsize);
131 put_le16(p + 58, oldsize >> 16);
132 if (s->mult_sectors)
133 put_le16(p + 59, 0x100 | s->mult_sectors);
134 put_le16(p + 60, s->nb_sectors);
135 put_le16(p + 61, s->nb_sectors >> 16);
136 put_le16(p + 62, 0x07); /* single word dma0-2 supported */
137 put_le16(p + 63, 0x07); /* mdma0-2 supported */
138 put_le16(p + 64, 0x03); /* pio3-4 supported */
139 put_le16(p + 65, 120);
140 put_le16(p + 66, 120);
141 put_le16(p + 67, 120);
142 put_le16(p + 68, 120);
143
144 if (s->ncq_queues) {
145 put_le16(p + 75, s->ncq_queues - 1);
146 /* NCQ supported */
147 put_le16(p + 76, (1 << 8));
148 }
149
150 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
151 put_le16(p + 81, 0x16); /* conforms to ata5 */
152 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
153 put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
154 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
155 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
156 /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
157 put_le16(p + 84, (1 << 14) | 0);
158 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
159 if (bdrv_enable_write_cache(s->bs))
160 put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
161 else
162 put_le16(p + 85, (1 << 14) | 1);
163 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
164 put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
165 /* 14=set to 1, 1=smart self test, 0=smart error logging */
166 put_le16(p + 87, (1 << 14) | 0);
167 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
168 put_le16(p + 93, 1 | (1 << 14) | 0x2000);
169 put_le16(p + 100, s->nb_sectors);
170 put_le16(p + 101, s->nb_sectors >> 16);
171 put_le16(p + 102, s->nb_sectors >> 32);
172 put_le16(p + 103, s->nb_sectors >> 48);
173 dev = s->unit ? s->bus->slave : s->bus->master;
174 if (dev && dev->conf.physical_block_size)
175 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
176
177 memcpy(s->identify_data, p, sizeof(s->identify_data));
178 s->identify_set = 1;
179 }
180
181 static void ide_atapi_identify(IDEState *s)
182 {
183 uint16_t *p;
184
185 if (s->identify_set) {
186 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
187 return;
188 }
189
190 memset(s->io_buffer, 0, 512);
191 p = (uint16_t *)s->io_buffer;
192 /* Removable CDROM, 50us response, 12 byte packets */
193 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
194 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
195 put_le16(p + 20, 3); /* buffer type */
196 put_le16(p + 21, 512); /* cache size in sectors */
197 put_le16(p + 22, 4); /* ecc bytes */
198 padstr((char *)(p + 23), s->version, 8); /* firmware version */
199 padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
200 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
201 #ifdef USE_DMA_CDROM
202 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
203 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
204 put_le16(p + 62, 7); /* single word dma0-2 supported */
205 put_le16(p + 63, 7); /* mdma0-2 supported */
206 #else
207 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
208 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
209 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
210 #endif
211 put_le16(p + 64, 3); /* pio3-4 supported */
212 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
213 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
214 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
215 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
216
217 put_le16(p + 71, 30); /* in ns */
218 put_le16(p + 72, 30); /* in ns */
219
220 if (s->ncq_queues) {
221 put_le16(p + 75, s->ncq_queues - 1);
222 /* NCQ supported */
223 put_le16(p + 76, (1 << 8));
224 }
225
226 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
227 #ifdef USE_DMA_CDROM
228 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
229 #endif
230 memcpy(s->identify_data, p, sizeof(s->identify_data));
231 s->identify_set = 1;
232 }
233
234 static void ide_cfata_identify(IDEState *s)
235 {
236 uint16_t *p;
237 uint32_t cur_sec;
238
239 p = (uint16_t *) s->identify_data;
240 if (s->identify_set)
241 goto fill_buffer;
242
243 memset(p, 0, sizeof(s->identify_data));
244
245 cur_sec = s->cylinders * s->heads * s->sectors;
246
247 put_le16(p + 0, 0x848a); /* CF Storage Card signature */
248 put_le16(p + 1, s->cylinders); /* Default cylinders */
249 put_le16(p + 3, s->heads); /* Default heads */
250 put_le16(p + 6, s->sectors); /* Default sectors per track */
251 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
252 put_le16(p + 8, s->nb_sectors); /* Sectors per card */
253 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
254 put_le16(p + 22, 0x0004); /* ECC bytes */
255 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
256 padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
257 #if MAX_MULT_SECTORS > 1
258 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
259 #else
260 put_le16(p + 47, 0x0000);
261 #endif
262 put_le16(p + 49, 0x0f00); /* Capabilities */
263 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
264 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
265 put_le16(p + 53, 0x0003); /* Translation params valid */
266 put_le16(p + 54, s->cylinders); /* Current cylinders */
267 put_le16(p + 55, s->heads); /* Current heads */
268 put_le16(p + 56, s->sectors); /* Current sectors */
269 put_le16(p + 57, cur_sec); /* Current capacity */
270 put_le16(p + 58, cur_sec >> 16); /* Current capacity */
271 if (s->mult_sectors) /* Multiple sector setting */
272 put_le16(p + 59, 0x100 | s->mult_sectors);
273 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
274 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
275 put_le16(p + 63, 0x0203); /* Multiword DMA capability */
276 put_le16(p + 64, 0x0001); /* Flow Control PIO support */
277 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
278 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
279 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
280 put_le16(p + 82, 0x400c); /* Command Set supported */
281 put_le16(p + 83, 0x7068); /* Command Set supported */
282 put_le16(p + 84, 0x4000); /* Features supported */
283 put_le16(p + 85, 0x000c); /* Command Set enabled */
284 put_le16(p + 86, 0x7044); /* Command Set enabled */
285 put_le16(p + 87, 0x4000); /* Features enabled */
286 put_le16(p + 91, 0x4060); /* Current APM level */
287 put_le16(p + 129, 0x0002); /* Current features option */
288 put_le16(p + 130, 0x0005); /* Reassigned sectors */
289 put_le16(p + 131, 0x0001); /* Initial power mode */
290 put_le16(p + 132, 0x0000); /* User signature */
291 put_le16(p + 160, 0x8100); /* Power requirement */
292 put_le16(p + 161, 0x8001); /* CF command set */
293
294 s->identify_set = 1;
295
296 fill_buffer:
297 memcpy(s->io_buffer, p, sizeof(s->identify_data));
298 }
299
300 static void ide_set_signature(IDEState *s)
301 {
302 s->select &= 0xf0; /* clear head */
303 /* put signature */
304 s->nsector = 1;
305 s->sector = 1;
306 if (s->drive_kind == IDE_CD) {
307 s->lcyl = 0x14;
308 s->hcyl = 0xeb;
309 } else if (s->bs) {
310 s->lcyl = 0;
311 s->hcyl = 0;
312 } else {
313 s->lcyl = 0xff;
314 s->hcyl = 0xff;
315 }
316 }
317
318 static inline void ide_abort_command(IDEState *s)
319 {
320 s->status = READY_STAT | ERR_STAT;
321 s->error = ABRT_ERR;
322 }
323
324 /* prepare data transfer and tell what to do after */
325 static void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
326 EndTransferFunc *end_transfer_func)
327 {
328 s->end_transfer_func = end_transfer_func;
329 s->data_ptr = buf;
330 s->data_end = buf + size;
331 if (!(s->status & ERR_STAT)) {
332 s->status |= DRQ_STAT;
333 }
334 s->bus->dma->ops->start_transfer(s->bus->dma);
335 }
336
337 static void ide_transfer_stop(IDEState *s)
338 {
339 s->end_transfer_func = ide_transfer_stop;
340 s->data_ptr = s->io_buffer;
341 s->data_end = s->io_buffer;
342 s->status &= ~DRQ_STAT;
343 }
344
345 int64_t ide_get_sector(IDEState *s)
346 {
347 int64_t sector_num;
348 if (s->select & 0x40) {
349 /* lba */
350 if (!s->lba48) {
351 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
352 (s->lcyl << 8) | s->sector;
353 } else {
354 sector_num = ((int64_t)s->hob_hcyl << 40) |
355 ((int64_t) s->hob_lcyl << 32) |
356 ((int64_t) s->hob_sector << 24) |
357 ((int64_t) s->hcyl << 16) |
358 ((int64_t) s->lcyl << 8) | s->sector;
359 }
360 } else {
361 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
362 (s->select & 0x0f) * s->sectors + (s->sector - 1);
363 }
364 return sector_num;
365 }
366
367 void ide_set_sector(IDEState *s, int64_t sector_num)
368 {
369 unsigned int cyl, r;
370 if (s->select & 0x40) {
371 if (!s->lba48) {
372 s->select = (s->select & 0xf0) | (sector_num >> 24);
373 s->hcyl = (sector_num >> 16);
374 s->lcyl = (sector_num >> 8);
375 s->sector = (sector_num);
376 } else {
377 s->sector = sector_num;
378 s->lcyl = sector_num >> 8;
379 s->hcyl = sector_num >> 16;
380 s->hob_sector = sector_num >> 24;
381 s->hob_lcyl = sector_num >> 32;
382 s->hob_hcyl = sector_num >> 40;
383 }
384 } else {
385 cyl = sector_num / (s->heads * s->sectors);
386 r = sector_num % (s->heads * s->sectors);
387 s->hcyl = cyl >> 8;
388 s->lcyl = cyl;
389 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
390 s->sector = (r % s->sectors) + 1;
391 }
392 }
393
394 static void ide_rw_error(IDEState *s) {
395 ide_abort_command(s);
396 ide_set_irq(s->bus);
397 }
398
399 void ide_sector_read(IDEState *s)
400 {
401 int64_t sector_num;
402 int ret, n;
403
404 s->status = READY_STAT | SEEK_STAT;
405 s->error = 0; /* not needed by IDE spec, but needed by Windows */
406 sector_num = ide_get_sector(s);
407 n = s->nsector;
408 if (n == 0) {
409 /* no more sector to read from disk */
410 ide_transfer_stop(s);
411 } else {
412 #if defined(DEBUG_IDE)
413 printf("read sector=%" PRId64 "\n", sector_num);
414 #endif
415 if (n > s->req_nb_sectors)
416 n = s->req_nb_sectors;
417 ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
418 if (ret != 0) {
419 if (ide_handle_rw_error(s, -ret,
420 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
421 {
422 return;
423 }
424 }
425 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
426 ide_set_irq(s->bus);
427 ide_set_sector(s, sector_num + n);
428 s->nsector -= n;
429 }
430 }
431
432 static void dma_buf_commit(IDEState *s, int is_write)
433 {
434 qemu_sglist_destroy(&s->sg);
435 }
436
437 static void ide_set_inactive(IDEState *s)
438 {
439 s->bus->dma->aiocb = NULL;
440 s->bus->dma->ops->set_inactive(s->bus->dma);
441 }
442
443 void ide_dma_error(IDEState *s)
444 {
445 ide_transfer_stop(s);
446 s->error = ABRT_ERR;
447 s->status = READY_STAT | ERR_STAT;
448 ide_set_inactive(s);
449 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
450 ide_set_irq(s->bus);
451 }
452
453 static int ide_handle_rw_error(IDEState *s, int error, int op)
454 {
455 int is_read = (op & BM_STATUS_RETRY_READ);
456 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
457
458 if (action == BLOCK_ERR_IGNORE) {
459 bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
460 return 0;
461 }
462
463 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
464 || action == BLOCK_ERR_STOP_ANY) {
465 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
466 s->bus->dma->ops->add_status(s->bus->dma, op);
467 bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
468 vm_stop(VMSTOP_DISKFULL);
469 } else {
470 if (op & BM_STATUS_DMA_RETRY) {
471 dma_buf_commit(s, 0);
472 ide_dma_error(s);
473 } else {
474 ide_rw_error(s);
475 }
476 bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
477 }
478
479 return 1;
480 }
481
482 void ide_dma_cb(void *opaque, int ret)
483 {
484 IDEState *s = opaque;
485 int n;
486 int64_t sector_num;
487
488 handle_rw_error:
489 if (ret < 0) {
490 int op = BM_STATUS_DMA_RETRY;
491
492 if (s->is_read)
493 op |= BM_STATUS_RETRY_READ;
494 if (ide_handle_rw_error(s, -ret, op)) {
495 return;
496 }
497 }
498
499 n = s->io_buffer_size >> 9;
500 sector_num = ide_get_sector(s);
501 if (n > 0) {
502 dma_buf_commit(s, s->is_read);
503 sector_num += n;
504 ide_set_sector(s, sector_num);
505 s->nsector -= n;
506 }
507
508 /* end of transfer ? */
509 if (s->nsector == 0) {
510 s->status = READY_STAT | SEEK_STAT;
511 ide_set_irq(s->bus);
512 goto eot;
513 }
514
515 /* launch next transfer */
516 n = s->nsector;
517 s->io_buffer_index = 0;
518 s->io_buffer_size = n * 512;
519 if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0)
520 goto eot;
521
522 #ifdef DEBUG_AIO
523 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, is_read=%d\n",
524 sector_num, n, s->is_read);
525 #endif
526
527 if (s->is_read) {
528 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
529 ide_dma_cb, s);
530 } else {
531 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
532 ide_dma_cb, s);
533 }
534
535 if (!s->bus->dma->aiocb) {
536 ret = -1;
537 goto handle_rw_error;
538 }
539 return;
540
541 eot:
542 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
543 ide_set_inactive(s);
544 }
545
546 static void ide_sector_start_dma(IDEState *s, int is_read)
547 {
548 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
549 s->io_buffer_index = 0;
550 s->io_buffer_size = 0;
551 s->is_read = is_read;
552 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
553 }
554
555 static void ide_sector_write_timer_cb(void *opaque)
556 {
557 IDEState *s = opaque;
558 ide_set_irq(s->bus);
559 }
560
561 void ide_sector_write(IDEState *s)
562 {
563 int64_t sector_num;
564 int ret, n, n1;
565
566 s->status = READY_STAT | SEEK_STAT;
567 sector_num = ide_get_sector(s);
568 #if defined(DEBUG_IDE)
569 printf("write sector=%" PRId64 "\n", sector_num);
570 #endif
571 n = s->nsector;
572 if (n > s->req_nb_sectors)
573 n = s->req_nb_sectors;
574 ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
575
576 if (ret != 0) {
577 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
578 return;
579 }
580
581 s->nsector -= n;
582 if (s->nsector == 0) {
583 /* no more sectors to write */
584 ide_transfer_stop(s);
585 } else {
586 n1 = s->nsector;
587 if (n1 > s->req_nb_sectors)
588 n1 = s->req_nb_sectors;
589 ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
590 }
591 ide_set_sector(s, sector_num + n);
592
593 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
594 /* It seems there is a bug in the Windows 2000 installer HDD
595 IDE driver which fills the disk with empty logs when the
596 IDE write IRQ comes too early. This hack tries to correct
597 that at the expense of slower write performances. Use this
598 option _only_ to install Windows 2000. You must disable it
599 for normal use. */
600 qemu_mod_timer(s->sector_write_timer,
601 qemu_get_clock(vm_clock) + (get_ticks_per_sec() / 1000));
602 } else {
603 ide_set_irq(s->bus);
604 }
605 }
606
607 void ide_atapi_cmd_ok(IDEState *s)
608 {
609 s->error = 0;
610 s->status = READY_STAT | SEEK_STAT;
611 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
612 ide_set_irq(s->bus);
613 }
614
615 void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
616 {
617 #ifdef DEBUG_IDE_ATAPI
618 printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
619 #endif
620 s->error = sense_key << 4;
621 s->status = READY_STAT | ERR_STAT;
622 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
623 s->sense_key = sense_key;
624 s->asc = asc;
625 ide_set_irq(s->bus);
626 }
627
628 static void ide_atapi_cmd_check_status(IDEState *s)
629 {
630 #ifdef DEBUG_IDE_ATAPI
631 printf("atapi_cmd_check_status\n");
632 #endif
633 s->error = MC_ERR | (SENSE_UNIT_ATTENTION << 4);
634 s->status = ERR_STAT;
635 s->nsector = 0;
636 ide_set_irq(s->bus);
637 }
638
639 static void ide_flush_cb(void *opaque, int ret)
640 {
641 IDEState *s = opaque;
642
643 if (ret < 0) {
644 /* XXX: What sector number to set here? */
645 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
646 return;
647 }
648 }
649
650 s->status = READY_STAT | SEEK_STAT;
651 ide_set_irq(s->bus);
652 }
653
654 void ide_flush_cache(IDEState *s)
655 {
656 BlockDriverAIOCB *acb;
657
658 if (s->bs == NULL) {
659 ide_flush_cb(s, 0);
660 return;
661 }
662
663 acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
664 if (acb == NULL) {
665 ide_flush_cb(s, -EIO);
666 }
667 }
668
669 static inline void cpu_to_ube16(uint8_t *buf, int val)
670 {
671 buf[0] = val >> 8;
672 buf[1] = val & 0xff;
673 }
674
675 static inline void cpu_to_ube32(uint8_t *buf, unsigned int val)
676 {
677 buf[0] = val >> 24;
678 buf[1] = val >> 16;
679 buf[2] = val >> 8;
680 buf[3] = val & 0xff;
681 }
682
683 static inline int ube16_to_cpu(const uint8_t *buf)
684 {
685 return (buf[0] << 8) | buf[1];
686 }
687
688 static inline int ube32_to_cpu(const uint8_t *buf)
689 {
690 return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
691 }
692
693 static void lba_to_msf(uint8_t *buf, int lba)
694 {
695 lba += 150;
696 buf[0] = (lba / 75) / 60;
697 buf[1] = (lba / 75) % 60;
698 buf[2] = lba % 75;
699 }
700
701 static void cd_data_to_raw(uint8_t *buf, int lba)
702 {
703 /* sync bytes */
704 buf[0] = 0x00;
705 memset(buf + 1, 0xff, 10);
706 buf[11] = 0x00;
707 buf += 12;
708 /* MSF */
709 lba_to_msf(buf, lba);
710 buf[3] = 0x01; /* mode 1 data */
711 buf += 4;
712 /* data */
713 buf += 2048;
714 /* XXX: ECC not computed */
715 memset(buf, 0, 288);
716 }
717
718 static int cd_read_sector(BlockDriverState *bs, int lba, uint8_t *buf,
719 int sector_size)
720 {
721 int ret;
722
723 switch(sector_size) {
724 case 2048:
725 ret = bdrv_read(bs, (int64_t)lba << 2, buf, 4);
726 break;
727 case 2352:
728 ret = bdrv_read(bs, (int64_t)lba << 2, buf + 16, 4);
729 if (ret < 0)
730 return ret;
731 cd_data_to_raw(buf, lba);
732 break;
733 default:
734 ret = -EIO;
735 break;
736 }
737 return ret;
738 }
739
740 void ide_atapi_io_error(IDEState *s, int ret)
741 {
742 /* XXX: handle more errors */
743 if (ret == -ENOMEDIUM) {
744 ide_atapi_cmd_error(s, SENSE_NOT_READY,
745 ASC_MEDIUM_NOT_PRESENT);
746 } else {
747 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
748 ASC_LOGICAL_BLOCK_OOR);
749 }
750 }
751
752 /* The whole ATAPI transfer logic is handled in this function */
753 static void ide_atapi_cmd_reply_end(IDEState *s)
754 {
755 int byte_count_limit, size, ret;
756 #ifdef DEBUG_IDE_ATAPI
757 printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
758 s->packet_transfer_size,
759 s->elementary_transfer_size,
760 s->io_buffer_index);
761 #endif
762 if (s->packet_transfer_size <= 0) {
763 /* end of transfer */
764 ide_transfer_stop(s);
765 s->status = READY_STAT | SEEK_STAT;
766 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
767 ide_set_irq(s->bus);
768 #ifdef DEBUG_IDE_ATAPI
769 printf("status=0x%x\n", s->status);
770 #endif
771 } else {
772 /* see if a new sector must be read */
773 if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
774 ret = cd_read_sector(s->bs, s->lba, s->io_buffer, s->cd_sector_size);
775 if (ret < 0) {
776 ide_transfer_stop(s);
777 ide_atapi_io_error(s, ret);
778 return;
779 }
780 s->lba++;
781 s->io_buffer_index = 0;
782 }
783 if (s->elementary_transfer_size > 0) {
784 /* there are some data left to transmit in this elementary
785 transfer */
786 size = s->cd_sector_size - s->io_buffer_index;
787 if (size > s->elementary_transfer_size)
788 size = s->elementary_transfer_size;
789 s->packet_transfer_size -= size;
790 s->elementary_transfer_size -= size;
791 s->io_buffer_index += size;
792 ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
793 size, ide_atapi_cmd_reply_end);
794 } else {
795 /* a new transfer is needed */
796 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
797 byte_count_limit = s->lcyl | (s->hcyl << 8);
798 #ifdef DEBUG_IDE_ATAPI
799 printf("byte_count_limit=%d\n", byte_count_limit);
800 #endif
801 if (byte_count_limit == 0xffff)
802 byte_count_limit--;
803 size = s->packet_transfer_size;
804 if (size > byte_count_limit) {
805 /* byte count limit must be even if this case */
806 if (byte_count_limit & 1)
807 byte_count_limit--;
808 size = byte_count_limit;
809 }
810 s->lcyl = size;
811 s->hcyl = size >> 8;
812 s->elementary_transfer_size = size;
813 /* we cannot transmit more than one sector at a time */
814 if (s->lba != -1) {
815 if (size > (s->cd_sector_size - s->io_buffer_index))
816 size = (s->cd_sector_size - s->io_buffer_index);
817 }
818 s->packet_transfer_size -= size;
819 s->elementary_transfer_size -= size;
820 s->io_buffer_index += size;
821 ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
822 size, ide_atapi_cmd_reply_end);
823 ide_set_irq(s->bus);
824 #ifdef DEBUG_IDE_ATAPI
825 printf("status=0x%x\n", s->status);
826 #endif
827 }
828 }
829 }
830
831 /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
832 static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
833 {
834 if (size > max_size)
835 size = max_size;
836 s->lba = -1; /* no sector read */
837 s->packet_transfer_size = size;
838 s->io_buffer_size = size; /* dma: send the reply data as one chunk */
839 s->elementary_transfer_size = 0;
840 s->io_buffer_index = 0;
841
842 if (s->atapi_dma) {
843 s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
844 s->bus->dma->ops->start_dma(s->bus->dma, s,
845 ide_atapi_cmd_read_dma_cb);
846 } else {
847 s->status = READY_STAT | SEEK_STAT;
848 ide_atapi_cmd_reply_end(s);
849 }
850 }
851
852 /* start a CD-CDROM read command */
853 static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
854 int sector_size)
855 {
856 s->lba = lba;
857 s->packet_transfer_size = nb_sectors * sector_size;
858 s->elementary_transfer_size = 0;
859 s->io_buffer_index = sector_size;
860 s->cd_sector_size = sector_size;
861
862 s->status = READY_STAT | SEEK_STAT;
863 ide_atapi_cmd_reply_end(s);
864 }
865
866 /* ATAPI DMA support */
867
868 /* XXX: handle read errors */
869 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
870 {
871 IDEState *s = opaque;
872 int data_offset, n;
873
874 if (ret < 0) {
875 ide_atapi_io_error(s, ret);
876 goto eot;
877 }
878
879 if (s->io_buffer_size > 0) {
880 /*
881 * For a cdrom read sector command (s->lba != -1),
882 * adjust the lba for the next s->io_buffer_size chunk
883 * and dma the current chunk.
884 * For a command != read (s->lba == -1), just transfer
885 * the reply data.
886 */
887 if (s->lba != -1) {
888 if (s->cd_sector_size == 2352) {
889 n = 1;
890 cd_data_to_raw(s->io_buffer, s->lba);
891 } else {
892 n = s->io_buffer_size >> 11;
893 }
894 s->lba += n;
895 }
896 s->packet_transfer_size -= s->io_buffer_size;
897 if (s->bus->dma->ops->rw_buf(s->bus->dma, 1) == 0)
898 goto eot;
899 }
900
901 if (s->packet_transfer_size <= 0) {
902 s->status = READY_STAT | SEEK_STAT;
903 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
904 ide_set_irq(s->bus);
905 eot:
906 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
907 ide_set_inactive(s);
908 return;
909 }
910
911 s->io_buffer_index = 0;
912 if (s->cd_sector_size == 2352) {
913 n = 1;
914 s->io_buffer_size = s->cd_sector_size;
915 data_offset = 16;
916 } else {
917 n = s->packet_transfer_size >> 11;
918 if (n > (IDE_DMA_BUF_SECTORS / 4))
919 n = (IDE_DMA_BUF_SECTORS / 4);
920 s->io_buffer_size = n * 2048;
921 data_offset = 0;
922 }
923 #ifdef DEBUG_AIO
924 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n);
925 #endif
926 s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset);
927 s->bus->dma->iov.iov_len = n * 4 * 512;
928 qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1);
929 s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2,
930 &s->bus->dma->qiov, n * 4,
931 ide_atapi_cmd_read_dma_cb, s);
932 if (!s->bus->dma->aiocb) {
933 /* Note: media not present is the most likely case */
934 ide_atapi_cmd_error(s, SENSE_NOT_READY,
935 ASC_MEDIUM_NOT_PRESENT);
936 goto eot;
937 }
938 }
939
940 /* start a CD-CDROM read command with DMA */
941 /* XXX: test if DMA is available */
942 static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
943 int sector_size)
944 {
945 s->lba = lba;
946 s->packet_transfer_size = nb_sectors * sector_size;
947 s->io_buffer_index = 0;
948 s->io_buffer_size = 0;
949 s->cd_sector_size = sector_size;
950
951 /* XXX: check if BUSY_STAT should be set */
952 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
953 s->bus->dma->ops->start_dma(s->bus->dma, s,
954 ide_atapi_cmd_read_dma_cb);
955 }
956
957 static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
958 int sector_size)
959 {
960 #ifdef DEBUG_IDE_ATAPI
961 printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio",
962 lba, nb_sectors);
963 #endif
964 if (s->atapi_dma) {
965 ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
966 } else {
967 ide_atapi_cmd_read_pio(s, lba, nb_sectors, sector_size);
968 }
969 }
970
971 static inline uint8_t ide_atapi_set_profile(uint8_t *buf, uint8_t *index,
972 uint16_t profile)
973 {
974 uint8_t *buf_profile = buf + 12; /* start of profiles */
975
976 buf_profile += ((*index) * 4); /* start of indexed profile */
977 cpu_to_ube16 (buf_profile, profile);
978 buf_profile[2] = ((buf_profile[0] == buf[6]) && (buf_profile[1] == buf[7]));
979
980 /* each profile adds 4 bytes to the response */
981 (*index)++;
982 buf[11] += 4; /* Additional Length */
983
984 return 4;
985 }
986
987 static int ide_dvd_read_structure(IDEState *s, int format,
988 const uint8_t *packet, uint8_t *buf)
989 {
990 switch (format) {
991 case 0x0: /* Physical format information */
992 {
993 int layer = packet[6];
994 uint64_t total_sectors;
995
996 if (layer != 0)
997 return -ASC_INV_FIELD_IN_CMD_PACKET;
998
999 bdrv_get_geometry(s->bs, &total_sectors);
1000 total_sectors >>= 2;
1001 if (total_sectors == 0)
1002 return -ASC_MEDIUM_NOT_PRESENT;
1003
1004 buf[4] = 1; /* DVD-ROM, part version 1 */
1005 buf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
1006 buf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
1007 buf[7] = 0; /* default densities */
1008
1009 /* FIXME: 0x30000 per spec? */
1010 cpu_to_ube32(buf + 8, 0); /* start sector */
1011 cpu_to_ube32(buf + 12, total_sectors - 1); /* end sector */
1012 cpu_to_ube32(buf + 16, total_sectors - 1); /* l0 end sector */
1013
1014 /* Size of buffer, not including 2 byte size field */
1015 cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
1016
1017 /* 2k data + 4 byte header */
1018 return (2048 + 4);
1019 }
1020
1021 case 0x01: /* DVD copyright information */
1022 buf[4] = 0; /* no copyright data */
1023 buf[5] = 0; /* no region restrictions */
1024
1025 /* Size of buffer, not including 2 byte size field */
1026 cpu_to_be16wu((uint16_t *)buf, 4 + 2);
1027
1028 /* 4 byte header + 4 byte data */
1029 return (4 + 4);
1030
1031 case 0x03: /* BCA information - invalid field for no BCA info */
1032 return -ASC_INV_FIELD_IN_CMD_PACKET;
1033
1034 case 0x04: /* DVD disc manufacturing information */
1035 /* Size of buffer, not including 2 byte size field */
1036 cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
1037
1038 /* 2k data + 4 byte header */
1039 return (2048 + 4);
1040
1041 case 0xff:
1042 /*
1043 * This lists all the command capabilities above. Add new ones
1044 * in order and update the length and buffer return values.
1045 */
1046
1047 buf[4] = 0x00; /* Physical format */
1048 buf[5] = 0x40; /* Not writable, is readable */
1049 cpu_to_be16wu((uint16_t *)(buf + 6), 2048 + 4);
1050
1051 buf[8] = 0x01; /* Copyright info */
1052 buf[9] = 0x40; /* Not writable, is readable */
1053 cpu_to_be16wu((uint16_t *)(buf + 10), 4 + 4);
1054
1055 buf[12] = 0x03; /* BCA info */
1056 buf[13] = 0x40; /* Not writable, is readable */
1057 cpu_to_be16wu((uint16_t *)(buf + 14), 188 + 4);
1058
1059 buf[16] = 0x04; /* Manufacturing info */
1060 buf[17] = 0x40; /* Not writable, is readable */
1061 cpu_to_be16wu((uint16_t *)(buf + 18), 2048 + 4);
1062
1063 /* Size of buffer, not including 2 byte size field */
1064 cpu_to_be16wu((uint16_t *)buf, 16 + 2);
1065
1066 /* data written + 4 byte header */
1067 return (16 + 4);
1068
1069 default: /* TODO: formats beyond DVD-ROM requires */
1070 return -ASC_INV_FIELD_IN_CMD_PACKET;
1071 }
1072 }
1073
1074 static void ide_atapi_cmd(IDEState *s)
1075 {
1076 const uint8_t *packet;
1077 uint8_t *buf;
1078 int max_len;
1079
1080 packet = s->io_buffer;
1081 buf = s->io_buffer;
1082 #ifdef DEBUG_IDE_ATAPI
1083 {
1084 int i;
1085 printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
1086 for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
1087 printf(" %02x", packet[i]);
1088 }
1089 printf("\n");
1090 }
1091 #endif
1092 /* If there's a UNIT_ATTENTION condition pending, only
1093 REQUEST_SENSE and INQUIRY commands are allowed to complete. */
1094 if (s->sense_key == SENSE_UNIT_ATTENTION &&
1095 s->io_buffer[0] != GPCMD_REQUEST_SENSE &&
1096 s->io_buffer[0] != GPCMD_INQUIRY) {
1097 ide_atapi_cmd_check_status(s);
1098 return;
1099 }
1100 switch(s->io_buffer[0]) {
1101 case GPCMD_TEST_UNIT_READY:
1102 if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) {
1103 ide_atapi_cmd_ok(s);
1104 } else {
1105 s->cdrom_changed = 0;
1106 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1107 ASC_MEDIUM_NOT_PRESENT);
1108 }
1109 break;
1110 case GPCMD_MODE_SENSE_6:
1111 case GPCMD_MODE_SENSE_10:
1112 {
1113 int action, code;
1114 if (packet[0] == GPCMD_MODE_SENSE_10)
1115 max_len = ube16_to_cpu(packet + 7);
1116 else
1117 max_len = packet[4];
1118 action = packet[2] >> 6;
1119 code = packet[2] & 0x3f;
1120 switch(action) {
1121 case 0: /* current values */
1122 switch(code) {
1123 case GPMODE_R_W_ERROR_PAGE: /* error recovery */
1124 cpu_to_ube16(&buf[0], 16 + 6);
1125 buf[2] = 0x70;
1126 buf[3] = 0;
1127 buf[4] = 0;
1128 buf[5] = 0;
1129 buf[6] = 0;
1130 buf[7] = 0;
1131
1132 buf[8] = 0x01;
1133 buf[9] = 0x06;
1134 buf[10] = 0x00;
1135 buf[11] = 0x05;
1136 buf[12] = 0x00;
1137 buf[13] = 0x00;
1138 buf[14] = 0x00;
1139 buf[15] = 0x00;
1140 ide_atapi_cmd_reply(s, 16, max_len);
1141 break;
1142 case GPMODE_AUDIO_CTL_PAGE:
1143 cpu_to_ube16(&buf[0], 24 + 6);
1144 buf[2] = 0x70;
1145 buf[3] = 0;
1146 buf[4] = 0;
1147 buf[5] = 0;
1148 buf[6] = 0;
1149 buf[7] = 0;
1150
1151 /* Fill with CDROM audio volume */
1152 buf[17] = 0;
1153 buf[19] = 0;
1154 buf[21] = 0;
1155 buf[23] = 0;
1156
1157 ide_atapi_cmd_reply(s, 24, max_len);
1158 break;
1159 case GPMODE_CAPABILITIES_PAGE:
1160 cpu_to_ube16(&buf[0], 28 + 6);
1161 buf[2] = 0x70;
1162 buf[3] = 0;
1163 buf[4] = 0;
1164 buf[5] = 0;
1165 buf[6] = 0;
1166 buf[7] = 0;
1167
1168 buf[8] = 0x2a;
1169 buf[9] = 0x12;
1170 buf[10] = 0x00;
1171 buf[11] = 0x00;
1172
1173 /* Claim PLAY_AUDIO capability (0x01) since some Linux
1174 code checks for this to automount media. */
1175 buf[12] = 0x71;
1176 buf[13] = 3 << 5;
1177 buf[14] = (1 << 0) | (1 << 3) | (1 << 5);
1178 if (bdrv_is_locked(s->bs))
1179 buf[6] |= 1 << 1;
1180 buf[15] = 0x00;
1181 cpu_to_ube16(&buf[16], 706);
1182 buf[18] = 0;
1183 buf[19] = 2;
1184 cpu_to_ube16(&buf[20], 512);
1185 cpu_to_ube16(&buf[22], 706);
1186 buf[24] = 0;
1187 buf[25] = 0;
1188 buf[26] = 0;
1189 buf[27] = 0;
1190 ide_atapi_cmd_reply(s, 28, max_len);
1191 break;
1192 default:
1193 goto error_cmd;
1194 }
1195 break;
1196 case 1: /* changeable values */
1197 goto error_cmd;
1198 case 2: /* default values */
1199 goto error_cmd;
1200 default:
1201 case 3: /* saved values */
1202 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1203 ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1204 break;
1205 }
1206 }
1207 break;
1208 case GPCMD_REQUEST_SENSE:
1209 max_len = packet[4];
1210 memset(buf, 0, 18);
1211 buf[0] = 0x70 | (1 << 7);
1212 buf[2] = s->sense_key;
1213 buf[7] = 10;
1214 buf[12] = s->asc;
1215 if (s->sense_key == SENSE_UNIT_ATTENTION)
1216 s->sense_key = SENSE_NONE;
1217 ide_atapi_cmd_reply(s, 18, max_len);
1218 break;
1219 case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
1220 if (bdrv_is_inserted(s->bs)) {
1221 bdrv_set_locked(s->bs, packet[4] & 1);
1222 ide_atapi_cmd_ok(s);
1223 } else {
1224 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1225 ASC_MEDIUM_NOT_PRESENT);
1226 }
1227 break;
1228 case GPCMD_READ_10:
1229 case GPCMD_READ_12:
1230 {
1231 int nb_sectors, lba;
1232
1233 if (packet[0] == GPCMD_READ_10)
1234 nb_sectors = ube16_to_cpu(packet + 7);
1235 else
1236 nb_sectors = ube32_to_cpu(packet + 6);
1237 lba = ube32_to_cpu(packet + 2);
1238 if (nb_sectors == 0) {
1239 ide_atapi_cmd_ok(s);
1240 break;
1241 }
1242 ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1243 }
1244 break;
1245 case GPCMD_READ_CD:
1246 {
1247 int nb_sectors, lba, transfer_request;
1248
1249 nb_sectors = (packet[6] << 16) | (packet[7] << 8) | packet[8];
1250 lba = ube32_to_cpu(packet + 2);
1251 if (nb_sectors == 0) {
1252 ide_atapi_cmd_ok(s);
1253 break;
1254 }
1255 transfer_request = packet[9];
1256 switch(transfer_request & 0xf8) {
1257 case 0x00:
1258 /* nothing */
1259 ide_atapi_cmd_ok(s);
1260 break;
1261 case 0x10:
1262 /* normal read */
1263 ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1264 break;
1265 case 0xf8:
1266 /* read all data */
1267 ide_atapi_cmd_read(s, lba, nb_sectors, 2352);
1268 break;
1269 default:
1270 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1271 ASC_INV_FIELD_IN_CMD_PACKET);
1272 break;
1273 }
1274 }
1275 break;
1276 case GPCMD_SEEK:
1277 {
1278 unsigned int lba;
1279 uint64_t total_sectors;
1280
1281 bdrv_get_geometry(s->bs, &total_sectors);
1282 total_sectors >>= 2;
1283 if (total_sectors == 0) {
1284 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1285 ASC_MEDIUM_NOT_PRESENT);
1286 break;
1287 }
1288 lba = ube32_to_cpu(packet + 2);
1289 if (lba >= total_sectors) {
1290 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1291 ASC_LOGICAL_BLOCK_OOR);
1292 break;
1293 }
1294 ide_atapi_cmd_ok(s);
1295 }
1296 break;
1297 case GPCMD_START_STOP_UNIT:
1298 {
1299 int start, eject, err = 0;
1300 start = packet[4] & 1;
1301 eject = (packet[4] >> 1) & 1;
1302
1303 if (eject) {
1304 err = bdrv_eject(s->bs, !start);
1305 }
1306
1307 switch (err) {
1308 case 0:
1309 ide_atapi_cmd_ok(s);
1310 break;
1311 case -EBUSY:
1312 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1313 ASC_MEDIA_REMOVAL_PREVENTED);
1314 break;
1315 default:
1316 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1317 ASC_MEDIUM_NOT_PRESENT);
1318 break;
1319 }
1320 }
1321 break;
1322 case GPCMD_MECHANISM_STATUS:
1323 {
1324 max_len = ube16_to_cpu(packet + 8);
1325 cpu_to_ube16(buf, 0);
1326 /* no current LBA */
1327 buf[2] = 0;
1328 buf[3] = 0;
1329 buf[4] = 0;
1330 buf[5] = 1;
1331 cpu_to_ube16(buf + 6, 0);
1332 ide_atapi_cmd_reply(s, 8, max_len);
1333 }
1334 break;
1335 case GPCMD_READ_TOC_PMA_ATIP:
1336 {
1337 int format, msf, start_track, len;
1338 uint64_t total_sectors;
1339
1340 bdrv_get_geometry(s->bs, &total_sectors);
1341 total_sectors >>= 2;
1342 if (total_sectors == 0) {
1343 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1344 ASC_MEDIUM_NOT_PRESENT);
1345 break;
1346 }
1347 max_len = ube16_to_cpu(packet + 7);
1348 format = packet[9] >> 6;
1349 msf = (packet[1] >> 1) & 1;
1350 start_track = packet[6];
1351 switch(format) {
1352 case 0:
1353 len = cdrom_read_toc(total_sectors, buf, msf, start_track);
1354 if (len < 0)
1355 goto error_cmd;
1356 ide_atapi_cmd_reply(s, len, max_len);
1357 break;
1358 case 1:
1359 /* multi session : only a single session defined */
1360 memset(buf, 0, 12);
1361 buf[1] = 0x0a;
1362 buf[2] = 0x01;
1363 buf[3] = 0x01;
1364 ide_atapi_cmd_reply(s, 12, max_len);
1365 break;
1366 case 2:
1367 len = cdrom_read_toc_raw(total_sectors, buf, msf, start_track);
1368 if (len < 0)
1369 goto error_cmd;
1370 ide_atapi_cmd_reply(s, len, max_len);
1371 break;
1372 default:
1373 error_cmd:
1374 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1375 ASC_INV_FIELD_IN_CMD_PACKET);
1376 break;
1377 }
1378 }
1379 break;
1380 case GPCMD_READ_CDVD_CAPACITY:
1381 {
1382 uint64_t total_sectors;
1383
1384 bdrv_get_geometry(s->bs, &total_sectors);
1385 total_sectors >>= 2;
1386 if (total_sectors == 0) {
1387 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1388 ASC_MEDIUM_NOT_PRESENT);
1389 break;
1390 }
1391 /* NOTE: it is really the number of sectors minus 1 */
1392 cpu_to_ube32(buf, total_sectors - 1);
1393 cpu_to_ube32(buf + 4, 2048);
1394 ide_atapi_cmd_reply(s, 8, 8);
1395 }
1396 break;
1397 case GPCMD_READ_DVD_STRUCTURE:
1398 {
1399 int media = packet[1];
1400 int format = packet[7];
1401 int ret;
1402
1403 max_len = ube16_to_cpu(packet + 8);
1404
1405 if (format < 0xff) {
1406 if (media_is_cd(s)) {
1407 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1408 ASC_INCOMPATIBLE_FORMAT);
1409 break;
1410 } else if (!media_present(s)) {
1411 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1412 ASC_INV_FIELD_IN_CMD_PACKET);
1413 break;
1414 }
1415 }
1416
1417 memset(buf, 0, max_len > IDE_DMA_BUF_SECTORS * 512 + 4 ?
1418 IDE_DMA_BUF_SECTORS * 512 + 4 : max_len);
1419
1420 switch (format) {
1421 case 0x00 ... 0x7f:
1422 case 0xff:
1423 if (media == 0) {
1424 ret = ide_dvd_read_structure(s, format, packet, buf);
1425
1426 if (ret < 0)
1427 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, -ret);
1428 else
1429 ide_atapi_cmd_reply(s, ret, max_len);
1430
1431 break;
1432 }
1433 /* TODO: BD support, fall through for now */
1434
1435 /* Generic disk structures */
1436 case 0x80: /* TODO: AACS volume identifier */
1437 case 0x81: /* TODO: AACS media serial number */
1438 case 0x82: /* TODO: AACS media identifier */
1439 case 0x83: /* TODO: AACS media key block */
1440 case 0x90: /* TODO: List of recognized format layers */
1441 case 0xc0: /* TODO: Write protection status */
1442 default:
1443 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1444 ASC_INV_FIELD_IN_CMD_PACKET);
1445 break;
1446 }
1447 }
1448 break;
1449 case GPCMD_SET_SPEED:
1450 ide_atapi_cmd_ok(s);
1451 break;
1452 case GPCMD_INQUIRY:
1453 max_len = packet[4];
1454 buf[0] = 0x05; /* CD-ROM */
1455 buf[1] = 0x80; /* removable */
1456 buf[2] = 0x00; /* ISO */
1457 buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
1458 buf[4] = 31; /* additional length */
1459 buf[5] = 0; /* reserved */
1460 buf[6] = 0; /* reserved */
1461 buf[7] = 0; /* reserved */
1462 padstr8(buf + 8, 8, "QEMU");
1463 padstr8(buf + 16, 16, "QEMU DVD-ROM");
1464 padstr8(buf + 32, 4, s->version);
1465 ide_atapi_cmd_reply(s, 36, max_len);
1466 break;
1467 case GPCMD_GET_CONFIGURATION:
1468 {
1469 uint32_t len;
1470 uint8_t index = 0;
1471
1472 /* only feature 0 is supported */
1473 if (packet[2] != 0 || packet[3] != 0) {
1474 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1475 ASC_INV_FIELD_IN_CMD_PACKET);
1476 break;
1477 }
1478
1479 /* XXX: could result in alignment problems in some architectures */
1480 max_len = ube16_to_cpu(packet + 7);
1481
1482 /*
1483 * XXX: avoid overflow for io_buffer if max_len is bigger than
1484 * the size of that buffer (dimensioned to max number of
1485 * sectors to transfer at once)
1486 *
1487 * Only a problem if the feature/profiles grow.
1488 */
1489 if (max_len > 512) /* XXX: assume 1 sector */
1490 max_len = 512;
1491
1492 memset(buf, 0, max_len);
1493 /*
1494 * the number of sectors from the media tells us which profile
1495 * to use as current. 0 means there is no media
1496 */
1497 if (media_is_dvd(s))
1498 cpu_to_ube16(buf + 6, MMC_PROFILE_DVD_ROM);
1499 else if (media_is_cd(s))
1500 cpu_to_ube16(buf + 6, MMC_PROFILE_CD_ROM);
1501
1502 buf[10] = 0x02 | 0x01; /* persistent and current */
1503 len = 12; /* headers: 8 + 4 */
1504 len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_DVD_ROM);
1505 len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_CD_ROM);
1506 cpu_to_ube32(buf, len - 4); /* data length */
1507
1508 ide_atapi_cmd_reply(s, len, max_len);
1509 break;
1510 }
1511 case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
1512 max_len = ube16_to_cpu(packet + 7);
1513
1514 if (packet[1] & 0x01) { /* polling */
1515 /* We don't support any event class (yet). */
1516 cpu_to_ube16(buf, 0x00); /* No event descriptor returned */
1517 buf[2] = 0x80; /* No Event Available (NEA) */
1518 buf[3] = 0x00; /* Empty supported event classes */
1519 ide_atapi_cmd_reply(s, 4, max_len);
1520 } else { /* asynchronous mode */
1521 /* Only polling is supported, asynchronous mode is not. */
1522 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1523 ASC_INV_FIELD_IN_CMD_PACKET);
1524 }
1525 break;
1526 default:
1527 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1528 ASC_ILLEGAL_OPCODE);
1529 break;
1530 }
1531 }
1532
1533 static void ide_cfata_metadata_inquiry(IDEState *s)
1534 {
1535 uint16_t *p;
1536 uint32_t spd;
1537
1538 p = (uint16_t *) s->io_buffer;
1539 memset(p, 0, 0x200);
1540 spd = ((s->mdata_size - 1) >> 9) + 1;
1541
1542 put_le16(p + 0, 0x0001); /* Data format revision */
1543 put_le16(p + 1, 0x0000); /* Media property: silicon */
1544 put_le16(p + 2, s->media_changed); /* Media status */
1545 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
1546 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
1547 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
1548 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
1549 }
1550
1551 static void ide_cfata_metadata_read(IDEState *s)
1552 {
1553 uint16_t *p;
1554
1555 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1556 s->status = ERR_STAT;
1557 s->error = ABRT_ERR;
1558 return;
1559 }
1560
1561 p = (uint16_t *) s->io_buffer;
1562 memset(p, 0, 0x200);
1563
1564 put_le16(p + 0, s->media_changed); /* Media status */
1565 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1566 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1567 s->nsector << 9), 0x200 - 2));
1568 }
1569
1570 static void ide_cfata_metadata_write(IDEState *s)
1571 {
1572 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1573 s->status = ERR_STAT;
1574 s->error = ABRT_ERR;
1575 return;
1576 }
1577
1578 s->media_changed = 0;
1579
1580 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1581 s->io_buffer + 2,
1582 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1583 s->nsector << 9), 0x200 - 2));
1584 }
1585
1586 /* called when the inserted state of the media has changed */
1587 static void cdrom_change_cb(void *opaque, int reason)
1588 {
1589 IDEState *s = opaque;
1590 uint64_t nb_sectors;
1591
1592 if (!(reason & CHANGE_MEDIA)) {
1593 return;
1594 }
1595
1596 bdrv_get_geometry(s->bs, &nb_sectors);
1597 s->nb_sectors = nb_sectors;
1598
1599 s->sense_key = SENSE_UNIT_ATTENTION;
1600 s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED;
1601 s->cdrom_changed = 1;
1602 ide_set_irq(s->bus);
1603 }
1604
1605 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
1606 {
1607 s->lba48 = lba48;
1608
1609 /* handle the 'magic' 0 nsector count conversion here. to avoid
1610 * fiddling with the rest of the read logic, we just store the
1611 * full sector count in ->nsector and ignore ->hob_nsector from now
1612 */
1613 if (!s->lba48) {
1614 if (!s->nsector)
1615 s->nsector = 256;
1616 } else {
1617 if (!s->nsector && !s->hob_nsector)
1618 s->nsector = 65536;
1619 else {
1620 int lo = s->nsector;
1621 int hi = s->hob_nsector;
1622
1623 s->nsector = (hi << 8) | lo;
1624 }
1625 }
1626 }
1627
1628 static void ide_clear_hob(IDEBus *bus)
1629 {
1630 /* any write clears HOB high bit of device control register */
1631 bus->ifs[0].select &= ~(1 << 7);
1632 bus->ifs[1].select &= ~(1 << 7);
1633 }
1634
1635 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1636 {
1637 IDEBus *bus = opaque;
1638
1639 #ifdef DEBUG_IDE
1640 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
1641 #endif
1642
1643 addr &= 7;
1644
1645 /* ignore writes to command block while busy with previous command */
1646 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
1647 return;
1648
1649 switch(addr) {
1650 case 0:
1651 break;
1652 case 1:
1653 ide_clear_hob(bus);
1654 /* NOTE: data is written to the two drives */
1655 bus->ifs[0].hob_feature = bus->ifs[0].feature;
1656 bus->ifs[1].hob_feature = bus->ifs[1].feature;
1657 bus->ifs[0].feature = val;
1658 bus->ifs[1].feature = val;
1659 break;
1660 case 2:
1661 ide_clear_hob(bus);
1662 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
1663 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
1664 bus->ifs[0].nsector = val;
1665 bus->ifs[1].nsector = val;
1666 break;
1667 case 3:
1668 ide_clear_hob(bus);
1669 bus->ifs[0].hob_sector = bus->ifs[0].sector;
1670 bus->ifs[1].hob_sector = bus->ifs[1].sector;
1671 bus->ifs[0].sector = val;
1672 bus->ifs[1].sector = val;
1673 break;
1674 case 4:
1675 ide_clear_hob(bus);
1676 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
1677 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
1678 bus->ifs[0].lcyl = val;
1679 bus->ifs[1].lcyl = val;
1680 break;
1681 case 5:
1682 ide_clear_hob(bus);
1683 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
1684 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
1685 bus->ifs[0].hcyl = val;
1686 bus->ifs[1].hcyl = val;
1687 break;
1688 case 6:
1689 /* FIXME: HOB readback uses bit 7 */
1690 bus->ifs[0].select = (val & ~0x10) | 0xa0;
1691 bus->ifs[1].select = (val | 0x10) | 0xa0;
1692 /* select drive */
1693 bus->unit = (val >> 4) & 1;
1694 break;
1695 default:
1696 case 7:
1697 /* command */
1698 ide_exec_cmd(bus, val);
1699 break;
1700 }
1701 }
1702
1703
1704 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1705 {
1706 IDEState *s;
1707 int n;
1708 int lba48 = 0;
1709
1710 #if defined(DEBUG_IDE)
1711 printf("ide: CMD=%02x\n", val);
1712 #endif
1713 s = idebus_active_if(bus);
1714 /* ignore commands to non existant slave */
1715 if (s != bus->ifs && !s->bs)
1716 return;
1717
1718 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1719 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1720 return;
1721
1722 switch(val) {
1723 case WIN_IDENTIFY:
1724 if (s->bs && s->drive_kind != IDE_CD) {
1725 if (s->drive_kind != IDE_CFATA)
1726 ide_identify(s);
1727 else
1728 ide_cfata_identify(s);
1729 s->status = READY_STAT | SEEK_STAT;
1730 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1731 } else {
1732 if (s->drive_kind == IDE_CD) {
1733 ide_set_signature(s);
1734 }
1735 ide_abort_command(s);
1736 }
1737 ide_set_irq(s->bus);
1738 break;
1739 case WIN_SPECIFY:
1740 case WIN_RECAL:
1741 s->error = 0;
1742 s->status = READY_STAT | SEEK_STAT;
1743 ide_set_irq(s->bus);
1744 break;
1745 case WIN_SETMULT:
1746 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1747 /* Disable Read and Write Multiple */
1748 s->mult_sectors = 0;
1749 s->status = READY_STAT | SEEK_STAT;
1750 } else if ((s->nsector & 0xff) != 0 &&
1751 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1752 (s->nsector & (s->nsector - 1)) != 0)) {
1753 ide_abort_command(s);
1754 } else {
1755 s->mult_sectors = s->nsector & 0xff;
1756 s->status = READY_STAT | SEEK_STAT;
1757 }
1758 ide_set_irq(s->bus);
1759 break;
1760 case WIN_VERIFY_EXT:
1761 lba48 = 1;
1762 case WIN_VERIFY:
1763 case WIN_VERIFY_ONCE:
1764 /* do sector number check ? */
1765 ide_cmd_lba48_transform(s, lba48);
1766 s->status = READY_STAT | SEEK_STAT;
1767 ide_set_irq(s->bus);
1768 break;
1769 case WIN_READ_EXT:
1770 lba48 = 1;
1771 case WIN_READ:
1772 case WIN_READ_ONCE:
1773 if (!s->bs)
1774 goto abort_cmd;
1775 ide_cmd_lba48_transform(s, lba48);
1776 s->req_nb_sectors = 1;
1777 ide_sector_read(s);
1778 break;
1779 case WIN_WRITE_EXT:
1780 lba48 = 1;
1781 case WIN_WRITE:
1782 case WIN_WRITE_ONCE:
1783 case CFA_WRITE_SECT_WO_ERASE:
1784 case WIN_WRITE_VERIFY:
1785 ide_cmd_lba48_transform(s, lba48);
1786 s->error = 0;
1787 s->status = SEEK_STAT | READY_STAT;
1788 s->req_nb_sectors = 1;
1789 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1790 s->media_changed = 1;
1791 break;
1792 case WIN_MULTREAD_EXT:
1793 lba48 = 1;
1794 case WIN_MULTREAD:
1795 if (!s->mult_sectors)
1796 goto abort_cmd;
1797 ide_cmd_lba48_transform(s, lba48);
1798 s->req_nb_sectors = s->mult_sectors;
1799 ide_sector_read(s);
1800 break;
1801 case WIN_MULTWRITE_EXT:
1802 lba48 = 1;
1803 case WIN_MULTWRITE:
1804 case CFA_WRITE_MULTI_WO_ERASE:
1805 if (!s->mult_sectors)
1806 goto abort_cmd;
1807 ide_cmd_lba48_transform(s, lba48);
1808 s->error = 0;
1809 s->status = SEEK_STAT | READY_STAT;
1810 s->req_nb_sectors = s->mult_sectors;
1811 n = s->nsector;
1812 if (n > s->req_nb_sectors)
1813 n = s->req_nb_sectors;
1814 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1815 s->media_changed = 1;
1816 break;
1817 case WIN_READDMA_EXT:
1818 lba48 = 1;
1819 case WIN_READDMA:
1820 case WIN_READDMA_ONCE:
1821 if (!s->bs)
1822 goto abort_cmd;
1823 ide_cmd_lba48_transform(s, lba48);
1824 ide_sector_start_dma(s, 1);
1825 break;
1826 case WIN_WRITEDMA_EXT:
1827 lba48 = 1;
1828 case WIN_WRITEDMA:
1829 case WIN_WRITEDMA_ONCE:
1830 if (!s->bs)
1831 goto abort_cmd;
1832 ide_cmd_lba48_transform(s, lba48);
1833 ide_sector_start_dma(s, 0);
1834 s->media_changed = 1;
1835 break;
1836 case WIN_READ_NATIVE_MAX_EXT:
1837 lba48 = 1;
1838 case WIN_READ_NATIVE_MAX:
1839 ide_cmd_lba48_transform(s, lba48);
1840 ide_set_sector(s, s->nb_sectors - 1);
1841 s->status = READY_STAT | SEEK_STAT;
1842 ide_set_irq(s->bus);
1843 break;
1844 case WIN_CHECKPOWERMODE1:
1845 case WIN_CHECKPOWERMODE2:
1846 s->nsector = 0xff; /* device active or idle */
1847 s->status = READY_STAT | SEEK_STAT;
1848 ide_set_irq(s->bus);
1849 break;
1850 case WIN_SETFEATURES:
1851 if (!s->bs)
1852 goto abort_cmd;
1853 /* XXX: valid for CDROM ? */
1854 switch(s->feature) {
1855 case 0xcc: /* reverting to power-on defaults enable */
1856 case 0x66: /* reverting to power-on defaults disable */
1857 case 0x02: /* write cache enable */
1858 case 0x82: /* write cache disable */
1859 case 0xaa: /* read look-ahead enable */
1860 case 0x55: /* read look-ahead disable */
1861 case 0x05: /* set advanced power management mode */
1862 case 0x85: /* disable advanced power management mode */
1863 case 0x69: /* NOP */
1864 case 0x67: /* NOP */
1865 case 0x96: /* NOP */
1866 case 0x9a: /* NOP */
1867 case 0x42: /* enable Automatic Acoustic Mode */
1868 case 0xc2: /* disable Automatic Acoustic Mode */
1869 s->status = READY_STAT | SEEK_STAT;
1870 ide_set_irq(s->bus);
1871 break;
1872 case 0x03: { /* set transfer mode */
1873 uint8_t val = s->nsector & 0x07;
1874 uint16_t *identify_data = (uint16_t *)s->identify_data;
1875
1876 switch (s->nsector >> 3) {
1877 case 0x00: /* pio default */
1878 case 0x01: /* pio mode */
1879 put_le16(identify_data + 62,0x07);
1880 put_le16(identify_data + 63,0x07);
1881 put_le16(identify_data + 88,0x3f);
1882 break;
1883 case 0x02: /* sigle word dma mode*/
1884 put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1885 put_le16(identify_data + 63,0x07);
1886 put_le16(identify_data + 88,0x3f);
1887 break;
1888 case 0x04: /* mdma mode */
1889 put_le16(identify_data + 62,0x07);
1890 put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1891 put_le16(identify_data + 88,0x3f);
1892 break;
1893 case 0x08: /* udma mode */
1894 put_le16(identify_data + 62,0x07);
1895 put_le16(identify_data + 63,0x07);
1896 put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1897 break;
1898 default:
1899 goto abort_cmd;
1900 }
1901 s->status = READY_STAT | SEEK_STAT;
1902 ide_set_irq(s->bus);
1903 break;
1904 }
1905 default:
1906 goto abort_cmd;
1907 }
1908 break;
1909 case WIN_FLUSH_CACHE:
1910 case WIN_FLUSH_CACHE_EXT:
1911 ide_flush_cache(s);
1912 break;
1913 case WIN_STANDBY:
1914 case WIN_STANDBY2:
1915 case WIN_STANDBYNOW1:
1916 case WIN_STANDBYNOW2:
1917 case WIN_IDLEIMMEDIATE:
1918 case CFA_IDLEIMMEDIATE:
1919 case WIN_SETIDLE1:
1920 case WIN_SETIDLE2:
1921 case WIN_SLEEPNOW1:
1922 case WIN_SLEEPNOW2:
1923 s->status = READY_STAT;
1924 ide_set_irq(s->bus);
1925 break;
1926 case WIN_SEEK:
1927 if(s->drive_kind == IDE_CD)
1928 goto abort_cmd;
1929 /* XXX: Check that seek is within bounds */
1930 s->status = READY_STAT | SEEK_STAT;
1931 ide_set_irq(s->bus);
1932 break;
1933 /* ATAPI commands */
1934 case WIN_PIDENTIFY:
1935 if (s->drive_kind == IDE_CD) {
1936 ide_atapi_identify(s);
1937 s->status = READY_STAT | SEEK_STAT;
1938 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1939 } else {
1940 ide_abort_command(s);
1941 }
1942 ide_set_irq(s->bus);
1943 break;
1944 case WIN_DIAGNOSE:
1945 ide_set_signature(s);
1946 if (s->drive_kind == IDE_CD)
1947 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1948 * devices to return a clear status register
1949 * with READY_STAT *not* set. */
1950 else
1951 s->status = READY_STAT | SEEK_STAT;
1952 s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1953 * present.
1954 */
1955 ide_set_irq(s->bus);
1956 break;
1957 case WIN_SRST:
1958 if (s->drive_kind != IDE_CD)
1959 goto abort_cmd;
1960 ide_set_signature(s);
1961 s->status = 0x00; /* NOTE: READY is _not_ set */
1962 s->error = 0x01;
1963 break;
1964 case WIN_PACKETCMD:
1965 if (s->drive_kind != IDE_CD)
1966 goto abort_cmd;
1967 /* overlapping commands not supported */
1968 if (s->feature & 0x02)
1969 goto abort_cmd;
1970 s->status = READY_STAT | SEEK_STAT;
1971 s->atapi_dma = s->feature & 1;
1972 s->nsector = 1;
1973 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1974 ide_atapi_cmd);
1975 break;
1976 /* CF-ATA commands */
1977 case CFA_REQ_EXT_ERROR_CODE:
1978 if (s->drive_kind != IDE_CFATA)
1979 goto abort_cmd;
1980 s->error = 0x09; /* miscellaneous error */
1981 s->status = READY_STAT | SEEK_STAT;
1982 ide_set_irq(s->bus);
1983 break;
1984 case CFA_ERASE_SECTORS:
1985 case CFA_WEAR_LEVEL:
1986 if (s->drive_kind != IDE_CFATA)
1987 goto abort_cmd;
1988 if (val == CFA_WEAR_LEVEL)
1989 s->nsector = 0;
1990 if (val == CFA_ERASE_SECTORS)
1991 s->media_changed = 1;
1992 s->error = 0x00;
1993 s->status = READY_STAT | SEEK_STAT;
1994 ide_set_irq(s->bus);
1995 break;
1996 case CFA_TRANSLATE_SECTOR:
1997 if (s->drive_kind != IDE_CFATA)
1998 goto abort_cmd;
1999 s->error = 0x00;
2000 s->status = READY_STAT | SEEK_STAT;
2001 memset(s->io_buffer, 0, 0x200);
2002 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
2003 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
2004 s->io_buffer[0x02] = s->select; /* Head */
2005 s->io_buffer[0x03] = s->sector; /* Sector */
2006 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
2007 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
2008 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
2009 s->io_buffer[0x13] = 0x00; /* Erase flag */
2010 s->io_buffer[0x18] = 0x00; /* Hot count */
2011 s->io_buffer[0x19] = 0x00; /* Hot count */
2012 s->io_buffer[0x1a] = 0x01; /* Hot count */
2013 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2014 ide_set_irq(s->bus);
2015 break;
2016 case CFA_ACCESS_METADATA_STORAGE:
2017 if (s->drive_kind != IDE_CFATA)
2018 goto abort_cmd;
2019 switch (s->feature) {
2020 case 0x02: /* Inquiry Metadata Storage */
2021 ide_cfata_metadata_inquiry(s);
2022 break;
2023 case 0x03: /* Read Metadata Storage */
2024 ide_cfata_metadata_read(s);
2025 break;
2026 case 0x04: /* Write Metadata Storage */
2027 ide_cfata_metadata_write(s);
2028 break;
2029 default:
2030 goto abort_cmd;
2031 }
2032 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2033 s->status = 0x00; /* NOTE: READY is _not_ set */
2034 ide_set_irq(s->bus);
2035 break;
2036 case IBM_SENSE_CONDITION:
2037 if (s->drive_kind != IDE_CFATA)
2038 goto abort_cmd;
2039 switch (s->feature) {
2040 case 0x01: /* sense temperature in device */
2041 s->nsector = 0x50; /* +20 C */
2042 break;
2043 default:
2044 goto abort_cmd;
2045 }
2046 s->status = READY_STAT | SEEK_STAT;
2047 ide_set_irq(s->bus);
2048 break;
2049
2050 case WIN_SMART:
2051 if (s->drive_kind == IDE_CD)
2052 goto abort_cmd;
2053 if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
2054 goto abort_cmd;
2055 if (!s->smart_enabled && s->feature != SMART_ENABLE)
2056 goto abort_cmd;
2057 switch (s->feature) {
2058 case SMART_DISABLE:
2059 s->smart_enabled = 0;
2060 s->status = READY_STAT | SEEK_STAT;
2061 ide_set_irq(s->bus);
2062 break;
2063 case SMART_ENABLE:
2064 s->smart_enabled = 1;
2065 s->status = READY_STAT | SEEK_STAT;
2066 ide_set_irq(s->bus);
2067 break;
2068 case SMART_ATTR_AUTOSAVE:
2069 switch (s->sector) {
2070 case 0x00:
2071 s->smart_autosave = 0;
2072 break;
2073 case 0xf1:
2074 s->smart_autosave = 1;
2075 break;
2076 default:
2077 goto abort_cmd;
2078 }
2079 s->status = READY_STAT | SEEK_STAT;
2080 ide_set_irq(s->bus);
2081 break;
2082 case SMART_STATUS:
2083 if (!s->smart_errors) {
2084 s->hcyl = 0xc2;
2085 s->lcyl = 0x4f;
2086 } else {
2087 s->hcyl = 0x2c;
2088 s->lcyl = 0xf4;
2089 }
2090 s->status = READY_STAT | SEEK_STAT;
2091 ide_set_irq(s->bus);
2092 break;
2093 case SMART_READ_THRESH:
2094 memset(s->io_buffer, 0, 0x200);
2095 s->io_buffer[0] = 0x01; /* smart struct version */
2096 for (n=0; n<30; n++) {
2097 if (smart_attributes[n][0] == 0)
2098 break;
2099 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
2100 s->io_buffer[2+1+(n*12)] = smart_attributes[n][4];
2101 }
2102 for (n=0; n<511; n++) /* checksum */
2103 s->io_buffer[511] += s->io_buffer[n];
2104 s->io_buffer[511] = 0x100 - s->io_buffer[511];
2105 s->status = READY_STAT | SEEK_STAT;
2106 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2107 ide_set_irq(s->bus);
2108 break;
2109 case SMART_READ_DATA:
2110 memset(s->io_buffer, 0, 0x200);
2111 s->io_buffer[0] = 0x01; /* smart struct version */
2112 for (n=0; n<30; n++) {
2113 if (smart_attributes[n][0] == 0)
2114 break;
2115 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
2116 s->io_buffer[2+1+(n*12)] = smart_attributes[n][1];
2117 s->io_buffer[2+3+(n*12)] = smart_attributes[n][2];
2118 s->io_buffer[2+4+(n*12)] = smart_attributes[n][3];
2119 }
2120 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
2121 if (s->smart_selftest_count == 0) {
2122 s->io_buffer[363] = 0;
2123 } else {
2124 s->io_buffer[363] =
2125 s->smart_selftest_data[3 +
2126 (s->smart_selftest_count - 1) *
2127 24];
2128 }
2129 s->io_buffer[364] = 0x20;
2130 s->io_buffer[365] = 0x01;
2131 /* offline data collection capacity: execute + self-test*/
2132 s->io_buffer[367] = (1<<4 | 1<<3 | 1);
2133 s->io_buffer[368] = 0x03; /* smart capability (1) */
2134 s->io_buffer[369] = 0x00; /* smart capability (2) */
2135 s->io_buffer[370] = 0x01; /* error logging supported */
2136 s->io_buffer[372] = 0x02; /* minutes for poll short test */
2137 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
2138 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
2139
2140 for (n=0; n<511; n++)
2141 s->io_buffer[511] += s->io_buffer[n];
2142 s->io_buffer[511] = 0x100 - s->io_buffer[511];
2143 s->status = READY_STAT | SEEK_STAT;
2144 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2145 ide_set_irq(s->bus);
2146 break;
2147 case SMART_READ_LOG:
2148 switch (s->sector) {
2149 case 0x01: /* summary smart error log */
2150 memset(s->io_buffer, 0, 0x200);
2151 s->io_buffer[0] = 0x01;
2152 s->io_buffer[1] = 0x00; /* no error entries */
2153 s->io_buffer[452] = s->smart_errors & 0xff;
2154 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
2155
2156 for (n=0; n<511; n++)
2157 s->io_buffer[511] += s->io_buffer[n];
2158 s->io_buffer[511] = 0x100 - s->io_buffer[511];
2159 break;
2160 case 0x06: /* smart self test log */
2161 memset(s->io_buffer, 0, 0x200);
2162 s->io_buffer[0] = 0x01;
2163 if (s->smart_selftest_count == 0) {
2164 s->io_buffer[508] = 0;
2165 } else {
2166 s->io_buffer[508] = s->smart_selftest_count;
2167 for (n=2; n<506; n++)
2168 s->io_buffer[n] = s->smart_selftest_data[n];
2169 }
2170 for (n=0; n<511; n++)
2171 s->io_buffer[511] += s->io_buffer[n];
2172 s->io_buffer[511] = 0x100 - s->io_buffer[511];
2173 break;
2174 default:
2175 goto abort_cmd;
2176 }
2177 s->status = READY_STAT | SEEK_STAT;
2178 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2179 ide_set_irq(s->bus);
2180 break;
2181 case SMART_EXECUTE_OFFLINE:
2182 switch (s->sector) {
2183 case 0: /* off-line routine */
2184 case 1: /* short self test */
2185 case 2: /* extended self test */
2186 s->smart_selftest_count++;
2187 if(s->smart_selftest_count > 21)
2188 s->smart_selftest_count = 0;
2189 n = 2 + (s->smart_selftest_count - 1) * 24;
2190 s->smart_selftest_data[n] = s->sector;
2191 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
2192 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
2193 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
2194 s->status = READY_STAT | SEEK_STAT;
2195 ide_set_irq(s->bus);
2196 break;
2197 default:
2198 goto abort_cmd;
2199 }
2200 break;
2201 default:
2202 goto abort_cmd;
2203 }
2204 break;
2205 default:
2206 abort_cmd:
2207 ide_abort_command(s);
2208 ide_set_irq(s->bus);
2209 break;
2210 }
2211 }
2212
2213 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
2214 {
2215 IDEBus *bus = opaque;
2216 IDEState *s = idebus_active_if(bus);
2217 uint32_t addr;
2218 int ret, hob;
2219
2220 addr = addr1 & 7;
2221 /* FIXME: HOB readback uses bit 7, but it's always set right now */
2222 //hob = s->select & (1 << 7);
2223 hob = 0;
2224 switch(addr) {
2225 case 0:
2226 ret = 0xff;
2227 break;
2228 case 1:
2229 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2230 (s != bus->ifs && !s->bs))
2231 ret = 0;
2232 else if (!hob)
2233 ret = s->error;
2234 else
2235 ret = s->hob_feature;
2236 break;
2237 case 2:
2238 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2239 ret = 0;
2240 else if (!hob)
2241 ret = s->nsector & 0xff;
2242 else
2243 ret = s->hob_nsector;
2244 break;
2245 case 3:
2246 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2247 ret = 0;
2248 else if (!hob)
2249 ret = s->sector;
2250 else
2251 ret = s->hob_sector;
2252 break;
2253 case 4:
2254 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2255 ret = 0;
2256 else if (!hob)
2257 ret = s->lcyl;
2258 else
2259 ret = s->hob_lcyl;
2260 break;
2261 case 5:
2262 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2263 ret = 0;
2264 else if (!hob)
2265 ret = s->hcyl;
2266 else
2267 ret = s->hob_hcyl;
2268 break;
2269 case 6:
2270 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2271 ret = 0;
2272 else
2273 ret = s->select;
2274 break;
2275 default:
2276 case 7:
2277 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2278 (s != bus->ifs && !s->bs))
2279 ret = 0;
2280 else
2281 ret = s->status;
2282 qemu_irq_lower(bus->irq);
2283 break;
2284 }
2285 #ifdef DEBUG_IDE
2286 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
2287 #endif
2288 return ret;
2289 }
2290
2291 uint32_t ide_status_read(void *opaque, uint32_t addr)
2292 {
2293 IDEBus *bus = opaque;
2294 IDEState *s = idebus_active_if(bus);
2295 int ret;
2296
2297 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2298 (s != bus->ifs && !s->bs))
2299 ret = 0;
2300 else
2301 ret = s->status;
2302 #ifdef DEBUG_IDE
2303 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
2304 #endif
2305 return ret;
2306 }
2307
2308 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
2309 {
2310 IDEBus *bus = opaque;
2311 IDEState *s;
2312 int i;
2313
2314 #ifdef DEBUG_IDE
2315 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
2316 #endif
2317 /* common for both drives */
2318 if (!(bus->cmd & IDE_CMD_RESET) &&
2319 (val & IDE_CMD_RESET)) {
2320 /* reset low to high */
2321 for(i = 0;i < 2; i++) {
2322 s = &bus->ifs[i];
2323 s->status = BUSY_STAT | SEEK_STAT;
2324 s->error = 0x01;
2325 }
2326 } else if ((bus->cmd & IDE_CMD_RESET) &&
2327 !(val & IDE_CMD_RESET)) {
2328 /* high to low */
2329 for(i = 0;i < 2; i++) {
2330 s = &bus->ifs[i];
2331 if (s->drive_kind == IDE_CD)
2332 s->status = 0x00; /* NOTE: READY is _not_ set */
2333 else
2334 s->status = READY_STAT | SEEK_STAT;
2335 ide_set_signature(s);
2336 }
2337 }
2338
2339 bus->cmd = val;
2340 }
2341
2342 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
2343 {
2344 IDEBus *bus = opaque;
2345 IDEState *s = idebus_active_if(bus);
2346 uint8_t *p;
2347
2348 /* PIO data access allowed only when DRQ bit is set */
2349 if (!(s->status & DRQ_STAT))
2350 return;
2351
2352 p = s->data_ptr;
2353 *(uint16_t *)p = le16_to_cpu(val);
2354 p += 2;
2355 s->data_ptr = p;
2356 if (p >= s->data_end)
2357 s->end_transfer_func(s);
2358 }
2359
2360 uint32_t ide_data_readw(void *opaque, uint32_t addr)
2361 {
2362 IDEBus *bus = opaque;
2363 IDEState *s = idebus_active_if(bus);
2364 uint8_t *p;
2365 int ret;
2366
2367 /* PIO data access allowed only when DRQ bit is set */
2368 if (!(s->status & DRQ_STAT))
2369 return 0;
2370
2371 p = s->data_ptr;
2372 ret = cpu_to_le16(*(uint16_t *)p);
2373 p += 2;
2374 s->data_ptr = p;
2375 if (p >= s->data_end)
2376 s->end_transfer_func(s);
2377 return ret;
2378 }
2379
2380 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
2381 {
2382 IDEBus *bus = opaque;
2383 IDEState *s = idebus_active_if(bus);
2384 uint8_t *p;
2385
2386 /* PIO data access allowed only when DRQ bit is set */
2387 if (!(s->status & DRQ_STAT))
2388 return;
2389
2390 p = s->data_ptr;
2391 *(uint32_t *)p = le32_to_cpu(val);
2392 p += 4;
2393 s->data_ptr = p;
2394 if (p >= s->data_end)
2395 s->end_transfer_func(s);
2396 }
2397
2398 uint32_t ide_data_readl(void *opaque, uint32_t addr)
2399 {
2400 IDEBus *bus = opaque;
2401 IDEState *s = idebus_active_if(bus);
2402 uint8_t *p;
2403 int ret;
2404
2405 /* PIO data access allowed only when DRQ bit is set */
2406 if (!(s->status & DRQ_STAT))
2407 return 0;
2408
2409 p = s->data_ptr;
2410 ret = cpu_to_le32(*(uint32_t *)p);
2411 p += 4;
2412 s->data_ptr = p;
2413 if (p >= s->data_end)
2414 s->end_transfer_func(s);
2415 return ret;
2416 }
2417
2418 static void ide_dummy_transfer_stop(IDEState *s)
2419 {
2420 s->data_ptr = s->io_buffer;
2421 s->data_end = s->io_buffer;
2422 s->io_buffer[0] = 0xff;
2423 s->io_buffer[1] = 0xff;
2424 s->io_buffer[2] = 0xff;
2425 s->io_buffer[3] = 0xff;
2426 }
2427
2428 static void ide_reset(IDEState *s)
2429 {
2430 #ifdef DEBUG_IDE
2431 printf("ide: reset\n");
2432 #endif
2433 if (s->drive_kind == IDE_CFATA)
2434 s->mult_sectors = 0;
2435 else
2436 s->mult_sectors = MAX_MULT_SECTORS;
2437 /* ide regs */
2438 s->feature = 0;
2439 s->error = 0;
2440 s->nsector = 0;
2441 s->sector = 0;
2442 s->lcyl = 0;
2443 s->hcyl = 0;
2444
2445 /* lba48 */
2446 s->hob_feature = 0;
2447 s->hob_sector = 0;
2448 s->hob_nsector = 0;
2449 s->hob_lcyl = 0;
2450 s->hob_hcyl = 0;
2451
2452 s->select = 0xa0;
2453 s->status = READY_STAT | SEEK_STAT;
2454
2455 s->lba48 = 0;
2456
2457 /* ATAPI specific */
2458 s->sense_key = 0;
2459 s->asc = 0;
2460 s->cdrom_changed = 0;
2461 s->packet_transfer_size = 0;
2462 s->elementary_transfer_size = 0;
2463 s->io_buffer_index = 0;
2464 s->cd_sector_size = 0;
2465 s->atapi_dma = 0;
2466 /* ATA DMA state */
2467 s->io_buffer_size = 0;
2468 s->req_nb_sectors = 0;
2469
2470 ide_set_signature(s);
2471 /* init the transfer handler so that 0xffff is returned on data
2472 accesses */
2473 s->end_transfer_func = ide_dummy_transfer_stop;
2474 ide_dummy_transfer_stop(s);
2475 s->media_changed = 0;
2476 }
2477
2478 void ide_bus_reset(IDEBus *bus)
2479 {
2480 bus->unit = 0;
2481 bus->cmd = 0;
2482 ide_reset(&bus->ifs[0]);
2483 ide_reset(&bus->ifs[1]);
2484 ide_clear_hob(bus);
2485
2486 /* pending async DMA */
2487 if (bus->dma->aiocb) {
2488 #ifdef DEBUG_AIO
2489 printf("aio_cancel\n");
2490 #endif
2491 bdrv_aio_cancel(bus->dma->aiocb);
2492 bus->dma->aiocb = NULL;
2493 }
2494
2495 /* reset dma provider too */
2496 bus->dma->ops->reset(bus->dma);
2497 }
2498
2499 int ide_init_drive(IDEState *s, BlockDriverState *bs,
2500 const char *version, const char *serial)
2501 {
2502 int cylinders, heads, secs;
2503 uint64_t nb_sectors;
2504
2505 s->bs = bs;
2506 bdrv_get_geometry(bs, &nb_sectors);
2507 bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
2508 if (cylinders < 1 || cylinders > 16383) {
2509 error_report("cyls must be between 1 and 16383");
2510 return -1;
2511 }
2512 if (heads < 1 || heads > 16) {
2513 error_report("heads must be between 1 and 16");
2514 return -1;
2515 }
2516 if (secs < 1 || secs > 63) {
2517 error_report("secs must be between 1 and 63");
2518 return -1;
2519 }
2520 s->cylinders = cylinders;
2521 s->heads = heads;
2522 s->sectors = secs;
2523 s->nb_sectors = nb_sectors;
2524 /* The SMART values should be preserved across power cycles
2525 but they aren't. */
2526 s->smart_enabled = 1;
2527 s->smart_autosave = 1;
2528 s->smart_errors = 0;
2529 s->smart_selftest_count = 0;
2530 if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
2531 s->drive_kind = IDE_CD;
2532 bdrv_set_change_cb(bs, cdrom_change_cb, s);
2533 bs->buffer_alignment = 2048;
2534 } else {
2535 if (!bdrv_is_inserted(s->bs)) {
2536 error_report("Device needs media, but drive is empty");
2537 return -1;
2538 }
2539 if (bdrv_is_read_only(bs)) {
2540 error_report("Can't use a read-only drive");
2541 return -1;
2542 }
2543 }
2544 if (serial) {
2545 strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
2546 } else {
2547 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2548 "QM%05d", s->drive_serial);
2549 }
2550 if (version) {
2551 pstrcpy(s->version, sizeof(s->version), version);
2552 } else {
2553 pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
2554 }
2555
2556 ide_reset(s);
2557 bdrv_set_removable(bs, s->drive_kind == IDE_CD);
2558 return 0;
2559 }
2560
2561 static void ide_init1(IDEBus *bus, int unit)
2562 {
2563 static int drive_serial = 1;
2564 IDEState *s = &bus->ifs[unit];
2565
2566 s->bus = bus;
2567 s->unit = unit;
2568 s->drive_serial = drive_serial++;
2569 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2570 s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4);
2571 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2572 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2573 s->sector_write_timer = qemu_new_timer(vm_clock,
2574 ide_sector_write_timer_cb, s);
2575 }
2576
2577 static void ide_nop_start(IDEDMA *dma, IDEState *s,
2578 BlockDriverCompletionFunc *cb)
2579 {
2580 }
2581
2582 static int ide_nop(IDEDMA *dma)
2583 {
2584 return 0;
2585 }
2586
2587 static int ide_nop_int(IDEDMA *dma, int x)
2588 {
2589 return 0;
2590 }
2591
2592 static void ide_nop_restart(void *opaque, int x, int y)
2593 {
2594 }
2595
2596 static const IDEDMAOps ide_dma_nop_ops = {
2597 .start_dma = ide_nop_start,
2598 .start_transfer = ide_nop,
2599 .prepare_buf = ide_nop_int,
2600 .rw_buf = ide_nop_int,
2601 .set_unit = ide_nop_int,
2602 .add_status = ide_nop_int,
2603 .set_inactive = ide_nop,
2604 .restart_cb = ide_nop_restart,
2605 .reset = ide_nop,
2606 };
2607
2608 static IDEDMA ide_dma_nop = {
2609 .ops = &ide_dma_nop_ops,
2610 .aiocb = NULL,
2611 };
2612
2613 void ide_init2(IDEBus *bus, qemu_irq irq)
2614 {
2615 int i;
2616
2617 for(i = 0; i < 2; i++) {
2618 ide_init1(bus, i);
2619 ide_reset(&bus->ifs[i]);
2620 }
2621 bus->irq = irq;
2622 bus->dma = &ide_dma_nop;
2623 }
2624
2625 /* TODO convert users to qdev and remove */
2626 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2627 DriveInfo *hd1, qemu_irq irq)
2628 {
2629 int i;
2630 DriveInfo *dinfo;
2631
2632 for(i = 0; i < 2; i++) {
2633 dinfo = i == 0 ? hd0 : hd1;
2634 ide_init1(bus, i);
2635 if (dinfo) {
2636 if (ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
2637 *dinfo->serial ? dinfo->serial : NULL) < 0) {
2638 error_report("Can't set up IDE drive %s", dinfo->id);
2639 exit(1);
2640 }
2641 } else {
2642 ide_reset(&bus->ifs[i]);
2643 }
2644 }
2645 bus->irq = irq;
2646 bus->dma = &ide_dma_nop;
2647 }
2648
2649 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
2650 {
2651 register_ioport_write(iobase, 8, 1, ide_ioport_write, bus);
2652 register_ioport_read(iobase, 8, 1, ide_ioport_read, bus);
2653 if (iobase2) {
2654 register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
2655 register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
2656 }
2657
2658 /* data ports */
2659 register_ioport_write(iobase, 2, 2, ide_data_writew, bus);
2660 register_ioport_read(iobase, 2, 2, ide_data_readw, bus);
2661 register_ioport_write(iobase, 4, 4, ide_data_writel, bus);
2662 register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
2663 }
2664
2665 static bool is_identify_set(void *opaque, int version_id)
2666 {
2667 IDEState *s = opaque;
2668
2669 return s->identify_set != 0;
2670 }
2671
2672 static EndTransferFunc* transfer_end_table[] = {
2673 ide_sector_read,
2674 ide_sector_write,
2675 ide_transfer_stop,
2676 ide_atapi_cmd_reply_end,
2677 ide_atapi_cmd,
2678 ide_dummy_transfer_stop,
2679 };
2680
2681 static int transfer_end_table_idx(EndTransferFunc *fn)
2682 {
2683 int i;
2684
2685 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2686 if (transfer_end_table[i] == fn)
2687 return i;
2688
2689 return -1;
2690 }
2691
2692 static int ide_drive_post_load(void *opaque, int version_id)
2693 {
2694 IDEState *s = opaque;
2695
2696 if (version_id < 3) {
2697 if (s->sense_key == SENSE_UNIT_ATTENTION &&
2698 s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
2699 s->cdrom_changed = 1;
2700 }
2701 }
2702 return 0;
2703 }
2704
2705 static int ide_drive_pio_post_load(void *opaque, int version_id)
2706 {
2707 IDEState *s = opaque;
2708
2709 if (s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) {
2710 return -EINVAL;
2711 }
2712 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2713 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2714 s->data_end = s->data_ptr + s->cur_io_buffer_len;
2715
2716 return 0;
2717 }
2718
2719 static void ide_drive_pio_pre_save(void *opaque)
2720 {
2721 IDEState *s = opaque;
2722 int idx;
2723
2724 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2725 s->cur_io_buffer_len = s->data_end - s->data_ptr;
2726
2727 idx = transfer_end_table_idx(s->end_transfer_func);
2728 if (idx == -1) {
2729 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2730 __func__);
2731 s->end_transfer_fn_idx = 2;
2732 } else {
2733 s->end_transfer_fn_idx = idx;
2734 }
2735 }
2736
2737 static bool ide_drive_pio_state_needed(void *opaque)
2738 {
2739 IDEState *s = opaque;
2740
2741 return (s->status & DRQ_STAT) != 0;
2742 }
2743
2744 const VMStateDescription vmstate_ide_drive_pio_state = {
2745 .name = "ide_drive/pio_state",
2746 .version_id = 1,
2747 .minimum_version_id = 1,
2748 .minimum_version_id_old = 1,
2749 .pre_save = ide_drive_pio_pre_save,
2750 .post_load = ide_drive_pio_post_load,
2751 .fields = (VMStateField []) {
2752 VMSTATE_INT32(req_nb_sectors, IDEState),
2753 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2754 vmstate_info_uint8, uint8_t),
2755 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2756 VMSTATE_INT32(cur_io_buffer_len, IDEState),
2757 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2758 VMSTATE_INT32(elementary_transfer_size, IDEState),
2759 VMSTATE_INT32(packet_transfer_size, IDEState),
2760 VMSTATE_END_OF_LIST()
2761 }
2762 };
2763
2764 const VMStateDescription vmstate_ide_drive = {
2765 .name = "ide_drive",
2766 .version_id = 3,
2767 .minimum_version_id = 0,
2768 .minimum_version_id_old = 0,
2769 .post_load = ide_drive_post_load,
2770 .fields = (VMStateField []) {
2771 VMSTATE_INT32(mult_sectors, IDEState),
2772 VMSTATE_INT32(identify_set, IDEState),
2773 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2774 VMSTATE_UINT8(feature, IDEState),
2775 VMSTATE_UINT8(error, IDEState),
2776 VMSTATE_UINT32(nsector, IDEState),
2777 VMSTATE_UINT8(sector, IDEState),
2778 VMSTATE_UINT8(lcyl, IDEState),
2779 VMSTATE_UINT8(hcyl, IDEState),
2780 VMSTATE_UINT8(hob_feature, IDEState),
2781 VMSTATE_UINT8(hob_sector, IDEState),
2782 VMSTATE_UINT8(hob_nsector, IDEState),
2783 VMSTATE_UINT8(hob_lcyl, IDEState),
2784 VMSTATE_UINT8(hob_hcyl, IDEState),
2785 VMSTATE_UINT8(select, IDEState),
2786 VMSTATE_UINT8(status, IDEState),
2787 VMSTATE_UINT8(lba48, IDEState),
2788 VMSTATE_UINT8(sense_key, IDEState),
2789 VMSTATE_UINT8(asc, IDEState),
2790 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2791 VMSTATE_END_OF_LIST()
2792 },
2793 .subsections = (VMStateSubsection []) {
2794 {
2795 .vmsd = &vmstate_ide_drive_pio_state,
2796 .needed = ide_drive_pio_state_needed,
2797 }, {
2798 /* empty */
2799 }
2800 }
2801 };
2802
2803 const VMStateDescription vmstate_ide_bus = {
2804 .name = "ide_bus",
2805 .version_id = 1,
2806 .minimum_version_id = 1,
2807 .minimum_version_id_old = 1,
2808 .fields = (VMStateField []) {
2809 VMSTATE_UINT8(cmd, IDEBus),
2810 VMSTATE_UINT8(unit, IDEBus),
2811 VMSTATE_END_OF_LIST()
2812 }
2813 };