|
|
1.1 root 1: /*
2: * QEMU IDE disk and CD/DVD-ROM Emulator
3: *
4: * Copyright (c) 2003 Fabrice Bellard
5: * Copyright (c) 2006 Openedhand Ltd.
6: *
7: * Permission is hereby granted, free of charge, to any person obtaining a copy
8: * of this software and associated documentation files (the "Software"), to deal
9: * in the Software without restriction, including without limitation the rights
10: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11: * copies of the Software, and to permit persons to whom the Software is
12: * furnished to do so, subject to the following conditions:
13: *
14: * The above copyright notice and this permission notice shall be included in
15: * all copies or substantial portions of the Software.
16: *
17: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23: * THE SOFTWARE.
24: */
25: #include <hw/hw.h>
26: #include <hw/pc.h>
27: #include <hw/pci.h>
1.1.1.7 ! root 28: #include <hw/isa.h>
1.1.1.4 root 29: #include "qemu-error.h"
1.1 root 30: #include "qemu-timer.h"
31: #include "sysemu.h"
32: #include "dma.h"
1.1.1.5 root 33: #include "blockdev.h"
1.1.1.7 ! root 34: #include "block_int.h"
1.1 root 35:
36: #include <hw/ide/internal.h>
37:
1.1.1.6 root 38: /* These values were based on a Seagate ST3500418AS but have been modified
39: to make more sense in QEMU */
40: static const int smart_attributes[][12] = {
41: /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
42: /* raw read error rate*/
43: { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
44: /* spin up */
45: { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
46: /* start stop count */
47: { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
48: /* remapped sectors */
49: { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
50: /* power on hours */
51: { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52: /* power cycle count */
53: { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
54: /* airflow-temperature-celsius */
55: { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
56: /* end of list */
57: { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
1.1 root 58: };
59:
60: static int ide_handle_rw_error(IDEState *s, int error, int op);
1.1.1.6 root 61: static void ide_dummy_transfer_stop(IDEState *s);
1.1 root 62:
63: static void padstr(char *str, const char *src, int len)
64: {
65: int i, v;
66: for(i = 0; i < len; i++) {
67: if (*src)
68: v = *src++;
69: else
70: v = ' ';
71: str[i^1] = v;
72: }
73: }
74:
75: static void put_le16(uint16_t *p, unsigned int v)
76: {
77: *p = cpu_to_le16(v);
78: }
79:
80: static void ide_identify(IDEState *s)
81: {
82: uint16_t *p;
83: unsigned int oldsize;
1.1.1.6 root 84: IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
1.1 root 85:
86: if (s->identify_set) {
87: memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
88: return;
89: }
90:
91: memset(s->io_buffer, 0, 512);
92: p = (uint16_t *)s->io_buffer;
93: put_le16(p + 0, 0x0040);
94: put_le16(p + 1, s->cylinders);
95: put_le16(p + 3, s->heads);
96: put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
97: put_le16(p + 5, 512); /* XXX: retired, remove ? */
98: put_le16(p + 6, s->sectors);
99: padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
100: put_le16(p + 20, 3); /* XXX: retired, remove ? */
101: put_le16(p + 21, 512); /* cache size in sectors */
102: put_le16(p + 22, 4); /* ecc bytes */
1.1.1.2 root 103: padstr((char *)(p + 23), s->version, 8); /* firmware version */
1.1 root 104: padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
105: #if MAX_MULT_SECTORS > 1
106: put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
107: #endif
108: put_le16(p + 48, 1); /* dword I/O */
109: put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
110: put_le16(p + 51, 0x200); /* PIO transfer cycle */
111: put_le16(p + 52, 0x200); /* DMA transfer cycle */
112: put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
113: put_le16(p + 54, s->cylinders);
114: put_le16(p + 55, s->heads);
115: put_le16(p + 56, s->sectors);
116: oldsize = s->cylinders * s->heads * s->sectors;
117: put_le16(p + 57, oldsize);
118: put_le16(p + 58, oldsize >> 16);
119: if (s->mult_sectors)
120: put_le16(p + 59, 0x100 | s->mult_sectors);
121: put_le16(p + 60, s->nb_sectors);
122: put_le16(p + 61, s->nb_sectors >> 16);
123: put_le16(p + 62, 0x07); /* single word dma0-2 supported */
124: put_le16(p + 63, 0x07); /* mdma0-2 supported */
1.1.1.5 root 125: put_le16(p + 64, 0x03); /* pio3-4 supported */
1.1 root 126: put_le16(p + 65, 120);
127: put_le16(p + 66, 120);
128: put_le16(p + 67, 120);
129: put_le16(p + 68, 120);
1.1.1.6 root 130: if (dev && dev->conf.discard_granularity) {
131: put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
132: }
1.1.1.5 root 133:
134: if (s->ncq_queues) {
135: put_le16(p + 75, s->ncq_queues - 1);
136: /* NCQ supported */
137: put_le16(p + 76, (1 << 8));
138: }
139:
1.1 root 140: put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
141: put_le16(p + 81, 0x16); /* conforms to ata5 */
1.1.1.5 root 142: /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
143: put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
1.1 root 144: /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
145: put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
146: /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
147: put_le16(p + 84, (1 << 14) | 0);
148: /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
149: if (bdrv_enable_write_cache(s->bs))
150: put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
151: else
152: put_le16(p + 85, (1 << 14) | 1);
153: /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
154: put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
155: /* 14=set to 1, 1=smart self test, 0=smart error logging */
156: put_le16(p + 87, (1 << 14) | 0);
157: put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
158: put_le16(p + 93, 1 | (1 << 14) | 0x2000);
159: put_le16(p + 100, s->nb_sectors);
160: put_le16(p + 101, s->nb_sectors >> 16);
161: put_le16(p + 102, s->nb_sectors >> 32);
162: put_le16(p + 103, s->nb_sectors >> 48);
1.1.1.6 root 163:
1.1.1.4 root 164: if (dev && dev->conf.physical_block_size)
165: put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
1.1.1.6 root 166: if (dev && dev->conf.discard_granularity) {
167: put_le16(p + 169, 1); /* TRIM support */
168: }
1.1 root 169:
170: memcpy(s->identify_data, p, sizeof(s->identify_data));
171: s->identify_set = 1;
172: }
173:
174: static void ide_atapi_identify(IDEState *s)
175: {
176: uint16_t *p;
177:
178: if (s->identify_set) {
179: memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
180: return;
181: }
182:
183: memset(s->io_buffer, 0, 512);
184: p = (uint16_t *)s->io_buffer;
185: /* Removable CDROM, 50us response, 12 byte packets */
186: put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
187: padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
188: put_le16(p + 20, 3); /* buffer type */
189: put_le16(p + 21, 512); /* cache size in sectors */
190: put_le16(p + 22, 4); /* ecc bytes */
1.1.1.2 root 191: padstr((char *)(p + 23), s->version, 8); /* firmware version */
1.1 root 192: padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
193: put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
194: #ifdef USE_DMA_CDROM
195: put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
196: put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
197: put_le16(p + 62, 7); /* single word dma0-2 supported */
198: put_le16(p + 63, 7); /* mdma0-2 supported */
199: #else
200: put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
201: put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
202: put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
203: #endif
1.1.1.5 root 204: put_le16(p + 64, 3); /* pio3-4 supported */
1.1 root 205: put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
206: put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
207: put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
208: put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
209:
210: put_le16(p + 71, 30); /* in ns */
211: put_le16(p + 72, 30); /* in ns */
212:
1.1.1.5 root 213: if (s->ncq_queues) {
214: put_le16(p + 75, s->ncq_queues - 1);
215: /* NCQ supported */
216: put_le16(p + 76, (1 << 8));
217: }
218:
1.1 root 219: put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
220: #ifdef USE_DMA_CDROM
221: put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
222: #endif
223: memcpy(s->identify_data, p, sizeof(s->identify_data));
224: s->identify_set = 1;
225: }
226:
227: static void ide_cfata_identify(IDEState *s)
228: {
229: uint16_t *p;
230: uint32_t cur_sec;
231:
232: p = (uint16_t *) s->identify_data;
233: if (s->identify_set)
234: goto fill_buffer;
235:
236: memset(p, 0, sizeof(s->identify_data));
237:
238: cur_sec = s->cylinders * s->heads * s->sectors;
239:
240: put_le16(p + 0, 0x848a); /* CF Storage Card signature */
241: put_le16(p + 1, s->cylinders); /* Default cylinders */
242: put_le16(p + 3, s->heads); /* Default heads */
243: put_le16(p + 6, s->sectors); /* Default sectors per track */
244: put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
245: put_le16(p + 8, s->nb_sectors); /* Sectors per card */
246: padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
247: put_le16(p + 22, 0x0004); /* ECC bytes */
1.1.1.2 root 248: padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
1.1 root 249: padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
250: #if MAX_MULT_SECTORS > 1
251: put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
252: #else
253: put_le16(p + 47, 0x0000);
254: #endif
255: put_le16(p + 49, 0x0f00); /* Capabilities */
256: put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
257: put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
258: put_le16(p + 53, 0x0003); /* Translation params valid */
259: put_le16(p + 54, s->cylinders); /* Current cylinders */
260: put_le16(p + 55, s->heads); /* Current heads */
261: put_le16(p + 56, s->sectors); /* Current sectors */
262: put_le16(p + 57, cur_sec); /* Current capacity */
263: put_le16(p + 58, cur_sec >> 16); /* Current capacity */
264: if (s->mult_sectors) /* Multiple sector setting */
265: put_le16(p + 59, 0x100 | s->mult_sectors);
266: put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
267: put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
268: put_le16(p + 63, 0x0203); /* Multiword DMA capability */
269: put_le16(p + 64, 0x0001); /* Flow Control PIO support */
270: put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
271: put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
272: put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
273: put_le16(p + 82, 0x400c); /* Command Set supported */
274: put_le16(p + 83, 0x7068); /* Command Set supported */
275: put_le16(p + 84, 0x4000); /* Features supported */
276: put_le16(p + 85, 0x000c); /* Command Set enabled */
277: put_le16(p + 86, 0x7044); /* Command Set enabled */
278: put_le16(p + 87, 0x4000); /* Features enabled */
279: put_le16(p + 91, 0x4060); /* Current APM level */
280: put_le16(p + 129, 0x0002); /* Current features option */
281: put_le16(p + 130, 0x0005); /* Reassigned sectors */
282: put_le16(p + 131, 0x0001); /* Initial power mode */
283: put_le16(p + 132, 0x0000); /* User signature */
284: put_le16(p + 160, 0x8100); /* Power requirement */
285: put_le16(p + 161, 0x8001); /* CF command set */
286:
287: s->identify_set = 1;
288:
289: fill_buffer:
290: memcpy(s->io_buffer, p, sizeof(s->identify_data));
291: }
292:
293: static void ide_set_signature(IDEState *s)
294: {
295: s->select &= 0xf0; /* clear head */
296: /* put signature */
297: s->nsector = 1;
298: s->sector = 1;
1.1.1.4 root 299: if (s->drive_kind == IDE_CD) {
1.1 root 300: s->lcyl = 0x14;
301: s->hcyl = 0xeb;
302: } else if (s->bs) {
303: s->lcyl = 0;
304: s->hcyl = 0;
305: } else {
306: s->lcyl = 0xff;
307: s->hcyl = 0xff;
308: }
309: }
310:
1.1.1.6 root 311: typedef struct TrimAIOCB {
312: BlockDriverAIOCB common;
313: QEMUBH *bh;
314: int ret;
315: } TrimAIOCB;
316:
317: static void trim_aio_cancel(BlockDriverAIOCB *acb)
318: {
319: TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
320:
321: qemu_bh_delete(iocb->bh);
322: iocb->bh = NULL;
323: qemu_aio_release(iocb);
324: }
325:
326: static AIOPool trim_aio_pool = {
327: .aiocb_size = sizeof(TrimAIOCB),
328: .cancel = trim_aio_cancel,
329: };
330:
331: static void ide_trim_bh_cb(void *opaque)
332: {
333: TrimAIOCB *iocb = opaque;
334:
335: iocb->common.cb(iocb->common.opaque, iocb->ret);
336:
337: qemu_bh_delete(iocb->bh);
338: iocb->bh = NULL;
339:
340: qemu_aio_release(iocb);
341: }
342:
343: BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
344: int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
345: BlockDriverCompletionFunc *cb, void *opaque)
346: {
347: TrimAIOCB *iocb;
348: int i, j, ret;
349:
350: iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
351: iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
352: iocb->ret = 0;
353:
354: for (j = 0; j < qiov->niov; j++) {
355: uint64_t *buffer = qiov->iov[j].iov_base;
356:
357: for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
358: /* 6-byte LBA + 2-byte range per entry */
359: uint64_t entry = le64_to_cpu(buffer[i]);
360: uint64_t sector = entry & 0x0000ffffffffffffULL;
361: uint16_t count = entry >> 48;
362:
363: if (count == 0) {
364: break;
365: }
366:
367: ret = bdrv_discard(bs, sector, count);
368: if (!iocb->ret) {
369: iocb->ret = ret;
370: }
371: }
372: }
373:
374: qemu_bh_schedule(iocb->bh);
375:
376: return &iocb->common;
377: }
378:
1.1 root 379: static inline void ide_abort_command(IDEState *s)
380: {
381: s->status = READY_STAT | ERR_STAT;
382: s->error = ABRT_ERR;
383: }
384:
385: /* prepare data transfer and tell what to do after */
1.1.1.6 root 386: void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
387: EndTransferFunc *end_transfer_func)
1.1 root 388: {
389: s->end_transfer_func = end_transfer_func;
390: s->data_ptr = buf;
391: s->data_end = buf + size;
1.1.1.5 root 392: if (!(s->status & ERR_STAT)) {
1.1 root 393: s->status |= DRQ_STAT;
1.1.1.5 root 394: }
395: s->bus->dma->ops->start_transfer(s->bus->dma);
1.1 root 396: }
397:
1.1.1.6 root 398: void ide_transfer_stop(IDEState *s)
1.1 root 399: {
400: s->end_transfer_func = ide_transfer_stop;
401: s->data_ptr = s->io_buffer;
402: s->data_end = s->io_buffer;
403: s->status &= ~DRQ_STAT;
404: }
405:
406: int64_t ide_get_sector(IDEState *s)
407: {
408: int64_t sector_num;
409: if (s->select & 0x40) {
410: /* lba */
411: if (!s->lba48) {
412: sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
413: (s->lcyl << 8) | s->sector;
414: } else {
415: sector_num = ((int64_t)s->hob_hcyl << 40) |
416: ((int64_t) s->hob_lcyl << 32) |
417: ((int64_t) s->hob_sector << 24) |
418: ((int64_t) s->hcyl << 16) |
419: ((int64_t) s->lcyl << 8) | s->sector;
420: }
421: } else {
422: sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
423: (s->select & 0x0f) * s->sectors + (s->sector - 1);
424: }
425: return sector_num;
426: }
427:
428: void ide_set_sector(IDEState *s, int64_t sector_num)
429: {
430: unsigned int cyl, r;
431: if (s->select & 0x40) {
432: if (!s->lba48) {
433: s->select = (s->select & 0xf0) | (sector_num >> 24);
434: s->hcyl = (sector_num >> 16);
435: s->lcyl = (sector_num >> 8);
436: s->sector = (sector_num);
437: } else {
438: s->sector = sector_num;
439: s->lcyl = sector_num >> 8;
440: s->hcyl = sector_num >> 16;
441: s->hob_sector = sector_num >> 24;
442: s->hob_lcyl = sector_num >> 32;
443: s->hob_hcyl = sector_num >> 40;
444: }
445: } else {
446: cyl = sector_num / (s->heads * s->sectors);
447: r = sector_num % (s->heads * s->sectors);
448: s->hcyl = cyl >> 8;
449: s->lcyl = cyl;
450: s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
451: s->sector = (r % s->sectors) + 1;
452: }
453: }
454:
455: static void ide_rw_error(IDEState *s) {
456: ide_abort_command(s);
457: ide_set_irq(s->bus);
458: }
459:
1.1.1.5 root 460: void ide_sector_read(IDEState *s)
1.1 root 461: {
462: int64_t sector_num;
463: int ret, n;
464:
465: s->status = READY_STAT | SEEK_STAT;
466: s->error = 0; /* not needed by IDE spec, but needed by Windows */
467: sector_num = ide_get_sector(s);
468: n = s->nsector;
469: if (n == 0) {
470: /* no more sector to read from disk */
471: ide_transfer_stop(s);
472: } else {
473: #if defined(DEBUG_IDE)
474: printf("read sector=%" PRId64 "\n", sector_num);
475: #endif
476: if (n > s->req_nb_sectors)
477: n = s->req_nb_sectors;
1.1.1.7 ! root 478:
! 479: bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
1.1 root 480: ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
1.1.1.7 ! root 481: bdrv_acct_done(s->bs, &s->acct);
1.1 root 482: if (ret != 0) {
483: if (ide_handle_rw_error(s, -ret,
484: BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
485: {
486: return;
487: }
488: }
489: ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
490: ide_set_irq(s->bus);
491: ide_set_sector(s, sector_num + n);
492: s->nsector -= n;
493: }
494: }
495:
1.1.1.5 root 496: static void dma_buf_commit(IDEState *s, int is_write)
1.1 root 497: {
1.1.1.5 root 498: qemu_sglist_destroy(&s->sg);
1.1 root 499: }
500:
1.1.1.6 root 501: void ide_set_inactive(IDEState *s)
1.1 root 502: {
1.1.1.5 root 503: s->bus->dma->aiocb = NULL;
504: s->bus->dma->ops->set_inactive(s->bus->dma);
1.1 root 505: }
506:
507: void ide_dma_error(IDEState *s)
508: {
509: ide_transfer_stop(s);
510: s->error = ABRT_ERR;
511: s->status = READY_STAT | ERR_STAT;
1.1.1.5 root 512: ide_set_inactive(s);
1.1 root 513: ide_set_irq(s->bus);
514: }
515:
516: static int ide_handle_rw_error(IDEState *s, int error, int op)
517: {
518: int is_read = (op & BM_STATUS_RETRY_READ);
1.1.1.4 root 519: BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
1.1 root 520:
1.1.1.4 root 521: if (action == BLOCK_ERR_IGNORE) {
522: bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
1.1 root 523: return 0;
1.1.1.4 root 524: }
1.1 root 525:
526: if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
527: || action == BLOCK_ERR_STOP_ANY) {
1.1.1.5 root 528: s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
1.1.1.6 root 529: s->bus->error_status = op;
1.1.1.4 root 530: bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
1.1.1.7 ! root 531: vm_stop(RUN_STATE_IO_ERROR);
! 532: bdrv_iostatus_set_err(s->bs, error);
1.1 root 533: } else {
534: if (op & BM_STATUS_DMA_RETRY) {
535: dma_buf_commit(s, 0);
536: ide_dma_error(s);
537: } else {
538: ide_rw_error(s);
539: }
1.1.1.4 root 540: bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
1.1 root 541: }
542:
543: return 1;
544: }
545:
1.1.1.5 root 546: void ide_dma_cb(void *opaque, int ret)
1.1 root 547: {
1.1.1.5 root 548: IDEState *s = opaque;
1.1 root 549: int n;
550: int64_t sector_num;
551:
1.1.1.5 root 552: handle_rw_error:
1.1 root 553: if (ret < 0) {
1.1.1.5 root 554: int op = BM_STATUS_DMA_RETRY;
555:
1.1.1.6 root 556: if (s->dma_cmd == IDE_DMA_READ)
1.1.1.5 root 557: op |= BM_STATUS_RETRY_READ;
1.1.1.6 root 558: else if (s->dma_cmd == IDE_DMA_TRIM)
559: op |= BM_STATUS_RETRY_TRIM;
560:
1.1.1.5 root 561: if (ide_handle_rw_error(s, -ret, op)) {
1.1 root 562: return;
563: }
564: }
565:
566: n = s->io_buffer_size >> 9;
567: sector_num = ide_get_sector(s);
568: if (n > 0) {
1.1.1.6 root 569: dma_buf_commit(s, ide_cmd_is_read(s));
1.1 root 570: sector_num += n;
571: ide_set_sector(s, sector_num);
572: s->nsector -= n;
573: }
574:
575: /* end of transfer ? */
576: if (s->nsector == 0) {
577: s->status = READY_STAT | SEEK_STAT;
578: ide_set_irq(s->bus);
1.1.1.5 root 579: goto eot;
1.1 root 580: }
581:
582: /* launch next transfer */
583: n = s->nsector;
584: s->io_buffer_index = 0;
585: s->io_buffer_size = n * 512;
1.1.1.6 root 586: if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
587: /* The PRDs were too short. Reset the Active bit, but don't raise an
588: * interrupt. */
1.1 root 589: goto eot;
1.1.1.6 root 590: }
1.1.1.5 root 591:
1.1 root 592: #ifdef DEBUG_AIO
1.1.1.6 root 593: printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
594: sector_num, n, s->dma_cmd);
1.1 root 595: #endif
1.1.1.5 root 596:
1.1.1.6 root 597: switch (s->dma_cmd) {
598: case IDE_DMA_READ:
1.1.1.5 root 599: s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
600: ide_dma_cb, s);
1.1.1.6 root 601: break;
602: case IDE_DMA_WRITE:
1.1.1.5 root 603: s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
604: ide_dma_cb, s);
1.1.1.6 root 605: break;
606: case IDE_DMA_TRIM:
607: s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
1.1.1.7 ! root 608: ide_issue_trim, ide_dma_cb, s, true);
1.1.1.6 root 609: break;
1.1.1.5 root 610: }
611:
612: if (!s->bus->dma->aiocb) {
613: ret = -1;
614: goto handle_rw_error;
615: }
616: return;
617:
618: eot:
1.1.1.7 ! root 619: if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
! 620: bdrv_acct_done(s->bs, &s->acct);
! 621: }
! 622: ide_set_inactive(s);
1.1 root 623: }
624:
1.1.1.6 root 625: static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
1.1 root 626: {
627: s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
628: s->io_buffer_index = 0;
629: s->io_buffer_size = 0;
1.1.1.6 root 630: s->dma_cmd = dma_cmd;
1.1.1.7 ! root 631:
! 632: switch (dma_cmd) {
! 633: case IDE_DMA_READ:
! 634: bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
! 635: BDRV_ACCT_READ);
! 636: break;
! 637: case IDE_DMA_WRITE:
! 638: bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
! 639: BDRV_ACCT_WRITE);
! 640: break;
! 641: default:
! 642: break;
! 643: }
! 644:
1.1.1.5 root 645: s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
1.1 root 646: }
647:
648: static void ide_sector_write_timer_cb(void *opaque)
649: {
650: IDEState *s = opaque;
651: ide_set_irq(s->bus);
652: }
653:
1.1.1.5 root 654: void ide_sector_write(IDEState *s)
1.1 root 655: {
656: int64_t sector_num;
657: int ret, n, n1;
658:
659: s->status = READY_STAT | SEEK_STAT;
660: sector_num = ide_get_sector(s);
661: #if defined(DEBUG_IDE)
662: printf("write sector=%" PRId64 "\n", sector_num);
663: #endif
664: n = s->nsector;
665: if (n > s->req_nb_sectors)
666: n = s->req_nb_sectors;
1.1.1.7 ! root 667:
! 668: bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
1.1 root 669: ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
1.1.1.7 ! root 670: bdrv_acct_done(s->bs, &s->acct);
1.1 root 671:
672: if (ret != 0) {
673: if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
674: return;
675: }
676:
677: s->nsector -= n;
678: if (s->nsector == 0) {
679: /* no more sectors to write */
680: ide_transfer_stop(s);
681: } else {
682: n1 = s->nsector;
683: if (n1 > s->req_nb_sectors)
684: n1 = s->req_nb_sectors;
685: ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
686: }
687: ide_set_sector(s, sector_num + n);
688:
689: if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
690: /* It seems there is a bug in the Windows 2000 installer HDD
691: IDE driver which fills the disk with empty logs when the
692: IDE write IRQ comes too early. This hack tries to correct
693: that at the expense of slower write performances. Use this
694: option _only_ to install Windows 2000. You must disable it
695: for normal use. */
1.1.1.4 root 696: qemu_mod_timer(s->sector_write_timer,
1.1.1.6 root 697: qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
1.1.1.4 root 698: } else {
1.1 root 699: ide_set_irq(s->bus);
700: }
701: }
702:
703: static void ide_flush_cb(void *opaque, int ret)
704: {
705: IDEState *s = opaque;
706:
1.1.1.5 root 707: if (ret < 0) {
708: /* XXX: What sector number to set here? */
709: if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
710: return;
711: }
712: }
1.1 root 713:
1.1.1.7 ! root 714: bdrv_acct_done(s->bs, &s->acct);
1.1 root 715: s->status = READY_STAT | SEEK_STAT;
716: ide_set_irq(s->bus);
717: }
718:
1.1.1.5 root 719: void ide_flush_cache(IDEState *s)
720: {
721: BlockDriverAIOCB *acb;
722:
723: if (s->bs == NULL) {
724: ide_flush_cb(s, 0);
725: return;
726: }
727:
1.1.1.7 ! root 728: bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
1.1.1.5 root 729: acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
730: if (acb == NULL) {
731: ide_flush_cb(s, -EIO);
732: }
733: }
734:
1.1 root 735: static void ide_cfata_metadata_inquiry(IDEState *s)
736: {
737: uint16_t *p;
738: uint32_t spd;
739:
740: p = (uint16_t *) s->io_buffer;
741: memset(p, 0, 0x200);
742: spd = ((s->mdata_size - 1) >> 9) + 1;
743:
744: put_le16(p + 0, 0x0001); /* Data format revision */
745: put_le16(p + 1, 0x0000); /* Media property: silicon */
746: put_le16(p + 2, s->media_changed); /* Media status */
747: put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
748: put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
749: put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
750: put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
751: }
752:
753: static void ide_cfata_metadata_read(IDEState *s)
754: {
755: uint16_t *p;
756:
757: if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
758: s->status = ERR_STAT;
759: s->error = ABRT_ERR;
760: return;
761: }
762:
763: p = (uint16_t *) s->io_buffer;
764: memset(p, 0, 0x200);
765:
766: put_le16(p + 0, s->media_changed); /* Media status */
767: memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
768: MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
769: s->nsector << 9), 0x200 - 2));
770: }
771:
772: static void ide_cfata_metadata_write(IDEState *s)
773: {
774: if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
775: s->status = ERR_STAT;
776: s->error = ABRT_ERR;
777: return;
778: }
779:
780: s->media_changed = 0;
781:
782: memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
783: s->io_buffer + 2,
784: MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
785: s->nsector << 9), 0x200 - 2));
786: }
787:
788: /* called when the inserted state of the media has changed */
1.1.1.7 ! root 789: static void ide_cd_change_cb(void *opaque, bool load)
1.1 root 790: {
791: IDEState *s = opaque;
792: uint64_t nb_sectors;
793:
1.1.1.7 ! root 794: s->tray_open = !load;
1.1 root 795: bdrv_get_geometry(s->bs, &nb_sectors);
796: s->nb_sectors = nb_sectors;
797:
1.1.1.6 root 798: /*
799: * First indicate to the guest that a CD has been removed. That's
800: * done on the next command the guest sends us.
801: *
1.1.1.7 ! root 802: * Then we set UNIT_ATTENTION, by which the guest will
1.1.1.6 root 803: * detect a new CD in the drive. See ide_atapi_cmd() for details.
804: */
1.1 root 805: s->cdrom_changed = 1;
1.1.1.6 root 806: s->events.new_media = true;
1.1.1.7 ! root 807: s->events.eject_request = false;
! 808: ide_set_irq(s->bus);
! 809: }
! 810:
! 811: static void ide_cd_eject_request_cb(void *opaque, bool force)
! 812: {
! 813: IDEState *s = opaque;
! 814:
! 815: s->events.eject_request = true;
! 816: if (force) {
! 817: s->tray_locked = false;
! 818: }
1.1 root 819: ide_set_irq(s->bus);
820: }
821:
822: static void ide_cmd_lba48_transform(IDEState *s, int lba48)
823: {
824: s->lba48 = lba48;
825:
826: /* handle the 'magic' 0 nsector count conversion here. to avoid
827: * fiddling with the rest of the read logic, we just store the
828: * full sector count in ->nsector and ignore ->hob_nsector from now
829: */
830: if (!s->lba48) {
831: if (!s->nsector)
832: s->nsector = 256;
833: } else {
834: if (!s->nsector && !s->hob_nsector)
835: s->nsector = 65536;
836: else {
837: int lo = s->nsector;
838: int hi = s->hob_nsector;
839:
840: s->nsector = (hi << 8) | lo;
841: }
842: }
843: }
844:
845: static void ide_clear_hob(IDEBus *bus)
846: {
847: /* any write clears HOB high bit of device control register */
848: bus->ifs[0].select &= ~(1 << 7);
849: bus->ifs[1].select &= ~(1 << 7);
850: }
851:
852: void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
853: {
854: IDEBus *bus = opaque;
855:
856: #ifdef DEBUG_IDE
857: printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
858: #endif
859:
860: addr &= 7;
861:
862: /* ignore writes to command block while busy with previous command */
863: if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
864: return;
865:
866: switch(addr) {
867: case 0:
868: break;
869: case 1:
870: ide_clear_hob(bus);
871: /* NOTE: data is written to the two drives */
872: bus->ifs[0].hob_feature = bus->ifs[0].feature;
873: bus->ifs[1].hob_feature = bus->ifs[1].feature;
874: bus->ifs[0].feature = val;
875: bus->ifs[1].feature = val;
876: break;
877: case 2:
878: ide_clear_hob(bus);
879: bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
880: bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
881: bus->ifs[0].nsector = val;
882: bus->ifs[1].nsector = val;
883: break;
884: case 3:
885: ide_clear_hob(bus);
886: bus->ifs[0].hob_sector = bus->ifs[0].sector;
887: bus->ifs[1].hob_sector = bus->ifs[1].sector;
888: bus->ifs[0].sector = val;
889: bus->ifs[1].sector = val;
890: break;
891: case 4:
892: ide_clear_hob(bus);
893: bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
894: bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
895: bus->ifs[0].lcyl = val;
896: bus->ifs[1].lcyl = val;
897: break;
898: case 5:
899: ide_clear_hob(bus);
900: bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
901: bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
902: bus->ifs[0].hcyl = val;
903: bus->ifs[1].hcyl = val;
904: break;
905: case 6:
906: /* FIXME: HOB readback uses bit 7 */
907: bus->ifs[0].select = (val & ~0x10) | 0xa0;
908: bus->ifs[1].select = (val | 0x10) | 0xa0;
909: /* select drive */
910: bus->unit = (val >> 4) & 1;
911: break;
912: default:
913: case 7:
914: /* command */
1.1.1.5 root 915: ide_exec_cmd(bus, val);
916: break;
917: }
918: }
919:
1.1.1.7 ! root 920: #define HD_OK (1u << IDE_HD)
! 921: #define CD_OK (1u << IDE_CD)
! 922: #define CFA_OK (1u << IDE_CFATA)
! 923: #define HD_CFA_OK (HD_OK | CFA_OK)
! 924: #define ALL_OK (HD_OK | CD_OK | CFA_OK)
! 925:
! 926: /* See ACS-2 T13/2015-D Table B.2 Command codes */
! 927: static const uint8_t ide_cmd_table[0x100] = {
! 928: /* NOP not implemented, mandatory for CD */
! 929: [CFA_REQ_EXT_ERROR_CODE] = CFA_OK,
! 930: [WIN_DSM] = ALL_OK,
! 931: [WIN_DEVICE_RESET] = CD_OK,
! 932: [WIN_RECAL] = HD_CFA_OK,
! 933: [WIN_READ] = ALL_OK,
! 934: [WIN_READ_ONCE] = ALL_OK,
! 935: [WIN_READ_EXT] = HD_CFA_OK,
! 936: [WIN_READDMA_EXT] = HD_CFA_OK,
! 937: [WIN_READ_NATIVE_MAX_EXT] = HD_CFA_OK,
! 938: [WIN_MULTREAD_EXT] = HD_CFA_OK,
! 939: [WIN_WRITE] = HD_CFA_OK,
! 940: [WIN_WRITE_ONCE] = HD_CFA_OK,
! 941: [WIN_WRITE_EXT] = HD_CFA_OK,
! 942: [WIN_WRITEDMA_EXT] = HD_CFA_OK,
! 943: [CFA_WRITE_SECT_WO_ERASE] = CFA_OK,
! 944: [WIN_MULTWRITE_EXT] = HD_CFA_OK,
! 945: [WIN_WRITE_VERIFY] = HD_CFA_OK,
! 946: [WIN_VERIFY] = HD_CFA_OK,
! 947: [WIN_VERIFY_ONCE] = HD_CFA_OK,
! 948: [WIN_VERIFY_EXT] = HD_CFA_OK,
! 949: [WIN_SEEK] = HD_CFA_OK,
! 950: [CFA_TRANSLATE_SECTOR] = CFA_OK,
! 951: [WIN_DIAGNOSE] = ALL_OK,
! 952: [WIN_SPECIFY] = HD_CFA_OK,
! 953: [WIN_STANDBYNOW2] = ALL_OK,
! 954: [WIN_IDLEIMMEDIATE2] = ALL_OK,
! 955: [WIN_STANDBY2] = ALL_OK,
! 956: [WIN_SETIDLE2] = ALL_OK,
! 957: [WIN_CHECKPOWERMODE2] = ALL_OK,
! 958: [WIN_SLEEPNOW2] = ALL_OK,
! 959: [WIN_PACKETCMD] = CD_OK,
! 960: [WIN_PIDENTIFY] = CD_OK,
! 961: [WIN_SMART] = HD_CFA_OK,
! 962: [CFA_ACCESS_METADATA_STORAGE] = CFA_OK,
! 963: [CFA_ERASE_SECTORS] = CFA_OK,
! 964: [WIN_MULTREAD] = HD_CFA_OK,
! 965: [WIN_MULTWRITE] = HD_CFA_OK,
! 966: [WIN_SETMULT] = HD_CFA_OK,
! 967: [WIN_READDMA] = HD_CFA_OK,
! 968: [WIN_READDMA_ONCE] = HD_CFA_OK,
! 969: [WIN_WRITEDMA] = HD_CFA_OK,
! 970: [WIN_WRITEDMA_ONCE] = HD_CFA_OK,
! 971: [CFA_WRITE_MULTI_WO_ERASE] = CFA_OK,
! 972: [WIN_STANDBYNOW1] = ALL_OK,
! 973: [WIN_IDLEIMMEDIATE] = ALL_OK,
! 974: [WIN_STANDBY] = ALL_OK,
! 975: [WIN_SETIDLE1] = ALL_OK,
! 976: [WIN_CHECKPOWERMODE1] = ALL_OK,
! 977: [WIN_SLEEPNOW1] = ALL_OK,
! 978: [WIN_FLUSH_CACHE] = ALL_OK,
! 979: [WIN_FLUSH_CACHE_EXT] = HD_CFA_OK,
! 980: [WIN_IDENTIFY] = ALL_OK,
! 981: [WIN_SETFEATURES] = ALL_OK,
! 982: [IBM_SENSE_CONDITION] = CFA_OK,
! 983: [CFA_WEAR_LEVEL] = CFA_OK,
! 984: [WIN_READ_NATIVE_MAX] = ALL_OK,
! 985: };
! 986:
! 987: static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
! 988: {
! 989: return cmd < ARRAY_SIZE(ide_cmd_table)
! 990: && (ide_cmd_table[cmd] & (1u << s->drive_kind));
! 991: }
1.1.1.5 root 992:
993: void ide_exec_cmd(IDEBus *bus, uint32_t val)
994: {
995: IDEState *s;
996: int n;
997: int lba48 = 0;
998:
1.1 root 999: #if defined(DEBUG_IDE)
1.1.1.5 root 1000: printf("ide: CMD=%02x\n", val);
1.1 root 1001: #endif
1.1.1.5 root 1002: s = idebus_active_if(bus);
1003: /* ignore commands to non existant slave */
1004: if (s != bus->ifs && !s->bs)
1005: return;
1.1 root 1006:
1.1.1.5 root 1007: /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1008: if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1009: return;
1.1 root 1010:
1.1.1.7 ! root 1011: if (!ide_cmd_permitted(s, val)) {
! 1012: goto abort_cmd;
! 1013: }
! 1014:
1.1.1.5 root 1015: switch(val) {
1.1.1.6 root 1016: case WIN_DSM:
1017: switch (s->feature) {
1018: case DSM_TRIM:
1019: if (!s->bs) {
1020: goto abort_cmd;
1021: }
1022: ide_sector_start_dma(s, IDE_DMA_TRIM);
1023: break;
1024: default:
1025: goto abort_cmd;
1026: }
1027: break;
1.1.1.5 root 1028: case WIN_IDENTIFY:
1029: if (s->bs && s->drive_kind != IDE_CD) {
1030: if (s->drive_kind != IDE_CFATA)
1031: ide_identify(s);
1032: else
1033: ide_cfata_identify(s);
1.1 root 1034: s->status = READY_STAT | SEEK_STAT;
1.1.1.5 root 1035: ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1036: } else {
1037: if (s->drive_kind == IDE_CD) {
1038: ide_set_signature(s);
1.1 root 1039: }
1.1.1.5 root 1040: ide_abort_command(s);
1041: }
1042: ide_set_irq(s->bus);
1043: break;
1044: case WIN_SPECIFY:
1045: case WIN_RECAL:
1046: s->error = 0;
1047: s->status = READY_STAT | SEEK_STAT;
1048: ide_set_irq(s->bus);
1049: break;
1050: case WIN_SETMULT:
1051: if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1052: /* Disable Read and Write Multiple */
1053: s->mult_sectors = 0;
1.1 root 1054: s->status = READY_STAT | SEEK_STAT;
1.1.1.5 root 1055: } else if ((s->nsector & 0xff) != 0 &&
1056: ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1057: (s->nsector & (s->nsector - 1)) != 0)) {
1058: ide_abort_command(s);
1059: } else {
1060: s->mult_sectors = s->nsector & 0xff;
1061: s->status = READY_STAT | SEEK_STAT;
1062: }
1063: ide_set_irq(s->bus);
1064: break;
1065: case WIN_VERIFY_EXT:
1066: lba48 = 1;
1067: case WIN_VERIFY:
1068: case WIN_VERIFY_ONCE:
1069: /* do sector number check ? */
1070: ide_cmd_lba48_transform(s, lba48);
1071: s->status = READY_STAT | SEEK_STAT;
1072: ide_set_irq(s->bus);
1073: break;
1.1.1.7 ! root 1074: case WIN_READ_EXT:
1.1.1.5 root 1075: lba48 = 1;
1076: case WIN_READ:
1077: case WIN_READ_ONCE:
1.1.1.7 ! root 1078: if (s->drive_kind == IDE_CD) {
! 1079: ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1.1.1.5 root 1080: goto abort_cmd;
1.1.1.7 ! root 1081: }
1.1.1.5 root 1082: ide_cmd_lba48_transform(s, lba48);
1083: s->req_nb_sectors = 1;
1084: ide_sector_read(s);
1085: break;
1.1.1.7 ! root 1086: case WIN_WRITE_EXT:
1.1.1.5 root 1087: lba48 = 1;
1088: case WIN_WRITE:
1089: case WIN_WRITE_ONCE:
1090: case CFA_WRITE_SECT_WO_ERASE:
1091: case WIN_WRITE_VERIFY:
1092: ide_cmd_lba48_transform(s, lba48);
1093: s->error = 0;
1094: s->status = SEEK_STAT | READY_STAT;
1095: s->req_nb_sectors = 1;
1096: ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1097: s->media_changed = 1;
1098: break;
1.1.1.7 ! root 1099: case WIN_MULTREAD_EXT:
1.1.1.5 root 1100: lba48 = 1;
1101: case WIN_MULTREAD:
1102: if (!s->mult_sectors)
1103: goto abort_cmd;
1104: ide_cmd_lba48_transform(s, lba48);
1105: s->req_nb_sectors = s->mult_sectors;
1106: ide_sector_read(s);
1107: break;
1108: case WIN_MULTWRITE_EXT:
1109: lba48 = 1;
1110: case WIN_MULTWRITE:
1111: case CFA_WRITE_MULTI_WO_ERASE:
1112: if (!s->mult_sectors)
1113: goto abort_cmd;
1114: ide_cmd_lba48_transform(s, lba48);
1115: s->error = 0;
1116: s->status = SEEK_STAT | READY_STAT;
1117: s->req_nb_sectors = s->mult_sectors;
1118: n = s->nsector;
1119: if (n > s->req_nb_sectors)
1120: n = s->req_nb_sectors;
1121: ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1122: s->media_changed = 1;
1123: break;
1.1.1.7 ! root 1124: case WIN_READDMA_EXT:
1.1.1.5 root 1125: lba48 = 1;
1126: case WIN_READDMA:
1127: case WIN_READDMA_ONCE:
1128: if (!s->bs)
1129: goto abort_cmd;
1130: ide_cmd_lba48_transform(s, lba48);
1.1.1.6 root 1131: ide_sector_start_dma(s, IDE_DMA_READ);
1.1.1.5 root 1132: break;
1.1.1.7 ! root 1133: case WIN_WRITEDMA_EXT:
1.1.1.5 root 1134: lba48 = 1;
1135: case WIN_WRITEDMA:
1136: case WIN_WRITEDMA_ONCE:
1137: if (!s->bs)
1138: goto abort_cmd;
1139: ide_cmd_lba48_transform(s, lba48);
1.1.1.6 root 1140: ide_sector_start_dma(s, IDE_DMA_WRITE);
1.1.1.5 root 1141: s->media_changed = 1;
1142: break;
1143: case WIN_READ_NATIVE_MAX_EXT:
1144: lba48 = 1;
1145: case WIN_READ_NATIVE_MAX:
1146: ide_cmd_lba48_transform(s, lba48);
1147: ide_set_sector(s, s->nb_sectors - 1);
1148: s->status = READY_STAT | SEEK_STAT;
1149: ide_set_irq(s->bus);
1150: break;
1151: case WIN_CHECKPOWERMODE1:
1152: case WIN_CHECKPOWERMODE2:
1.1.1.6 root 1153: s->error = 0;
1.1.1.5 root 1154: s->nsector = 0xff; /* device active or idle */
1155: s->status = READY_STAT | SEEK_STAT;
1156: ide_set_irq(s->bus);
1157: break;
1158: case WIN_SETFEATURES:
1159: if (!s->bs)
1160: goto abort_cmd;
1161: /* XXX: valid for CDROM ? */
1162: switch(s->feature) {
1163: case 0xcc: /* reverting to power-on defaults enable */
1164: case 0x66: /* reverting to power-on defaults disable */
1165: case 0x02: /* write cache enable */
1166: case 0x82: /* write cache disable */
1167: case 0xaa: /* read look-ahead enable */
1168: case 0x55: /* read look-ahead disable */
1169: case 0x05: /* set advanced power management mode */
1170: case 0x85: /* disable advanced power management mode */
1171: case 0x69: /* NOP */
1172: case 0x67: /* NOP */
1173: case 0x96: /* NOP */
1174: case 0x9a: /* NOP */
1175: case 0x42: /* enable Automatic Acoustic Mode */
1176: case 0xc2: /* disable Automatic Acoustic Mode */
1.1 root 1177: s->status = READY_STAT | SEEK_STAT;
1178: ide_set_irq(s->bus);
1179: break;
1.1.1.5 root 1180: case 0x03: { /* set transfer mode */
1.1 root 1181: uint8_t val = s->nsector & 0x07;
1.1.1.5 root 1182: uint16_t *identify_data = (uint16_t *)s->identify_data;
1.1 root 1183:
1184: switch (s->nsector >> 3) {
1.1.1.5 root 1185: case 0x00: /* pio default */
1186: case 0x01: /* pio mode */
1.1 root 1187: put_le16(identify_data + 62,0x07);
1188: put_le16(identify_data + 63,0x07);
1189: put_le16(identify_data + 88,0x3f);
1190: break;
1.1.1.5 root 1191: case 0x02: /* sigle word dma mode*/
1.1 root 1192: put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1193: put_le16(identify_data + 63,0x07);
1194: put_le16(identify_data + 88,0x3f);
1195: break;
1.1.1.5 root 1196: case 0x04: /* mdma mode */
1.1 root 1197: put_le16(identify_data + 62,0x07);
1198: put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1199: put_le16(identify_data + 88,0x3f);
1200: break;
1.1.1.5 root 1201: case 0x08: /* udma mode */
1.1 root 1202: put_le16(identify_data + 62,0x07);
1203: put_le16(identify_data + 63,0x07);
1204: put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1205: break;
1.1.1.5 root 1206: default:
1.1 root 1207: goto abort_cmd;
1208: }
1209: s->status = READY_STAT | SEEK_STAT;
1210: ide_set_irq(s->bus);
1211: break;
1.1.1.5 root 1212: }
1213: default:
1214: goto abort_cmd;
1215: }
1216: break;
1217: case WIN_FLUSH_CACHE:
1218: case WIN_FLUSH_CACHE_EXT:
1219: ide_flush_cache(s);
1220: break;
1221: case WIN_STANDBY:
1222: case WIN_STANDBY2:
1223: case WIN_STANDBYNOW1:
1224: case WIN_STANDBYNOW2:
1225: case WIN_IDLEIMMEDIATE:
1.1.1.7 ! root 1226: case WIN_IDLEIMMEDIATE2:
1.1.1.5 root 1227: case WIN_SETIDLE1:
1228: case WIN_SETIDLE2:
1229: case WIN_SLEEPNOW1:
1230: case WIN_SLEEPNOW2:
1231: s->status = READY_STAT;
1232: ide_set_irq(s->bus);
1233: break;
1234: case WIN_SEEK:
1235: /* XXX: Check that seek is within bounds */
1236: s->status = READY_STAT | SEEK_STAT;
1237: ide_set_irq(s->bus);
1238: break;
1239: /* ATAPI commands */
1240: case WIN_PIDENTIFY:
1.1.1.7 ! root 1241: ide_atapi_identify(s);
! 1242: s->status = READY_STAT | SEEK_STAT;
! 1243: ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1.1.1.5 root 1244: ide_set_irq(s->bus);
1245: break;
1246: case WIN_DIAGNOSE:
1247: ide_set_signature(s);
1248: if (s->drive_kind == IDE_CD)
1249: s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1250: * devices to return a clear status register
1251: * with READY_STAT *not* set. */
1252: else
1.1 root 1253: s->status = READY_STAT | SEEK_STAT;
1.1.1.5 root 1254: s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1255: * present.
1256: */
1257: ide_set_irq(s->bus);
1258: break;
1.1.1.7 ! root 1259: case WIN_DEVICE_RESET:
1.1.1.5 root 1260: ide_set_signature(s);
1261: s->status = 0x00; /* NOTE: READY is _not_ set */
1262: s->error = 0x01;
1263: break;
1264: case WIN_PACKETCMD:
1265: /* overlapping commands not supported */
1266: if (s->feature & 0x02)
1267: goto abort_cmd;
1268: s->status = READY_STAT | SEEK_STAT;
1269: s->atapi_dma = s->feature & 1;
1270: s->nsector = 1;
1271: ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1272: ide_atapi_cmd);
1273: break;
1274: /* CF-ATA commands */
1275: case CFA_REQ_EXT_ERROR_CODE:
1276: s->error = 0x09; /* miscellaneous error */
1277: s->status = READY_STAT | SEEK_STAT;
1278: ide_set_irq(s->bus);
1279: break;
1280: case CFA_ERASE_SECTORS:
1281: case CFA_WEAR_LEVEL:
1282: if (val == CFA_WEAR_LEVEL)
1283: s->nsector = 0;
1284: if (val == CFA_ERASE_SECTORS)
1285: s->media_changed = 1;
1286: s->error = 0x00;
1287: s->status = READY_STAT | SEEK_STAT;
1288: ide_set_irq(s->bus);
1289: break;
1290: case CFA_TRANSLATE_SECTOR:
1291: s->error = 0x00;
1292: s->status = READY_STAT | SEEK_STAT;
1293: memset(s->io_buffer, 0, 0x200);
1294: s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1295: s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1296: s->io_buffer[0x02] = s->select; /* Head */
1297: s->io_buffer[0x03] = s->sector; /* Sector */
1298: s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1299: s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1300: s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1301: s->io_buffer[0x13] = 0x00; /* Erase flag */
1302: s->io_buffer[0x18] = 0x00; /* Hot count */
1303: s->io_buffer[0x19] = 0x00; /* Hot count */
1304: s->io_buffer[0x1a] = 0x01; /* Hot count */
1305: ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1306: ide_set_irq(s->bus);
1307: break;
1308: case CFA_ACCESS_METADATA_STORAGE:
1309: switch (s->feature) {
1310: case 0x02: /* Inquiry Metadata Storage */
1311: ide_cfata_metadata_inquiry(s);
1.1 root 1312: break;
1.1.1.5 root 1313: case 0x03: /* Read Metadata Storage */
1314: ide_cfata_metadata_read(s);
1.1 root 1315: break;
1.1.1.5 root 1316: case 0x04: /* Write Metadata Storage */
1317: ide_cfata_metadata_write(s);
1.1 root 1318: break;
1.1.1.5 root 1319: default:
1320: goto abort_cmd;
1321: }
1322: ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1323: s->status = 0x00; /* NOTE: READY is _not_ set */
1324: ide_set_irq(s->bus);
1325: break;
1326: case IBM_SENSE_CONDITION:
1327: switch (s->feature) {
1328: case 0x01: /* sense temperature in device */
1329: s->nsector = 0x50; /* +20 C */
1.1 root 1330: break;
1.1.1.5 root 1331: default:
1332: goto abort_cmd;
1333: }
1334: s->status = READY_STAT | SEEK_STAT;
1335: ide_set_irq(s->bus);
1336: break;
1.1 root 1337:
1.1.1.7 ! root 1338: case WIN_SMART:
1.1.1.5 root 1339: if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1.1 root 1340: goto abort_cmd;
1.1.1.5 root 1341: if (!s->smart_enabled && s->feature != SMART_ENABLE)
1.1 root 1342: goto abort_cmd;
1.1.1.5 root 1343: switch (s->feature) {
1344: case SMART_DISABLE:
1.1 root 1345: s->smart_enabled = 0;
1346: s->status = READY_STAT | SEEK_STAT;
1347: ide_set_irq(s->bus);
1348: break;
1.1.1.5 root 1349: case SMART_ENABLE:
1.1 root 1350: s->smart_enabled = 1;
1351: s->status = READY_STAT | SEEK_STAT;
1352: ide_set_irq(s->bus);
1353: break;
1.1.1.5 root 1354: case SMART_ATTR_AUTOSAVE:
1.1 root 1355: switch (s->sector) {
1356: case 0x00:
1.1.1.5 root 1357: s->smart_autosave = 0;
1358: break;
1.1 root 1359: case 0xf1:
1.1.1.5 root 1360: s->smart_autosave = 1;
1361: break;
1.1 root 1362: default:
1.1.1.5 root 1363: goto abort_cmd;
1.1 root 1364: }
1365: s->status = READY_STAT | SEEK_STAT;
1366: ide_set_irq(s->bus);
1367: break;
1.1.1.5 root 1368: case SMART_STATUS:
1.1 root 1369: if (!s->smart_errors) {
1.1.1.5 root 1370: s->hcyl = 0xc2;
1371: s->lcyl = 0x4f;
1.1 root 1372: } else {
1.1.1.5 root 1373: s->hcyl = 0x2c;
1374: s->lcyl = 0xf4;
1.1 root 1375: }
1376: s->status = READY_STAT | SEEK_STAT;
1377: ide_set_irq(s->bus);
1378: break;
1.1.1.5 root 1379: case SMART_READ_THRESH:
1.1 root 1380: memset(s->io_buffer, 0, 0x200);
1381: s->io_buffer[0] = 0x01; /* smart struct version */
1382: for (n=0; n<30; n++) {
1.1.1.5 root 1383: if (smart_attributes[n][0] == 0)
1.1 root 1384: break;
1.1.1.5 root 1385: s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1.1.1.6 root 1386: s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1.1 root 1387: }
1388: for (n=0; n<511; n++) /* checksum */
1.1.1.5 root 1389: s->io_buffer[511] += s->io_buffer[n];
1.1 root 1390: s->io_buffer[511] = 0x100 - s->io_buffer[511];
1391: s->status = READY_STAT | SEEK_STAT;
1392: ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1393: ide_set_irq(s->bus);
1394: break;
1.1.1.5 root 1395: case SMART_READ_DATA:
1.1 root 1396: memset(s->io_buffer, 0, 0x200);
1397: s->io_buffer[0] = 0x01; /* smart struct version */
1398: for (n=0; n<30; n++) {
1.1.1.6 root 1399: if (smart_attributes[n][0] == 0) {
1.1 root 1400: break;
1.1.1.6 root 1401: }
1402: int i;
1403: for(i = 0; i < 11; i++) {
1404: s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1405: }
1.1 root 1406: }
1407: s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1408: if (s->smart_selftest_count == 0) {
1.1.1.5 root 1409: s->io_buffer[363] = 0;
1.1 root 1410: } else {
1.1.1.5 root 1411: s->io_buffer[363] =
1.1 root 1412: s->smart_selftest_data[3 +
1.1.1.5 root 1413: (s->smart_selftest_count - 1) *
1414: 24];
1.1 root 1415: }
1416: s->io_buffer[364] = 0x20;
1417: s->io_buffer[365] = 0x01;
1418: /* offline data collection capacity: execute + self-test*/
1419: s->io_buffer[367] = (1<<4 | 1<<3 | 1);
1420: s->io_buffer[368] = 0x03; /* smart capability (1) */
1421: s->io_buffer[369] = 0x00; /* smart capability (2) */
1422: s->io_buffer[370] = 0x01; /* error logging supported */
1423: s->io_buffer[372] = 0x02; /* minutes for poll short test */
1424: s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1425: s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1426:
1427: for (n=0; n<511; n++)
1.1.1.5 root 1428: s->io_buffer[511] += s->io_buffer[n];
1.1 root 1429: s->io_buffer[511] = 0x100 - s->io_buffer[511];
1430: s->status = READY_STAT | SEEK_STAT;
1431: ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1432: ide_set_irq(s->bus);
1433: break;
1.1.1.5 root 1434: case SMART_READ_LOG:
1.1 root 1435: switch (s->sector) {
1436: case 0x01: /* summary smart error log */
1.1.1.5 root 1437: memset(s->io_buffer, 0, 0x200);
1438: s->io_buffer[0] = 0x01;
1439: s->io_buffer[1] = 0x00; /* no error entries */
1440: s->io_buffer[452] = s->smart_errors & 0xff;
1441: s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1.1 root 1442:
1.1.1.5 root 1443: for (n=0; n<511; n++)
1.1 root 1444: s->io_buffer[511] += s->io_buffer[n];
1.1.1.5 root 1445: s->io_buffer[511] = 0x100 - s->io_buffer[511];
1446: break;
1.1 root 1447: case 0x06: /* smart self test log */
1.1.1.5 root 1448: memset(s->io_buffer, 0, 0x200);
1449: s->io_buffer[0] = 0x01;
1450: if (s->smart_selftest_count == 0) {
1.1 root 1451: s->io_buffer[508] = 0;
1.1.1.5 root 1452: } else {
1.1 root 1453: s->io_buffer[508] = s->smart_selftest_count;
1454: for (n=2; n<506; n++)
1.1.1.5 root 1455: s->io_buffer[n] = s->smart_selftest_data[n];
1456: }
1457: for (n=0; n<511; n++)
1.1 root 1458: s->io_buffer[511] += s->io_buffer[n];
1.1.1.5 root 1459: s->io_buffer[511] = 0x100 - s->io_buffer[511];
1460: break;
1.1 root 1461: default:
1.1.1.5 root 1462: goto abort_cmd;
1.1 root 1463: }
1464: s->status = READY_STAT | SEEK_STAT;
1465: ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1466: ide_set_irq(s->bus);
1467: break;
1.1.1.5 root 1468: case SMART_EXECUTE_OFFLINE:
1.1 root 1469: switch (s->sector) {
1470: case 0: /* off-line routine */
1471: case 1: /* short self test */
1472: case 2: /* extended self test */
1.1.1.5 root 1473: s->smart_selftest_count++;
1474: if(s->smart_selftest_count > 21)
1.1 root 1475: s->smart_selftest_count = 0;
1.1.1.5 root 1476: n = 2 + (s->smart_selftest_count - 1) * 24;
1477: s->smart_selftest_data[n] = s->sector;
1478: s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1479: s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1480: s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1481: s->status = READY_STAT | SEEK_STAT;
1482: ide_set_irq(s->bus);
1483: break;
1.1 root 1484: default:
1.1.1.5 root 1485: goto abort_cmd;
1.1 root 1486: }
1487: break;
1.1.1.5 root 1488: default:
1.1 root 1489: goto abort_cmd;
1.1.1.5 root 1490: }
1491: break;
1492: default:
1.1.1.7 ! root 1493: /* should not be reachable */
1.1.1.5 root 1494: abort_cmd:
1495: ide_abort_command(s);
1496: ide_set_irq(s->bus);
1497: break;
1.1 root 1498: }
1499: }
1500:
1501: uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1502: {
1503: IDEBus *bus = opaque;
1504: IDEState *s = idebus_active_if(bus);
1505: uint32_t addr;
1506: int ret, hob;
1507:
1508: addr = addr1 & 7;
1509: /* FIXME: HOB readback uses bit 7, but it's always set right now */
1510: //hob = s->select & (1 << 7);
1511: hob = 0;
1512: switch(addr) {
1513: case 0:
1514: ret = 0xff;
1515: break;
1516: case 1:
1517: if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1518: (s != bus->ifs && !s->bs))
1519: ret = 0;
1520: else if (!hob)
1521: ret = s->error;
1522: else
1523: ret = s->hob_feature;
1524: break;
1525: case 2:
1526: if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1527: ret = 0;
1528: else if (!hob)
1529: ret = s->nsector & 0xff;
1530: else
1531: ret = s->hob_nsector;
1532: break;
1533: case 3:
1534: if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1535: ret = 0;
1536: else if (!hob)
1537: ret = s->sector;
1538: else
1539: ret = s->hob_sector;
1540: break;
1541: case 4:
1542: if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1543: ret = 0;
1544: else if (!hob)
1545: ret = s->lcyl;
1546: else
1547: ret = s->hob_lcyl;
1548: break;
1549: case 5:
1550: if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1551: ret = 0;
1552: else if (!hob)
1553: ret = s->hcyl;
1554: else
1555: ret = s->hob_hcyl;
1556: break;
1557: case 6:
1558: if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1559: ret = 0;
1560: else
1561: ret = s->select;
1562: break;
1563: default:
1564: case 7:
1565: if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1566: (s != bus->ifs && !s->bs))
1567: ret = 0;
1568: else
1569: ret = s->status;
1570: qemu_irq_lower(bus->irq);
1571: break;
1572: }
1573: #ifdef DEBUG_IDE
1574: printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1575: #endif
1576: return ret;
1577: }
1578:
1579: uint32_t ide_status_read(void *opaque, uint32_t addr)
1580: {
1581: IDEBus *bus = opaque;
1582: IDEState *s = idebus_active_if(bus);
1583: int ret;
1584:
1585: if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1586: (s != bus->ifs && !s->bs))
1587: ret = 0;
1588: else
1589: ret = s->status;
1590: #ifdef DEBUG_IDE
1591: printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1592: #endif
1593: return ret;
1594: }
1595:
1596: void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1597: {
1598: IDEBus *bus = opaque;
1599: IDEState *s;
1600: int i;
1601:
1602: #ifdef DEBUG_IDE
1603: printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1604: #endif
1605: /* common for both drives */
1606: if (!(bus->cmd & IDE_CMD_RESET) &&
1607: (val & IDE_CMD_RESET)) {
1608: /* reset low to high */
1609: for(i = 0;i < 2; i++) {
1610: s = &bus->ifs[i];
1611: s->status = BUSY_STAT | SEEK_STAT;
1612: s->error = 0x01;
1613: }
1614: } else if ((bus->cmd & IDE_CMD_RESET) &&
1615: !(val & IDE_CMD_RESET)) {
1616: /* high to low */
1617: for(i = 0;i < 2; i++) {
1618: s = &bus->ifs[i];
1.1.1.4 root 1619: if (s->drive_kind == IDE_CD)
1.1 root 1620: s->status = 0x00; /* NOTE: READY is _not_ set */
1621: else
1622: s->status = READY_STAT | SEEK_STAT;
1623: ide_set_signature(s);
1624: }
1625: }
1626:
1627: bus->cmd = val;
1628: }
1629:
1.1.1.6 root 1630: /*
1631: * Returns true if the running PIO transfer is a PIO out (i.e. data is
1632: * transferred from the device to the guest), false if it's a PIO in
1633: */
1634: static bool ide_is_pio_out(IDEState *s)
1635: {
1636: if (s->end_transfer_func == ide_sector_write ||
1637: s->end_transfer_func == ide_atapi_cmd) {
1638: return false;
1639: } else if (s->end_transfer_func == ide_sector_read ||
1640: s->end_transfer_func == ide_transfer_stop ||
1641: s->end_transfer_func == ide_atapi_cmd_reply_end ||
1642: s->end_transfer_func == ide_dummy_transfer_stop) {
1643: return true;
1644: }
1645:
1646: abort();
1647: }
1648:
1.1 root 1649: void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1650: {
1651: IDEBus *bus = opaque;
1652: IDEState *s = idebus_active_if(bus);
1653: uint8_t *p;
1654:
1.1.1.6 root 1655: /* PIO data access allowed only when DRQ bit is set. The result of a write
1656: * during PIO out is indeterminate, just ignore it. */
1657: if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1.1 root 1658: return;
1.1.1.6 root 1659: }
1.1 root 1660:
1661: p = s->data_ptr;
1662: *(uint16_t *)p = le16_to_cpu(val);
1663: p += 2;
1664: s->data_ptr = p;
1665: if (p >= s->data_end)
1666: s->end_transfer_func(s);
1667: }
1668:
1669: uint32_t ide_data_readw(void *opaque, uint32_t addr)
1670: {
1671: IDEBus *bus = opaque;
1672: IDEState *s = idebus_active_if(bus);
1673: uint8_t *p;
1674: int ret;
1675:
1.1.1.6 root 1676: /* PIO data access allowed only when DRQ bit is set. The result of a read
1677: * during PIO in is indeterminate, return 0 and don't move forward. */
1678: if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1.1 root 1679: return 0;
1.1.1.6 root 1680: }
1.1 root 1681:
1682: p = s->data_ptr;
1683: ret = cpu_to_le16(*(uint16_t *)p);
1684: p += 2;
1685: s->data_ptr = p;
1686: if (p >= s->data_end)
1687: s->end_transfer_func(s);
1688: return ret;
1689: }
1690:
1691: void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1692: {
1693: IDEBus *bus = opaque;
1694: IDEState *s = idebus_active_if(bus);
1695: uint8_t *p;
1696:
1.1.1.6 root 1697: /* PIO data access allowed only when DRQ bit is set. The result of a write
1698: * during PIO out is indeterminate, just ignore it. */
1699: if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1.1 root 1700: return;
1.1.1.6 root 1701: }
1.1 root 1702:
1703: p = s->data_ptr;
1704: *(uint32_t *)p = le32_to_cpu(val);
1705: p += 4;
1706: s->data_ptr = p;
1707: if (p >= s->data_end)
1708: s->end_transfer_func(s);
1709: }
1710:
1711: uint32_t ide_data_readl(void *opaque, uint32_t addr)
1712: {
1713: IDEBus *bus = opaque;
1714: IDEState *s = idebus_active_if(bus);
1715: uint8_t *p;
1716: int ret;
1717:
1.1.1.6 root 1718: /* PIO data access allowed only when DRQ bit is set. The result of a read
1719: * during PIO in is indeterminate, return 0 and don't move forward. */
1720: if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1.1 root 1721: return 0;
1.1.1.6 root 1722: }
1.1 root 1723:
1724: p = s->data_ptr;
1725: ret = cpu_to_le32(*(uint32_t *)p);
1726: p += 4;
1727: s->data_ptr = p;
1728: if (p >= s->data_end)
1729: s->end_transfer_func(s);
1730: return ret;
1731: }
1732:
1733: static void ide_dummy_transfer_stop(IDEState *s)
1734: {
1735: s->data_ptr = s->io_buffer;
1736: s->data_end = s->io_buffer;
1737: s->io_buffer[0] = 0xff;
1738: s->io_buffer[1] = 0xff;
1739: s->io_buffer[2] = 0xff;
1740: s->io_buffer[3] = 0xff;
1741: }
1742:
1743: static void ide_reset(IDEState *s)
1744: {
1745: #ifdef DEBUG_IDE
1746: printf("ide: reset\n");
1747: #endif
1.1.1.4 root 1748: if (s->drive_kind == IDE_CFATA)
1.1 root 1749: s->mult_sectors = 0;
1750: else
1751: s->mult_sectors = MAX_MULT_SECTORS;
1752: /* ide regs */
1753: s->feature = 0;
1754: s->error = 0;
1755: s->nsector = 0;
1756: s->sector = 0;
1757: s->lcyl = 0;
1758: s->hcyl = 0;
1759:
1760: /* lba48 */
1761: s->hob_feature = 0;
1762: s->hob_sector = 0;
1763: s->hob_nsector = 0;
1764: s->hob_lcyl = 0;
1765: s->hob_hcyl = 0;
1766:
1767: s->select = 0xa0;
1768: s->status = READY_STAT | SEEK_STAT;
1769:
1770: s->lba48 = 0;
1771:
1772: /* ATAPI specific */
1773: s->sense_key = 0;
1774: s->asc = 0;
1775: s->cdrom_changed = 0;
1776: s->packet_transfer_size = 0;
1777: s->elementary_transfer_size = 0;
1778: s->io_buffer_index = 0;
1779: s->cd_sector_size = 0;
1780: s->atapi_dma = 0;
1781: /* ATA DMA state */
1782: s->io_buffer_size = 0;
1783: s->req_nb_sectors = 0;
1784:
1785: ide_set_signature(s);
1786: /* init the transfer handler so that 0xffff is returned on data
1787: accesses */
1788: s->end_transfer_func = ide_dummy_transfer_stop;
1789: ide_dummy_transfer_stop(s);
1790: s->media_changed = 0;
1791: }
1792:
1793: void ide_bus_reset(IDEBus *bus)
1794: {
1795: bus->unit = 0;
1796: bus->cmd = 0;
1797: ide_reset(&bus->ifs[0]);
1798: ide_reset(&bus->ifs[1]);
1799: ide_clear_hob(bus);
1.1.1.5 root 1800:
1801: /* pending async DMA */
1802: if (bus->dma->aiocb) {
1803: #ifdef DEBUG_AIO
1804: printf("aio_cancel\n");
1805: #endif
1806: bdrv_aio_cancel(bus->dma->aiocb);
1807: bus->dma->aiocb = NULL;
1808: }
1809:
1810: /* reset dma provider too */
1811: bus->dma->ops->reset(bus->dma);
1.1 root 1812: }
1813:
1.1.1.7 ! root 1814: static bool ide_cd_is_tray_open(void *opaque)
! 1815: {
! 1816: return ((IDEState *)opaque)->tray_open;
! 1817: }
! 1818:
! 1819: static bool ide_cd_is_medium_locked(void *opaque)
! 1820: {
! 1821: return ((IDEState *)opaque)->tray_locked;
! 1822: }
! 1823:
! 1824: static const BlockDevOps ide_cd_block_ops = {
! 1825: .change_media_cb = ide_cd_change_cb,
! 1826: .eject_request_cb = ide_cd_eject_request_cb,
! 1827: .is_tray_open = ide_cd_is_tray_open,
! 1828: .is_medium_locked = ide_cd_is_medium_locked,
! 1829: };
! 1830:
1.1.1.6 root 1831: int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1.1.1.4 root 1832: const char *version, const char *serial)
1.1 root 1833: {
1834: int cylinders, heads, secs;
1835: uint64_t nb_sectors;
1836:
1.1.1.4 root 1837: s->bs = bs;
1.1.1.6 root 1838: s->drive_kind = kind;
1839:
1.1.1.4 root 1840: bdrv_get_geometry(bs, &nb_sectors);
1841: bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
1842: if (cylinders < 1 || cylinders > 16383) {
1843: error_report("cyls must be between 1 and 16383");
1844: return -1;
1845: }
1846: if (heads < 1 || heads > 16) {
1847: error_report("heads must be between 1 and 16");
1848: return -1;
1849: }
1850: if (secs < 1 || secs > 63) {
1851: error_report("secs must be between 1 and 63");
1852: return -1;
1853: }
1854: s->cylinders = cylinders;
1855: s->heads = heads;
1856: s->sectors = secs;
1857: s->nb_sectors = nb_sectors;
1858: /* The SMART values should be preserved across power cycles
1859: but they aren't. */
1860: s->smart_enabled = 1;
1861: s->smart_autosave = 1;
1862: s->smart_errors = 0;
1863: s->smart_selftest_count = 0;
1.1.1.6 root 1864: if (kind == IDE_CD) {
1.1.1.7 ! root 1865: bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
! 1866: bdrv_set_buffer_alignment(bs, 2048);
1.1.1.4 root 1867: } else {
1868: if (!bdrv_is_inserted(s->bs)) {
1869: error_report("Device needs media, but drive is empty");
1870: return -1;
1871: }
1872: if (bdrv_is_read_only(bs)) {
1873: error_report("Can't use a read-only drive");
1874: return -1;
1.1 root 1875: }
1876: }
1.1.1.4 root 1877: if (serial) {
1878: strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
1879: } else {
1.1 root 1880: snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1881: "QM%05d", s->drive_serial);
1.1.1.4 root 1882: }
1.1.1.2 root 1883: if (version) {
1884: pstrcpy(s->version, sizeof(s->version), version);
1885: } else {
1886: pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
1887: }
1.1.1.5 root 1888:
1.1 root 1889: ide_reset(s);
1.1.1.7 ! root 1890: bdrv_iostatus_enable(bs);
1.1.1.4 root 1891: return 0;
1.1 root 1892: }
1893:
1.1.1.4 root 1894: static void ide_init1(IDEBus *bus, int unit)
1.1 root 1895: {
1896: static int drive_serial = 1;
1.1.1.4 root 1897: IDEState *s = &bus->ifs[unit];
1898:
1899: s->bus = bus;
1900: s->unit = unit;
1901: s->drive_serial = drive_serial++;
1.1.1.5 root 1902: /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1.1.1.4 root 1903: s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
1.1.1.6 root 1904: s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
1905: memset(s->io_buffer, 0, s->io_buffer_total_len);
1906:
1.1.1.4 root 1907: s->smart_selftest_data = qemu_blockalign(s->bs, 512);
1.1.1.6 root 1908: memset(s->smart_selftest_data, 0, 512);
1909:
1910: s->sector_write_timer = qemu_new_timer_ns(vm_clock,
1.1.1.4 root 1911: ide_sector_write_timer_cb, s);
1912: }
1913:
1.1.1.5 root 1914: static void ide_nop_start(IDEDMA *dma, IDEState *s,
1915: BlockDriverCompletionFunc *cb)
1916: {
1917: }
1918:
1919: static int ide_nop(IDEDMA *dma)
1920: {
1921: return 0;
1922: }
1923:
1924: static int ide_nop_int(IDEDMA *dma, int x)
1925: {
1926: return 0;
1927: }
1928:
1.1.1.7 ! root 1929: static void ide_nop_restart(void *opaque, int x, RunState y)
1.1.1.5 root 1930: {
1931: }
1932:
1933: static const IDEDMAOps ide_dma_nop_ops = {
1934: .start_dma = ide_nop_start,
1935: .start_transfer = ide_nop,
1936: .prepare_buf = ide_nop_int,
1937: .rw_buf = ide_nop_int,
1938: .set_unit = ide_nop_int,
1939: .add_status = ide_nop_int,
1940: .set_inactive = ide_nop,
1941: .restart_cb = ide_nop_restart,
1942: .reset = ide_nop,
1943: };
1944:
1945: static IDEDMA ide_dma_nop = {
1946: .ops = &ide_dma_nop_ops,
1947: .aiocb = NULL,
1948: };
1949:
1.1.1.4 root 1950: void ide_init2(IDEBus *bus, qemu_irq irq)
1951: {
1.1 root 1952: int i;
1953:
1954: for(i = 0; i < 2; i++) {
1.1.1.4 root 1955: ide_init1(bus, i);
1956: ide_reset(&bus->ifs[i]);
1957: }
1958: bus->irq = irq;
1.1.1.5 root 1959: bus->dma = &ide_dma_nop;
1.1.1.4 root 1960: }
1961:
1962: /* TODO convert users to qdev and remove */
1963: void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
1964: DriveInfo *hd1, qemu_irq irq)
1965: {
1966: int i;
1967: DriveInfo *dinfo;
1968:
1969: for(i = 0; i < 2; i++) {
1970: dinfo = i == 0 ? hd0 : hd1;
1971: ide_init1(bus, i);
1972: if (dinfo) {
1.1.1.6 root 1973: if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
1974: dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
1.1.1.4 root 1975: *dinfo->serial ? dinfo->serial : NULL) < 0) {
1976: error_report("Can't set up IDE drive %s", dinfo->id);
1977: exit(1);
1978: }
1.1.1.7 ! root 1979: bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]);
1.1.1.4 root 1980: } else {
1981: ide_reset(&bus->ifs[i]);
1982: }
1.1 root 1983: }
1984: bus->irq = irq;
1.1.1.5 root 1985: bus->dma = &ide_dma_nop;
1.1 root 1986: }
1987:
1.1.1.7 ! root 1988: static const MemoryRegionPortio ide_portio_list[] = {
! 1989: { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
! 1990: { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
! 1991: { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
! 1992: PORTIO_END_OF_LIST(),
! 1993: };
! 1994:
! 1995: static const MemoryRegionPortio ide_portio2_list[] = {
! 1996: { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
! 1997: PORTIO_END_OF_LIST(),
! 1998: };
! 1999:
! 2000: void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
1.1 root 2001: {
1.1.1.7 ! root 2002: /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
! 2003: bridge has been setup properly to always register with ISA. */
! 2004: isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
! 2005:
1.1 root 2006: if (iobase2) {
1.1.1.7 ! root 2007: isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
1.1 root 2008: }
2009: }
2010:
2011: static bool is_identify_set(void *opaque, int version_id)
2012: {
2013: IDEState *s = opaque;
2014:
2015: return s->identify_set != 0;
2016: }
2017:
1.1.1.2 root 2018: static EndTransferFunc* transfer_end_table[] = {
2019: ide_sector_read,
2020: ide_sector_write,
2021: ide_transfer_stop,
2022: ide_atapi_cmd_reply_end,
2023: ide_atapi_cmd,
1.1.1.4 root 2024: ide_dummy_transfer_stop,
1.1.1.2 root 2025: };
2026:
2027: static int transfer_end_table_idx(EndTransferFunc *fn)
2028: {
2029: int i;
2030:
2031: for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2032: if (transfer_end_table[i] == fn)
2033: return i;
2034:
2035: return -1;
2036: }
2037:
1.1 root 2038: static int ide_drive_post_load(void *opaque, int version_id)
2039: {
2040: IDEState *s = opaque;
2041:
2042: if (version_id < 3) {
1.1.1.7 ! root 2043: if (s->sense_key == UNIT_ATTENTION &&
1.1 root 2044: s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
2045: s->cdrom_changed = 1;
2046: }
2047: }
2048: return 0;
2049: }
2050:
1.1.1.4 root 2051: static int ide_drive_pio_post_load(void *opaque, int version_id)
1.1.1.2 root 2052: {
2053: IDEState *s = opaque;
2054:
1.1.1.7 ! root 2055: if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
1.1.1.4 root 2056: return -EINVAL;
2057: }
2058: s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2059: s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2060: s->data_end = s->data_ptr + s->cur_io_buffer_len;
1.1.1.2 root 2061:
1.1.1.4 root 2062: return 0;
2063: }
2064:
2065: static void ide_drive_pio_pre_save(void *opaque)
2066: {
2067: IDEState *s = opaque;
2068: int idx;
1.1.1.2 root 2069:
2070: s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2071: s->cur_io_buffer_len = s->data_end - s->data_ptr;
2072:
1.1.1.4 root 2073: idx = transfer_end_table_idx(s->end_transfer_func);
2074: if (idx == -1) {
1.1.1.2 root 2075: fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2076: __func__);
2077: s->end_transfer_fn_idx = 2;
1.1.1.4 root 2078: } else {
2079: s->end_transfer_fn_idx = idx;
1.1.1.2 root 2080: }
2081: }
2082:
1.1.1.4 root 2083: static bool ide_drive_pio_state_needed(void *opaque)
2084: {
2085: IDEState *s = opaque;
2086:
1.1.1.6 root 2087: return ((s->status & DRQ_STAT) != 0)
2088: || (s->bus->error_status & BM_STATUS_PIO_RETRY);
2089: }
2090:
1.1.1.7 ! root 2091: static int ide_tray_state_post_load(void *opaque, int version_id)
! 2092: {
! 2093: IDEState *s = opaque;
! 2094:
! 2095: bdrv_eject(s->bs, s->tray_open);
! 2096: bdrv_lock_medium(s->bs, s->tray_locked);
! 2097: return 0;
! 2098: }
! 2099:
! 2100: static bool ide_tray_state_needed(void *opaque)
! 2101: {
! 2102: IDEState *s = opaque;
! 2103:
! 2104: return s->tray_open || s->tray_locked;
! 2105: }
! 2106:
1.1.1.6 root 2107: static bool ide_atapi_gesn_needed(void *opaque)
2108: {
2109: IDEState *s = opaque;
2110:
2111: return s->events.new_media || s->events.eject_request;
1.1.1.4 root 2112: }
2113:
1.1.1.6 root 2114: static bool ide_error_needed(void *opaque)
2115: {
2116: IDEBus *bus = opaque;
2117:
2118: return (bus->error_status != 0);
2119: }
2120:
2121: /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
1.1.1.7 ! root 2122: static const VMStateDescription vmstate_ide_atapi_gesn_state = {
1.1.1.6 root 2123: .name ="ide_drive/atapi/gesn_state",
2124: .version_id = 1,
2125: .minimum_version_id = 1,
2126: .minimum_version_id_old = 1,
2127: .fields = (VMStateField []) {
2128: VMSTATE_BOOL(events.new_media, IDEState),
2129: VMSTATE_BOOL(events.eject_request, IDEState),
2130: VMSTATE_END_OF_LIST()
2131: }
2132: };
2133:
1.1.1.7 ! root 2134: static const VMStateDescription vmstate_ide_tray_state = {
! 2135: .name = "ide_drive/tray_state",
! 2136: .version_id = 1,
! 2137: .minimum_version_id = 1,
! 2138: .minimum_version_id_old = 1,
! 2139: .post_load = ide_tray_state_post_load,
! 2140: .fields = (VMStateField[]) {
! 2141: VMSTATE_BOOL(tray_open, IDEState),
! 2142: VMSTATE_BOOL(tray_locked, IDEState),
! 2143: VMSTATE_END_OF_LIST()
! 2144: }
! 2145: };
! 2146:
! 2147: static const VMStateDescription vmstate_ide_drive_pio_state = {
1.1.1.4 root 2148: .name = "ide_drive/pio_state",
2149: .version_id = 1,
2150: .minimum_version_id = 1,
2151: .minimum_version_id_old = 1,
2152: .pre_save = ide_drive_pio_pre_save,
2153: .post_load = ide_drive_pio_post_load,
2154: .fields = (VMStateField []) {
2155: VMSTATE_INT32(req_nb_sectors, IDEState),
2156: VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2157: vmstate_info_uint8, uint8_t),
2158: VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2159: VMSTATE_INT32(cur_io_buffer_len, IDEState),
2160: VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2161: VMSTATE_INT32(elementary_transfer_size, IDEState),
2162: VMSTATE_INT32(packet_transfer_size, IDEState),
2163: VMSTATE_END_OF_LIST()
2164: }
2165: };
2166:
1.1 root 2167: const VMStateDescription vmstate_ide_drive = {
2168: .name = "ide_drive",
1.1.1.4 root 2169: .version_id = 3,
1.1 root 2170: .minimum_version_id = 0,
2171: .minimum_version_id_old = 0,
2172: .post_load = ide_drive_post_load,
2173: .fields = (VMStateField []) {
2174: VMSTATE_INT32(mult_sectors, IDEState),
2175: VMSTATE_INT32(identify_set, IDEState),
2176: VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2177: VMSTATE_UINT8(feature, IDEState),
2178: VMSTATE_UINT8(error, IDEState),
2179: VMSTATE_UINT32(nsector, IDEState),
2180: VMSTATE_UINT8(sector, IDEState),
2181: VMSTATE_UINT8(lcyl, IDEState),
2182: VMSTATE_UINT8(hcyl, IDEState),
2183: VMSTATE_UINT8(hob_feature, IDEState),
2184: VMSTATE_UINT8(hob_sector, IDEState),
2185: VMSTATE_UINT8(hob_nsector, IDEState),
2186: VMSTATE_UINT8(hob_lcyl, IDEState),
2187: VMSTATE_UINT8(hob_hcyl, IDEState),
2188: VMSTATE_UINT8(select, IDEState),
2189: VMSTATE_UINT8(status, IDEState),
2190: VMSTATE_UINT8(lba48, IDEState),
2191: VMSTATE_UINT8(sense_key, IDEState),
2192: VMSTATE_UINT8(asc, IDEState),
2193: VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2194: VMSTATE_END_OF_LIST()
1.1.1.4 root 2195: },
2196: .subsections = (VMStateSubsection []) {
2197: {
2198: .vmsd = &vmstate_ide_drive_pio_state,
2199: .needed = ide_drive_pio_state_needed,
2200: }, {
1.1.1.7 ! root 2201: .vmsd = &vmstate_ide_tray_state,
! 2202: .needed = ide_tray_state_needed,
! 2203: }, {
1.1.1.6 root 2204: .vmsd = &vmstate_ide_atapi_gesn_state,
2205: .needed = ide_atapi_gesn_needed,
2206: }, {
1.1.1.4 root 2207: /* empty */
2208: }
1.1 root 2209: }
2210: };
2211:
1.1.1.7 ! root 2212: static const VMStateDescription vmstate_ide_error_status = {
1.1.1.6 root 2213: .name ="ide_bus/error",
2214: .version_id = 1,
2215: .minimum_version_id = 1,
2216: .minimum_version_id_old = 1,
2217: .fields = (VMStateField []) {
2218: VMSTATE_INT32(error_status, IDEBus),
2219: VMSTATE_END_OF_LIST()
2220: }
2221: };
2222:
1.1 root 2223: const VMStateDescription vmstate_ide_bus = {
2224: .name = "ide_bus",
2225: .version_id = 1,
2226: .minimum_version_id = 1,
2227: .minimum_version_id_old = 1,
2228: .fields = (VMStateField []) {
2229: VMSTATE_UINT8(cmd, IDEBus),
2230: VMSTATE_UINT8(unit, IDEBus),
2231: VMSTATE_END_OF_LIST()
1.1.1.6 root 2232: },
2233: .subsections = (VMStateSubsection []) {
2234: {
2235: .vmsd = &vmstate_ide_error_status,
2236: .needed = ide_error_needed,
2237: }, {
2238: /* empty */
2239: }
1.1 root 2240: }
2241: };
1.1.1.6 root 2242:
2243: void ide_drive_get(DriveInfo **hd, int max_bus)
2244: {
2245: int i;
2246:
2247: if (drive_get_max_bus(IF_IDE) >= max_bus) {
2248: fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2249: exit(1);
2250: }
2251:
2252: for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2253: hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2254: }
2255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.