ide: add TRIM support
[qemu.git] / hw / ide / core.c
blobca17a436c03a4bcf1f2a3143cfc7660977f170ed
1 /*
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
23 * THE SOFTWARE.
25 #include <hw/hw.h>
26 #include <hw/pc.h>
27 #include <hw/pci.h>
28 #include "qemu-error.h"
29 #include "qemu-timer.h"
30 #include "sysemu.h"
31 #include "dma.h"
32 #include "blockdev.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},
42 /* spin up */
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},
48 /* power on hours */
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},
54 /* end of list */
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)
62 int i, v;
63 for(i = 0; i < len; i++) {
64 if (*src)
65 v = *src++;
66 else
67 v = ' ';
68 str[i^1] = v;
72 static void put_le16(uint16_t *p, unsigned int v)
74 *p = cpu_to_le16(v);
77 static void ide_identify(IDEState *s)
79 uint16_t *p;
80 unsigned int oldsize;
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));
85 return;
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);
104 #endif
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);
116 if (s->mult_sectors)
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 */
131 if (s->ncq_queues) {
132 put_le16(p + 75, s->ncq_queues - 1);
133 /* NCQ supported */
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);
148 else
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));
168 s->identify_set = 1;
171 static void ide_atapi_identify(IDEState *s)
173 uint16_t *p;
175 if (s->identify_set) {
176 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
177 return;
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) */
191 #ifdef USE_DMA_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 */
196 #else
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 */
200 #endif
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 */
210 if (s->ncq_queues) {
211 put_le16(p + 75, s->ncq_queues - 1);
212 /* NCQ supported */
213 put_le16(p + 76, (1 << 8));
216 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
217 #ifdef USE_DMA_CDROM
218 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
219 #endif
220 memcpy(s->identify_data, p, sizeof(s->identify_data));
221 s->identify_set = 1;
224 static void ide_cfata_identify(IDEState *s)
226 uint16_t *p;
227 uint32_t cur_sec;
229 p = (uint16_t *) s->identify_data;
230 if (s->identify_set)
231 goto fill_buffer;
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);
249 #else
250 put_le16(p + 47, 0x0000);
251 #endif
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 */
284 s->identify_set = 1;
286 fill_buffer:
287 memcpy(s->io_buffer, p, sizeof(s->identify_data));
290 static void ide_set_signature(IDEState *s)
292 s->select &= 0xf0; /* clear head */
293 /* put signature */
294 s->nsector = 1;
295 s->sector = 1;
296 if (s->drive_kind == IDE_CD) {
297 s->lcyl = 0x14;
298 s->hcyl = 0xeb;
299 } else if (s->bs) {
300 s->lcyl = 0;
301 s->hcyl = 0;
302 } else {
303 s->lcyl = 0xff;
304 s->hcyl = 0xff;
308 typedef struct TrimAIOCB {
309 BlockDriverAIOCB common;
310 QEMUBH *bh;
311 int ret;
312 } TrimAIOCB;
314 static void trim_aio_cancel(BlockDriverAIOCB *acb)
316 TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
318 qemu_bh_delete(iocb->bh);
319 iocb->bh = NULL;
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);
335 iocb->bh = NULL;
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)
344 TrimAIOCB *iocb;
345 int i, j, ret;
347 iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
348 iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
349 iocb->ret = 0;
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;
360 if (count == 0) {
361 break;
364 ret = bdrv_discard(bs, sector, count);
365 if (!iocb->ret) {
366 iocb->ret = ret;
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;
379 s->error = ABRT_ERR;
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;
387 s->data_ptr = buf;
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)
405 int64_t sector_num;
406 if (s->select & 0x40) {
407 /* lba */
408 if (!s->lba48) {
409 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
410 (s->lcyl << 8) | s->sector;
411 } else {
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;
418 } else {
419 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
420 (s->select & 0x0f) * s->sectors + (s->sector - 1);
422 return sector_num;
425 void ide_set_sector(IDEState *s, int64_t sector_num)
427 unsigned int cyl, r;
428 if (s->select & 0x40) {
429 if (!s->lba48) {
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);
434 } else {
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;
442 } else {
443 cyl = sector_num / (s->heads * s->sectors);
444 r = sector_num % (s->heads * s->sectors);
445 s->hcyl = cyl >> 8;
446 s->lcyl = cyl;
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);
454 ide_set_irq(s->bus);
457 void ide_sector_read(IDEState *s)
459 int64_t sector_num;
460 int ret, n;
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);
465 n = s->nsector;
466 if (n == 0) {
467 /* no more sector to read from disk */
468 ide_transfer_stop(s);
469 } else {
470 #if defined(DEBUG_IDE)
471 printf("read sector=%" PRId64 "\n", sector_num);
472 #endif
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);
476 if (ret != 0) {
477 if (ide_handle_rw_error(s, -ret,
478 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
480 return;
483 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
484 ide_set_irq(s->bus);
485 ide_set_sector(s, sector_num + n);
486 s->nsector -= 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);
504 s->error = ABRT_ERR;
505 s->status = READY_STAT | ERR_STAT;
506 ide_set_inactive(s);
507 ide_set_irq(s->bus);
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);
517 return 0;
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);
526 } else {
527 if (op & BM_STATUS_DMA_RETRY) {
528 dma_buf_commit(s, 0);
529 ide_dma_error(s);
530 } else {
531 ide_rw_error(s);
533 bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
536 return 1;
539 void ide_dma_cb(void *opaque, int ret)
541 IDEState *s = opaque;
542 int n;
543 int64_t sector_num;
545 handle_rw_error:
546 if (ret < 0) {
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)) {
555 return;
559 n = s->io_buffer_size >> 9;
560 sector_num = ide_get_sector(s);
561 if (n > 0) {
562 dma_buf_commit(s, ide_cmd_is_read(s));
563 sector_num += n;
564 ide_set_sector(s, sector_num);
565 s->nsector -= n;
568 /* end of transfer ? */
569 if (s->nsector == 0) {
570 s->status = READY_STAT | SEEK_STAT;
571 ide_set_irq(s->bus);
572 goto eot;
575 /* launch next transfer */
576 n = s->nsector;
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
581 * interrupt. */
582 goto eot;
585 #ifdef DEBUG_AIO
586 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
587 sector_num, n, s->dma_cmd);
588 #endif
590 switch (s->dma_cmd) {
591 case IDE_DMA_READ:
592 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
593 ide_dma_cb, s);
594 break;
595 case IDE_DMA_WRITE:
596 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
597 ide_dma_cb, s);
598 break;
599 case IDE_DMA_TRIM:
600 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
601 ide_issue_trim, ide_dma_cb, s, 1);
602 break;
605 if (!s->bus->dma->aiocb) {
606 ret = -1;
607 goto handle_rw_error;
609 return;
611 eot:
612 ide_set_inactive(s);
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;
627 ide_set_irq(s->bus);
630 void ide_sector_write(IDEState *s)
632 int64_t sector_num;
633 int ret, n, n1;
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);
639 #endif
640 n = s->nsector;
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);
645 if (ret != 0) {
646 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
647 return;
650 s->nsector -= n;
651 if (s->nsector == 0) {
652 /* no more sectors to write */
653 ide_transfer_stop(s);
654 } else {
655 n1 = s->nsector;
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
668 for normal use. */
669 qemu_mod_timer(s->sector_write_timer,
670 qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
671 } else {
672 ide_set_irq(s->bus);
676 static void ide_flush_cb(void *opaque, int ret)
678 IDEState *s = opaque;
680 if (ret < 0) {
681 /* XXX: What sector number to set here? */
682 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
683 return;
687 s->status = READY_STAT | SEEK_STAT;
688 ide_set_irq(s->bus);
691 void ide_flush_cache(IDEState *s)
693 BlockDriverAIOCB *acb;
695 if (s->bs == NULL) {
696 ide_flush_cb(s, 0);
697 return;
700 acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
701 if (acb == NULL) {
702 ide_flush_cb(s, -EIO);
706 static void ide_cfata_metadata_inquiry(IDEState *s)
708 uint16_t *p;
709 uint32_t spd;
711 p = (uint16_t *) s->io_buffer;
712 memset(p, 0, 0x200);
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)
726 uint16_t *p;
728 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
729 s->status = ERR_STAT;
730 s->error = ABRT_ERR;
731 return;
734 p = (uint16_t *) s->io_buffer;
735 memset(p, 0, 0x200);
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;
747 s->error = ABRT_ERR;
748 return;
751 s->media_changed = 0;
753 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
754 s->io_buffer + 2,
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;
763 uint64_t nb_sectors;
765 if (!(reason & CHANGE_MEDIA)) {
766 return;
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;
781 ide_set_irq(s->bus);
784 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
786 s->lba48 = 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
792 if (!s->lba48) {
793 if (!s->nsector)
794 s->nsector = 256;
795 } else {
796 if (!s->nsector && !s->hob_nsector)
797 s->nsector = 65536;
798 else {
799 int lo = s->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;
818 #ifdef DEBUG_IDE
819 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
820 #endif
822 addr &= 7;
824 /* ignore writes to command block while busy with previous command */
825 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
826 return;
828 switch(addr) {
829 case 0:
830 break;
831 case 1:
832 ide_clear_hob(bus);
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;
838 break;
839 case 2:
840 ide_clear_hob(bus);
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;
845 break;
846 case 3:
847 ide_clear_hob(bus);
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;
852 break;
853 case 4:
854 ide_clear_hob(bus);
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;
859 break;
860 case 5:
861 ide_clear_hob(bus);
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;
866 break;
867 case 6:
868 /* FIXME: HOB readback uses bit 7 */
869 bus->ifs[0].select = (val & ~0x10) | 0xa0;
870 bus->ifs[1].select = (val | 0x10) | 0xa0;
871 /* select drive */
872 bus->unit = (val >> 4) & 1;
873 break;
874 default:
875 case 7:
876 /* command */
877 ide_exec_cmd(bus, val);
878 break;
883 void ide_exec_cmd(IDEBus *bus, uint32_t val)
885 IDEState *s;
886 int n;
887 int lba48 = 0;
889 #if defined(DEBUG_IDE)
890 printf("ide: CMD=%02x\n", val);
891 #endif
892 s = idebus_active_if(bus);
893 /* ignore commands to non existant slave */
894 if (s != bus->ifs && !s->bs)
895 return;
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)
899 return;
901 switch(val) {
902 case WIN_DSM:
903 switch (s->feature) {
904 case DSM_TRIM:
905 if (!s->bs) {
906 goto abort_cmd;
908 ide_sector_start_dma(s, IDE_DMA_TRIM);
909 break;
910 default:
911 goto abort_cmd;
913 break;
914 case WIN_IDENTIFY:
915 if (s->bs && s->drive_kind != IDE_CD) {
916 if (s->drive_kind != IDE_CFATA)
917 ide_identify(s);
918 else
919 ide_cfata_identify(s);
920 s->status = READY_STAT | SEEK_STAT;
921 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
922 } else {
923 if (s->drive_kind == IDE_CD) {
924 ide_set_signature(s);
926 ide_abort_command(s);
928 ide_set_irq(s->bus);
929 break;
930 case WIN_SPECIFY:
931 case WIN_RECAL:
932 s->error = 0;
933 s->status = READY_STAT | SEEK_STAT;
934 ide_set_irq(s->bus);
935 break;
936 case WIN_SETMULT:
937 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
938 /* Disable Read and Write Multiple */
939 s->mult_sectors = 0;
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);
945 } else {
946 s->mult_sectors = s->nsector & 0xff;
947 s->status = READY_STAT | SEEK_STAT;
949 ide_set_irq(s->bus);
950 break;
951 case WIN_VERIFY_EXT:
952 lba48 = 1;
953 case WIN_VERIFY:
954 case WIN_VERIFY_ONCE:
955 /* do sector number check ? */
956 ide_cmd_lba48_transform(s, lba48);
957 s->status = READY_STAT | SEEK_STAT;
958 ide_set_irq(s->bus);
959 break;
960 case WIN_READ_EXT:
961 lba48 = 1;
962 case WIN_READ:
963 case WIN_READ_ONCE:
964 if (!s->bs)
965 goto abort_cmd;
966 ide_cmd_lba48_transform(s, lba48);
967 s->req_nb_sectors = 1;
968 ide_sector_read(s);
969 break;
970 case WIN_WRITE_EXT:
971 lba48 = 1;
972 case WIN_WRITE:
973 case WIN_WRITE_ONCE:
974 case CFA_WRITE_SECT_WO_ERASE:
975 case WIN_WRITE_VERIFY:
976 ide_cmd_lba48_transform(s, lba48);
977 s->error = 0;
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;
982 break;
983 case WIN_MULTREAD_EXT:
984 lba48 = 1;
985 case WIN_MULTREAD:
986 if (!s->mult_sectors)
987 goto abort_cmd;
988 ide_cmd_lba48_transform(s, lba48);
989 s->req_nb_sectors = s->mult_sectors;
990 ide_sector_read(s);
991 break;
992 case WIN_MULTWRITE_EXT:
993 lba48 = 1;
994 case WIN_MULTWRITE:
995 case CFA_WRITE_MULTI_WO_ERASE:
996 if (!s->mult_sectors)
997 goto abort_cmd;
998 ide_cmd_lba48_transform(s, lba48);
999 s->error = 0;
1000 s->status = SEEK_STAT | READY_STAT;
1001 s->req_nb_sectors = s->mult_sectors;
1002 n = s->nsector;
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;
1007 break;
1008 case WIN_READDMA_EXT:
1009 lba48 = 1;
1010 case WIN_READDMA:
1011 case WIN_READDMA_ONCE:
1012 if (!s->bs)
1013 goto abort_cmd;
1014 ide_cmd_lba48_transform(s, lba48);
1015 ide_sector_start_dma(s, IDE_DMA_READ);
1016 break;
1017 case WIN_WRITEDMA_EXT:
1018 lba48 = 1;
1019 case WIN_WRITEDMA:
1020 case WIN_WRITEDMA_ONCE:
1021 if (!s->bs)
1022 goto abort_cmd;
1023 ide_cmd_lba48_transform(s, lba48);
1024 ide_sector_start_dma(s, IDE_DMA_WRITE);
1025 s->media_changed = 1;
1026 break;
1027 case WIN_READ_NATIVE_MAX_EXT:
1028 lba48 = 1;
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);
1034 break;
1035 case WIN_CHECKPOWERMODE1:
1036 case WIN_CHECKPOWERMODE2:
1037 s->error = 0;
1038 s->nsector = 0xff; /* device active or idle */
1039 s->status = READY_STAT | SEEK_STAT;
1040 ide_set_irq(s->bus);
1041 break;
1042 case WIN_SETFEATURES:
1043 if (!s->bs)
1044 goto abort_cmd;
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);
1063 break;
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);
1074 break;
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);
1079 break;
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);
1084 break;
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)));
1089 break;
1090 default:
1091 goto abort_cmd;
1093 s->status = READY_STAT | SEEK_STAT;
1094 ide_set_irq(s->bus);
1095 break;
1097 default:
1098 goto abort_cmd;
1100 break;
1101 case WIN_FLUSH_CACHE:
1102 case WIN_FLUSH_CACHE_EXT:
1103 ide_flush_cache(s);
1104 break;
1105 case WIN_STANDBY:
1106 case WIN_STANDBY2:
1107 case WIN_STANDBYNOW1:
1108 case WIN_STANDBYNOW2:
1109 case WIN_IDLEIMMEDIATE:
1110 case CFA_IDLEIMMEDIATE:
1111 case WIN_SETIDLE1:
1112 case WIN_SETIDLE2:
1113 case WIN_SLEEPNOW1:
1114 case WIN_SLEEPNOW2:
1115 s->status = READY_STAT;
1116 ide_set_irq(s->bus);
1117 break;
1118 case WIN_SEEK:
1119 if(s->drive_kind == IDE_CD)
1120 goto abort_cmd;
1121 /* XXX: Check that seek is within bounds */
1122 s->status = READY_STAT | SEEK_STAT;
1123 ide_set_irq(s->bus);
1124 break;
1125 /* ATAPI commands */
1126 case WIN_PIDENTIFY:
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);
1131 } else {
1132 ide_abort_command(s);
1134 ide_set_irq(s->bus);
1135 break;
1136 case WIN_DIAGNOSE:
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. */
1142 else
1143 s->status = READY_STAT | SEEK_STAT;
1144 s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1145 * present.
1147 ide_set_irq(s->bus);
1148 break;
1149 case WIN_SRST:
1150 if (s->drive_kind != IDE_CD)
1151 goto abort_cmd;
1152 ide_set_signature(s);
1153 s->status = 0x00; /* NOTE: READY is _not_ set */
1154 s->error = 0x01;
1155 break;
1156 case WIN_PACKETCMD:
1157 if (s->drive_kind != IDE_CD)
1158 goto abort_cmd;
1159 /* overlapping commands not supported */
1160 if (s->feature & 0x02)
1161 goto abort_cmd;
1162 s->status = READY_STAT | SEEK_STAT;
1163 s->atapi_dma = s->feature & 1;
1164 s->nsector = 1;
1165 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1166 ide_atapi_cmd);
1167 break;
1168 /* CF-ATA commands */
1169 case CFA_REQ_EXT_ERROR_CODE:
1170 if (s->drive_kind != IDE_CFATA)
1171 goto abort_cmd;
1172 s->error = 0x09; /* miscellaneous error */
1173 s->status = READY_STAT | SEEK_STAT;
1174 ide_set_irq(s->bus);
1175 break;
1176 case CFA_ERASE_SECTORS:
1177 case CFA_WEAR_LEVEL:
1178 if (s->drive_kind != IDE_CFATA)
1179 goto abort_cmd;
1180 if (val == CFA_WEAR_LEVEL)
1181 s->nsector = 0;
1182 if (val == CFA_ERASE_SECTORS)
1183 s->media_changed = 1;
1184 s->error = 0x00;
1185 s->status = READY_STAT | SEEK_STAT;
1186 ide_set_irq(s->bus);
1187 break;
1188 case CFA_TRANSLATE_SECTOR:
1189 if (s->drive_kind != IDE_CFATA)
1190 goto abort_cmd;
1191 s->error = 0x00;
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);
1207 break;
1208 case CFA_ACCESS_METADATA_STORAGE:
1209 if (s->drive_kind != IDE_CFATA)
1210 goto abort_cmd;
1211 switch (s->feature) {
1212 case 0x02: /* Inquiry Metadata Storage */
1213 ide_cfata_metadata_inquiry(s);
1214 break;
1215 case 0x03: /* Read Metadata Storage */
1216 ide_cfata_metadata_read(s);
1217 break;
1218 case 0x04: /* Write Metadata Storage */
1219 ide_cfata_metadata_write(s);
1220 break;
1221 default:
1222 goto abort_cmd;
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);
1227 break;
1228 case IBM_SENSE_CONDITION:
1229 if (s->drive_kind != IDE_CFATA)
1230 goto abort_cmd;
1231 switch (s->feature) {
1232 case 0x01: /* sense temperature in device */
1233 s->nsector = 0x50; /* +20 C */
1234 break;
1235 default:
1236 goto abort_cmd;
1238 s->status = READY_STAT | SEEK_STAT;
1239 ide_set_irq(s->bus);
1240 break;
1242 case WIN_SMART:
1243 if (s->drive_kind == IDE_CD)
1244 goto abort_cmd;
1245 if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1246 goto abort_cmd;
1247 if (!s->smart_enabled && s->feature != SMART_ENABLE)
1248 goto abort_cmd;
1249 switch (s->feature) {
1250 case SMART_DISABLE:
1251 s->smart_enabled = 0;
1252 s->status = READY_STAT | SEEK_STAT;
1253 ide_set_irq(s->bus);
1254 break;
1255 case SMART_ENABLE:
1256 s->smart_enabled = 1;
1257 s->status = READY_STAT | SEEK_STAT;
1258 ide_set_irq(s->bus);
1259 break;
1260 case SMART_ATTR_AUTOSAVE:
1261 switch (s->sector) {
1262 case 0x00:
1263 s->smart_autosave = 0;
1264 break;
1265 case 0xf1:
1266 s->smart_autosave = 1;
1267 break;
1268 default:
1269 goto abort_cmd;
1271 s->status = READY_STAT | SEEK_STAT;
1272 ide_set_irq(s->bus);
1273 break;
1274 case SMART_STATUS:
1275 if (!s->smart_errors) {
1276 s->hcyl = 0xc2;
1277 s->lcyl = 0x4f;
1278 } else {
1279 s->hcyl = 0x2c;
1280 s->lcyl = 0xf4;
1282 s->status = READY_STAT | SEEK_STAT;
1283 ide_set_irq(s->bus);
1284 break;
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)
1290 break;
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);
1300 break;
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) {
1306 break;
1308 int i;
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;
1316 } else {
1317 s->io_buffer[363] =
1318 s->smart_selftest_data[3 +
1319 (s->smart_selftest_count - 1) *
1320 24];
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);
1339 break;
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];
1352 break;
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;
1358 } else {
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];
1366 break;
1367 default:
1368 goto abort_cmd;
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);
1373 break;
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);
1389 break;
1390 default:
1391 goto abort_cmd;
1393 break;
1394 default:
1395 goto abort_cmd;
1397 break;
1398 default:
1399 abort_cmd:
1400 ide_abort_command(s);
1401 ide_set_irq(s->bus);
1402 break;
1406 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1408 IDEBus *bus = opaque;
1409 IDEState *s = idebus_active_if(bus);
1410 uint32_t addr;
1411 int ret, hob;
1413 addr = addr1 & 7;
1414 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1415 //hob = s->select & (1 << 7);
1416 hob = 0;
1417 switch(addr) {
1418 case 0:
1419 ret = 0xff;
1420 break;
1421 case 1:
1422 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1423 (s != bus->ifs && !s->bs))
1424 ret = 0;
1425 else if (!hob)
1426 ret = s->error;
1427 else
1428 ret = s->hob_feature;
1429 break;
1430 case 2:
1431 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1432 ret = 0;
1433 else if (!hob)
1434 ret = s->nsector & 0xff;
1435 else
1436 ret = s->hob_nsector;
1437 break;
1438 case 3:
1439 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1440 ret = 0;
1441 else if (!hob)
1442 ret = s->sector;
1443 else
1444 ret = s->hob_sector;
1445 break;
1446 case 4:
1447 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1448 ret = 0;
1449 else if (!hob)
1450 ret = s->lcyl;
1451 else
1452 ret = s->hob_lcyl;
1453 break;
1454 case 5:
1455 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1456 ret = 0;
1457 else if (!hob)
1458 ret = s->hcyl;
1459 else
1460 ret = s->hob_hcyl;
1461 break;
1462 case 6:
1463 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1464 ret = 0;
1465 else
1466 ret = s->select;
1467 break;
1468 default:
1469 case 7:
1470 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1471 (s != bus->ifs && !s->bs))
1472 ret = 0;
1473 else
1474 ret = s->status;
1475 qemu_irq_lower(bus->irq);
1476 break;
1478 #ifdef DEBUG_IDE
1479 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1480 #endif
1481 return ret;
1484 uint32_t ide_status_read(void *opaque, uint32_t addr)
1486 IDEBus *bus = opaque;
1487 IDEState *s = idebus_active_if(bus);
1488 int ret;
1490 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1491 (s != bus->ifs && !s->bs))
1492 ret = 0;
1493 else
1494 ret = s->status;
1495 #ifdef DEBUG_IDE
1496 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1497 #endif
1498 return ret;
1501 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1503 IDEBus *bus = opaque;
1504 IDEState *s;
1505 int i;
1507 #ifdef DEBUG_IDE
1508 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1509 #endif
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++) {
1515 s = &bus->ifs[i];
1516 s->status = BUSY_STAT | SEEK_STAT;
1517 s->error = 0x01;
1519 } else if ((bus->cmd & IDE_CMD_RESET) &&
1520 !(val & IDE_CMD_RESET)) {
1521 /* high to low */
1522 for(i = 0;i < 2; i++) {
1523 s = &bus->ifs[i];
1524 if (s->drive_kind == IDE_CD)
1525 s->status = 0x00; /* NOTE: READY is _not_ set */
1526 else
1527 s->status = READY_STAT | SEEK_STAT;
1528 ide_set_signature(s);
1532 bus->cmd = val;
1535 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1537 IDEBus *bus = opaque;
1538 IDEState *s = idebus_active_if(bus);
1539 uint8_t *p;
1541 /* PIO data access allowed only when DRQ bit is set */
1542 if (!(s->status & DRQ_STAT))
1543 return;
1545 p = s->data_ptr;
1546 *(uint16_t *)p = le16_to_cpu(val);
1547 p += 2;
1548 s->data_ptr = p;
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);
1557 uint8_t *p;
1558 int ret;
1560 /* PIO data access allowed only when DRQ bit is set */
1561 if (!(s->status & DRQ_STAT))
1562 return 0;
1564 p = s->data_ptr;
1565 ret = cpu_to_le16(*(uint16_t *)p);
1566 p += 2;
1567 s->data_ptr = p;
1568 if (p >= s->data_end)
1569 s->end_transfer_func(s);
1570 return ret;
1573 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1575 IDEBus *bus = opaque;
1576 IDEState *s = idebus_active_if(bus);
1577 uint8_t *p;
1579 /* PIO data access allowed only when DRQ bit is set */
1580 if (!(s->status & DRQ_STAT))
1581 return;
1583 p = s->data_ptr;
1584 *(uint32_t *)p = le32_to_cpu(val);
1585 p += 4;
1586 s->data_ptr = p;
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);
1595 uint8_t *p;
1596 int ret;
1598 /* PIO data access allowed only when DRQ bit is set */
1599 if (!(s->status & DRQ_STAT))
1600 return 0;
1602 p = s->data_ptr;
1603 ret = cpu_to_le32(*(uint32_t *)p);
1604 p += 4;
1605 s->data_ptr = p;
1606 if (p >= s->data_end)
1607 s->end_transfer_func(s);
1608 return ret;
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)
1623 #ifdef DEBUG_IDE
1624 printf("ide: reset\n");
1625 #endif
1626 if (s->drive_kind == IDE_CFATA)
1627 s->mult_sectors = 0;
1628 else
1629 s->mult_sectors = MAX_MULT_SECTORS;
1630 /* ide regs */
1631 s->feature = 0;
1632 s->error = 0;
1633 s->nsector = 0;
1634 s->sector = 0;
1635 s->lcyl = 0;
1636 s->hcyl = 0;
1638 /* lba48 */
1639 s->hob_feature = 0;
1640 s->hob_sector = 0;
1641 s->hob_nsector = 0;
1642 s->hob_lcyl = 0;
1643 s->hob_hcyl = 0;
1645 s->select = 0xa0;
1646 s->status = READY_STAT | SEEK_STAT;
1648 s->lba48 = 0;
1650 /* ATAPI specific */
1651 s->sense_key = 0;
1652 s->asc = 0;
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;
1658 s->atapi_dma = 0;
1659 /* ATA DMA state */
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
1665 accesses */
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)
1673 bus->unit = 0;
1674 bus->cmd = 0;
1675 ide_reset(&bus->ifs[0]);
1676 ide_reset(&bus->ifs[1]);
1677 ide_clear_hob(bus);
1679 /* pending async DMA */
1680 if (bus->dma->aiocb) {
1681 #ifdef DEBUG_AIO
1682 printf("aio_cancel\n");
1683 #endif
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;
1698 s->bs = bs;
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");
1705 return -1;
1707 if (heads < 1 || heads > 16) {
1708 error_report("heads must be between 1 and 16");
1709 return -1;
1711 if (secs < 1 || secs > 63) {
1712 error_report("secs must be between 1 and 63");
1713 return -1;
1715 s->cylinders = cylinders;
1716 s->heads = heads;
1717 s->sectors = secs;
1718 s->nb_sectors = nb_sectors;
1719 /* The SMART values should be preserved across power cycles
1720 but they aren't. */
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;
1728 } else {
1729 if (!bdrv_is_inserted(s->bs)) {
1730 error_report("Device needs media, but drive is empty");
1731 return -1;
1733 if (bdrv_is_read_only(bs)) {
1734 error_report("Can't use a read-only drive");
1735 return -1;
1738 if (serial) {
1739 strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
1740 } else {
1741 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1742 "QM%05d", s->drive_serial);
1744 if (version) {
1745 pstrcpy(s->version, sizeof(s->version), version);
1746 } else {
1747 pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
1750 ide_reset(s);
1751 bdrv_set_removable(bs, s->drive_kind == IDE_CD);
1752 return 0;
1755 static void ide_init1(IDEBus *bus, int unit)
1757 static int drive_serial = 1;
1758 IDEState *s = &bus->ifs[unit];
1760 s->bus = bus;
1761 s->unit = 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)
1778 return 0;
1781 static int ide_nop_int(IDEDMA *dma, int x)
1783 return 0;
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,
1799 .reset = ide_nop,
1802 static IDEDMA ide_dma_nop = {
1803 .ops = &ide_dma_nop_ops,
1804 .aiocb = NULL,
1807 void ide_init2(IDEBus *bus, qemu_irq irq)
1809 int i;
1811 for(i = 0; i < 2; i++) {
1812 ide_init1(bus, i);
1813 ide_reset(&bus->ifs[i]);
1815 bus->irq = irq;
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)
1823 int i;
1824 DriveInfo *dinfo;
1826 for(i = 0; i < 2; i++) {
1827 dinfo = i == 0 ? hd0 : hd1;
1828 ide_init1(bus, i);
1829 if (dinfo) {
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);
1834 exit(1);
1836 } else {
1837 ide_reset(&bus->ifs[i]);
1840 bus->irq = irq;
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);
1848 if (iobase2) {
1849 register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
1850 register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
1853 /* data ports */
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[] = {
1868 ide_sector_read,
1869 ide_sector_write,
1870 ide_transfer_stop,
1871 ide_atapi_cmd_reply_end,
1872 ide_atapi_cmd,
1873 ide_dummy_transfer_stop,
1876 static int transfer_end_table_idx(EndTransferFunc *fn)
1878 int i;
1880 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
1881 if (transfer_end_table[i] == fn)
1882 return i;
1884 return -1;
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;
1897 return 0;
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)) {
1905 return -EINVAL;
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;
1911 return 0;
1914 static void ide_drive_pio_pre_save(void *opaque)
1916 IDEState *s = opaque;
1917 int idx;
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);
1923 if (idx == -1) {
1924 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
1925 __func__);
1926 s->end_transfer_fn_idx = 2;
1927 } else {
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",
1957 .version_id = 1,
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",
1969 .version_id = 1,
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",
1989 .version_id = 3,
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,
2020 }, {
2021 .vmsd = &vmstate_ide_atapi_gesn_state,
2022 .needed = ide_atapi_gesn_needed,
2023 }, {
2024 /* empty */
2029 const VMStateDescription vmstate_ide_error_status = {
2030 .name ="ide_bus/error",
2031 .version_id = 1,
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 = {
2041 .name = "ide_bus",
2042 .version_id = 1,
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,
2054 }, {
2055 /* empty */
2060 void ide_drive_get(DriveInfo **hd, int max_bus)
2062 int i;
2064 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2065 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2066 exit(1);
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);