2 * QEMU IDE disk and CD/DVD-ROM Emulator
4 * Copyright (c) 2003 Fabrice Bellard
5 * Copyright (c) 2006 Openedhand Ltd.
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 #include "qemu-error.h"
30 #include "qemu-timer.h"
33 #include "hw/block-common.h"
36 #include <hw/ide/internal.h>
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},
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},
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},
58 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
);
59 static void ide_dummy_transfer_stop(IDEState
*s
);
61 static void padstr(char *str
, const char *src
, int len
)
64 for(i
= 0; i
< len
; i
++) {
73 static void put_le16(uint16_t *p
, unsigned int v
)
78 static void ide_identify(IDEState
*s
)
82 IDEDevice
*dev
= s
->unit
? s
->bus
->slave
: s
->bus
->master
;
84 if (s
->identify_set
) {
85 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
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
);
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);
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 */
133 put_le16(p
+ 75, s
->ncq_queues
- 1);
135 put_le16(p
+ 76, (1 << 8));
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 */
146 put_le16(p
+ 84, (1 << 14) | (1 << 8) | 0);
148 put_le16(p
+ 84, (1 << 14) | 0);
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);
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 */
159 put_le16(p
+ 87, (1 << 14) | (1 << 8) | 0);
161 put_le16(p
+ 87, (1 << 14) | 0);
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);
170 if (dev
&& dev
->conf
.physical_block_size
)
171 put_le16(p
+ 106, 0x6000 | get_physical_block_exp(&dev
->conf
));
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
);
179 if (dev
&& dev
->conf
.discard_granularity
) {
180 put_le16(p
+ 169, 1); /* TRIM support */
183 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
187 static void ide_atapi_identify(IDEState
*s
)
191 if (s
->identify_set
) {
192 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
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) */
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 */
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 */
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 */
223 put_le16(p
+ 71, 30); /* in ns */
224 put_le16(p
+ 72, 30); /* in ns */
227 put_le16(p
+ 75, s
->ncq_queues
- 1);
229 put_le16(p
+ 76, (1 << 8));
232 put_le16(p
+ 80, 0x1e); /* support up to ATA/ATAPI-4 */
234 put_le16(p
+ 88, 0x3f | (1 << 13)); /* udma5 set and supported */
236 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
240 static void ide_cfata_identify(IDEState
*s
)
245 p
= (uint16_t *) s
->identify_data
;
249 memset(p
, 0, sizeof(s
->identify_data
));
251 cur_sec
= s
->cylinders
* s
->heads
* s
->sectors
;
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
);
266 put_le16(p
+ 47, 0x0000);
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 */
303 memcpy(s
->io_buffer
, p
, sizeof(s
->identify_data
));
306 static void ide_set_signature(IDEState
*s
)
308 s
->select
&= 0xf0; /* clear head */
312 if (s
->drive_kind
== IDE_CD
) {
324 typedef struct TrimAIOCB
{
325 BlockDriverAIOCB common
;
330 static void trim_aio_cancel(BlockDriverAIOCB
*acb
)
332 TrimAIOCB
*iocb
= container_of(acb
, TrimAIOCB
, common
);
334 qemu_bh_delete(iocb
->bh
);
336 qemu_aio_release(iocb
);
339 static AIOPool trim_aio_pool
= {
340 .aiocb_size
= sizeof(TrimAIOCB
),
341 .cancel
= trim_aio_cancel
,
344 static void ide_trim_bh_cb(void *opaque
)
346 TrimAIOCB
*iocb
= opaque
;
348 iocb
->common
.cb(iocb
->common
.opaque
, iocb
->ret
);
350 qemu_bh_delete(iocb
->bh
);
353 qemu_aio_release(iocb
);
356 BlockDriverAIOCB
*ide_issue_trim(BlockDriverState
*bs
,
357 int64_t sector_num
, QEMUIOVector
*qiov
, int nb_sectors
,
358 BlockDriverCompletionFunc
*cb
, void *opaque
)
363 iocb
= qemu_aio_get(&trim_aio_pool
, bs
, cb
, opaque
);
364 iocb
->bh
= qemu_bh_new(ide_trim_bh_cb
, iocb
);
367 for (j
= 0; j
< qiov
->niov
; j
++) {
368 uint64_t *buffer
= qiov
->iov
[j
].iov_base
;
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;
380 ret
= bdrv_discard(bs
, sector
, count
);
387 qemu_bh_schedule(iocb
->bh
);
389 return &iocb
->common
;
392 static inline void ide_abort_command(IDEState
*s
)
394 s
->status
= READY_STAT
| ERR_STAT
;
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
)
402 s
->end_transfer_func
= end_transfer_func
;
404 s
->data_end
= buf
+ size
;
405 if (!(s
->status
& ERR_STAT
)) {
406 s
->status
|= DRQ_STAT
;
408 s
->bus
->dma
->ops
->start_transfer(s
->bus
->dma
);
411 void ide_transfer_stop(IDEState
*s
)
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
;
419 int64_t ide_get_sector(IDEState
*s
)
422 if (s
->select
& 0x40) {
425 sector_num
= ((s
->select
& 0x0f) << 24) | (s
->hcyl
<< 16) |
426 (s
->lcyl
<< 8) | s
->sector
;
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
;
435 sector_num
= ((s
->hcyl
<< 8) | s
->lcyl
) * s
->heads
* s
->sectors
+
436 (s
->select
& 0x0f) * s
->sectors
+ (s
->sector
- 1);
441 void ide_set_sector(IDEState
*s
, int64_t sector_num
)
444 if (s
->select
& 0x40) {
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
);
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;
459 cyl
= sector_num
/ (s
->heads
* s
->sectors
);
460 r
= sector_num
% (s
->heads
* s
->sectors
);
463 s
->select
= (s
->select
& 0xf0) | ((r
/ s
->sectors
) & 0x0f);
464 s
->sector
= (r
% s
->sectors
) + 1;
468 static void ide_rw_error(IDEState
*s
) {
469 ide_abort_command(s
);
473 static void ide_sector_read_cb(void *opaque
, int ret
)
475 IDEState
*s
= opaque
;
479 s
->status
&= ~BUSY_STAT
;
481 bdrv_acct_done(s
->bs
, &s
->acct
);
483 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_PIO_RETRY
|
484 BM_STATUS_RETRY_READ
)) {
490 if (n
> s
->req_nb_sectors
) {
491 n
= s
->req_nb_sectors
;
494 /* Allow the guest to read the io_buffer */
495 ide_transfer_start(s
, s
->io_buffer
, n
* BDRV_SECTOR_SIZE
, ide_sector_read
);
499 ide_set_sector(s
, ide_get_sector(s
) + n
);
503 void ide_sector_read(IDEState
*s
)
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
);
514 ide_transfer_stop(s
);
518 s
->status
|= BUSY_STAT
;
520 if (n
> s
->req_nb_sectors
) {
521 n
= s
->req_nb_sectors
;
524 #if defined(DEBUG_IDE)
525 printf("sector=%" PRId64
"\n", sector_num
);
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);
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
);
537 static void dma_buf_commit(IDEState
*s
)
539 qemu_sglist_destroy(&s
->sg
);
542 void ide_set_inactive(IDEState
*s
)
544 s
->bus
->dma
->aiocb
= NULL
;
545 s
->bus
->dma
->ops
->set_inactive(s
->bus
->dma
);
548 void ide_dma_error(IDEState
*s
)
550 ide_transfer_stop(s
);
552 s
->status
= READY_STAT
| ERR_STAT
;
557 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
)
559 bool is_read
= (op
& BM_STATUS_RETRY_READ
) != 0;
560 BlockErrorAction action
= bdrv_get_error_action(s
->bs
, is_read
, error
);
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
) {
573 bdrv_error_action(s
->bs
, action
, is_read
, error
);
574 return action
!= BDRV_ACTION_IGNORE
;
577 void ide_dma_cb(void *opaque
, int ret
)
579 IDEState
*s
= opaque
;
584 int op
= BM_STATUS_DMA_RETRY
;
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
;
591 if (ide_handle_rw_error(s
, -ret
, op
)) {
596 n
= s
->io_buffer_size
>> 9;
597 sector_num
= ide_get_sector(s
);
601 ide_set_sector(s
, sector_num
);
605 /* end of transfer ? */
606 if (s
->nsector
== 0) {
607 s
->status
= READY_STAT
| SEEK_STAT
;
612 /* launch next transfer */
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
623 printf("ide_dma_cb: sector_num=%" PRId64
" n=%d, cmd_cmd=%d\n",
624 sector_num
, n
, s
->dma_cmd
);
627 switch (s
->dma_cmd
) {
629 s
->bus
->dma
->aiocb
= dma_bdrv_read(s
->bs
, &s
->sg
, sector_num
,
633 s
->bus
->dma
->aiocb
= dma_bdrv_write(s
->bs
, &s
->sg
, sector_num
,
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
);
645 if (s
->dma_cmd
== IDE_DMA_READ
|| s
->dma_cmd
== IDE_DMA_WRITE
) {
646 bdrv_acct_done(s
->bs
, &s
->acct
);
651 static void ide_sector_start_dma(IDEState
*s
, enum ide_dma_cmd dma_cmd
)
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
;
660 bdrv_acct_start(s
->bs
, &s
->acct
, s
->nsector
* BDRV_SECTOR_SIZE
,
664 bdrv_acct_start(s
->bs
, &s
->acct
, s
->nsector
* BDRV_SECTOR_SIZE
,
671 s
->bus
->dma
->ops
->start_dma(s
->bus
->dma
, s
, ide_dma_cb
);
674 static void ide_sector_write_timer_cb(void *opaque
)
676 IDEState
*s
= opaque
;
680 static void ide_sector_write_cb(void *opaque
, int ret
)
682 IDEState
*s
= opaque
;
685 bdrv_acct_done(s
->bs
, &s
->acct
);
688 s
->status
&= ~BUSY_STAT
;
691 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_PIO_RETRY
)) {
697 if (n
> s
->req_nb_sectors
) {
698 n
= s
->req_nb_sectors
;
701 if (s
->nsector
== 0) {
702 /* no more sectors to write */
703 ide_transfer_stop(s
);
706 if (n1
> s
->req_nb_sectors
) {
707 n1
= s
->req_nb_sectors
;
709 ide_transfer_start(s
, s
->io_buffer
, n1
* BDRV_SECTOR_SIZE
,
712 ide_set_sector(s
, ide_get_sector(s
) + n
);
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
721 qemu_mod_timer(s
->sector_write_timer
,
722 qemu_get_clock_ns(vm_clock
) + (get_ticks_per_sec() / 1000));
728 void ide_sector_write(IDEState
*s
)
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
);
739 if (n
> s
->req_nb_sectors
) {
740 n
= s
->req_nb_sectors
;
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);
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
);
752 static void ide_flush_cb(void *opaque
, int ret
)
754 IDEState
*s
= opaque
;
757 /* XXX: What sector number to set here? */
758 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_RETRY_FLUSH
)) {
763 bdrv_acct_done(s
->bs
, &s
->acct
);
764 s
->status
= READY_STAT
| SEEK_STAT
;
768 void ide_flush_cache(IDEState
*s
)
775 bdrv_acct_start(s
->bs
, &s
->acct
, 0, BDRV_ACCT_FLUSH
);
776 bdrv_aio_flush(s
->bs
, ide_flush_cb
, s
);
779 static void ide_cfata_metadata_inquiry(IDEState
*s
)
784 p
= (uint16_t *) s
->io_buffer
;
786 spd
= ((s
->mdata_size
- 1) >> 9) + 1;
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) */
797 static void ide_cfata_metadata_read(IDEState
*s
)
801 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
802 s
->status
= ERR_STAT
;
807 p
= (uint16_t *) s
->io_buffer
;
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));
816 static void ide_cfata_metadata_write(IDEState
*s
)
818 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
819 s
->status
= ERR_STAT
;
824 s
->media_changed
= 0;
826 memcpy(s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
828 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
829 s
->nsector
<< 9), 0x200 - 2));
832 /* called when the inserted state of the media has changed */
833 static void ide_cd_change_cb(void *opaque
, bool load
)
835 IDEState
*s
= opaque
;
838 s
->tray_open
= !load
;
839 bdrv_get_geometry(s
->bs
, &nb_sectors
);
840 s
->nb_sectors
= nb_sectors
;
843 * First indicate to the guest that a CD has been removed. That's
844 * done on the next command the guest sends us.
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.
849 s
->cdrom_changed
= 1;
850 s
->events
.new_media
= true;
851 s
->events
.eject_request
= false;
855 static void ide_cd_eject_request_cb(void *opaque
, bool force
)
857 IDEState
*s
= opaque
;
859 s
->events
.eject_request
= true;
861 s
->tray_locked
= false;
866 static void ide_cmd_lba48_transform(IDEState
*s
, int lba48
)
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
878 if (!s
->nsector
&& !s
->hob_nsector
)
882 int hi
= s
->hob_nsector
;
884 s
->nsector
= (hi
<< 8) | lo
;
889 static void ide_clear_hob(IDEBus
*bus
)
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);
896 void ide_ioport_write(void *opaque
, uint32_t addr
, uint32_t val
)
898 IDEBus
*bus
= opaque
;
901 printf("IDE: write addr=0x%x val=0x%02x\n", addr
, val
);
906 /* ignore writes to command block while busy with previous command */
907 if (addr
!= 7 && (idebus_active_if(bus
)->status
& (BUSY_STAT
|DRQ_STAT
)))
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
;
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
;
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
;
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
;
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
;
950 /* FIXME: HOB readback uses bit 7 */
951 bus
->ifs
[0].select
= (val
& ~0x10) | 0xa0;
952 bus
->ifs
[1].select
= (val
| 0x10) | 0xa0;
954 bus
->unit
= (val
>> 4) & 1;
959 ide_exec_cmd(bus
, val
);
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)
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
,
975 [WIN_DEVICE_RESET
] = CD_OK
,
976 [WIN_RECAL
] = HD_CFA_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
,
1031 static bool ide_cmd_permitted(IDEState
*s
, uint32_t cmd
)
1033 return cmd
< ARRAY_SIZE(ide_cmd_table
)
1034 && (ide_cmd_table
[cmd
] & (1u << s
->drive_kind
));
1037 void ide_exec_cmd(IDEBus
*bus
, uint32_t val
)
1039 uint16_t *identify_data
;
1044 #if defined(DEBUG_IDE)
1045 printf("ide: CMD=%02x\n", val
);
1047 s
= idebus_active_if(bus
);
1048 /* ignore commands to non existent slave */
1049 if (s
!= bus
->ifs
&& !s
->bs
)
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
)
1056 if (!ide_cmd_permitted(s
, val
)) {
1062 switch (s
->feature
) {
1067 ide_sector_start_dma(s
, IDE_DMA_TRIM
);
1074 if (s
->bs
&& s
->drive_kind
!= IDE_CD
) {
1075 if (s
->drive_kind
!= IDE_CFATA
)
1078 ide_cfata_identify(s
);
1079 s
->status
= READY_STAT
| SEEK_STAT
;
1080 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
1082 if (s
->drive_kind
== IDE_CD
) {
1083 ide_set_signature(s
);
1085 ide_abort_command(s
);
1087 ide_set_irq(s
->bus
);
1092 s
->status
= READY_STAT
| SEEK_STAT
;
1093 ide_set_irq(s
->bus
);
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
);
1105 s
->mult_sectors
= s
->nsector
& 0xff;
1106 s
->status
= READY_STAT
| SEEK_STAT
;
1108 ide_set_irq(s
->bus
);
1110 case WIN_VERIFY_EXT
:
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
);
1123 if (s
->drive_kind
== IDE_CD
) {
1124 ide_set_signature(s
); /* odd, but ATA4 8.27.5.2 requires it */
1130 ide_cmd_lba48_transform(s
, lba48
);
1131 s
->req_nb_sectors
= 1;
1137 case WIN_WRITE_ONCE
:
1138 case CFA_WRITE_SECT_WO_ERASE
:
1139 case WIN_WRITE_VERIFY
:
1143 ide_cmd_lba48_transform(s
, lba48
);
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;
1150 case WIN_MULTREAD_EXT
:
1156 if (!s
->mult_sectors
) {
1159 ide_cmd_lba48_transform(s
, lba48
);
1160 s
->req_nb_sectors
= s
->mult_sectors
;
1163 case WIN_MULTWRITE_EXT
:
1166 case CFA_WRITE_MULTI_WO_ERASE
:
1170 if (!s
->mult_sectors
) {
1173 ide_cmd_lba48_transform(s
, lba48
);
1175 s
->status
= SEEK_STAT
| READY_STAT
;
1176 s
->req_nb_sectors
= s
->mult_sectors
;
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;
1183 case WIN_READDMA_EXT
:
1186 case WIN_READDMA_ONCE
:
1190 ide_cmd_lba48_transform(s
, lba48
);
1191 ide_sector_start_dma(s
, IDE_DMA_READ
);
1193 case WIN_WRITEDMA_EXT
:
1196 case WIN_WRITEDMA_ONCE
:
1200 ide_cmd_lba48_transform(s
, lba48
);
1201 ide_sector_start_dma(s
, IDE_DMA_WRITE
);
1202 s
->media_changed
= 1;
1204 case WIN_READ_NATIVE_MAX_EXT
:
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
);
1212 case WIN_CHECKPOWERMODE1
:
1213 case WIN_CHECKPOWERMODE2
:
1215 s
->nsector
= 0xff; /* device active or idle */
1216 s
->status
= READY_STAT
| SEEK_STAT
;
1217 ide_set_irq(s
->bus
);
1219 case WIN_SETFEATURES
:
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
);
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);
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
);
1252 case 0x03: { /* set transfer mode */
1253 uint8_t val
= s
->nsector
& 0x07;
1254 identify_data
= (uint16_t *)s
->identify_data
;
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);
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);
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);
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)));
1281 s
->status
= READY_STAT
| SEEK_STAT
;
1282 ide_set_irq(s
->bus
);
1289 case WIN_FLUSH_CACHE
:
1290 case WIN_FLUSH_CACHE_EXT
:
1295 case WIN_STANDBYNOW1
:
1296 case WIN_STANDBYNOW2
:
1297 case WIN_IDLEIMMEDIATE
:
1298 case WIN_IDLEIMMEDIATE2
:
1303 s
->status
= READY_STAT
;
1304 ide_set_irq(s
->bus
);
1307 /* XXX: Check that seek is within bounds */
1308 s
->status
= READY_STAT
| SEEK_STAT
;
1309 ide_set_irq(s
->bus
);
1311 /* ATAPI commands */
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
);
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. */
1325 s
->status
= READY_STAT
| SEEK_STAT
;
1326 s
->error
= 0x01; /* Device 0 passed, Device 1 passed or not
1329 ide_set_irq(s
->bus
);
1331 case WIN_DEVICE_RESET
:
1332 ide_set_signature(s
);
1333 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1337 /* overlapping commands not supported */
1338 if (s
->feature
& 0x02)
1340 s
->status
= READY_STAT
| SEEK_STAT
;
1341 s
->atapi_dma
= s
->feature
& 1;
1343 ide_transfer_start(s
, s
->io_buffer
, ATAPI_PACKET_SIZE
,
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
);
1352 case CFA_ERASE_SECTORS
:
1353 case CFA_WEAR_LEVEL
:
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
:
1359 if (val
== CFA_WEAR_LEVEL
)
1361 if (val
== CFA_ERASE_SECTORS
)
1362 s
->media_changed
= 1;
1364 s
->status
= READY_STAT
| SEEK_STAT
;
1365 ide_set_irq(s
->bus
);
1367 case CFA_TRANSLATE_SECTOR
:
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
);
1385 case CFA_ACCESS_METADATA_STORAGE
:
1386 switch (s
->feature
) {
1387 case 0x02: /* Inquiry Metadata Storage */
1388 ide_cfata_metadata_inquiry(s
);
1390 case 0x03: /* Read Metadata Storage */
1391 ide_cfata_metadata_read(s
);
1393 case 0x04: /* Write Metadata Storage */
1394 ide_cfata_metadata_write(s
);
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
);
1403 case IBM_SENSE_CONDITION
:
1404 switch (s
->feature
) {
1405 case 0x01: /* sense temperature in device */
1406 s
->nsector
= 0x50; /* +20 C */
1411 s
->status
= READY_STAT
| SEEK_STAT
;
1412 ide_set_irq(s
->bus
);
1416 if (s
->hcyl
!= 0xc2 || s
->lcyl
!= 0x4f)
1418 if (!s
->smart_enabled
&& s
->feature
!= SMART_ENABLE
)
1420 switch (s
->feature
) {
1422 s
->smart_enabled
= 0;
1423 s
->status
= READY_STAT
| SEEK_STAT
;
1424 ide_set_irq(s
->bus
);
1427 s
->smart_enabled
= 1;
1428 s
->status
= READY_STAT
| SEEK_STAT
;
1429 ide_set_irq(s
->bus
);
1431 case SMART_ATTR_AUTOSAVE
:
1432 switch (s
->sector
) {
1434 s
->smart_autosave
= 0;
1437 s
->smart_autosave
= 1;
1442 s
->status
= READY_STAT
| SEEK_STAT
;
1443 ide_set_irq(s
->bus
);
1446 if (!s
->smart_errors
) {
1453 s
->status
= READY_STAT
| SEEK_STAT
;
1454 ide_set_irq(s
->bus
);
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];
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
);
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
++) {
1475 for(i
= 0; i
< 11; i
++) {
1476 s
->io_buffer
[2+i
+(n
*12)] = smart_attributes
[n
][i
];
1479 s
->io_buffer
[362] = 0x02 | (s
->smart_autosave
?0x80:0x00);
1480 if (s
->smart_selftest_count
== 0) {
1481 s
->io_buffer
[363] = 0;
1484 s
->smart_selftest_data
[3 +
1485 (s
->smart_selftest_count
- 1) *
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 */
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
);
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;
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];
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;
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
];
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];
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
);
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
);
1565 /* should not be reachable */
1567 ide_abort_command(s
);
1568 ide_set_irq(s
->bus
);
1573 uint32_t ide_ioport_read(void *opaque
, uint32_t addr1
)
1575 IDEBus
*bus
= opaque
;
1576 IDEState
*s
= idebus_active_if(bus
);
1581 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1582 //hob = s->select & (1 << 7);
1589 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1590 (s
!= bus
->ifs
&& !s
->bs
))
1595 ret
= s
->hob_feature
;
1598 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1601 ret
= s
->nsector
& 0xff;
1603 ret
= s
->hob_nsector
;
1606 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1611 ret
= s
->hob_sector
;
1614 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1622 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1630 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1637 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1638 (s
!= bus
->ifs
&& !s
->bs
))
1642 qemu_irq_lower(bus
->irq
);
1646 printf("ide: read addr=0x%x val=%02x\n", addr1
, ret
);
1651 uint32_t ide_status_read(void *opaque
, uint32_t addr
)
1653 IDEBus
*bus
= opaque
;
1654 IDEState
*s
= idebus_active_if(bus
);
1657 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1658 (s
!= bus
->ifs
&& !s
->bs
))
1663 printf("ide: read status addr=0x%x val=%02x\n", addr
, ret
);
1668 void ide_cmd_write(void *opaque
, uint32_t addr
, uint32_t val
)
1670 IDEBus
*bus
= opaque
;
1675 printf("ide: write control addr=0x%x val=%02x\n", addr
, val
);
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
++) {
1683 s
->status
= BUSY_STAT
| SEEK_STAT
;
1686 } else if ((bus
->cmd
& IDE_CMD_RESET
) &&
1687 !(val
& IDE_CMD_RESET
)) {
1689 for(i
= 0;i
< 2; i
++) {
1691 if (s
->drive_kind
== IDE_CD
)
1692 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1694 s
->status
= READY_STAT
| SEEK_STAT
;
1695 ide_set_signature(s
);
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
1706 static bool ide_is_pio_out(IDEState
*s
)
1708 if (s
->end_transfer_func
== ide_sector_write
||
1709 s
->end_transfer_func
== ide_atapi_cmd
) {
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
) {
1721 void ide_data_writew(void *opaque
, uint32_t addr
, uint32_t val
)
1723 IDEBus
*bus
= opaque
;
1724 IDEState
*s
= idebus_active_if(bus
);
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
)) {
1734 *(uint16_t *)p
= le16_to_cpu(val
);
1737 if (p
>= s
->data_end
)
1738 s
->end_transfer_func(s
);
1741 uint32_t ide_data_readw(void *opaque
, uint32_t addr
)
1743 IDEBus
*bus
= opaque
;
1744 IDEState
*s
= idebus_active_if(bus
);
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
)) {
1755 ret
= cpu_to_le16(*(uint16_t *)p
);
1758 if (p
>= s
->data_end
)
1759 s
->end_transfer_func(s
);
1763 void ide_data_writel(void *opaque
, uint32_t addr
, uint32_t val
)
1765 IDEBus
*bus
= opaque
;
1766 IDEState
*s
= idebus_active_if(bus
);
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
)) {
1776 *(uint32_t *)p
= le32_to_cpu(val
);
1779 if (p
>= s
->data_end
)
1780 s
->end_transfer_func(s
);
1783 uint32_t ide_data_readl(void *opaque
, uint32_t addr
)
1785 IDEBus
*bus
= opaque
;
1786 IDEState
*s
= idebus_active_if(bus
);
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
)) {
1797 ret
= cpu_to_le32(*(uint32_t *)p
);
1800 if (p
>= s
->data_end
)
1801 s
->end_transfer_func(s
);
1805 static void ide_dummy_transfer_stop(IDEState
*s
)
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;
1815 static void ide_reset(IDEState
*s
)
1818 printf("ide: reset\n");
1822 bdrv_aio_cancel(s
->pio_aiocb
);
1823 s
->pio_aiocb
= NULL
;
1826 if (s
->drive_kind
== IDE_CFATA
)
1827 s
->mult_sectors
= 0;
1829 s
->mult_sectors
= MAX_MULT_SECTORS
;
1846 s
->status
= READY_STAT
| SEEK_STAT
;
1850 /* ATAPI specific */
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;
1860 s
->io_buffer_size
= 0;
1861 s
->req_nb_sectors
= 0;
1863 ide_set_signature(s
);
1864 /* init the transfer handler so that 0xffff is returned on data
1866 s
->end_transfer_func
= ide_dummy_transfer_stop
;
1867 ide_dummy_transfer_stop(s
);
1868 s
->media_changed
= 0;
1871 void ide_bus_reset(IDEBus
*bus
)
1875 ide_reset(&bus
->ifs
[0]);
1876 ide_reset(&bus
->ifs
[1]);
1879 /* pending async DMA */
1880 if (bus
->dma
->aiocb
) {
1882 printf("aio_cancel\n");
1884 bdrv_aio_cancel(bus
->dma
->aiocb
);
1885 bus
->dma
->aiocb
= NULL
;
1888 /* reset dma provider too */
1889 bus
->dma
->ops
->reset(bus
->dma
);
1892 static bool ide_cd_is_tray_open(void *opaque
)
1894 return ((IDEState
*)opaque
)->tray_open
;
1897 static bool ide_cd_is_medium_locked(void *opaque
)
1899 return ((IDEState
*)opaque
)->tray_locked
;
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
,
1909 int ide_init_drive(IDEState
*s
, BlockDriverState
*bs
, IDEDriveKind kind
,
1910 const char *version
, const char *serial
, const char *model
,
1912 uint32_t cylinders
, uint32_t heads
, uint32_t secs
,
1915 uint64_t nb_sectors
;
1918 s
->drive_kind
= kind
;
1920 bdrv_get_geometry(bs
, &nb_sectors
);
1921 s
->cylinders
= cylinders
;
1924 s
->chs_trans
= chs_trans
;
1925 s
->nb_sectors
= nb_sectors
;
1927 /* The SMART values should be preserved across power cycles
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);
1937 if (!bdrv_is_inserted(s
->bs
)) {
1938 error_report("Device needs media, but drive is empty");
1941 if (bdrv_is_read_only(bs
)) {
1942 error_report("Can't use a read-only drive");
1947 pstrcpy(s
->drive_serial_str
, sizeof(s
->drive_serial_str
), serial
);
1949 snprintf(s
->drive_serial_str
, sizeof(s
->drive_serial_str
),
1950 "QM%05d", s
->drive_serial
);
1953 pstrcpy(s
->drive_model_str
, sizeof(s
->drive_model_str
), model
);
1957 strcpy(s
->drive_model_str
, "QEMU DVD-ROM");
1960 strcpy(s
->drive_model_str
, "QEMU MICRODRIVE");
1963 strcpy(s
->drive_model_str
, "QEMU HARDDISK");
1969 pstrcpy(s
->version
, sizeof(s
->version
), version
);
1971 pstrcpy(s
->version
, sizeof(s
->version
), qemu_get_version());
1975 bdrv_iostatus_enable(bs
);
1979 static void ide_init1(IDEBus
*bus
, int unit
)
1981 static int drive_serial
= 1;
1982 IDEState
*s
= &bus
->ifs
[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
);
1992 s
->smart_selftest_data
= qemu_blockalign(s
->bs
, 512);
1993 memset(s
->smart_selftest_data
, 0, 512);
1995 s
->sector_write_timer
= qemu_new_timer_ns(vm_clock
,
1996 ide_sector_write_timer_cb
, s
);
1999 static void ide_nop_start(IDEDMA
*dma
, IDEState
*s
,
2000 BlockDriverCompletionFunc
*cb
)
2004 static int ide_nop(IDEDMA
*dma
)
2009 static int ide_nop_int(IDEDMA
*dma
, int x
)
2014 static void ide_nop_restart(void *opaque
, int x
, RunState y
)
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
,
2030 static IDEDMA ide_dma_nop
= {
2031 .ops
= &ide_dma_nop_ops
,
2035 void ide_init2(IDEBus
*bus
, qemu_irq irq
)
2039 for(i
= 0; i
< 2; i
++) {
2041 ide_reset(&bus
->ifs
[i
]);
2044 bus
->dma
= &ide_dma_nop
;
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
)
2053 uint32_t cyls
, heads
, secs
;
2055 for(i
= 0; i
< 2; i
++) {
2056 dinfo
= i
== 0 ? hd0
: hd1
;
2060 heads
= dinfo
->heads
;
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
);
2068 if (cyls
< 1 || cyls
> 65535) {
2069 error_report("cyls must be between 1 and 65535");
2072 if (heads
< 1 || heads
> 16) {
2073 error_report("heads must be between 1 and 16");
2076 if (secs
< 1 || secs
> 255) {
2077 error_report("secs must be between 1 and 255");
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
);
2087 bdrv_attach_dev_nofail(dinfo
->bdrv
, &bus
->ifs
[i
]);
2089 ide_reset(&bus
->ifs
[i
]);
2093 bus
->dma
= &ide_dma_nop
;
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(),
2103 static const MemoryRegionPortio ide_portio2_list
[] = {
2104 { 0, 1, 1, .read
= ide_status_read
, .write
= ide_cmd_write
},
2105 PORTIO_END_OF_LIST(),
2108 void ide_init_ioport(IDEBus
*bus
, ISADevice
*dev
, int iobase
, int iobase2
)
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");
2115 isa_register_portio_list(dev
, iobase2
, ide_portio2_list
, bus
, "ide");
2119 static bool is_identify_set(void *opaque
, int version_id
)
2121 IDEState
*s
= opaque
;
2123 return s
->identify_set
!= 0;
2126 static EndTransferFunc
* transfer_end_table
[] = {
2130 ide_atapi_cmd_reply_end
,
2132 ide_dummy_transfer_stop
,
2135 static int transfer_end_table_idx(EndTransferFunc
*fn
)
2139 for (i
= 0; i
< ARRAY_SIZE(transfer_end_table
); i
++)
2140 if (transfer_end_table
[i
] == fn
)
2146 static int ide_drive_post_load(void *opaque
, int version_id
)
2148 IDEState
*s
= opaque
;
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;
2156 if (s
->identify_set
) {
2157 bdrv_set_enable_write_cache(s
->bs
, !!(s
->identify_data
[85] & (1 << 5)));
2162 static int ide_drive_pio_post_load(void *opaque
, int version_id
)
2164 IDEState
*s
= opaque
;
2166 if (s
->end_transfer_fn_idx
>= ARRAY_SIZE(transfer_end_table
)) {
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
;
2176 static void ide_drive_pio_pre_save(void *opaque
)
2178 IDEState
*s
= opaque
;
2181 s
->cur_io_buffer_offset
= s
->data_ptr
- s
->io_buffer
;
2182 s
->cur_io_buffer_len
= s
->data_end
- s
->data_ptr
;
2184 idx
= transfer_end_table_idx(s
->end_transfer_func
);
2186 fprintf(stderr
, "%s: invalid end_transfer_func for DRQ_STAT\n",
2188 s
->end_transfer_fn_idx
= 2;
2190 s
->end_transfer_fn_idx
= idx
;
2194 static bool ide_drive_pio_state_needed(void *opaque
)
2196 IDEState
*s
= opaque
;
2198 return ((s
->status
& DRQ_STAT
) != 0)
2199 || (s
->bus
->error_status
& BM_STATUS_PIO_RETRY
);
2202 static bool ide_tray_state_needed(void *opaque
)
2204 IDEState
*s
= opaque
;
2206 return s
->tray_open
|| s
->tray_locked
;
2209 static bool ide_atapi_gesn_needed(void *opaque
)
2211 IDEState
*s
= opaque
;
2213 return s
->events
.new_media
|| s
->events
.eject_request
;
2216 static bool ide_error_needed(void *opaque
)
2218 IDEBus
*bus
= opaque
;
2220 return (bus
->error_status
!= 0);
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",
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()
2236 static const VMStateDescription vmstate_ide_tray_state
= {
2237 .name
= "ide_drive/tray_state",
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()
2248 static const VMStateDescription vmstate_ide_drive_pio_state
= {
2249 .name
= "ide_drive/pio_state",
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()
2268 const VMStateDescription vmstate_ide_drive
= {
2269 .name
= "ide_drive",
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()
2297 .subsections
= (VMStateSubsection
[]) {
2299 .vmsd
= &vmstate_ide_drive_pio_state
,
2300 .needed
= ide_drive_pio_state_needed
,
2302 .vmsd
= &vmstate_ide_tray_state
,
2303 .needed
= ide_tray_state_needed
,
2305 .vmsd
= &vmstate_ide_atapi_gesn_state
,
2306 .needed
= ide_atapi_gesn_needed
,
2313 static const VMStateDescription vmstate_ide_error_status
= {
2314 .name
="ide_bus/error",
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()
2324 const VMStateDescription vmstate_ide_bus
= {
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()
2334 .subsections
= (VMStateSubsection
[]) {
2336 .vmsd
= &vmstate_ide_error_status
,
2337 .needed
= ide_error_needed
,
2344 void ide_drive_get(DriveInfo
**hd
, int max_bus
)
2348 if (drive_get_max_bus(IF_IDE
) >= max_bus
) {
2349 fprintf(stderr
, "qemu: too many IDE bus: %d\n", max_bus
);
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
);