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