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