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
28 #include "qemu-error.h"
29 #include "qemu-timer.h"
34 #include <hw/ide/internal.h>
36 /* These values were based on a Seagate ST3500418AS but have been modified
37 to make more sense in QEMU */
38 static const int smart_attributes
[][12] = {
39 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
40 /* raw read error rate*/
41 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
43 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
44 /* start stop count */
45 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
46 /* remapped sectors */
47 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
49 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
50 /* power cycle count */
51 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52 /* airflow-temperature-celsius */
53 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
55 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
58 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
);
60 static void padstr(char *str
, const char *src
, int len
)
63 for(i
= 0; i
< len
; i
++) {
72 static void put_le16(uint16_t *p
, unsigned int v
)
77 static void ide_identify(IDEState
*s
)
83 if (s
->identify_set
) {
84 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
88 memset(s
->io_buffer
, 0, 512);
89 p
= (uint16_t *)s
->io_buffer
;
90 put_le16(p
+ 0, 0x0040);
91 put_le16(p
+ 1, s
->cylinders
);
92 put_le16(p
+ 3, s
->heads
);
93 put_le16(p
+ 4, 512 * s
->sectors
); /* XXX: retired, remove ? */
94 put_le16(p
+ 5, 512); /* XXX: retired, remove ? */
95 put_le16(p
+ 6, s
->sectors
);
96 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
97 put_le16(p
+ 20, 3); /* XXX: retired, remove ? */
98 put_le16(p
+ 21, 512); /* cache size in sectors */
99 put_le16(p
+ 22, 4); /* ecc bytes */
100 padstr((char *)(p
+ 23), s
->version
, 8); /* firmware version */
101 padstr((char *)(p
+ 27), "QEMU HARDDISK", 40); /* model */
102 #if MAX_MULT_SECTORS > 1
103 put_le16(p
+ 47, 0x8000 | MAX_MULT_SECTORS
);
105 put_le16(p
+ 48, 1); /* dword I/O */
106 put_le16(p
+ 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
107 put_le16(p
+ 51, 0x200); /* PIO transfer cycle */
108 put_le16(p
+ 52, 0x200); /* DMA transfer cycle */
109 put_le16(p
+ 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
110 put_le16(p
+ 54, s
->cylinders
);
111 put_le16(p
+ 55, s
->heads
);
112 put_le16(p
+ 56, s
->sectors
);
113 oldsize
= s
->cylinders
* s
->heads
* s
->sectors
;
114 put_le16(p
+ 57, oldsize
);
115 put_le16(p
+ 58, oldsize
>> 16);
117 put_le16(p
+ 59, 0x100 | s
->mult_sectors
);
118 put_le16(p
+ 60, s
->nb_sectors
);
119 put_le16(p
+ 61, s
->nb_sectors
>> 16);
120 put_le16(p
+ 62, 0x07); /* single word dma0-2 supported */
121 put_le16(p
+ 63, 0x07); /* mdma0-2 supported */
122 put_le16(p
+ 64, 0x03); /* pio3-4 supported */
123 put_le16(p
+ 65, 120);
124 put_le16(p
+ 66, 120);
125 put_le16(p
+ 67, 120);
126 put_le16(p
+ 68, 120);
129 put_le16(p
+ 75, s
->ncq_queues
- 1);
131 put_le16(p
+ 76, (1 << 8));
134 put_le16(p
+ 80, 0xf0); /* ata3 -> ata6 supported */
135 put_le16(p
+ 81, 0x16); /* conforms to ata5 */
136 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
137 put_le16(p
+ 82, (1 << 14) | (1 << 5) | 1);
138 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
139 put_le16(p
+ 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
140 /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
141 put_le16(p
+ 84, (1 << 14) | 0);
142 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
143 if (bdrv_enable_write_cache(s
->bs
))
144 put_le16(p
+ 85, (1 << 14) | (1 << 5) | 1);
146 put_le16(p
+ 85, (1 << 14) | 1);
147 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
148 put_le16(p
+ 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
149 /* 14=set to 1, 1=smart self test, 0=smart error logging */
150 put_le16(p
+ 87, (1 << 14) | 0);
151 put_le16(p
+ 88, 0x3f | (1 << 13)); /* udma5 set and supported */
152 put_le16(p
+ 93, 1 | (1 << 14) | 0x2000);
153 put_le16(p
+ 100, s
->nb_sectors
);
154 put_le16(p
+ 101, s
->nb_sectors
>> 16);
155 put_le16(p
+ 102, s
->nb_sectors
>> 32);
156 put_le16(p
+ 103, s
->nb_sectors
>> 48);
157 dev
= s
->unit
? s
->bus
->slave
: s
->bus
->master
;
158 if (dev
&& dev
->conf
.physical_block_size
)
159 put_le16(p
+ 106, 0x6000 | get_physical_block_exp(&dev
->conf
));
161 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
165 static void ide_atapi_identify(IDEState
*s
)
169 if (s
->identify_set
) {
170 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
174 memset(s
->io_buffer
, 0, 512);
175 p
= (uint16_t *)s
->io_buffer
;
176 /* Removable CDROM, 50us response, 12 byte packets */
177 put_le16(p
+ 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
178 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
179 put_le16(p
+ 20, 3); /* buffer type */
180 put_le16(p
+ 21, 512); /* cache size in sectors */
181 put_le16(p
+ 22, 4); /* ecc bytes */
182 padstr((char *)(p
+ 23), s
->version
, 8); /* firmware version */
183 padstr((char *)(p
+ 27), "QEMU DVD-ROM", 40); /* model */
184 put_le16(p
+ 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
186 put_le16(p
+ 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
187 put_le16(p
+ 53, 7); /* words 64-70, 54-58, 88 valid */
188 put_le16(p
+ 62, 7); /* single word dma0-2 supported */
189 put_le16(p
+ 63, 7); /* mdma0-2 supported */
191 put_le16(p
+ 49, 1 << 9); /* LBA supported, no DMA */
192 put_le16(p
+ 53, 3); /* words 64-70, 54-58 valid */
193 put_le16(p
+ 63, 0x103); /* DMA modes XXX: may be incorrect */
195 put_le16(p
+ 64, 3); /* pio3-4 supported */
196 put_le16(p
+ 65, 0xb4); /* minimum DMA multiword tx cycle time */
197 put_le16(p
+ 66, 0xb4); /* recommended DMA multiword tx cycle time */
198 put_le16(p
+ 67, 0x12c); /* minimum PIO cycle time without flow control */
199 put_le16(p
+ 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
201 put_le16(p
+ 71, 30); /* in ns */
202 put_le16(p
+ 72, 30); /* in ns */
205 put_le16(p
+ 75, s
->ncq_queues
- 1);
207 put_le16(p
+ 76, (1 << 8));
210 put_le16(p
+ 80, 0x1e); /* support up to ATA/ATAPI-4 */
212 put_le16(p
+ 88, 0x3f | (1 << 13)); /* udma5 set and supported */
214 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
218 static void ide_cfata_identify(IDEState
*s
)
223 p
= (uint16_t *) s
->identify_data
;
227 memset(p
, 0, sizeof(s
->identify_data
));
229 cur_sec
= s
->cylinders
* s
->heads
* s
->sectors
;
231 put_le16(p
+ 0, 0x848a); /* CF Storage Card signature */
232 put_le16(p
+ 1, s
->cylinders
); /* Default cylinders */
233 put_le16(p
+ 3, s
->heads
); /* Default heads */
234 put_le16(p
+ 6, s
->sectors
); /* Default sectors per track */
235 put_le16(p
+ 7, s
->nb_sectors
>> 16); /* Sectors per card */
236 put_le16(p
+ 8, s
->nb_sectors
); /* Sectors per card */
237 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
238 put_le16(p
+ 22, 0x0004); /* ECC bytes */
239 padstr((char *) (p
+ 23), s
->version
, 8); /* Firmware Revision */
240 padstr((char *) (p
+ 27), "QEMU MICRODRIVE", 40);/* Model number */
241 #if MAX_MULT_SECTORS > 1
242 put_le16(p
+ 47, 0x8000 | MAX_MULT_SECTORS
);
244 put_le16(p
+ 47, 0x0000);
246 put_le16(p
+ 49, 0x0f00); /* Capabilities */
247 put_le16(p
+ 51, 0x0002); /* PIO cycle timing mode */
248 put_le16(p
+ 52, 0x0001); /* DMA cycle timing mode */
249 put_le16(p
+ 53, 0x0003); /* Translation params valid */
250 put_le16(p
+ 54, s
->cylinders
); /* Current cylinders */
251 put_le16(p
+ 55, s
->heads
); /* Current heads */
252 put_le16(p
+ 56, s
->sectors
); /* Current sectors */
253 put_le16(p
+ 57, cur_sec
); /* Current capacity */
254 put_le16(p
+ 58, cur_sec
>> 16); /* Current capacity */
255 if (s
->mult_sectors
) /* Multiple sector setting */
256 put_le16(p
+ 59, 0x100 | s
->mult_sectors
);
257 put_le16(p
+ 60, s
->nb_sectors
); /* Total LBA sectors */
258 put_le16(p
+ 61, s
->nb_sectors
>> 16); /* Total LBA sectors */
259 put_le16(p
+ 63, 0x0203); /* Multiword DMA capability */
260 put_le16(p
+ 64, 0x0001); /* Flow Control PIO support */
261 put_le16(p
+ 65, 0x0096); /* Min. Multiword DMA cycle */
262 put_le16(p
+ 66, 0x0096); /* Rec. Multiword DMA cycle */
263 put_le16(p
+ 68, 0x00b4); /* Min. PIO cycle time */
264 put_le16(p
+ 82, 0x400c); /* Command Set supported */
265 put_le16(p
+ 83, 0x7068); /* Command Set supported */
266 put_le16(p
+ 84, 0x4000); /* Features supported */
267 put_le16(p
+ 85, 0x000c); /* Command Set enabled */
268 put_le16(p
+ 86, 0x7044); /* Command Set enabled */
269 put_le16(p
+ 87, 0x4000); /* Features enabled */
270 put_le16(p
+ 91, 0x4060); /* Current APM level */
271 put_le16(p
+ 129, 0x0002); /* Current features option */
272 put_le16(p
+ 130, 0x0005); /* Reassigned sectors */
273 put_le16(p
+ 131, 0x0001); /* Initial power mode */
274 put_le16(p
+ 132, 0x0000); /* User signature */
275 put_le16(p
+ 160, 0x8100); /* Power requirement */
276 put_le16(p
+ 161, 0x8001); /* CF command set */
281 memcpy(s
->io_buffer
, p
, sizeof(s
->identify_data
));
284 static void ide_set_signature(IDEState
*s
)
286 s
->select
&= 0xf0; /* clear head */
290 if (s
->drive_kind
== IDE_CD
) {
302 static inline void ide_abort_command(IDEState
*s
)
304 s
->status
= READY_STAT
| ERR_STAT
;
308 /* prepare data transfer and tell what to do after */
309 void ide_transfer_start(IDEState
*s
, uint8_t *buf
, int size
,
310 EndTransferFunc
*end_transfer_func
)
312 s
->end_transfer_func
= end_transfer_func
;
314 s
->data_end
= buf
+ size
;
315 if (!(s
->status
& ERR_STAT
)) {
316 s
->status
|= DRQ_STAT
;
318 s
->bus
->dma
->ops
->start_transfer(s
->bus
->dma
);
321 void ide_transfer_stop(IDEState
*s
)
323 s
->end_transfer_func
= ide_transfer_stop
;
324 s
->data_ptr
= s
->io_buffer
;
325 s
->data_end
= s
->io_buffer
;
326 s
->status
&= ~DRQ_STAT
;
329 int64_t ide_get_sector(IDEState
*s
)
332 if (s
->select
& 0x40) {
335 sector_num
= ((s
->select
& 0x0f) << 24) | (s
->hcyl
<< 16) |
336 (s
->lcyl
<< 8) | s
->sector
;
338 sector_num
= ((int64_t)s
->hob_hcyl
<< 40) |
339 ((int64_t) s
->hob_lcyl
<< 32) |
340 ((int64_t) s
->hob_sector
<< 24) |
341 ((int64_t) s
->hcyl
<< 16) |
342 ((int64_t) s
->lcyl
<< 8) | s
->sector
;
345 sector_num
= ((s
->hcyl
<< 8) | s
->lcyl
) * s
->heads
* s
->sectors
+
346 (s
->select
& 0x0f) * s
->sectors
+ (s
->sector
- 1);
351 void ide_set_sector(IDEState
*s
, int64_t sector_num
)
354 if (s
->select
& 0x40) {
356 s
->select
= (s
->select
& 0xf0) | (sector_num
>> 24);
357 s
->hcyl
= (sector_num
>> 16);
358 s
->lcyl
= (sector_num
>> 8);
359 s
->sector
= (sector_num
);
361 s
->sector
= sector_num
;
362 s
->lcyl
= sector_num
>> 8;
363 s
->hcyl
= sector_num
>> 16;
364 s
->hob_sector
= sector_num
>> 24;
365 s
->hob_lcyl
= sector_num
>> 32;
366 s
->hob_hcyl
= sector_num
>> 40;
369 cyl
= sector_num
/ (s
->heads
* s
->sectors
);
370 r
= sector_num
% (s
->heads
* s
->sectors
);
373 s
->select
= (s
->select
& 0xf0) | ((r
/ s
->sectors
) & 0x0f);
374 s
->sector
= (r
% s
->sectors
) + 1;
378 static void ide_rw_error(IDEState
*s
) {
379 ide_abort_command(s
);
383 void ide_sector_read(IDEState
*s
)
388 s
->status
= READY_STAT
| SEEK_STAT
;
389 s
->error
= 0; /* not needed by IDE spec, but needed by Windows */
390 sector_num
= ide_get_sector(s
);
393 /* no more sector to read from disk */
394 ide_transfer_stop(s
);
396 #if defined(DEBUG_IDE)
397 printf("read sector=%" PRId64
"\n", sector_num
);
399 if (n
> s
->req_nb_sectors
)
400 n
= s
->req_nb_sectors
;
401 ret
= bdrv_read(s
->bs
, sector_num
, s
->io_buffer
, n
);
403 if (ide_handle_rw_error(s
, -ret
,
404 BM_STATUS_PIO_RETRY
| BM_STATUS_RETRY_READ
))
409 ide_transfer_start(s
, s
->io_buffer
, 512 * n
, ide_sector_read
);
411 ide_set_sector(s
, sector_num
+ n
);
416 static void dma_buf_commit(IDEState
*s
, int is_write
)
418 qemu_sglist_destroy(&s
->sg
);
421 void ide_set_inactive(IDEState
*s
)
423 s
->bus
->dma
->aiocb
= NULL
;
424 s
->bus
->dma
->ops
->set_inactive(s
->bus
->dma
);
427 void ide_dma_error(IDEState
*s
)
429 ide_transfer_stop(s
);
431 s
->status
= READY_STAT
| ERR_STAT
;
436 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
)
438 int is_read
= (op
& BM_STATUS_RETRY_READ
);
439 BlockErrorAction action
= bdrv_get_on_error(s
->bs
, is_read
);
441 if (action
== BLOCK_ERR_IGNORE
) {
442 bdrv_mon_event(s
->bs
, BDRV_ACTION_IGNORE
, is_read
);
446 if ((error
== ENOSPC
&& action
== BLOCK_ERR_STOP_ENOSPC
)
447 || action
== BLOCK_ERR_STOP_ANY
) {
448 s
->bus
->dma
->ops
->set_unit(s
->bus
->dma
, s
->unit
);
449 s
->bus
->dma
->ops
->add_status(s
->bus
->dma
, op
);
450 bdrv_mon_event(s
->bs
, BDRV_ACTION_STOP
, is_read
);
451 vm_stop(VMSTOP_DISKFULL
);
453 if (op
& BM_STATUS_DMA_RETRY
) {
454 dma_buf_commit(s
, 0);
459 bdrv_mon_event(s
->bs
, BDRV_ACTION_REPORT
, is_read
);
465 void ide_dma_cb(void *opaque
, int ret
)
467 IDEState
*s
= opaque
;
473 int op
= BM_STATUS_DMA_RETRY
;
476 op
|= BM_STATUS_RETRY_READ
;
477 if (ide_handle_rw_error(s
, -ret
, op
)) {
482 n
= s
->io_buffer_size
>> 9;
483 sector_num
= ide_get_sector(s
);
485 dma_buf_commit(s
, s
->is_read
);
487 ide_set_sector(s
, sector_num
);
491 /* end of transfer ? */
492 if (s
->nsector
== 0) {
493 s
->status
= READY_STAT
| SEEK_STAT
;
498 /* launch next transfer */
500 s
->io_buffer_index
= 0;
501 s
->io_buffer_size
= n
* 512;
502 if (s
->bus
->dma
->ops
->prepare_buf(s
->bus
->dma
, s
->is_read
) == 0) {
503 /* The PRDs were too short. Reset the Active bit, but don't raise an
509 printf("ide_dma_cb: sector_num=%" PRId64
" n=%d, is_read=%d\n",
510 sector_num
, n
, s
->is_read
);
514 s
->bus
->dma
->aiocb
= dma_bdrv_read(s
->bs
, &s
->sg
, sector_num
,
517 s
->bus
->dma
->aiocb
= dma_bdrv_write(s
->bs
, &s
->sg
, sector_num
,
521 if (!s
->bus
->dma
->aiocb
) {
523 goto handle_rw_error
;
531 static void ide_sector_start_dma(IDEState
*s
, int is_read
)
533 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
| BUSY_STAT
;
534 s
->io_buffer_index
= 0;
535 s
->io_buffer_size
= 0;
536 s
->is_read
= is_read
;
537 s
->bus
->dma
->ops
->start_dma(s
->bus
->dma
, s
, ide_dma_cb
);
540 static void ide_sector_write_timer_cb(void *opaque
)
542 IDEState
*s
= opaque
;
546 void ide_sector_write(IDEState
*s
)
551 s
->status
= READY_STAT
| SEEK_STAT
;
552 sector_num
= ide_get_sector(s
);
553 #if defined(DEBUG_IDE)
554 printf("write sector=%" PRId64
"\n", sector_num
);
557 if (n
> s
->req_nb_sectors
)
558 n
= s
->req_nb_sectors
;
559 ret
= bdrv_write(s
->bs
, sector_num
, s
->io_buffer
, n
);
562 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_PIO_RETRY
))
567 if (s
->nsector
== 0) {
568 /* no more sectors to write */
569 ide_transfer_stop(s
);
572 if (n1
> s
->req_nb_sectors
)
573 n1
= s
->req_nb_sectors
;
574 ide_transfer_start(s
, s
->io_buffer
, 512 * n1
, ide_sector_write
);
576 ide_set_sector(s
, sector_num
+ n
);
578 if (win2k_install_hack
&& ((++s
->irq_count
% 16) == 0)) {
579 /* It seems there is a bug in the Windows 2000 installer HDD
580 IDE driver which fills the disk with empty logs when the
581 IDE write IRQ comes too early. This hack tries to correct
582 that at the expense of slower write performances. Use this
583 option _only_ to install Windows 2000. You must disable it
585 qemu_mod_timer(s
->sector_write_timer
,
586 qemu_get_clock_ns(vm_clock
) + (get_ticks_per_sec() / 1000));
592 static void ide_flush_cb(void *opaque
, int ret
)
594 IDEState
*s
= opaque
;
597 /* XXX: What sector number to set here? */
598 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_RETRY_FLUSH
)) {
603 s
->status
= READY_STAT
| SEEK_STAT
;
607 void ide_flush_cache(IDEState
*s
)
609 BlockDriverAIOCB
*acb
;
616 acb
= bdrv_aio_flush(s
->bs
, ide_flush_cb
, s
);
618 ide_flush_cb(s
, -EIO
);
622 static void ide_cfata_metadata_inquiry(IDEState
*s
)
627 p
= (uint16_t *) s
->io_buffer
;
629 spd
= ((s
->mdata_size
- 1) >> 9) + 1;
631 put_le16(p
+ 0, 0x0001); /* Data format revision */
632 put_le16(p
+ 1, 0x0000); /* Media property: silicon */
633 put_le16(p
+ 2, s
->media_changed
); /* Media status */
634 put_le16(p
+ 3, s
->mdata_size
& 0xffff); /* Capacity in bytes (low) */
635 put_le16(p
+ 4, s
->mdata_size
>> 16); /* Capacity in bytes (high) */
636 put_le16(p
+ 5, spd
& 0xffff); /* Sectors per device (low) */
637 put_le16(p
+ 6, spd
>> 16); /* Sectors per device (high) */
640 static void ide_cfata_metadata_read(IDEState
*s
)
644 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
645 s
->status
= ERR_STAT
;
650 p
= (uint16_t *) s
->io_buffer
;
653 put_le16(p
+ 0, s
->media_changed
); /* Media status */
654 memcpy(p
+ 1, s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
655 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
656 s
->nsector
<< 9), 0x200 - 2));
659 static void ide_cfata_metadata_write(IDEState
*s
)
661 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
662 s
->status
= ERR_STAT
;
667 s
->media_changed
= 0;
669 memcpy(s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
671 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
672 s
->nsector
<< 9), 0x200 - 2));
675 /* called when the inserted state of the media has changed */
676 static void cdrom_change_cb(void *opaque
, int reason
)
678 IDEState
*s
= opaque
;
681 if (!(reason
& CHANGE_MEDIA
)) {
685 bdrv_get_geometry(s
->bs
, &nb_sectors
);
686 s
->nb_sectors
= nb_sectors
;
689 * First indicate to the guest that a CD has been removed. That's
690 * done on the next command the guest sends us.
692 * Then we set SENSE_UNIT_ATTENTION, by which the guest will
693 * detect a new CD in the drive. See ide_atapi_cmd() for details.
695 s
->cdrom_changed
= 1;
696 s
->events
.new_media
= true;
700 static void ide_cmd_lba48_transform(IDEState
*s
, int lba48
)
704 /* handle the 'magic' 0 nsector count conversion here. to avoid
705 * fiddling with the rest of the read logic, we just store the
706 * full sector count in ->nsector and ignore ->hob_nsector from now
712 if (!s
->nsector
&& !s
->hob_nsector
)
716 int hi
= s
->hob_nsector
;
718 s
->nsector
= (hi
<< 8) | lo
;
723 static void ide_clear_hob(IDEBus
*bus
)
725 /* any write clears HOB high bit of device control register */
726 bus
->ifs
[0].select
&= ~(1 << 7);
727 bus
->ifs
[1].select
&= ~(1 << 7);
730 void ide_ioport_write(void *opaque
, uint32_t addr
, uint32_t val
)
732 IDEBus
*bus
= opaque
;
735 printf("IDE: write addr=0x%x val=0x%02x\n", addr
, val
);
740 /* ignore writes to command block while busy with previous command */
741 if (addr
!= 7 && (idebus_active_if(bus
)->status
& (BUSY_STAT
|DRQ_STAT
)))
749 /* NOTE: data is written to the two drives */
750 bus
->ifs
[0].hob_feature
= bus
->ifs
[0].feature
;
751 bus
->ifs
[1].hob_feature
= bus
->ifs
[1].feature
;
752 bus
->ifs
[0].feature
= val
;
753 bus
->ifs
[1].feature
= val
;
757 bus
->ifs
[0].hob_nsector
= bus
->ifs
[0].nsector
;
758 bus
->ifs
[1].hob_nsector
= bus
->ifs
[1].nsector
;
759 bus
->ifs
[0].nsector
= val
;
760 bus
->ifs
[1].nsector
= val
;
764 bus
->ifs
[0].hob_sector
= bus
->ifs
[0].sector
;
765 bus
->ifs
[1].hob_sector
= bus
->ifs
[1].sector
;
766 bus
->ifs
[0].sector
= val
;
767 bus
->ifs
[1].sector
= val
;
771 bus
->ifs
[0].hob_lcyl
= bus
->ifs
[0].lcyl
;
772 bus
->ifs
[1].hob_lcyl
= bus
->ifs
[1].lcyl
;
773 bus
->ifs
[0].lcyl
= val
;
774 bus
->ifs
[1].lcyl
= val
;
778 bus
->ifs
[0].hob_hcyl
= bus
->ifs
[0].hcyl
;
779 bus
->ifs
[1].hob_hcyl
= bus
->ifs
[1].hcyl
;
780 bus
->ifs
[0].hcyl
= val
;
781 bus
->ifs
[1].hcyl
= val
;
784 /* FIXME: HOB readback uses bit 7 */
785 bus
->ifs
[0].select
= (val
& ~0x10) | 0xa0;
786 bus
->ifs
[1].select
= (val
| 0x10) | 0xa0;
788 bus
->unit
= (val
>> 4) & 1;
793 ide_exec_cmd(bus
, val
);
799 void ide_exec_cmd(IDEBus
*bus
, uint32_t val
)
805 #if defined(DEBUG_IDE)
806 printf("ide: CMD=%02x\n", val
);
808 s
= idebus_active_if(bus
);
809 /* ignore commands to non existant slave */
810 if (s
!= bus
->ifs
&& !s
->bs
)
813 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
814 if ((s
->status
& (BUSY_STAT
|DRQ_STAT
)) && val
!= WIN_DEVICE_RESET
)
819 if (s
->bs
&& s
->drive_kind
!= IDE_CD
) {
820 if (s
->drive_kind
!= IDE_CFATA
)
823 ide_cfata_identify(s
);
824 s
->status
= READY_STAT
| SEEK_STAT
;
825 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
827 if (s
->drive_kind
== IDE_CD
) {
828 ide_set_signature(s
);
830 ide_abort_command(s
);
837 s
->status
= READY_STAT
| SEEK_STAT
;
841 if (s
->drive_kind
== IDE_CFATA
&& s
->nsector
== 0) {
842 /* Disable Read and Write Multiple */
844 s
->status
= READY_STAT
| SEEK_STAT
;
845 } else if ((s
->nsector
& 0xff) != 0 &&
846 ((s
->nsector
& 0xff) > MAX_MULT_SECTORS
||
847 (s
->nsector
& (s
->nsector
- 1)) != 0)) {
848 ide_abort_command(s
);
850 s
->mult_sectors
= s
->nsector
& 0xff;
851 s
->status
= READY_STAT
| SEEK_STAT
;
858 case WIN_VERIFY_ONCE
:
859 /* do sector number check ? */
860 ide_cmd_lba48_transform(s
, lba48
);
861 s
->status
= READY_STAT
| SEEK_STAT
;
870 ide_cmd_lba48_transform(s
, lba48
);
871 s
->req_nb_sectors
= 1;
878 case CFA_WRITE_SECT_WO_ERASE
:
879 case WIN_WRITE_VERIFY
:
880 ide_cmd_lba48_transform(s
, lba48
);
882 s
->status
= SEEK_STAT
| READY_STAT
;
883 s
->req_nb_sectors
= 1;
884 ide_transfer_start(s
, s
->io_buffer
, 512, ide_sector_write
);
885 s
->media_changed
= 1;
887 case WIN_MULTREAD_EXT
:
890 if (!s
->mult_sectors
)
892 ide_cmd_lba48_transform(s
, lba48
);
893 s
->req_nb_sectors
= s
->mult_sectors
;
896 case WIN_MULTWRITE_EXT
:
899 case CFA_WRITE_MULTI_WO_ERASE
:
900 if (!s
->mult_sectors
)
902 ide_cmd_lba48_transform(s
, lba48
);
904 s
->status
= SEEK_STAT
| READY_STAT
;
905 s
->req_nb_sectors
= s
->mult_sectors
;
907 if (n
> s
->req_nb_sectors
)
908 n
= s
->req_nb_sectors
;
909 ide_transfer_start(s
, s
->io_buffer
, 512 * n
, ide_sector_write
);
910 s
->media_changed
= 1;
912 case WIN_READDMA_EXT
:
915 case WIN_READDMA_ONCE
:
918 ide_cmd_lba48_transform(s
, lba48
);
919 ide_sector_start_dma(s
, 1);
921 case WIN_WRITEDMA_EXT
:
924 case WIN_WRITEDMA_ONCE
:
927 ide_cmd_lba48_transform(s
, lba48
);
928 ide_sector_start_dma(s
, 0);
929 s
->media_changed
= 1;
931 case WIN_READ_NATIVE_MAX_EXT
:
933 case WIN_READ_NATIVE_MAX
:
934 ide_cmd_lba48_transform(s
, lba48
);
935 ide_set_sector(s
, s
->nb_sectors
- 1);
936 s
->status
= READY_STAT
| SEEK_STAT
;
939 case WIN_CHECKPOWERMODE1
:
940 case WIN_CHECKPOWERMODE2
:
942 s
->nsector
= 0xff; /* device active or idle */
943 s
->status
= READY_STAT
| SEEK_STAT
;
946 case WIN_SETFEATURES
:
949 /* XXX: valid for CDROM ? */
951 case 0xcc: /* reverting to power-on defaults enable */
952 case 0x66: /* reverting to power-on defaults disable */
953 case 0x02: /* write cache enable */
954 case 0x82: /* write cache disable */
955 case 0xaa: /* read look-ahead enable */
956 case 0x55: /* read look-ahead disable */
957 case 0x05: /* set advanced power management mode */
958 case 0x85: /* disable advanced power management mode */
963 case 0x42: /* enable Automatic Acoustic Mode */
964 case 0xc2: /* disable Automatic Acoustic Mode */
965 s
->status
= READY_STAT
| SEEK_STAT
;
968 case 0x03: { /* set transfer mode */
969 uint8_t val
= s
->nsector
& 0x07;
970 uint16_t *identify_data
= (uint16_t *)s
->identify_data
;
972 switch (s
->nsector
>> 3) {
973 case 0x00: /* pio default */
974 case 0x01: /* pio mode */
975 put_le16(identify_data
+ 62,0x07);
976 put_le16(identify_data
+ 63,0x07);
977 put_le16(identify_data
+ 88,0x3f);
979 case 0x02: /* sigle word dma mode*/
980 put_le16(identify_data
+ 62,0x07 | (1 << (val
+ 8)));
981 put_le16(identify_data
+ 63,0x07);
982 put_le16(identify_data
+ 88,0x3f);
984 case 0x04: /* mdma mode */
985 put_le16(identify_data
+ 62,0x07);
986 put_le16(identify_data
+ 63,0x07 | (1 << (val
+ 8)));
987 put_le16(identify_data
+ 88,0x3f);
989 case 0x08: /* udma mode */
990 put_le16(identify_data
+ 62,0x07);
991 put_le16(identify_data
+ 63,0x07);
992 put_le16(identify_data
+ 88,0x3f | (1 << (val
+ 8)));
997 s
->status
= READY_STAT
| SEEK_STAT
;
1005 case WIN_FLUSH_CACHE
:
1006 case WIN_FLUSH_CACHE_EXT
:
1011 case WIN_STANDBYNOW1
:
1012 case WIN_STANDBYNOW2
:
1013 case WIN_IDLEIMMEDIATE
:
1014 case CFA_IDLEIMMEDIATE
:
1019 s
->status
= READY_STAT
;
1020 ide_set_irq(s
->bus
);
1023 if(s
->drive_kind
== IDE_CD
)
1025 /* XXX: Check that seek is within bounds */
1026 s
->status
= READY_STAT
| SEEK_STAT
;
1027 ide_set_irq(s
->bus
);
1029 /* ATAPI commands */
1031 if (s
->drive_kind
== IDE_CD
) {
1032 ide_atapi_identify(s
);
1033 s
->status
= READY_STAT
| SEEK_STAT
;
1034 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
1036 ide_abort_command(s
);
1038 ide_set_irq(s
->bus
);
1041 ide_set_signature(s
);
1042 if (s
->drive_kind
== IDE_CD
)
1043 s
->status
= 0; /* ATAPI spec (v6) section 9.10 defines packet
1044 * devices to return a clear status register
1045 * with READY_STAT *not* set. */
1047 s
->status
= READY_STAT
| SEEK_STAT
;
1048 s
->error
= 0x01; /* Device 0 passed, Device 1 passed or not
1051 ide_set_irq(s
->bus
);
1054 if (s
->drive_kind
!= IDE_CD
)
1056 ide_set_signature(s
);
1057 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1061 if (s
->drive_kind
!= IDE_CD
)
1063 /* overlapping commands not supported */
1064 if (s
->feature
& 0x02)
1066 s
->status
= READY_STAT
| SEEK_STAT
;
1067 s
->atapi_dma
= s
->feature
& 1;
1069 ide_transfer_start(s
, s
->io_buffer
, ATAPI_PACKET_SIZE
,
1072 /* CF-ATA commands */
1073 case CFA_REQ_EXT_ERROR_CODE
:
1074 if (s
->drive_kind
!= IDE_CFATA
)
1076 s
->error
= 0x09; /* miscellaneous error */
1077 s
->status
= READY_STAT
| SEEK_STAT
;
1078 ide_set_irq(s
->bus
);
1080 case CFA_ERASE_SECTORS
:
1081 case CFA_WEAR_LEVEL
:
1082 if (s
->drive_kind
!= IDE_CFATA
)
1084 if (val
== CFA_WEAR_LEVEL
)
1086 if (val
== CFA_ERASE_SECTORS
)
1087 s
->media_changed
= 1;
1089 s
->status
= READY_STAT
| SEEK_STAT
;
1090 ide_set_irq(s
->bus
);
1092 case CFA_TRANSLATE_SECTOR
:
1093 if (s
->drive_kind
!= IDE_CFATA
)
1096 s
->status
= READY_STAT
| SEEK_STAT
;
1097 memset(s
->io_buffer
, 0, 0x200);
1098 s
->io_buffer
[0x00] = s
->hcyl
; /* Cyl MSB */
1099 s
->io_buffer
[0x01] = s
->lcyl
; /* Cyl LSB */
1100 s
->io_buffer
[0x02] = s
->select
; /* Head */
1101 s
->io_buffer
[0x03] = s
->sector
; /* Sector */
1102 s
->io_buffer
[0x04] = ide_get_sector(s
) >> 16; /* LBA MSB */
1103 s
->io_buffer
[0x05] = ide_get_sector(s
) >> 8; /* LBA */
1104 s
->io_buffer
[0x06] = ide_get_sector(s
) >> 0; /* LBA LSB */
1105 s
->io_buffer
[0x13] = 0x00; /* Erase flag */
1106 s
->io_buffer
[0x18] = 0x00; /* Hot count */
1107 s
->io_buffer
[0x19] = 0x00; /* Hot count */
1108 s
->io_buffer
[0x1a] = 0x01; /* Hot count */
1109 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1110 ide_set_irq(s
->bus
);
1112 case CFA_ACCESS_METADATA_STORAGE
:
1113 if (s
->drive_kind
!= IDE_CFATA
)
1115 switch (s
->feature
) {
1116 case 0x02: /* Inquiry Metadata Storage */
1117 ide_cfata_metadata_inquiry(s
);
1119 case 0x03: /* Read Metadata Storage */
1120 ide_cfata_metadata_read(s
);
1122 case 0x04: /* Write Metadata Storage */
1123 ide_cfata_metadata_write(s
);
1128 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1129 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1130 ide_set_irq(s
->bus
);
1132 case IBM_SENSE_CONDITION
:
1133 if (s
->drive_kind
!= IDE_CFATA
)
1135 switch (s
->feature
) {
1136 case 0x01: /* sense temperature in device */
1137 s
->nsector
= 0x50; /* +20 C */
1142 s
->status
= READY_STAT
| SEEK_STAT
;
1143 ide_set_irq(s
->bus
);
1147 if (s
->drive_kind
== IDE_CD
)
1149 if (s
->hcyl
!= 0xc2 || s
->lcyl
!= 0x4f)
1151 if (!s
->smart_enabled
&& s
->feature
!= SMART_ENABLE
)
1153 switch (s
->feature
) {
1155 s
->smart_enabled
= 0;
1156 s
->status
= READY_STAT
| SEEK_STAT
;
1157 ide_set_irq(s
->bus
);
1160 s
->smart_enabled
= 1;
1161 s
->status
= READY_STAT
| SEEK_STAT
;
1162 ide_set_irq(s
->bus
);
1164 case SMART_ATTR_AUTOSAVE
:
1165 switch (s
->sector
) {
1167 s
->smart_autosave
= 0;
1170 s
->smart_autosave
= 1;
1175 s
->status
= READY_STAT
| SEEK_STAT
;
1176 ide_set_irq(s
->bus
);
1179 if (!s
->smart_errors
) {
1186 s
->status
= READY_STAT
| SEEK_STAT
;
1187 ide_set_irq(s
->bus
);
1189 case SMART_READ_THRESH
:
1190 memset(s
->io_buffer
, 0, 0x200);
1191 s
->io_buffer
[0] = 0x01; /* smart struct version */
1192 for (n
=0; n
<30; n
++) {
1193 if (smart_attributes
[n
][0] == 0)
1195 s
->io_buffer
[2+0+(n
*12)] = smart_attributes
[n
][0];
1196 s
->io_buffer
[2+1+(n
*12)] = smart_attributes
[n
][11];
1198 for (n
=0; n
<511; n
++) /* checksum */
1199 s
->io_buffer
[511] += s
->io_buffer
[n
];
1200 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1201 s
->status
= READY_STAT
| SEEK_STAT
;
1202 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1203 ide_set_irq(s
->bus
);
1205 case SMART_READ_DATA
:
1206 memset(s
->io_buffer
, 0, 0x200);
1207 s
->io_buffer
[0] = 0x01; /* smart struct version */
1208 for (n
=0; n
<30; n
++) {
1209 if (smart_attributes
[n
][0] == 0) {
1213 for(i
= 0; i
< 11; i
++) {
1214 s
->io_buffer
[2+i
+(n
*12)] = smart_attributes
[n
][i
];
1217 s
->io_buffer
[362] = 0x02 | (s
->smart_autosave
?0x80:0x00);
1218 if (s
->smart_selftest_count
== 0) {
1219 s
->io_buffer
[363] = 0;
1222 s
->smart_selftest_data
[3 +
1223 (s
->smart_selftest_count
- 1) *
1226 s
->io_buffer
[364] = 0x20;
1227 s
->io_buffer
[365] = 0x01;
1228 /* offline data collection capacity: execute + self-test*/
1229 s
->io_buffer
[367] = (1<<4 | 1<<3 | 1);
1230 s
->io_buffer
[368] = 0x03; /* smart capability (1) */
1231 s
->io_buffer
[369] = 0x00; /* smart capability (2) */
1232 s
->io_buffer
[370] = 0x01; /* error logging supported */
1233 s
->io_buffer
[372] = 0x02; /* minutes for poll short test */
1234 s
->io_buffer
[373] = 0x36; /* minutes for poll ext test */
1235 s
->io_buffer
[374] = 0x01; /* minutes for poll conveyance */
1237 for (n
=0; n
<511; n
++)
1238 s
->io_buffer
[511] += s
->io_buffer
[n
];
1239 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1240 s
->status
= READY_STAT
| SEEK_STAT
;
1241 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1242 ide_set_irq(s
->bus
);
1244 case SMART_READ_LOG
:
1245 switch (s
->sector
) {
1246 case 0x01: /* summary smart error log */
1247 memset(s
->io_buffer
, 0, 0x200);
1248 s
->io_buffer
[0] = 0x01;
1249 s
->io_buffer
[1] = 0x00; /* no error entries */
1250 s
->io_buffer
[452] = s
->smart_errors
& 0xff;
1251 s
->io_buffer
[453] = (s
->smart_errors
& 0xff00) >> 8;
1253 for (n
=0; n
<511; n
++)
1254 s
->io_buffer
[511] += s
->io_buffer
[n
];
1255 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1257 case 0x06: /* smart self test log */
1258 memset(s
->io_buffer
, 0, 0x200);
1259 s
->io_buffer
[0] = 0x01;
1260 if (s
->smart_selftest_count
== 0) {
1261 s
->io_buffer
[508] = 0;
1263 s
->io_buffer
[508] = s
->smart_selftest_count
;
1264 for (n
=2; n
<506; n
++)
1265 s
->io_buffer
[n
] = s
->smart_selftest_data
[n
];
1267 for (n
=0; n
<511; n
++)
1268 s
->io_buffer
[511] += s
->io_buffer
[n
];
1269 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1274 s
->status
= READY_STAT
| SEEK_STAT
;
1275 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1276 ide_set_irq(s
->bus
);
1278 case SMART_EXECUTE_OFFLINE
:
1279 switch (s
->sector
) {
1280 case 0: /* off-line routine */
1281 case 1: /* short self test */
1282 case 2: /* extended self test */
1283 s
->smart_selftest_count
++;
1284 if(s
->smart_selftest_count
> 21)
1285 s
->smart_selftest_count
= 0;
1286 n
= 2 + (s
->smart_selftest_count
- 1) * 24;
1287 s
->smart_selftest_data
[n
] = s
->sector
;
1288 s
->smart_selftest_data
[n
+1] = 0x00; /* OK and finished */
1289 s
->smart_selftest_data
[n
+2] = 0x34; /* hour count lsb */
1290 s
->smart_selftest_data
[n
+3] = 0x12; /* hour count msb */
1291 s
->status
= READY_STAT
| SEEK_STAT
;
1292 ide_set_irq(s
->bus
);
1304 ide_abort_command(s
);
1305 ide_set_irq(s
->bus
);
1310 uint32_t ide_ioport_read(void *opaque
, uint32_t addr1
)
1312 IDEBus
*bus
= opaque
;
1313 IDEState
*s
= idebus_active_if(bus
);
1318 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1319 //hob = s->select & (1 << 7);
1326 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1327 (s
!= bus
->ifs
&& !s
->bs
))
1332 ret
= s
->hob_feature
;
1335 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1338 ret
= s
->nsector
& 0xff;
1340 ret
= s
->hob_nsector
;
1343 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1348 ret
= s
->hob_sector
;
1351 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1359 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1367 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1374 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1375 (s
!= bus
->ifs
&& !s
->bs
))
1379 qemu_irq_lower(bus
->irq
);
1383 printf("ide: read addr=0x%x val=%02x\n", addr1
, ret
);
1388 uint32_t ide_status_read(void *opaque
, uint32_t addr
)
1390 IDEBus
*bus
= opaque
;
1391 IDEState
*s
= idebus_active_if(bus
);
1394 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1395 (s
!= bus
->ifs
&& !s
->bs
))
1400 printf("ide: read status addr=0x%x val=%02x\n", addr
, ret
);
1405 void ide_cmd_write(void *opaque
, uint32_t addr
, uint32_t val
)
1407 IDEBus
*bus
= opaque
;
1412 printf("ide: write control addr=0x%x val=%02x\n", addr
, val
);
1414 /* common for both drives */
1415 if (!(bus
->cmd
& IDE_CMD_RESET
) &&
1416 (val
& IDE_CMD_RESET
)) {
1417 /* reset low to high */
1418 for(i
= 0;i
< 2; i
++) {
1420 s
->status
= BUSY_STAT
| SEEK_STAT
;
1423 } else if ((bus
->cmd
& IDE_CMD_RESET
) &&
1424 !(val
& IDE_CMD_RESET
)) {
1426 for(i
= 0;i
< 2; i
++) {
1428 if (s
->drive_kind
== IDE_CD
)
1429 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1431 s
->status
= READY_STAT
| SEEK_STAT
;
1432 ide_set_signature(s
);
1439 void ide_data_writew(void *opaque
, uint32_t addr
, uint32_t val
)
1441 IDEBus
*bus
= opaque
;
1442 IDEState
*s
= idebus_active_if(bus
);
1445 /* PIO data access allowed only when DRQ bit is set */
1446 if (!(s
->status
& DRQ_STAT
))
1450 *(uint16_t *)p
= le16_to_cpu(val
);
1453 if (p
>= s
->data_end
)
1454 s
->end_transfer_func(s
);
1457 uint32_t ide_data_readw(void *opaque
, uint32_t addr
)
1459 IDEBus
*bus
= opaque
;
1460 IDEState
*s
= idebus_active_if(bus
);
1464 /* PIO data access allowed only when DRQ bit is set */
1465 if (!(s
->status
& DRQ_STAT
))
1469 ret
= cpu_to_le16(*(uint16_t *)p
);
1472 if (p
>= s
->data_end
)
1473 s
->end_transfer_func(s
);
1477 void ide_data_writel(void *opaque
, uint32_t addr
, uint32_t val
)
1479 IDEBus
*bus
= opaque
;
1480 IDEState
*s
= idebus_active_if(bus
);
1483 /* PIO data access allowed only when DRQ bit is set */
1484 if (!(s
->status
& DRQ_STAT
))
1488 *(uint32_t *)p
= le32_to_cpu(val
);
1491 if (p
>= s
->data_end
)
1492 s
->end_transfer_func(s
);
1495 uint32_t ide_data_readl(void *opaque
, uint32_t addr
)
1497 IDEBus
*bus
= opaque
;
1498 IDEState
*s
= idebus_active_if(bus
);
1502 /* PIO data access allowed only when DRQ bit is set */
1503 if (!(s
->status
& DRQ_STAT
))
1507 ret
= cpu_to_le32(*(uint32_t *)p
);
1510 if (p
>= s
->data_end
)
1511 s
->end_transfer_func(s
);
1515 static void ide_dummy_transfer_stop(IDEState
*s
)
1517 s
->data_ptr
= s
->io_buffer
;
1518 s
->data_end
= s
->io_buffer
;
1519 s
->io_buffer
[0] = 0xff;
1520 s
->io_buffer
[1] = 0xff;
1521 s
->io_buffer
[2] = 0xff;
1522 s
->io_buffer
[3] = 0xff;
1525 static void ide_reset(IDEState
*s
)
1528 printf("ide: reset\n");
1530 if (s
->drive_kind
== IDE_CFATA
)
1531 s
->mult_sectors
= 0;
1533 s
->mult_sectors
= MAX_MULT_SECTORS
;
1550 s
->status
= READY_STAT
| SEEK_STAT
;
1554 /* ATAPI specific */
1557 s
->cdrom_changed
= 0;
1558 s
->packet_transfer_size
= 0;
1559 s
->elementary_transfer_size
= 0;
1560 s
->io_buffer_index
= 0;
1561 s
->cd_sector_size
= 0;
1564 s
->io_buffer_size
= 0;
1565 s
->req_nb_sectors
= 0;
1567 ide_set_signature(s
);
1568 /* init the transfer handler so that 0xffff is returned on data
1570 s
->end_transfer_func
= ide_dummy_transfer_stop
;
1571 ide_dummy_transfer_stop(s
);
1572 s
->media_changed
= 0;
1575 void ide_bus_reset(IDEBus
*bus
)
1579 ide_reset(&bus
->ifs
[0]);
1580 ide_reset(&bus
->ifs
[1]);
1583 /* pending async DMA */
1584 if (bus
->dma
->aiocb
) {
1586 printf("aio_cancel\n");
1588 bdrv_aio_cancel(bus
->dma
->aiocb
);
1589 bus
->dma
->aiocb
= NULL
;
1592 /* reset dma provider too */
1593 bus
->dma
->ops
->reset(bus
->dma
);
1596 int ide_init_drive(IDEState
*s
, BlockDriverState
*bs
, IDEDriveKind kind
,
1597 const char *version
, const char *serial
)
1599 int cylinders
, heads
, secs
;
1600 uint64_t nb_sectors
;
1603 s
->drive_kind
= kind
;
1605 bdrv_get_geometry(bs
, &nb_sectors
);
1606 bdrv_guess_geometry(bs
, &cylinders
, &heads
, &secs
);
1607 if (cylinders
< 1 || cylinders
> 16383) {
1608 error_report("cyls must be between 1 and 16383");
1611 if (heads
< 1 || heads
> 16) {
1612 error_report("heads must be between 1 and 16");
1615 if (secs
< 1 || secs
> 63) {
1616 error_report("secs must be between 1 and 63");
1619 s
->cylinders
= cylinders
;
1622 s
->nb_sectors
= nb_sectors
;
1623 /* The SMART values should be preserved across power cycles
1625 s
->smart_enabled
= 1;
1626 s
->smart_autosave
= 1;
1627 s
->smart_errors
= 0;
1628 s
->smart_selftest_count
= 0;
1629 if (kind
== IDE_CD
) {
1630 bdrv_set_change_cb(bs
, cdrom_change_cb
, s
);
1631 bs
->buffer_alignment
= 2048;
1633 if (!bdrv_is_inserted(s
->bs
)) {
1634 error_report("Device needs media, but drive is empty");
1637 if (bdrv_is_read_only(bs
)) {
1638 error_report("Can't use a read-only drive");
1643 strncpy(s
->drive_serial_str
, serial
, sizeof(s
->drive_serial_str
));
1645 snprintf(s
->drive_serial_str
, sizeof(s
->drive_serial_str
),
1646 "QM%05d", s
->drive_serial
);
1649 pstrcpy(s
->version
, sizeof(s
->version
), version
);
1651 pstrcpy(s
->version
, sizeof(s
->version
), QEMU_VERSION
);
1655 bdrv_set_removable(bs
, s
->drive_kind
== IDE_CD
);
1659 static void ide_init1(IDEBus
*bus
, int unit
)
1661 static int drive_serial
= 1;
1662 IDEState
*s
= &bus
->ifs
[unit
];
1666 s
->drive_serial
= drive_serial
++;
1667 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1668 s
->io_buffer
= qemu_memalign(2048, IDE_DMA_BUF_SECTORS
*512 + 4);
1669 s
->io_buffer_total_len
= IDE_DMA_BUF_SECTORS
*512 + 4;
1670 s
->smart_selftest_data
= qemu_blockalign(s
->bs
, 512);
1671 s
->sector_write_timer
= qemu_new_timer_ns(vm_clock
,
1672 ide_sector_write_timer_cb
, s
);
1675 static void ide_nop_start(IDEDMA
*dma
, IDEState
*s
,
1676 BlockDriverCompletionFunc
*cb
)
1680 static int ide_nop(IDEDMA
*dma
)
1685 static int ide_nop_int(IDEDMA
*dma
, int x
)
1690 static void ide_nop_restart(void *opaque
, int x
, int y
)
1694 static const IDEDMAOps ide_dma_nop_ops
= {
1695 .start_dma
= ide_nop_start
,
1696 .start_transfer
= ide_nop
,
1697 .prepare_buf
= ide_nop_int
,
1698 .rw_buf
= ide_nop_int
,
1699 .set_unit
= ide_nop_int
,
1700 .add_status
= ide_nop_int
,
1701 .set_inactive
= ide_nop
,
1702 .restart_cb
= ide_nop_restart
,
1706 static IDEDMA ide_dma_nop
= {
1707 .ops
= &ide_dma_nop_ops
,
1711 void ide_init2(IDEBus
*bus
, qemu_irq irq
)
1715 for(i
= 0; i
< 2; i
++) {
1717 ide_reset(&bus
->ifs
[i
]);
1720 bus
->dma
= &ide_dma_nop
;
1723 /* TODO convert users to qdev and remove */
1724 void ide_init2_with_non_qdev_drives(IDEBus
*bus
, DriveInfo
*hd0
,
1725 DriveInfo
*hd1
, qemu_irq irq
)
1730 for(i
= 0; i
< 2; i
++) {
1731 dinfo
= i
== 0 ? hd0
: hd1
;
1734 if (ide_init_drive(&bus
->ifs
[i
], dinfo
->bdrv
,
1735 dinfo
->media_cd
? IDE_CD
: IDE_HD
, NULL
,
1736 *dinfo
->serial
? dinfo
->serial
: NULL
) < 0) {
1737 error_report("Can't set up IDE drive %s", dinfo
->id
);
1741 ide_reset(&bus
->ifs
[i
]);
1745 bus
->dma
= &ide_dma_nop
;
1748 void ide_init_ioport(IDEBus
*bus
, int iobase
, int iobase2
)
1750 register_ioport_write(iobase
, 8, 1, ide_ioport_write
, bus
);
1751 register_ioport_read(iobase
, 8, 1, ide_ioport_read
, bus
);
1753 register_ioport_read(iobase2
, 1, 1, ide_status_read
, bus
);
1754 register_ioport_write(iobase2
, 1, 1, ide_cmd_write
, bus
);
1758 register_ioport_write(iobase
, 2, 2, ide_data_writew
, bus
);
1759 register_ioport_read(iobase
, 2, 2, ide_data_readw
, bus
);
1760 register_ioport_write(iobase
, 4, 4, ide_data_writel
, bus
);
1761 register_ioport_read(iobase
, 4, 4, ide_data_readl
, bus
);
1764 static bool is_identify_set(void *opaque
, int version_id
)
1766 IDEState
*s
= opaque
;
1768 return s
->identify_set
!= 0;
1771 static EndTransferFunc
* transfer_end_table
[] = {
1775 ide_atapi_cmd_reply_end
,
1777 ide_dummy_transfer_stop
,
1780 static int transfer_end_table_idx(EndTransferFunc
*fn
)
1784 for (i
= 0; i
< ARRAY_SIZE(transfer_end_table
); i
++)
1785 if (transfer_end_table
[i
] == fn
)
1791 static int ide_drive_post_load(void *opaque
, int version_id
)
1793 IDEState
*s
= opaque
;
1795 if (version_id
< 3) {
1796 if (s
->sense_key
== SENSE_UNIT_ATTENTION
&&
1797 s
->asc
== ASC_MEDIUM_MAY_HAVE_CHANGED
) {
1798 s
->cdrom_changed
= 1;
1804 static int ide_drive_pio_post_load(void *opaque
, int version_id
)
1806 IDEState
*s
= opaque
;
1808 if (s
->end_transfer_fn_idx
> ARRAY_SIZE(transfer_end_table
)) {
1811 s
->end_transfer_func
= transfer_end_table
[s
->end_transfer_fn_idx
];
1812 s
->data_ptr
= s
->io_buffer
+ s
->cur_io_buffer_offset
;
1813 s
->data_end
= s
->data_ptr
+ s
->cur_io_buffer_len
;
1818 static void ide_drive_pio_pre_save(void *opaque
)
1820 IDEState
*s
= opaque
;
1823 s
->cur_io_buffer_offset
= s
->data_ptr
- s
->io_buffer
;
1824 s
->cur_io_buffer_len
= s
->data_end
- s
->data_ptr
;
1826 idx
= transfer_end_table_idx(s
->end_transfer_func
);
1828 fprintf(stderr
, "%s: invalid end_transfer_func for DRQ_STAT\n",
1830 s
->end_transfer_fn_idx
= 2;
1832 s
->end_transfer_fn_idx
= idx
;
1836 static bool ide_drive_pio_state_needed(void *opaque
)
1838 IDEState
*s
= opaque
;
1840 return (s
->status
& DRQ_STAT
) != 0;
1843 static bool ide_atapi_gesn_needed(void *opaque
)
1845 IDEState
*s
= opaque
;
1847 return s
->events
.new_media
|| s
->events
.eject_request
;
1850 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
1851 const VMStateDescription vmstate_ide_atapi_gesn_state
= {
1852 .name
="ide_drive/atapi/gesn_state",
1854 .minimum_version_id
= 1,
1855 .minimum_version_id_old
= 1,
1856 .fields
= (VMStateField
[]) {
1857 VMSTATE_BOOL(events
.new_media
, IDEState
),
1858 VMSTATE_BOOL(events
.eject_request
, IDEState
),
1862 const VMStateDescription vmstate_ide_drive_pio_state
= {
1863 .name
= "ide_drive/pio_state",
1865 .minimum_version_id
= 1,
1866 .minimum_version_id_old
= 1,
1867 .pre_save
= ide_drive_pio_pre_save
,
1868 .post_load
= ide_drive_pio_post_load
,
1869 .fields
= (VMStateField
[]) {
1870 VMSTATE_INT32(req_nb_sectors
, IDEState
),
1871 VMSTATE_VARRAY_INT32(io_buffer
, IDEState
, io_buffer_total_len
, 1,
1872 vmstate_info_uint8
, uint8_t),
1873 VMSTATE_INT32(cur_io_buffer_offset
, IDEState
),
1874 VMSTATE_INT32(cur_io_buffer_len
, IDEState
),
1875 VMSTATE_UINT8(end_transfer_fn_idx
, IDEState
),
1876 VMSTATE_INT32(elementary_transfer_size
, IDEState
),
1877 VMSTATE_INT32(packet_transfer_size
, IDEState
),
1878 VMSTATE_END_OF_LIST()
1882 const VMStateDescription vmstate_ide_drive
= {
1883 .name
= "ide_drive",
1885 .minimum_version_id
= 0,
1886 .minimum_version_id_old
= 0,
1887 .post_load
= ide_drive_post_load
,
1888 .fields
= (VMStateField
[]) {
1889 VMSTATE_INT32(mult_sectors
, IDEState
),
1890 VMSTATE_INT32(identify_set
, IDEState
),
1891 VMSTATE_BUFFER_TEST(identify_data
, IDEState
, is_identify_set
),
1892 VMSTATE_UINT8(feature
, IDEState
),
1893 VMSTATE_UINT8(error
, IDEState
),
1894 VMSTATE_UINT32(nsector
, IDEState
),
1895 VMSTATE_UINT8(sector
, IDEState
),
1896 VMSTATE_UINT8(lcyl
, IDEState
),
1897 VMSTATE_UINT8(hcyl
, IDEState
),
1898 VMSTATE_UINT8(hob_feature
, IDEState
),
1899 VMSTATE_UINT8(hob_sector
, IDEState
),
1900 VMSTATE_UINT8(hob_nsector
, IDEState
),
1901 VMSTATE_UINT8(hob_lcyl
, IDEState
),
1902 VMSTATE_UINT8(hob_hcyl
, IDEState
),
1903 VMSTATE_UINT8(select
, IDEState
),
1904 VMSTATE_UINT8(status
, IDEState
),
1905 VMSTATE_UINT8(lba48
, IDEState
),
1906 VMSTATE_UINT8(sense_key
, IDEState
),
1907 VMSTATE_UINT8(asc
, IDEState
),
1908 VMSTATE_UINT8_V(cdrom_changed
, IDEState
, 3),
1909 VMSTATE_END_OF_LIST()
1911 .subsections
= (VMStateSubsection
[]) {
1913 .vmsd
= &vmstate_ide_drive_pio_state
,
1914 .needed
= ide_drive_pio_state_needed
,
1916 .vmsd
= &vmstate_ide_atapi_gesn_state
,
1917 .needed
= ide_atapi_gesn_needed
,
1924 const VMStateDescription vmstate_ide_bus
= {
1927 .minimum_version_id
= 1,
1928 .minimum_version_id_old
= 1,
1929 .fields
= (VMStateField
[]) {
1930 VMSTATE_UINT8(cmd
, IDEBus
),
1931 VMSTATE_UINT8(unit
, IDEBus
),
1932 VMSTATE_END_OF_LIST()
1936 void ide_drive_get(DriveInfo
**hd
, int max_bus
)
1940 if (drive_get_max_bus(IF_IDE
) >= max_bus
) {
1941 fprintf(stderr
, "qemu: too many IDE bus: %d\n", max_bus
);
1945 for(i
= 0; i
< max_bus
* MAX_IDE_DEVS
; i
++) {
1946 hd
[i
] = drive_get(IF_IDE
, i
/ MAX_IDE_DEVS
, i
% MAX_IDE_DEVS
);