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