2 * QEMU IDE disk and CD/DVD-ROM Emulator
4 * Copyright (c) 2003 Fabrice Bellard
5 * Copyright (c) 2006 Openedhand Ltd.
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:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
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
28 #include "qemu-error.h"
29 #include "qemu-timer.h"
34 #include <hw/ide/internal.h>
36 /* These values were based on a Seagate ST3500418AS but have been modified
37 to make more sense in QEMU */
38 static const int smart_attributes[][12] = {
39 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
40 /* raw read error rate*/
41 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
43 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
44 /* start stop count */
45 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
46 /* remapped sectors */
47 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
49 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
50 /* power cycle count */
51 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52 /* airflow-temperature-celsius */
53 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
55 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
58 static int ide_handle_rw_error(IDEState *s, int error, int op);
60 static void padstr(char *str, const char *src, int len)
63 for(i = 0; i < len; i++) {
72 static void put_le16(uint16_t *p, unsigned int v)
77 static void ide_identify(IDEState *s)
81 IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
83 if (s->identify_set) {
84 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
88 memset(s->io_buffer, 0, 512);
89 p = (uint16_t *)s->io_buffer;
90 put_le16(p + 0, 0x0040);
91 put_le16(p + 1, s->cylinders);
92 put_le16(p + 3, s->heads);
93 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
94 put_le16(p + 5, 512); /* XXX: retired, remove ? */
95 put_le16(p + 6, s->sectors);
96 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
97 put_le16(p + 20, 3); /* XXX: retired, remove ? */
98 put_le16(p + 21, 512); /* cache size in sectors */
99 put_le16(p + 22, 4); /* ecc bytes */
100 padstr((char *)(p + 23), s->version, 8); /* firmware version */
101 padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
102 #if MAX_MULT_SECTORS > 1
103 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
105 put_le16(p + 48, 1); /* dword I/O */
106 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
107 put_le16(p + 51, 0x200); /* PIO transfer cycle */
108 put_le16(p + 52, 0x200); /* DMA transfer cycle */
109 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
110 put_le16(p + 54, s->cylinders);
111 put_le16(p + 55, s->heads);
112 put_le16(p + 56, s->sectors);
113 oldsize = s->cylinders * s->heads * s->sectors;
114 put_le16(p + 57, oldsize);
115 put_le16(p + 58, oldsize >> 16);
117 put_le16(p + 59, 0x100 | s->mult_sectors);
118 put_le16(p + 60, s->nb_sectors);
119 put_le16(p + 61, s->nb_sectors >> 16);
120 put_le16(p + 62, 0x07); /* single word dma0-2 supported */
121 put_le16(p + 63, 0x07); /* mdma0-2 supported */
122 put_le16(p + 64, 0x03); /* pio3-4 supported */
123 put_le16(p + 65, 120);
124 put_le16(p + 66, 120);
125 put_le16(p + 67, 120);
126 put_le16(p + 68, 120);
127 if (dev && dev->conf.discard_granularity) {
128 put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
132 put_le16(p + 75, s->ncq_queues - 1);
134 put_le16(p + 76, (1 << 8));
137 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
138 put_le16(p + 81, 0x16); /* conforms to ata5 */
139 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
140 put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
141 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
142 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
143 /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
144 put_le16(p + 84, (1 << 14) | 0);
145 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
146 if (bdrv_enable_write_cache(s->bs))
147 put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
149 put_le16(p + 85, (1 << 14) | 1);
150 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
151 put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
152 /* 14=set to 1, 1=smart self test, 0=smart error logging */
153 put_le16(p + 87, (1 << 14) | 0);
154 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
155 put_le16(p + 93, 1 | (1 << 14) | 0x2000);
156 put_le16(p + 100, s->nb_sectors);
157 put_le16(p + 101, s->nb_sectors >> 16);
158 put_le16(p + 102, s->nb_sectors >> 32);
159 put_le16(p + 103, s->nb_sectors >> 48);
161 if (dev && dev->conf.physical_block_size)
162 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
163 if (dev && dev->conf.discard_granularity) {
164 put_le16(p + 169, 1); /* TRIM support */
167 memcpy(s->identify_data, p, sizeof(s->identify_data));
171 static void ide_atapi_identify(IDEState *s)
175 if (s->identify_set) {
176 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
180 memset(s->io_buffer, 0, 512);
181 p = (uint16_t *)s->io_buffer;
182 /* Removable CDROM, 50us response, 12 byte packets */
183 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
184 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
185 put_le16(p + 20, 3); /* buffer type */
186 put_le16(p + 21, 512); /* cache size in sectors */
187 put_le16(p + 22, 4); /* ecc bytes */
188 padstr((char *)(p + 23), s->version, 8); /* firmware version */
189 padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
190 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
192 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
193 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
194 put_le16(p + 62, 7); /* single word dma0-2 supported */
195 put_le16(p + 63, 7); /* mdma0-2 supported */
197 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
198 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
199 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
201 put_le16(p + 64, 3); /* pio3-4 supported */
202 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
203 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
204 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
205 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
207 put_le16(p + 71, 30); /* in ns */
208 put_le16(p + 72, 30); /* in ns */
211 put_le16(p + 75, s->ncq_queues - 1);
213 put_le16(p + 76, (1 << 8));
216 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
218 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
220 memcpy(s->identify_data, p, sizeof(s->identify_data));
224 static void ide_cfata_identify(IDEState *s)
229 p = (uint16_t *) s->identify_data;
233 memset(p, 0, sizeof(s->identify_data));
235 cur_sec = s->cylinders * s->heads * s->sectors;
237 put_le16(p + 0, 0x848a); /* CF Storage Card signature */
238 put_le16(p + 1, s->cylinders); /* Default cylinders */
239 put_le16(p + 3, s->heads); /* Default heads */
240 put_le16(p + 6, s->sectors); /* Default sectors per track */
241 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
242 put_le16(p + 8, s->nb_sectors); /* Sectors per card */
243 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
244 put_le16(p + 22, 0x0004); /* ECC bytes */
245 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
246 padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
247 #if MAX_MULT_SECTORS > 1
248 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
250 put_le16(p + 47, 0x0000);
252 put_le16(p + 49, 0x0f00); /* Capabilities */
253 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
254 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
255 put_le16(p + 53, 0x0003); /* Translation params valid */
256 put_le16(p + 54, s->cylinders); /* Current cylinders */
257 put_le16(p + 55, s->heads); /* Current heads */
258 put_le16(p + 56, s->sectors); /* Current sectors */
259 put_le16(p + 57, cur_sec); /* Current capacity */
260 put_le16(p + 58, cur_sec >> 16); /* Current capacity */
261 if (s->mult_sectors) /* Multiple sector setting */
262 put_le16(p + 59, 0x100 | s->mult_sectors);
263 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
264 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
265 put_le16(p + 63, 0x0203); /* Multiword DMA capability */
266 put_le16(p + 64, 0x0001); /* Flow Control PIO support */
267 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
268 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
269 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
270 put_le16(p + 82, 0x400c); /* Command Set supported */
271 put_le16(p + 83, 0x7068); /* Command Set supported */
272 put_le16(p + 84, 0x4000); /* Features supported */
273 put_le16(p + 85, 0x000c); /* Command Set enabled */
274 put_le16(p + 86, 0x7044); /* Command Set enabled */
275 put_le16(p + 87, 0x4000); /* Features enabled */
276 put_le16(p + 91, 0x4060); /* Current APM level */
277 put_le16(p + 129, 0x0002); /* Current features option */
278 put_le16(p + 130, 0x0005); /* Reassigned sectors */
279 put_le16(p + 131, 0x0001); /* Initial power mode */
280 put_le16(p + 132, 0x0000); /* User signature */
281 put_le16(p + 160, 0x8100); /* Power requirement */
282 put_le16(p + 161, 0x8001); /* CF command set */
287 memcpy(s->io_buffer, p, sizeof(s->identify_data));
290 static void ide_set_signature(IDEState *s)
292 s->select &= 0xf0; /* clear head */
296 if (s->drive_kind == IDE_CD) {
308 typedef struct TrimAIOCB {
309 BlockDriverAIOCB common;
314 static void trim_aio_cancel(BlockDriverAIOCB *acb)
316 TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
318 qemu_bh_delete(iocb->bh);
320 qemu_aio_release(iocb);
323 static AIOPool trim_aio_pool = {
324 .aiocb_size = sizeof(TrimAIOCB),
325 .cancel = trim_aio_cancel,
328 static void ide_trim_bh_cb(void *opaque)
330 TrimAIOCB *iocb = opaque;
332 iocb->common.cb(iocb->common.opaque, iocb->ret);
334 qemu_bh_delete(iocb->bh);
337 qemu_aio_release(iocb);
340 BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
341 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
342 BlockDriverCompletionFunc *cb, void *opaque)
347 iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
348 iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
351 for (j = 0; j < qiov->niov; j++) {
352 uint64_t *buffer = qiov->iov[j].iov_base;
354 for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
355 /* 6-byte LBA + 2-byte range per entry */
356 uint64_t entry = le64_to_cpu(buffer[i]);
357 uint64_t sector = entry & 0x0000ffffffffffffULL;
358 uint16_t count = entry >> 48;
364 ret = bdrv_discard(bs, sector, count);
371 qemu_bh_schedule(iocb->bh);
373 return &iocb->common;
376 static inline void ide_abort_command(IDEState *s)
378 s->status = READY_STAT | ERR_STAT;
382 /* prepare data transfer and tell what to do after */
383 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
384 EndTransferFunc *end_transfer_func)
386 s->end_transfer_func = end_transfer_func;
388 s->data_end = buf + size;
389 if (!(s->status & ERR_STAT)) {
390 s->status |= DRQ_STAT;
392 s->bus->dma->ops->start_transfer(s->bus->dma);
395 void ide_transfer_stop(IDEState *s)
397 s->end_transfer_func = ide_transfer_stop;
398 s->data_ptr = s->io_buffer;
399 s->data_end = s->io_buffer;
400 s->status &= ~DRQ_STAT;
403 int64_t ide_get_sector(IDEState *s)
406 if (s->select & 0x40) {
409 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
410 (s->lcyl << 8) | s->sector;
412 sector_num = ((int64_t)s->hob_hcyl << 40) |
413 ((int64_t) s->hob_lcyl << 32) |
414 ((int64_t) s->hob_sector << 24) |
415 ((int64_t) s->hcyl << 16) |
416 ((int64_t) s->lcyl << 8) | s->sector;
419 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
420 (s->select & 0x0f) * s->sectors + (s->sector - 1);
425 void ide_set_sector(IDEState *s, int64_t sector_num)
428 if (s->select & 0x40) {
430 s->select = (s->select & 0xf0) | (sector_num >> 24);
431 s->hcyl = (sector_num >> 16);
432 s->lcyl = (sector_num >> 8);
433 s->sector = (sector_num);
435 s->sector = sector_num;
436 s->lcyl = sector_num >> 8;
437 s->hcyl = sector_num >> 16;
438 s->hob_sector = sector_num >> 24;
439 s->hob_lcyl = sector_num >> 32;
440 s->hob_hcyl = sector_num >> 40;
443 cyl = sector_num / (s->heads * s->sectors);
444 r = sector_num % (s->heads * s->sectors);
447 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
448 s->sector = (r % s->sectors) + 1;
452 static void ide_rw_error(IDEState *s) {
453 ide_abort_command(s);
457 void ide_sector_read(IDEState *s)
462 s->status = READY_STAT | SEEK_STAT;
463 s->error = 0; /* not needed by IDE spec, but needed by Windows */
464 sector_num = ide_get_sector(s);
467 /* no more sector to read from disk */
468 ide_transfer_stop(s);
470 #if defined(DEBUG_IDE)
471 printf("read sector=%" PRId64 "\n", sector_num);
473 if (n > s->req_nb_sectors)
474 n = s->req_nb_sectors;
475 ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
477 if (ide_handle_rw_error(s, -ret,
478 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
483 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
485 ide_set_sector(s, sector_num + n);
490 static void dma_buf_commit(IDEState *s, int is_write)
492 qemu_sglist_destroy(&s->sg);
495 void ide_set_inactive(IDEState *s)
497 s->bus->dma->aiocb = NULL;
498 s->bus->dma->ops->set_inactive(s->bus->dma);
501 void ide_dma_error(IDEState *s)
503 ide_transfer_stop(s);
505 s->status = READY_STAT | ERR_STAT;
510 static int ide_handle_rw_error(IDEState *s, int error, int op)
512 int is_read = (op & BM_STATUS_RETRY_READ);
513 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
515 if (action == BLOCK_ERR_IGNORE) {
516 bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
520 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
521 || action == BLOCK_ERR_STOP_ANY) {
522 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
523 s->bus->error_status = op;
524 bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
525 vm_stop(VMSTOP_DISKFULL);
527 if (op & BM_STATUS_DMA_RETRY) {
528 dma_buf_commit(s, 0);
533 bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
539 void ide_dma_cb(void *opaque, int ret)
541 IDEState *s = opaque;
547 int op = BM_STATUS_DMA_RETRY;
549 if (s->dma_cmd == IDE_DMA_READ)
550 op |= BM_STATUS_RETRY_READ;
551 else if (s->dma_cmd == IDE_DMA_TRIM)
552 op |= BM_STATUS_RETRY_TRIM;
554 if (ide_handle_rw_error(s, -ret, op)) {
559 n = s->io_buffer_size >> 9;
560 sector_num = ide_get_sector(s);
562 dma_buf_commit(s, ide_cmd_is_read(s));
564 ide_set_sector(s, sector_num);
568 /* end of transfer ? */
569 if (s->nsector == 0) {
570 s->status = READY_STAT | SEEK_STAT;
575 /* launch next transfer */
577 s->io_buffer_index = 0;
578 s->io_buffer_size = n * 512;
579 if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
580 /* The PRDs were too short. Reset the Active bit, but don't raise an
586 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
587 sector_num, n, s->dma_cmd);
590 switch (s->dma_cmd) {
592 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
596 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
600 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
601 ide_issue_trim, ide_dma_cb, s, 1);
605 if (!s->bus->dma->aiocb) {
607 goto handle_rw_error;
615 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
617 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
618 s->io_buffer_index = 0;
619 s->io_buffer_size = 0;
620 s->dma_cmd = dma_cmd;
621 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
624 static void ide_sector_write_timer_cb(void *opaque)
626 IDEState *s = opaque;
630 void ide_sector_write(IDEState *s)
635 s->status = READY_STAT | SEEK_STAT;
636 sector_num = ide_get_sector(s);
637 #if defined(DEBUG_IDE)
638 printf("write sector=%" PRId64 "\n", sector_num);
641 if (n > s->req_nb_sectors)
642 n = s->req_nb_sectors;
643 ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
646 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
651 if (s->nsector == 0) {
652 /* no more sectors to write */
653 ide_transfer_stop(s);
656 if (n1 > s->req_nb_sectors)
657 n1 = s->req_nb_sectors;
658 ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
660 ide_set_sector(s, sector_num + n);
662 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
663 /* It seems there is a bug in the Windows 2000 installer HDD
664 IDE driver which fills the disk with empty logs when the
665 IDE write IRQ comes too early. This hack tries to correct
666 that at the expense of slower write performances. Use this
667 option _only_ to install Windows 2000. You must disable it
669 qemu_mod_timer(s->sector_write_timer,
670 qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
676 static void ide_flush_cb(void *opaque, int ret)
678 IDEState *s = opaque;
681 /* XXX: What sector number to set here? */
682 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
687 s->status = READY_STAT | SEEK_STAT;
691 void ide_flush_cache(IDEState *s)
693 BlockDriverAIOCB *acb;
700 acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
702 ide_flush_cb(s, -EIO);
706 static void ide_cfata_metadata_inquiry(IDEState *s)
711 p = (uint16_t *) s->io_buffer;
713 spd = ((s->mdata_size - 1) >> 9) + 1;
715 put_le16(p + 0, 0x0001); /* Data format revision */
716 put_le16(p + 1, 0x0000); /* Media property: silicon */
717 put_le16(p + 2, s->media_changed); /* Media status */
718 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
719 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
720 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
721 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
724 static void ide_cfata_metadata_read(IDEState *s)
728 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
729 s->status = ERR_STAT;
734 p = (uint16_t *) s->io_buffer;
737 put_le16(p + 0, s->media_changed); /* Media status */
738 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
739 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
740 s->nsector << 9), 0x200 - 2));
743 static void ide_cfata_metadata_write(IDEState *s)
745 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
746 s->status = ERR_STAT;
751 s->media_changed = 0;
753 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
755 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
756 s->nsector << 9), 0x200 - 2));
759 /* called when the inserted state of the media has changed */
760 static void cdrom_change_cb(void *opaque, int reason)
762 IDEState *s = opaque;
765 if (!(reason & CHANGE_MEDIA)) {
769 bdrv_get_geometry(s->bs, &nb_sectors);
770 s->nb_sectors = nb_sectors;
773 * First indicate to the guest that a CD has been removed. That's
774 * done on the next command the guest sends us.
776 * Then we set SENSE_UNIT_ATTENTION, by which the guest will
777 * detect a new CD in the drive. See ide_atapi_cmd() for details.
779 s->cdrom_changed = 1;
780 s->events.new_media = true;
784 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
788 /* handle the 'magic' 0 nsector count conversion here. to avoid
789 * fiddling with the rest of the read logic, we just store the
790 * full sector count in ->nsector and ignore ->hob_nsector from now
796 if (!s->nsector && !s->hob_nsector)
800 int hi = s->hob_nsector;
802 s->nsector = (hi << 8) | lo;
807 static void ide_clear_hob(IDEBus *bus)
809 /* any write clears HOB high bit of device control register */
810 bus->ifs[0].select &= ~(1 << 7);
811 bus->ifs[1].select &= ~(1 << 7);
814 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
816 IDEBus *bus = opaque;
819 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
824 /* ignore writes to command block while busy with previous command */
825 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
833 /* NOTE: data is written to the two drives */
834 bus->ifs[0].hob_feature = bus->ifs[0].feature;
835 bus->ifs[1].hob_feature = bus->ifs[1].feature;
836 bus->ifs[0].feature = val;
837 bus->ifs[1].feature = val;
841 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
842 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
843 bus->ifs[0].nsector = val;
844 bus->ifs[1].nsector = val;
848 bus->ifs[0].hob_sector = bus->ifs[0].sector;
849 bus->ifs[1].hob_sector = bus->ifs[1].sector;
850 bus->ifs[0].sector = val;
851 bus->ifs[1].sector = val;
855 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
856 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
857 bus->ifs[0].lcyl = val;
858 bus->ifs[1].lcyl = val;
862 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
863 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
864 bus->ifs[0].hcyl = val;
865 bus->ifs[1].hcyl = val;
868 /* FIXME: HOB readback uses bit 7 */
869 bus->ifs[0].select = (val & ~0x10) | 0xa0;
870 bus->ifs[1].select = (val | 0x10) | 0xa0;
872 bus->unit = (val >> 4) & 1;
877 ide_exec_cmd(bus, val);
883 void ide_exec_cmd(IDEBus *bus, uint32_t val)
889 #if defined(DEBUG_IDE)
890 printf("ide: CMD=%02x\n", val);
892 s = idebus_active_if(bus);
893 /* ignore commands to non existant slave */
894 if (s != bus->ifs && !s->bs)
897 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
898 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
903 switch (s->feature) {
908 ide_sector_start_dma(s, IDE_DMA_TRIM);
915 if (s->bs && s->drive_kind != IDE_CD) {
916 if (s->drive_kind != IDE_CFATA)
919 ide_cfata_identify(s);
920 s->status = READY_STAT | SEEK_STAT;
921 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
923 if (s->drive_kind == IDE_CD) {
924 ide_set_signature(s);
926 ide_abort_command(s);
933 s->status = READY_STAT | SEEK_STAT;
937 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
938 /* Disable Read and Write Multiple */
940 s->status = READY_STAT | SEEK_STAT;
941 } else if ((s->nsector & 0xff) != 0 &&
942 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
943 (s->nsector & (s->nsector - 1)) != 0)) {
944 ide_abort_command(s);
946 s->mult_sectors = s->nsector & 0xff;
947 s->status = READY_STAT | SEEK_STAT;
954 case WIN_VERIFY_ONCE:
955 /* do sector number check ? */
956 ide_cmd_lba48_transform(s, lba48);
957 s->status = READY_STAT | SEEK_STAT;
966 ide_cmd_lba48_transform(s, lba48);
967 s->req_nb_sectors = 1;
974 case CFA_WRITE_SECT_WO_ERASE:
975 case WIN_WRITE_VERIFY:
976 ide_cmd_lba48_transform(s, lba48);
978 s->status = SEEK_STAT | READY_STAT;
979 s->req_nb_sectors = 1;
980 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
981 s->media_changed = 1;
983 case WIN_MULTREAD_EXT:
986 if (!s->mult_sectors)
988 ide_cmd_lba48_transform(s, lba48);
989 s->req_nb_sectors = s->mult_sectors;
992 case WIN_MULTWRITE_EXT:
995 case CFA_WRITE_MULTI_WO_ERASE:
996 if (!s->mult_sectors)
998 ide_cmd_lba48_transform(s, lba48);
1000 s->status = SEEK_STAT | READY_STAT;
1001 s->req_nb_sectors = s->mult_sectors;
1003 if (n > s->req_nb_sectors)
1004 n = s->req_nb_sectors;
1005 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1006 s->media_changed = 1;
1008 case WIN_READDMA_EXT:
1011 case WIN_READDMA_ONCE:
1014 ide_cmd_lba48_transform(s, lba48);
1015 ide_sector_start_dma(s, IDE_DMA_READ);
1017 case WIN_WRITEDMA_EXT:
1020 case WIN_WRITEDMA_ONCE:
1023 ide_cmd_lba48_transform(s, lba48);
1024 ide_sector_start_dma(s, IDE_DMA_WRITE);
1025 s->media_changed = 1;
1027 case WIN_READ_NATIVE_MAX_EXT:
1029 case WIN_READ_NATIVE_MAX:
1030 ide_cmd_lba48_transform(s, lba48);
1031 ide_set_sector(s, s->nb_sectors - 1);
1032 s->status = READY_STAT | SEEK_STAT;
1033 ide_set_irq(s->bus);
1035 case WIN_CHECKPOWERMODE1:
1036 case WIN_CHECKPOWERMODE2:
1038 s->nsector = 0xff; /* device active or idle */
1039 s->status = READY_STAT | SEEK_STAT;
1040 ide_set_irq(s->bus);
1042 case WIN_SETFEATURES:
1045 /* XXX: valid for CDROM ? */
1046 switch(s->feature) {
1047 case 0xcc: /* reverting to power-on defaults enable */
1048 case 0x66: /* reverting to power-on defaults disable */
1049 case 0x02: /* write cache enable */
1050 case 0x82: /* write cache disable */
1051 case 0xaa: /* read look-ahead enable */
1052 case 0x55: /* read look-ahead disable */
1053 case 0x05: /* set advanced power management mode */
1054 case 0x85: /* disable advanced power management mode */
1055 case 0x69: /* NOP */
1056 case 0x67: /* NOP */
1057 case 0x96: /* NOP */
1058 case 0x9a: /* NOP */
1059 case 0x42: /* enable Automatic Acoustic Mode */
1060 case 0xc2: /* disable Automatic Acoustic Mode */
1061 s->status = READY_STAT | SEEK_STAT;
1062 ide_set_irq(s->bus);
1064 case 0x03: { /* set transfer mode */
1065 uint8_t val = s->nsector & 0x07;
1066 uint16_t *identify_data = (uint16_t *)s->identify_data;
1068 switch (s->nsector >> 3) {
1069 case 0x00: /* pio default */
1070 case 0x01: /* pio mode */
1071 put_le16(identify_data + 62,0x07);
1072 put_le16(identify_data + 63,0x07);
1073 put_le16(identify_data + 88,0x3f);
1075 case 0x02: /* sigle word dma mode*/
1076 put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1077 put_le16(identify_data + 63,0x07);
1078 put_le16(identify_data + 88,0x3f);
1080 case 0x04: /* mdma mode */
1081 put_le16(identify_data + 62,0x07);
1082 put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1083 put_le16(identify_data + 88,0x3f);
1085 case 0x08: /* udma mode */
1086 put_le16(identify_data + 62,0x07);
1087 put_le16(identify_data + 63,0x07);
1088 put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1093 s->status = READY_STAT | SEEK_STAT;
1094 ide_set_irq(s->bus);
1101 case WIN_FLUSH_CACHE:
1102 case WIN_FLUSH_CACHE_EXT:
1107 case WIN_STANDBYNOW1:
1108 case WIN_STANDBYNOW2:
1109 case WIN_IDLEIMMEDIATE:
1110 case CFA_IDLEIMMEDIATE:
1115 s->status = READY_STAT;
1116 ide_set_irq(s->bus);
1119 if(s->drive_kind == IDE_CD)
1121 /* XXX: Check that seek is within bounds */
1122 s->status = READY_STAT | SEEK_STAT;
1123 ide_set_irq(s->bus);
1125 /* ATAPI commands */
1127 if (s->drive_kind == IDE_CD) {
1128 ide_atapi_identify(s);
1129 s->status = READY_STAT | SEEK_STAT;
1130 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1132 ide_abort_command(s);
1134 ide_set_irq(s->bus);
1137 ide_set_signature(s);
1138 if (s->drive_kind == IDE_CD)
1139 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1140 * devices to return a clear status register
1141 * with READY_STAT *not* set. */
1143 s->status = READY_STAT | SEEK_STAT;
1144 s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1147 ide_set_irq(s->bus);
1150 if (s->drive_kind != IDE_CD)
1152 ide_set_signature(s);
1153 s->status = 0x00; /* NOTE: READY is _not_ set */
1157 if (s->drive_kind != IDE_CD)
1159 /* overlapping commands not supported */
1160 if (s->feature & 0x02)
1162 s->status = READY_STAT | SEEK_STAT;
1163 s->atapi_dma = s->feature & 1;
1165 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1168 /* CF-ATA commands */
1169 case CFA_REQ_EXT_ERROR_CODE:
1170 if (s->drive_kind != IDE_CFATA)
1172 s->error = 0x09; /* miscellaneous error */
1173 s->status = READY_STAT | SEEK_STAT;
1174 ide_set_irq(s->bus);
1176 case CFA_ERASE_SECTORS:
1177 case CFA_WEAR_LEVEL:
1178 if (s->drive_kind != IDE_CFATA)
1180 if (val == CFA_WEAR_LEVEL)
1182 if (val == CFA_ERASE_SECTORS)
1183 s->media_changed = 1;
1185 s->status = READY_STAT | SEEK_STAT;
1186 ide_set_irq(s->bus);
1188 case CFA_TRANSLATE_SECTOR:
1189 if (s->drive_kind != IDE_CFATA)
1192 s->status = READY_STAT | SEEK_STAT;
1193 memset(s->io_buffer, 0, 0x200);
1194 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1195 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1196 s->io_buffer[0x02] = s->select; /* Head */
1197 s->io_buffer[0x03] = s->sector; /* Sector */
1198 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1199 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1200 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1201 s->io_buffer[0x13] = 0x00; /* Erase flag */
1202 s->io_buffer[0x18] = 0x00; /* Hot count */
1203 s->io_buffer[0x19] = 0x00; /* Hot count */
1204 s->io_buffer[0x1a] = 0x01; /* Hot count */
1205 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1206 ide_set_irq(s->bus);
1208 case CFA_ACCESS_METADATA_STORAGE:
1209 if (s->drive_kind != IDE_CFATA)
1211 switch (s->feature) {
1212 case 0x02: /* Inquiry Metadata Storage */
1213 ide_cfata_metadata_inquiry(s);
1215 case 0x03: /* Read Metadata Storage */
1216 ide_cfata_metadata_read(s);
1218 case 0x04: /* Write Metadata Storage */
1219 ide_cfata_metadata_write(s);
1224 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1225 s->status = 0x00; /* NOTE: READY is _not_ set */
1226 ide_set_irq(s->bus);
1228 case IBM_SENSE_CONDITION:
1229 if (s->drive_kind != IDE_CFATA)
1231 switch (s->feature) {
1232 case 0x01: /* sense temperature in device */
1233 s->nsector = 0x50; /* +20 C */
1238 s->status = READY_STAT | SEEK_STAT;
1239 ide_set_irq(s->bus);
1243 if (s->drive_kind == IDE_CD)
1245 if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1247 if (!s->smart_enabled && s->feature != SMART_ENABLE)
1249 switch (s->feature) {
1251 s->smart_enabled = 0;
1252 s->status = READY_STAT | SEEK_STAT;
1253 ide_set_irq(s->bus);
1256 s->smart_enabled = 1;
1257 s->status = READY_STAT | SEEK_STAT;
1258 ide_set_irq(s->bus);
1260 case SMART_ATTR_AUTOSAVE:
1261 switch (s->sector) {
1263 s->smart_autosave = 0;
1266 s->smart_autosave = 1;
1271 s->status = READY_STAT | SEEK_STAT;
1272 ide_set_irq(s->bus);
1275 if (!s->smart_errors) {
1282 s->status = READY_STAT | SEEK_STAT;
1283 ide_set_irq(s->bus);
1285 case SMART_READ_THRESH:
1286 memset(s->io_buffer, 0, 0x200);
1287 s->io_buffer[0] = 0x01; /* smart struct version */
1288 for (n=0; n<30; n++) {
1289 if (smart_attributes[n][0] == 0)
1291 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1292 s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1294 for (n=0; n<511; n++) /* checksum */
1295 s->io_buffer[511] += s->io_buffer[n];
1296 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1297 s->status = READY_STAT | SEEK_STAT;
1298 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1299 ide_set_irq(s->bus);
1301 case SMART_READ_DATA:
1302 memset(s->io_buffer, 0, 0x200);
1303 s->io_buffer[0] = 0x01; /* smart struct version */
1304 for (n=0; n<30; n++) {
1305 if (smart_attributes[n][0] == 0) {
1309 for(i = 0; i < 11; i++) {
1310 s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1313 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1314 if (s->smart_selftest_count == 0) {
1315 s->io_buffer[363] = 0;
1318 s->smart_selftest_data[3 +
1319 (s->smart_selftest_count - 1) *
1322 s->io_buffer[364] = 0x20;
1323 s->io_buffer[365] = 0x01;
1324 /* offline data collection capacity: execute + self-test*/
1325 s->io_buffer[367] = (1<<4 | 1<<3 | 1);
1326 s->io_buffer[368] = 0x03; /* smart capability (1) */
1327 s->io_buffer[369] = 0x00; /* smart capability (2) */
1328 s->io_buffer[370] = 0x01; /* error logging supported */
1329 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1330 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1331 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1333 for (n=0; n<511; n++)
1334 s->io_buffer[511] += s->io_buffer[n];
1335 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1336 s->status = READY_STAT | SEEK_STAT;
1337 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1338 ide_set_irq(s->bus);
1340 case SMART_READ_LOG:
1341 switch (s->sector) {
1342 case 0x01: /* summary smart error log */
1343 memset(s->io_buffer, 0, 0x200);
1344 s->io_buffer[0] = 0x01;
1345 s->io_buffer[1] = 0x00; /* no error entries */
1346 s->io_buffer[452] = s->smart_errors & 0xff;
1347 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1349 for (n=0; n<511; n++)
1350 s->io_buffer[511] += s->io_buffer[n];
1351 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1353 case 0x06: /* smart self test log */
1354 memset(s->io_buffer, 0, 0x200);
1355 s->io_buffer[0] = 0x01;
1356 if (s->smart_selftest_count == 0) {
1357 s->io_buffer[508] = 0;
1359 s->io_buffer[508] = s->smart_selftest_count;
1360 for (n=2; n<506; n++)
1361 s->io_buffer[n] = s->smart_selftest_data[n];
1363 for (n=0; n<511; n++)
1364 s->io_buffer[511] += s->io_buffer[n];
1365 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1370 s->status = READY_STAT | SEEK_STAT;
1371 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1372 ide_set_irq(s->bus);
1374 case SMART_EXECUTE_OFFLINE:
1375 switch (s->sector) {
1376 case 0: /* off-line routine */
1377 case 1: /* short self test */
1378 case 2: /* extended self test */
1379 s->smart_selftest_count++;
1380 if(s->smart_selftest_count > 21)
1381 s->smart_selftest_count = 0;
1382 n = 2 + (s->smart_selftest_count - 1) * 24;
1383 s->smart_selftest_data[n] = s->sector;
1384 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1385 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1386 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1387 s->status = READY_STAT | SEEK_STAT;
1388 ide_set_irq(s->bus);
1400 ide_abort_command(s);
1401 ide_set_irq(s->bus);
1406 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1408 IDEBus *bus = opaque;
1409 IDEState *s = idebus_active_if(bus);
1414 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1415 //hob = s->select & (1 << 7);
1422 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1423 (s != bus->ifs && !s->bs))
1428 ret = s->hob_feature;
1431 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1434 ret = s->nsector & 0xff;
1436 ret = s->hob_nsector;
1439 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1444 ret = s->hob_sector;
1447 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1455 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1463 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1470 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1471 (s != bus->ifs && !s->bs))
1475 qemu_irq_lower(bus->irq);
1479 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1484 uint32_t ide_status_read(void *opaque, uint32_t addr)
1486 IDEBus *bus = opaque;
1487 IDEState *s = idebus_active_if(bus);
1490 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1491 (s != bus->ifs && !s->bs))
1496 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1501 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1503 IDEBus *bus = opaque;
1508 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1510 /* common for both drives */
1511 if (!(bus->cmd & IDE_CMD_RESET) &&
1512 (val & IDE_CMD_RESET)) {
1513 /* reset low to high */
1514 for(i = 0;i < 2; i++) {
1516 s->status = BUSY_STAT | SEEK_STAT;
1519 } else if ((bus->cmd & IDE_CMD_RESET) &&
1520 !(val & IDE_CMD_RESET)) {
1522 for(i = 0;i < 2; i++) {
1524 if (s->drive_kind == IDE_CD)
1525 s->status = 0x00; /* NOTE: READY is _not_ set */
1527 s->status = READY_STAT | SEEK_STAT;
1528 ide_set_signature(s);
1535 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1537 IDEBus *bus = opaque;
1538 IDEState *s = idebus_active_if(bus);
1541 /* PIO data access allowed only when DRQ bit is set */
1542 if (!(s->status & DRQ_STAT))
1546 *(uint16_t *)p = le16_to_cpu(val);
1549 if (p >= s->data_end)
1550 s->end_transfer_func(s);
1553 uint32_t ide_data_readw(void *opaque, uint32_t addr)
1555 IDEBus *bus = opaque;
1556 IDEState *s = idebus_active_if(bus);
1560 /* PIO data access allowed only when DRQ bit is set */
1561 if (!(s->status & DRQ_STAT))
1565 ret = cpu_to_le16(*(uint16_t *)p);
1568 if (p >= s->data_end)
1569 s->end_transfer_func(s);
1573 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1575 IDEBus *bus = opaque;
1576 IDEState *s = idebus_active_if(bus);
1579 /* PIO data access allowed only when DRQ bit is set */
1580 if (!(s->status & DRQ_STAT))
1584 *(uint32_t *)p = le32_to_cpu(val);
1587 if (p >= s->data_end)
1588 s->end_transfer_func(s);
1591 uint32_t ide_data_readl(void *opaque, uint32_t addr)
1593 IDEBus *bus = opaque;
1594 IDEState *s = idebus_active_if(bus);
1598 /* PIO data access allowed only when DRQ bit is set */
1599 if (!(s->status & DRQ_STAT))
1603 ret = cpu_to_le32(*(uint32_t *)p);
1606 if (p >= s->data_end)
1607 s->end_transfer_func(s);
1611 static void ide_dummy_transfer_stop(IDEState *s)
1613 s->data_ptr = s->io_buffer;
1614 s->data_end = s->io_buffer;
1615 s->io_buffer[0] = 0xff;
1616 s->io_buffer[1] = 0xff;
1617 s->io_buffer[2] = 0xff;
1618 s->io_buffer[3] = 0xff;
1621 static void ide_reset(IDEState *s)
1624 printf("ide: reset\n");
1626 if (s->drive_kind == IDE_CFATA)
1627 s->mult_sectors = 0;
1629 s->mult_sectors = MAX_MULT_SECTORS;
1646 s->status = READY_STAT | SEEK_STAT;
1650 /* ATAPI specific */
1653 s->cdrom_changed = 0;
1654 s->packet_transfer_size = 0;
1655 s->elementary_transfer_size = 0;
1656 s->io_buffer_index = 0;
1657 s->cd_sector_size = 0;
1660 s->io_buffer_size = 0;
1661 s->req_nb_sectors = 0;
1663 ide_set_signature(s);
1664 /* init the transfer handler so that 0xffff is returned on data
1666 s->end_transfer_func = ide_dummy_transfer_stop;
1667 ide_dummy_transfer_stop(s);
1668 s->media_changed = 0;
1671 void ide_bus_reset(IDEBus *bus)
1675 ide_reset(&bus->ifs[0]);
1676 ide_reset(&bus->ifs[1]);
1679 /* pending async DMA */
1680 if (bus->dma->aiocb) {
1682 printf("aio_cancel\n");
1684 bdrv_aio_cancel(bus->dma->aiocb);
1685 bus->dma->aiocb = NULL;
1688 /* reset dma provider too */
1689 bus->dma->ops->reset(bus->dma);
1692 int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1693 const char *version, const char *serial)
1695 int cylinders, heads, secs;
1696 uint64_t nb_sectors;
1699 s->drive_kind = kind;
1701 bdrv_get_geometry(bs, &nb_sectors);
1702 bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
1703 if (cylinders < 1 || cylinders > 16383) {
1704 error_report("cyls must be between 1 and 16383");
1707 if (heads < 1 || heads > 16) {
1708 error_report("heads must be between 1 and 16");
1711 if (secs < 1 || secs > 63) {
1712 error_report("secs must be between 1 and 63");
1715 s->cylinders = cylinders;
1718 s->nb_sectors = nb_sectors;
1719 /* The SMART values should be preserved across power cycles
1721 s->smart_enabled = 1;
1722 s->smart_autosave = 1;
1723 s->smart_errors = 0;
1724 s->smart_selftest_count = 0;
1725 if (kind == IDE_CD) {
1726 bdrv_set_change_cb(bs, cdrom_change_cb, s);
1727 bs->buffer_alignment = 2048;
1729 if (!bdrv_is_inserted(s->bs)) {
1730 error_report("Device needs media, but drive is empty");
1733 if (bdrv_is_read_only(bs)) {
1734 error_report("Can't use a read-only drive");
1739 strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
1741 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1742 "QM%05d", s->drive_serial);
1745 pstrcpy(s->version, sizeof(s->version), version);
1747 pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
1751 bdrv_set_removable(bs, s->drive_kind == IDE_CD);
1755 static void ide_init1(IDEBus *bus, int unit)
1757 static int drive_serial = 1;
1758 IDEState *s = &bus->ifs[unit];
1762 s->drive_serial = drive_serial++;
1763 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1764 s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4);
1765 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
1766 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
1767 s->sector_write_timer = qemu_new_timer_ns(vm_clock,
1768 ide_sector_write_timer_cb, s);
1771 static void ide_nop_start(IDEDMA *dma, IDEState *s,
1772 BlockDriverCompletionFunc *cb)
1776 static int ide_nop(IDEDMA *dma)
1781 static int ide_nop_int(IDEDMA *dma, int x)
1786 static void ide_nop_restart(void *opaque, int x, int y)
1790 static const IDEDMAOps ide_dma_nop_ops = {
1791 .start_dma = ide_nop_start,
1792 .start_transfer = ide_nop,
1793 .prepare_buf = ide_nop_int,
1794 .rw_buf = ide_nop_int,
1795 .set_unit = ide_nop_int,
1796 .add_status = ide_nop_int,
1797 .set_inactive = ide_nop,
1798 .restart_cb = ide_nop_restart,
1802 static IDEDMA ide_dma_nop = {
1803 .ops = &ide_dma_nop_ops,
1807 void ide_init2(IDEBus *bus, qemu_irq irq)
1811 for(i = 0; i < 2; i++) {
1813 ide_reset(&bus->ifs[i]);
1816 bus->dma = &ide_dma_nop;
1819 /* TODO convert users to qdev and remove */
1820 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
1821 DriveInfo *hd1, qemu_irq irq)
1826 for(i = 0; i < 2; i++) {
1827 dinfo = i == 0 ? hd0 : hd1;
1830 if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
1831 dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
1832 *dinfo->serial ? dinfo->serial : NULL) < 0) {
1833 error_report("Can't set up IDE drive %s", dinfo->id);
1837 ide_reset(&bus->ifs[i]);
1841 bus->dma = &ide_dma_nop;
1844 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
1846 register_ioport_write(iobase, 8, 1, ide_ioport_write, bus);
1847 register_ioport_read(iobase, 8, 1, ide_ioport_read, bus);
1849 register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
1850 register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
1854 register_ioport_write(iobase, 2, 2, ide_data_writew, bus);
1855 register_ioport_read(iobase, 2, 2, ide_data_readw, bus);
1856 register_ioport_write(iobase, 4, 4, ide_data_writel, bus);
1857 register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
1860 static bool is_identify_set(void *opaque, int version_id)
1862 IDEState *s = opaque;
1864 return s->identify_set != 0;
1867 static EndTransferFunc* transfer_end_table[] = {
1871 ide_atapi_cmd_reply_end,
1873 ide_dummy_transfer_stop,
1876 static int transfer_end_table_idx(EndTransferFunc *fn)
1880 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
1881 if (transfer_end_table[i] == fn)
1887 static int ide_drive_post_load(void *opaque, int version_id)
1889 IDEState *s = opaque;
1891 if (version_id < 3) {
1892 if (s->sense_key == SENSE_UNIT_ATTENTION &&
1893 s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
1894 s->cdrom_changed = 1;
1900 static int ide_drive_pio_post_load(void *opaque, int version_id)
1902 IDEState *s = opaque;
1904 if (s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) {
1907 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
1908 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
1909 s->data_end = s->data_ptr + s->cur_io_buffer_len;
1914 static void ide_drive_pio_pre_save(void *opaque)
1916 IDEState *s = opaque;
1919 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
1920 s->cur_io_buffer_len = s->data_end - s->data_ptr;
1922 idx = transfer_end_table_idx(s->end_transfer_func);
1924 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
1926 s->end_transfer_fn_idx = 2;
1928 s->end_transfer_fn_idx = idx;
1932 static bool ide_drive_pio_state_needed(void *opaque)
1934 IDEState *s = opaque;
1936 return ((s->status & DRQ_STAT) != 0)
1937 || (s->bus->error_status & BM_STATUS_PIO_RETRY);
1940 static bool ide_atapi_gesn_needed(void *opaque)
1942 IDEState *s = opaque;
1944 return s->events.new_media || s->events.eject_request;
1947 static bool ide_error_needed(void *opaque)
1949 IDEBus *bus = opaque;
1951 return (bus->error_status != 0);
1954 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
1955 const VMStateDescription vmstate_ide_atapi_gesn_state = {
1956 .name ="ide_drive/atapi/gesn_state",
1958 .minimum_version_id = 1,
1959 .minimum_version_id_old = 1,
1960 .fields = (VMStateField []) {
1961 VMSTATE_BOOL(events.new_media, IDEState),
1962 VMSTATE_BOOL(events.eject_request, IDEState),
1963 VMSTATE_END_OF_LIST()
1967 const VMStateDescription vmstate_ide_drive_pio_state = {
1968 .name = "ide_drive/pio_state",
1970 .minimum_version_id = 1,
1971 .minimum_version_id_old = 1,
1972 .pre_save = ide_drive_pio_pre_save,
1973 .post_load = ide_drive_pio_post_load,
1974 .fields = (VMStateField []) {
1975 VMSTATE_INT32(req_nb_sectors, IDEState),
1976 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
1977 vmstate_info_uint8, uint8_t),
1978 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
1979 VMSTATE_INT32(cur_io_buffer_len, IDEState),
1980 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
1981 VMSTATE_INT32(elementary_transfer_size, IDEState),
1982 VMSTATE_INT32(packet_transfer_size, IDEState),
1983 VMSTATE_END_OF_LIST()
1987 const VMStateDescription vmstate_ide_drive = {
1988 .name = "ide_drive",
1990 .minimum_version_id = 0,
1991 .minimum_version_id_old = 0,
1992 .post_load = ide_drive_post_load,
1993 .fields = (VMStateField []) {
1994 VMSTATE_INT32(mult_sectors, IDEState),
1995 VMSTATE_INT32(identify_set, IDEState),
1996 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
1997 VMSTATE_UINT8(feature, IDEState),
1998 VMSTATE_UINT8(error, IDEState),
1999 VMSTATE_UINT32(nsector, IDEState),
2000 VMSTATE_UINT8(sector, IDEState),
2001 VMSTATE_UINT8(lcyl, IDEState),
2002 VMSTATE_UINT8(hcyl, IDEState),
2003 VMSTATE_UINT8(hob_feature, IDEState),
2004 VMSTATE_UINT8(hob_sector, IDEState),
2005 VMSTATE_UINT8(hob_nsector, IDEState),
2006 VMSTATE_UINT8(hob_lcyl, IDEState),
2007 VMSTATE_UINT8(hob_hcyl, IDEState),
2008 VMSTATE_UINT8(select, IDEState),
2009 VMSTATE_UINT8(status, IDEState),
2010 VMSTATE_UINT8(lba48, IDEState),
2011 VMSTATE_UINT8(sense_key, IDEState),
2012 VMSTATE_UINT8(asc, IDEState),
2013 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2014 VMSTATE_END_OF_LIST()
2016 .subsections = (VMStateSubsection []) {
2018 .vmsd = &vmstate_ide_drive_pio_state,
2019 .needed = ide_drive_pio_state_needed,
2021 .vmsd = &vmstate_ide_atapi_gesn_state,
2022 .needed = ide_atapi_gesn_needed,
2029 const VMStateDescription vmstate_ide_error_status = {
2030 .name ="ide_bus/error",
2032 .minimum_version_id = 1,
2033 .minimum_version_id_old = 1,
2034 .fields = (VMStateField []) {
2035 VMSTATE_INT32(error_status, IDEBus),
2036 VMSTATE_END_OF_LIST()
2040 const VMStateDescription vmstate_ide_bus = {
2043 .minimum_version_id = 1,
2044 .minimum_version_id_old = 1,
2045 .fields = (VMStateField []) {
2046 VMSTATE_UINT8(cmd, IDEBus),
2047 VMSTATE_UINT8(unit, IDEBus),
2048 VMSTATE_END_OF_LIST()
2050 .subsections = (VMStateSubsection []) {
2052 .vmsd = &vmstate_ide_error_status,
2053 .needed = ide_error_needed,
2060 void ide_drive_get(DriveInfo **hd, int max_bus)
2064 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2065 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2069 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2070 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);