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
;
433 s
->bus
->dma
->ops
->add_status(s
->bus
->dma
, BM_STATUS_INT
);
437 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
)
439 int is_read
= (op
& BM_STATUS_RETRY_READ
);
440 BlockErrorAction action
= bdrv_get_on_error(s
->bs
, is_read
);
442 if (action
== BLOCK_ERR_IGNORE
) {
443 bdrv_mon_event(s
->bs
, BDRV_ACTION_IGNORE
, is_read
);
447 if ((error
== ENOSPC
&& action
== BLOCK_ERR_STOP_ENOSPC
)
448 || action
== BLOCK_ERR_STOP_ANY
) {
449 s
->bus
->dma
->ops
->set_unit(s
->bus
->dma
, s
->unit
);
450 s
->bus
->dma
->ops
->add_status(s
->bus
->dma
, op
);
451 bdrv_mon_event(s
->bs
, BDRV_ACTION_STOP
, is_read
);
452 vm_stop(VMSTOP_DISKFULL
);
454 if (op
& BM_STATUS_DMA_RETRY
) {
455 dma_buf_commit(s
, 0);
460 bdrv_mon_event(s
->bs
, BDRV_ACTION_REPORT
, is_read
);
466 void ide_dma_cb(void *opaque
, int ret
)
468 IDEState
*s
= opaque
;
474 int op
= BM_STATUS_DMA_RETRY
;
477 op
|= BM_STATUS_RETRY_READ
;
478 if (ide_handle_rw_error(s
, -ret
, op
)) {
483 n
= s
->io_buffer_size
>> 9;
484 sector_num
= ide_get_sector(s
);
486 dma_buf_commit(s
, s
->is_read
);
488 ide_set_sector(s
, sector_num
);
492 /* end of transfer ? */
493 if (s
->nsector
== 0) {
494 s
->status
= READY_STAT
| SEEK_STAT
;
499 /* launch next transfer */
501 s
->io_buffer_index
= 0;
502 s
->io_buffer_size
= n
* 512;
503 if (s
->bus
->dma
->ops
->prepare_buf(s
->bus
->dma
, s
->is_read
) == 0)
507 printf("ide_dma_cb: sector_num=%" PRId64
" n=%d, is_read=%d\n",
508 sector_num
, n
, s
->is_read
);
512 s
->bus
->dma
->aiocb
= dma_bdrv_read(s
->bs
, &s
->sg
, sector_num
,
515 s
->bus
->dma
->aiocb
= dma_bdrv_write(s
->bs
, &s
->sg
, sector_num
,
519 if (!s
->bus
->dma
->aiocb
) {
521 goto handle_rw_error
;
526 s
->bus
->dma
->ops
->add_status(s
->bus
->dma
, BM_STATUS_INT
);
530 static void ide_sector_start_dma(IDEState
*s
, int is_read
)
532 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
| BUSY_STAT
;
533 s
->io_buffer_index
= 0;
534 s
->io_buffer_size
= 0;
535 s
->is_read
= is_read
;
536 s
->bus
->dma
->ops
->start_dma(s
->bus
->dma
, s
, ide_dma_cb
);
539 static void ide_sector_write_timer_cb(void *opaque
)
541 IDEState
*s
= opaque
;
545 void ide_sector_write(IDEState
*s
)
550 s
->status
= READY_STAT
| SEEK_STAT
;
551 sector_num
= ide_get_sector(s
);
552 #if defined(DEBUG_IDE)
553 printf("write sector=%" PRId64
"\n", sector_num
);
556 if (n
> s
->req_nb_sectors
)
557 n
= s
->req_nb_sectors
;
558 ret
= bdrv_write(s
->bs
, sector_num
, s
->io_buffer
, n
);
561 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_PIO_RETRY
))
566 if (s
->nsector
== 0) {
567 /* no more sectors to write */
568 ide_transfer_stop(s
);
571 if (n1
> s
->req_nb_sectors
)
572 n1
= s
->req_nb_sectors
;
573 ide_transfer_start(s
, s
->io_buffer
, 512 * n1
, ide_sector_write
);
575 ide_set_sector(s
, sector_num
+ n
);
577 if (win2k_install_hack
&& ((++s
->irq_count
% 16) == 0)) {
578 /* It seems there is a bug in the Windows 2000 installer HDD
579 IDE driver which fills the disk with empty logs when the
580 IDE write IRQ comes too early. This hack tries to correct
581 that at the expense of slower write performances. Use this
582 option _only_ to install Windows 2000. You must disable it
584 qemu_mod_timer(s
->sector_write_timer
,
585 qemu_get_clock_ns(vm_clock
) + (get_ticks_per_sec() / 1000));
591 static void ide_flush_cb(void *opaque
, int ret
)
593 IDEState
*s
= opaque
;
596 /* XXX: What sector number to set here? */
597 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_RETRY_FLUSH
)) {
602 s
->status
= READY_STAT
| SEEK_STAT
;
606 void ide_flush_cache(IDEState
*s
)
608 BlockDriverAIOCB
*acb
;
615 acb
= bdrv_aio_flush(s
->bs
, ide_flush_cb
, s
);
617 ide_flush_cb(s
, -EIO
);
621 static void ide_cfata_metadata_inquiry(IDEState
*s
)
626 p
= (uint16_t *) s
->io_buffer
;
628 spd
= ((s
->mdata_size
- 1) >> 9) + 1;
630 put_le16(p
+ 0, 0x0001); /* Data format revision */
631 put_le16(p
+ 1, 0x0000); /* Media property: silicon */
632 put_le16(p
+ 2, s
->media_changed
); /* Media status */
633 put_le16(p
+ 3, s
->mdata_size
& 0xffff); /* Capacity in bytes (low) */
634 put_le16(p
+ 4, s
->mdata_size
>> 16); /* Capacity in bytes (high) */
635 put_le16(p
+ 5, spd
& 0xffff); /* Sectors per device (low) */
636 put_le16(p
+ 6, spd
>> 16); /* Sectors per device (high) */
639 static void ide_cfata_metadata_read(IDEState
*s
)
643 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
644 s
->status
= ERR_STAT
;
649 p
= (uint16_t *) s
->io_buffer
;
652 put_le16(p
+ 0, s
->media_changed
); /* Media status */
653 memcpy(p
+ 1, s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
654 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
655 s
->nsector
<< 9), 0x200 - 2));
658 static void ide_cfata_metadata_write(IDEState
*s
)
660 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
661 s
->status
= ERR_STAT
;
666 s
->media_changed
= 0;
668 memcpy(s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
670 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
671 s
->nsector
<< 9), 0x200 - 2));
674 /* called when the inserted state of the media has changed */
675 static void cdrom_change_cb(void *opaque
, int reason
)
677 IDEState
*s
= opaque
;
680 if (!(reason
& CHANGE_MEDIA
)) {
684 bdrv_get_geometry(s
->bs
, &nb_sectors
);
685 s
->nb_sectors
= nb_sectors
;
688 * First indicate to the guest that a CD has been removed. That's
689 * done on the next command the guest sends us.
691 * Then we set SENSE_UNIT_ATTENTION, by which the guest will
692 * detect a new CD in the drive. See ide_atapi_cmd() for details.
694 s
->cdrom_changed
= 1;
695 s
->events
.new_media
= true;
699 static void ide_cmd_lba48_transform(IDEState
*s
, int lba48
)
703 /* handle the 'magic' 0 nsector count conversion here. to avoid
704 * fiddling with the rest of the read logic, we just store the
705 * full sector count in ->nsector and ignore ->hob_nsector from now
711 if (!s
->nsector
&& !s
->hob_nsector
)
715 int hi
= s
->hob_nsector
;
717 s
->nsector
= (hi
<< 8) | lo
;
722 static void ide_clear_hob(IDEBus
*bus
)
724 /* any write clears HOB high bit of device control register */
725 bus
->ifs
[0].select
&= ~(1 << 7);
726 bus
->ifs
[1].select
&= ~(1 << 7);
729 void ide_ioport_write(void *opaque
, uint32_t addr
, uint32_t val
)
731 IDEBus
*bus
= opaque
;
734 printf("IDE: write addr=0x%x val=0x%02x\n", addr
, val
);
739 /* ignore writes to command block while busy with previous command */
740 if (addr
!= 7 && (idebus_active_if(bus
)->status
& (BUSY_STAT
|DRQ_STAT
)))
748 /* NOTE: data is written to the two drives */
749 bus
->ifs
[0].hob_feature
= bus
->ifs
[0].feature
;
750 bus
->ifs
[1].hob_feature
= bus
->ifs
[1].feature
;
751 bus
->ifs
[0].feature
= val
;
752 bus
->ifs
[1].feature
= val
;
756 bus
->ifs
[0].hob_nsector
= bus
->ifs
[0].nsector
;
757 bus
->ifs
[1].hob_nsector
= bus
->ifs
[1].nsector
;
758 bus
->ifs
[0].nsector
= val
;
759 bus
->ifs
[1].nsector
= val
;
763 bus
->ifs
[0].hob_sector
= bus
->ifs
[0].sector
;
764 bus
->ifs
[1].hob_sector
= bus
->ifs
[1].sector
;
765 bus
->ifs
[0].sector
= val
;
766 bus
->ifs
[1].sector
= val
;
770 bus
->ifs
[0].hob_lcyl
= bus
->ifs
[0].lcyl
;
771 bus
->ifs
[1].hob_lcyl
= bus
->ifs
[1].lcyl
;
772 bus
->ifs
[0].lcyl
= val
;
773 bus
->ifs
[1].lcyl
= val
;
777 bus
->ifs
[0].hob_hcyl
= bus
->ifs
[0].hcyl
;
778 bus
->ifs
[1].hob_hcyl
= bus
->ifs
[1].hcyl
;
779 bus
->ifs
[0].hcyl
= val
;
780 bus
->ifs
[1].hcyl
= val
;
783 /* FIXME: HOB readback uses bit 7 */
784 bus
->ifs
[0].select
= (val
& ~0x10) | 0xa0;
785 bus
->ifs
[1].select
= (val
| 0x10) | 0xa0;
787 bus
->unit
= (val
>> 4) & 1;
792 ide_exec_cmd(bus
, val
);
798 void ide_exec_cmd(IDEBus
*bus
, uint32_t val
)
804 #if defined(DEBUG_IDE)
805 printf("ide: CMD=%02x\n", val
);
807 s
= idebus_active_if(bus
);
808 /* ignore commands to non existant slave */
809 if (s
!= bus
->ifs
&& !s
->bs
)
812 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
813 if ((s
->status
& (BUSY_STAT
|DRQ_STAT
)) && val
!= WIN_DEVICE_RESET
)
818 if (s
->bs
&& s
->drive_kind
!= IDE_CD
) {
819 if (s
->drive_kind
!= IDE_CFATA
)
822 ide_cfata_identify(s
);
823 s
->status
= READY_STAT
| SEEK_STAT
;
824 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
826 if (s
->drive_kind
== IDE_CD
) {
827 ide_set_signature(s
);
829 ide_abort_command(s
);
836 s
->status
= READY_STAT
| SEEK_STAT
;
840 if (s
->drive_kind
== IDE_CFATA
&& s
->nsector
== 0) {
841 /* Disable Read and Write Multiple */
843 s
->status
= READY_STAT
| SEEK_STAT
;
844 } else if ((s
->nsector
& 0xff) != 0 &&
845 ((s
->nsector
& 0xff) > MAX_MULT_SECTORS
||
846 (s
->nsector
& (s
->nsector
- 1)) != 0)) {
847 ide_abort_command(s
);
849 s
->mult_sectors
= s
->nsector
& 0xff;
850 s
->status
= READY_STAT
| SEEK_STAT
;
857 case WIN_VERIFY_ONCE
:
858 /* do sector number check ? */
859 ide_cmd_lba48_transform(s
, lba48
);
860 s
->status
= READY_STAT
| SEEK_STAT
;
869 ide_cmd_lba48_transform(s
, lba48
);
870 s
->req_nb_sectors
= 1;
877 case CFA_WRITE_SECT_WO_ERASE
:
878 case WIN_WRITE_VERIFY
:
879 ide_cmd_lba48_transform(s
, lba48
);
881 s
->status
= SEEK_STAT
| READY_STAT
;
882 s
->req_nb_sectors
= 1;
883 ide_transfer_start(s
, s
->io_buffer
, 512, ide_sector_write
);
884 s
->media_changed
= 1;
886 case WIN_MULTREAD_EXT
:
889 if (!s
->mult_sectors
)
891 ide_cmd_lba48_transform(s
, lba48
);
892 s
->req_nb_sectors
= s
->mult_sectors
;
895 case WIN_MULTWRITE_EXT
:
898 case CFA_WRITE_MULTI_WO_ERASE
:
899 if (!s
->mult_sectors
)
901 ide_cmd_lba48_transform(s
, lba48
);
903 s
->status
= SEEK_STAT
| READY_STAT
;
904 s
->req_nb_sectors
= s
->mult_sectors
;
906 if (n
> s
->req_nb_sectors
)
907 n
= s
->req_nb_sectors
;
908 ide_transfer_start(s
, s
->io_buffer
, 512 * n
, ide_sector_write
);
909 s
->media_changed
= 1;
911 case WIN_READDMA_EXT
:
914 case WIN_READDMA_ONCE
:
917 ide_cmd_lba48_transform(s
, lba48
);
918 ide_sector_start_dma(s
, 1);
920 case WIN_WRITEDMA_EXT
:
923 case WIN_WRITEDMA_ONCE
:
926 ide_cmd_lba48_transform(s
, lba48
);
927 ide_sector_start_dma(s
, 0);
928 s
->media_changed
= 1;
930 case WIN_READ_NATIVE_MAX_EXT
:
932 case WIN_READ_NATIVE_MAX
:
933 ide_cmd_lba48_transform(s
, lba48
);
934 ide_set_sector(s
, s
->nb_sectors
- 1);
935 s
->status
= READY_STAT
| SEEK_STAT
;
938 case WIN_CHECKPOWERMODE1
:
939 case WIN_CHECKPOWERMODE2
:
941 s
->nsector
= 0xff; /* device active or idle */
942 s
->status
= READY_STAT
| SEEK_STAT
;
945 case WIN_SETFEATURES
:
948 /* XXX: valid for CDROM ? */
950 case 0xcc: /* reverting to power-on defaults enable */
951 case 0x66: /* reverting to power-on defaults disable */
952 case 0x02: /* write cache enable */
953 case 0x82: /* write cache disable */
954 case 0xaa: /* read look-ahead enable */
955 case 0x55: /* read look-ahead disable */
956 case 0x05: /* set advanced power management mode */
957 case 0x85: /* disable advanced power management mode */
962 case 0x42: /* enable Automatic Acoustic Mode */
963 case 0xc2: /* disable Automatic Acoustic Mode */
964 s
->status
= READY_STAT
| SEEK_STAT
;
967 case 0x03: { /* set transfer mode */
968 uint8_t val
= s
->nsector
& 0x07;
969 uint16_t *identify_data
= (uint16_t *)s
->identify_data
;
971 switch (s
->nsector
>> 3) {
972 case 0x00: /* pio default */
973 case 0x01: /* pio mode */
974 put_le16(identify_data
+ 62,0x07);
975 put_le16(identify_data
+ 63,0x07);
976 put_le16(identify_data
+ 88,0x3f);
978 case 0x02: /* sigle word dma mode*/
979 put_le16(identify_data
+ 62,0x07 | (1 << (val
+ 8)));
980 put_le16(identify_data
+ 63,0x07);
981 put_le16(identify_data
+ 88,0x3f);
983 case 0x04: /* mdma mode */
984 put_le16(identify_data
+ 62,0x07);
985 put_le16(identify_data
+ 63,0x07 | (1 << (val
+ 8)));
986 put_le16(identify_data
+ 88,0x3f);
988 case 0x08: /* udma mode */
989 put_le16(identify_data
+ 62,0x07);
990 put_le16(identify_data
+ 63,0x07);
991 put_le16(identify_data
+ 88,0x3f | (1 << (val
+ 8)));
996 s
->status
= READY_STAT
| SEEK_STAT
;
1004 case WIN_FLUSH_CACHE
:
1005 case WIN_FLUSH_CACHE_EXT
:
1010 case WIN_STANDBYNOW1
:
1011 case WIN_STANDBYNOW2
:
1012 case WIN_IDLEIMMEDIATE
:
1013 case CFA_IDLEIMMEDIATE
:
1018 s
->status
= READY_STAT
;
1019 ide_set_irq(s
->bus
);
1022 if(s
->drive_kind
== IDE_CD
)
1024 /* XXX: Check that seek is within bounds */
1025 s
->status
= READY_STAT
| SEEK_STAT
;
1026 ide_set_irq(s
->bus
);
1028 /* ATAPI commands */
1030 if (s
->drive_kind
== IDE_CD
) {
1031 ide_atapi_identify(s
);
1032 s
->status
= READY_STAT
| SEEK_STAT
;
1033 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
1035 ide_abort_command(s
);
1037 ide_set_irq(s
->bus
);
1040 ide_set_signature(s
);
1041 if (s
->drive_kind
== IDE_CD
)
1042 s
->status
= 0; /* ATAPI spec (v6) section 9.10 defines packet
1043 * devices to return a clear status register
1044 * with READY_STAT *not* set. */
1046 s
->status
= READY_STAT
| SEEK_STAT
;
1047 s
->error
= 0x01; /* Device 0 passed, Device 1 passed or not
1050 ide_set_irq(s
->bus
);
1053 if (s
->drive_kind
!= IDE_CD
)
1055 ide_set_signature(s
);
1056 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1060 if (s
->drive_kind
!= IDE_CD
)
1062 /* overlapping commands not supported */
1063 if (s
->feature
& 0x02)
1065 s
->status
= READY_STAT
| SEEK_STAT
;
1066 s
->atapi_dma
= s
->feature
& 1;
1068 ide_transfer_start(s
, s
->io_buffer
, ATAPI_PACKET_SIZE
,
1071 /* CF-ATA commands */
1072 case CFA_REQ_EXT_ERROR_CODE
:
1073 if (s
->drive_kind
!= IDE_CFATA
)
1075 s
->error
= 0x09; /* miscellaneous error */
1076 s
->status
= READY_STAT
| SEEK_STAT
;
1077 ide_set_irq(s
->bus
);
1079 case CFA_ERASE_SECTORS
:
1080 case CFA_WEAR_LEVEL
:
1081 if (s
->drive_kind
!= IDE_CFATA
)
1083 if (val
== CFA_WEAR_LEVEL
)
1085 if (val
== CFA_ERASE_SECTORS
)
1086 s
->media_changed
= 1;
1088 s
->status
= READY_STAT
| SEEK_STAT
;
1089 ide_set_irq(s
->bus
);
1091 case CFA_TRANSLATE_SECTOR
:
1092 if (s
->drive_kind
!= IDE_CFATA
)
1095 s
->status
= READY_STAT
| SEEK_STAT
;
1096 memset(s
->io_buffer
, 0, 0x200);
1097 s
->io_buffer
[0x00] = s
->hcyl
; /* Cyl MSB */
1098 s
->io_buffer
[0x01] = s
->lcyl
; /* Cyl LSB */
1099 s
->io_buffer
[0x02] = s
->select
; /* Head */
1100 s
->io_buffer
[0x03] = s
->sector
; /* Sector */
1101 s
->io_buffer
[0x04] = ide_get_sector(s
) >> 16; /* LBA MSB */
1102 s
->io_buffer
[0x05] = ide_get_sector(s
) >> 8; /* LBA */
1103 s
->io_buffer
[0x06] = ide_get_sector(s
) >> 0; /* LBA LSB */
1104 s
->io_buffer
[0x13] = 0x00; /* Erase flag */
1105 s
->io_buffer
[0x18] = 0x00; /* Hot count */
1106 s
->io_buffer
[0x19] = 0x00; /* Hot count */
1107 s
->io_buffer
[0x1a] = 0x01; /* Hot count */
1108 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1109 ide_set_irq(s
->bus
);
1111 case CFA_ACCESS_METADATA_STORAGE
:
1112 if (s
->drive_kind
!= IDE_CFATA
)
1114 switch (s
->feature
) {
1115 case 0x02: /* Inquiry Metadata Storage */
1116 ide_cfata_metadata_inquiry(s
);
1118 case 0x03: /* Read Metadata Storage */
1119 ide_cfata_metadata_read(s
);
1121 case 0x04: /* Write Metadata Storage */
1122 ide_cfata_metadata_write(s
);
1127 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1128 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1129 ide_set_irq(s
->bus
);
1131 case IBM_SENSE_CONDITION
:
1132 if (s
->drive_kind
!= IDE_CFATA
)
1134 switch (s
->feature
) {
1135 case 0x01: /* sense temperature in device */
1136 s
->nsector
= 0x50; /* +20 C */
1141 s
->status
= READY_STAT
| SEEK_STAT
;
1142 ide_set_irq(s
->bus
);
1146 if (s
->drive_kind
== IDE_CD
)
1148 if (s
->hcyl
!= 0xc2 || s
->lcyl
!= 0x4f)
1150 if (!s
->smart_enabled
&& s
->feature
!= SMART_ENABLE
)
1152 switch (s
->feature
) {
1154 s
->smart_enabled
= 0;
1155 s
->status
= READY_STAT
| SEEK_STAT
;
1156 ide_set_irq(s
->bus
);
1159 s
->smart_enabled
= 1;
1160 s
->status
= READY_STAT
| SEEK_STAT
;
1161 ide_set_irq(s
->bus
);
1163 case SMART_ATTR_AUTOSAVE
:
1164 switch (s
->sector
) {
1166 s
->smart_autosave
= 0;
1169 s
->smart_autosave
= 1;
1174 s
->status
= READY_STAT
| SEEK_STAT
;
1175 ide_set_irq(s
->bus
);
1178 if (!s
->smart_errors
) {
1185 s
->status
= READY_STAT
| SEEK_STAT
;
1186 ide_set_irq(s
->bus
);
1188 case SMART_READ_THRESH
:
1189 memset(s
->io_buffer
, 0, 0x200);
1190 s
->io_buffer
[0] = 0x01; /* smart struct version */
1191 for (n
=0; n
<30; n
++) {
1192 if (smart_attributes
[n
][0] == 0)
1194 s
->io_buffer
[2+0+(n
*12)] = smart_attributes
[n
][0];
1195 s
->io_buffer
[2+1+(n
*12)] = smart_attributes
[n
][11];
1197 for (n
=0; n
<511; n
++) /* checksum */
1198 s
->io_buffer
[511] += s
->io_buffer
[n
];
1199 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1200 s
->status
= READY_STAT
| SEEK_STAT
;
1201 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1202 ide_set_irq(s
->bus
);
1204 case SMART_READ_DATA
:
1205 memset(s
->io_buffer
, 0, 0x200);
1206 s
->io_buffer
[0] = 0x01; /* smart struct version */
1207 for (n
=0; n
<30; n
++) {
1208 if (smart_attributes
[n
][0] == 0) {
1212 for(i
= 0; i
< 11; i
++) {
1213 s
->io_buffer
[2+i
+(n
*12)] = smart_attributes
[n
][i
];
1216 s
->io_buffer
[362] = 0x02 | (s
->smart_autosave
?0x80:0x00);
1217 if (s
->smart_selftest_count
== 0) {
1218 s
->io_buffer
[363] = 0;
1221 s
->smart_selftest_data
[3 +
1222 (s
->smart_selftest_count
- 1) *
1225 s
->io_buffer
[364] = 0x20;
1226 s
->io_buffer
[365] = 0x01;
1227 /* offline data collection capacity: execute + self-test*/
1228 s
->io_buffer
[367] = (1<<4 | 1<<3 | 1);
1229 s
->io_buffer
[368] = 0x03; /* smart capability (1) */
1230 s
->io_buffer
[369] = 0x00; /* smart capability (2) */
1231 s
->io_buffer
[370] = 0x01; /* error logging supported */
1232 s
->io_buffer
[372] = 0x02; /* minutes for poll short test */
1233 s
->io_buffer
[373] = 0x36; /* minutes for poll ext test */
1234 s
->io_buffer
[374] = 0x01; /* minutes for poll conveyance */
1236 for (n
=0; n
<511; n
++)
1237 s
->io_buffer
[511] += s
->io_buffer
[n
];
1238 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1239 s
->status
= READY_STAT
| SEEK_STAT
;
1240 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1241 ide_set_irq(s
->bus
);
1243 case SMART_READ_LOG
:
1244 switch (s
->sector
) {
1245 case 0x01: /* summary smart error log */
1246 memset(s
->io_buffer
, 0, 0x200);
1247 s
->io_buffer
[0] = 0x01;
1248 s
->io_buffer
[1] = 0x00; /* no error entries */
1249 s
->io_buffer
[452] = s
->smart_errors
& 0xff;
1250 s
->io_buffer
[453] = (s
->smart_errors
& 0xff00) >> 8;
1252 for (n
=0; n
<511; n
++)
1253 s
->io_buffer
[511] += s
->io_buffer
[n
];
1254 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1256 case 0x06: /* smart self test log */
1257 memset(s
->io_buffer
, 0, 0x200);
1258 s
->io_buffer
[0] = 0x01;
1259 if (s
->smart_selftest_count
== 0) {
1260 s
->io_buffer
[508] = 0;
1262 s
->io_buffer
[508] = s
->smart_selftest_count
;
1263 for (n
=2; n
<506; n
++)
1264 s
->io_buffer
[n
] = s
->smart_selftest_data
[n
];
1266 for (n
=0; n
<511; n
++)
1267 s
->io_buffer
[511] += s
->io_buffer
[n
];
1268 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
1273 s
->status
= READY_STAT
| SEEK_STAT
;
1274 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
1275 ide_set_irq(s
->bus
);
1277 case SMART_EXECUTE_OFFLINE
:
1278 switch (s
->sector
) {
1279 case 0: /* off-line routine */
1280 case 1: /* short self test */
1281 case 2: /* extended self test */
1282 s
->smart_selftest_count
++;
1283 if(s
->smart_selftest_count
> 21)
1284 s
->smart_selftest_count
= 0;
1285 n
= 2 + (s
->smart_selftest_count
- 1) * 24;
1286 s
->smart_selftest_data
[n
] = s
->sector
;
1287 s
->smart_selftest_data
[n
+1] = 0x00; /* OK and finished */
1288 s
->smart_selftest_data
[n
+2] = 0x34; /* hour count lsb */
1289 s
->smart_selftest_data
[n
+3] = 0x12; /* hour count msb */
1290 s
->status
= READY_STAT
| SEEK_STAT
;
1291 ide_set_irq(s
->bus
);
1303 ide_abort_command(s
);
1304 ide_set_irq(s
->bus
);
1309 uint32_t ide_ioport_read(void *opaque
, uint32_t addr1
)
1311 IDEBus
*bus
= opaque
;
1312 IDEState
*s
= idebus_active_if(bus
);
1317 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1318 //hob = s->select & (1 << 7);
1325 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1326 (s
!= bus
->ifs
&& !s
->bs
))
1331 ret
= s
->hob_feature
;
1334 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1337 ret
= s
->nsector
& 0xff;
1339 ret
= s
->hob_nsector
;
1342 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1347 ret
= s
->hob_sector
;
1350 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1358 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1366 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
1373 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1374 (s
!= bus
->ifs
&& !s
->bs
))
1378 qemu_irq_lower(bus
->irq
);
1382 printf("ide: read addr=0x%x val=%02x\n", addr1
, ret
);
1387 uint32_t ide_status_read(void *opaque
, uint32_t addr
)
1389 IDEBus
*bus
= opaque
;
1390 IDEState
*s
= idebus_active_if(bus
);
1393 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
1394 (s
!= bus
->ifs
&& !s
->bs
))
1399 printf("ide: read status addr=0x%x val=%02x\n", addr
, ret
);
1404 void ide_cmd_write(void *opaque
, uint32_t addr
, uint32_t val
)
1406 IDEBus
*bus
= opaque
;
1411 printf("ide: write control addr=0x%x val=%02x\n", addr
, val
);
1413 /* common for both drives */
1414 if (!(bus
->cmd
& IDE_CMD_RESET
) &&
1415 (val
& IDE_CMD_RESET
)) {
1416 /* reset low to high */
1417 for(i
= 0;i
< 2; i
++) {
1419 s
->status
= BUSY_STAT
| SEEK_STAT
;
1422 } else if ((bus
->cmd
& IDE_CMD_RESET
) &&
1423 !(val
& IDE_CMD_RESET
)) {
1425 for(i
= 0;i
< 2; i
++) {
1427 if (s
->drive_kind
== IDE_CD
)
1428 s
->status
= 0x00; /* NOTE: READY is _not_ set */
1430 s
->status
= READY_STAT
| SEEK_STAT
;
1431 ide_set_signature(s
);
1438 void ide_data_writew(void *opaque
, uint32_t addr
, uint32_t val
)
1440 IDEBus
*bus
= opaque
;
1441 IDEState
*s
= idebus_active_if(bus
);
1444 /* PIO data access allowed only when DRQ bit is set */
1445 if (!(s
->status
& DRQ_STAT
))
1449 *(uint16_t *)p
= le16_to_cpu(val
);
1452 if (p
>= s
->data_end
)
1453 s
->end_transfer_func(s
);
1456 uint32_t ide_data_readw(void *opaque
, uint32_t addr
)
1458 IDEBus
*bus
= opaque
;
1459 IDEState
*s
= idebus_active_if(bus
);
1463 /* PIO data access allowed only when DRQ bit is set */
1464 if (!(s
->status
& DRQ_STAT
))
1468 ret
= cpu_to_le16(*(uint16_t *)p
);
1471 if (p
>= s
->data_end
)
1472 s
->end_transfer_func(s
);
1476 void ide_data_writel(void *opaque
, uint32_t addr
, uint32_t val
)
1478 IDEBus
*bus
= opaque
;
1479 IDEState
*s
= idebus_active_if(bus
);
1482 /* PIO data access allowed only when DRQ bit is set */
1483 if (!(s
->status
& DRQ_STAT
))
1487 *(uint32_t *)p
= le32_to_cpu(val
);
1490 if (p
>= s
->data_end
)
1491 s
->end_transfer_func(s
);
1494 uint32_t ide_data_readl(void *opaque
, uint32_t addr
)
1496 IDEBus
*bus
= opaque
;
1497 IDEState
*s
= idebus_active_if(bus
);
1501 /* PIO data access allowed only when DRQ bit is set */
1502 if (!(s
->status
& DRQ_STAT
))
1506 ret
= cpu_to_le32(*(uint32_t *)p
);
1509 if (p
>= s
->data_end
)
1510 s
->end_transfer_func(s
);
1514 static void ide_dummy_transfer_stop(IDEState
*s
)
1516 s
->data_ptr
= s
->io_buffer
;
1517 s
->data_end
= s
->io_buffer
;
1518 s
->io_buffer
[0] = 0xff;
1519 s
->io_buffer
[1] = 0xff;
1520 s
->io_buffer
[2] = 0xff;
1521 s
->io_buffer
[3] = 0xff;
1524 static void ide_reset(IDEState
*s
)
1527 printf("ide: reset\n");
1529 if (s
->drive_kind
== IDE_CFATA
)
1530 s
->mult_sectors
= 0;
1532 s
->mult_sectors
= MAX_MULT_SECTORS
;
1549 s
->status
= READY_STAT
| SEEK_STAT
;
1553 /* ATAPI specific */
1556 s
->cdrom_changed
= 0;
1557 s
->packet_transfer_size
= 0;
1558 s
->elementary_transfer_size
= 0;
1559 s
->io_buffer_index
= 0;
1560 s
->cd_sector_size
= 0;
1563 s
->io_buffer_size
= 0;
1564 s
->req_nb_sectors
= 0;
1566 ide_set_signature(s
);
1567 /* init the transfer handler so that 0xffff is returned on data
1569 s
->end_transfer_func
= ide_dummy_transfer_stop
;
1570 ide_dummy_transfer_stop(s
);
1571 s
->media_changed
= 0;
1574 void ide_bus_reset(IDEBus
*bus
)
1578 ide_reset(&bus
->ifs
[0]);
1579 ide_reset(&bus
->ifs
[1]);
1582 /* pending async DMA */
1583 if (bus
->dma
->aiocb
) {
1585 printf("aio_cancel\n");
1587 bdrv_aio_cancel(bus
->dma
->aiocb
);
1588 bus
->dma
->aiocb
= NULL
;
1591 /* reset dma provider too */
1592 bus
->dma
->ops
->reset(bus
->dma
);
1595 int ide_init_drive(IDEState
*s
, BlockDriverState
*bs
, IDEDriveKind kind
,
1596 const char *version
, const char *serial
)
1598 int cylinders
, heads
, secs
;
1599 uint64_t nb_sectors
;
1602 s
->drive_kind
= kind
;
1604 bdrv_get_geometry(bs
, &nb_sectors
);
1605 bdrv_guess_geometry(bs
, &cylinders
, &heads
, &secs
);
1606 if (cylinders
< 1 || cylinders
> 16383) {
1607 error_report("cyls must be between 1 and 16383");
1610 if (heads
< 1 || heads
> 16) {
1611 error_report("heads must be between 1 and 16");
1614 if (secs
< 1 || secs
> 63) {
1615 error_report("secs must be between 1 and 63");
1618 s
->cylinders
= cylinders
;
1621 s
->nb_sectors
= nb_sectors
;
1622 /* The SMART values should be preserved across power cycles
1624 s
->smart_enabled
= 1;
1625 s
->smart_autosave
= 1;
1626 s
->smart_errors
= 0;
1627 s
->smart_selftest_count
= 0;
1628 if (kind
== IDE_CD
) {
1629 bdrv_set_change_cb(bs
, cdrom_change_cb
, s
);
1630 bs
->buffer_alignment
= 2048;
1632 if (!bdrv_is_inserted(s
->bs
)) {
1633 error_report("Device needs media, but drive is empty");
1636 if (bdrv_is_read_only(bs
)) {
1637 error_report("Can't use a read-only drive");
1642 strncpy(s
->drive_serial_str
, serial
, sizeof(s
->drive_serial_str
));
1644 snprintf(s
->drive_serial_str
, sizeof(s
->drive_serial_str
),
1645 "QM%05d", s
->drive_serial
);
1648 pstrcpy(s
->version
, sizeof(s
->version
), version
);
1650 pstrcpy(s
->version
, sizeof(s
->version
), QEMU_VERSION
);
1654 bdrv_set_removable(bs
, s
->drive_kind
== IDE_CD
);
1658 static void ide_init1(IDEBus
*bus
, int unit
)
1660 static int drive_serial
= 1;
1661 IDEState
*s
= &bus
->ifs
[unit
];
1665 s
->drive_serial
= drive_serial
++;
1666 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1667 s
->io_buffer
= qemu_memalign(2048, IDE_DMA_BUF_SECTORS
*512 + 4);
1668 s
->io_buffer_total_len
= IDE_DMA_BUF_SECTORS
*512 + 4;
1669 s
->smart_selftest_data
= qemu_blockalign(s
->bs
, 512);
1670 s
->sector_write_timer
= qemu_new_timer_ns(vm_clock
,
1671 ide_sector_write_timer_cb
, s
);
1674 static void ide_nop_start(IDEDMA
*dma
, IDEState
*s
,
1675 BlockDriverCompletionFunc
*cb
)
1679 static int ide_nop(IDEDMA
*dma
)
1684 static int ide_nop_int(IDEDMA
*dma
, int x
)
1689 static void ide_nop_restart(void *opaque
, int x
, int y
)
1693 static const IDEDMAOps ide_dma_nop_ops
= {
1694 .start_dma
= ide_nop_start
,
1695 .start_transfer
= ide_nop
,
1696 .prepare_buf
= ide_nop_int
,
1697 .rw_buf
= ide_nop_int
,
1698 .set_unit
= ide_nop_int
,
1699 .add_status
= ide_nop_int
,
1700 .set_inactive
= ide_nop
,
1701 .restart_cb
= ide_nop_restart
,
1705 static IDEDMA ide_dma_nop
= {
1706 .ops
= &ide_dma_nop_ops
,
1710 void ide_init2(IDEBus
*bus
, qemu_irq irq
)
1714 for(i
= 0; i
< 2; i
++) {
1716 ide_reset(&bus
->ifs
[i
]);
1719 bus
->dma
= &ide_dma_nop
;
1722 /* TODO convert users to qdev and remove */
1723 void ide_init2_with_non_qdev_drives(IDEBus
*bus
, DriveInfo
*hd0
,
1724 DriveInfo
*hd1
, qemu_irq irq
)
1729 for(i
= 0; i
< 2; i
++) {
1730 dinfo
= i
== 0 ? hd0
: hd1
;
1733 if (ide_init_drive(&bus
->ifs
[i
], dinfo
->bdrv
,
1734 dinfo
->media_cd
? IDE_CD
: IDE_HD
, NULL
,
1735 *dinfo
->serial
? dinfo
->serial
: NULL
) < 0) {
1736 error_report("Can't set up IDE drive %s", dinfo
->id
);
1740 ide_reset(&bus
->ifs
[i
]);
1744 bus
->dma
= &ide_dma_nop
;
1747 void ide_init_ioport(IDEBus
*bus
, int iobase
, int iobase2
)
1749 register_ioport_write(iobase
, 8, 1, ide_ioport_write
, bus
);
1750 register_ioport_read(iobase
, 8, 1, ide_ioport_read
, bus
);
1752 register_ioport_read(iobase2
, 1, 1, ide_status_read
, bus
);
1753 register_ioport_write(iobase2
, 1, 1, ide_cmd_write
, bus
);
1757 register_ioport_write(iobase
, 2, 2, ide_data_writew
, bus
);
1758 register_ioport_read(iobase
, 2, 2, ide_data_readw
, bus
);
1759 register_ioport_write(iobase
, 4, 4, ide_data_writel
, bus
);
1760 register_ioport_read(iobase
, 4, 4, ide_data_readl
, bus
);
1763 static bool is_identify_set(void *opaque
, int version_id
)
1765 IDEState
*s
= opaque
;
1767 return s
->identify_set
!= 0;
1770 static EndTransferFunc
* transfer_end_table
[] = {
1774 ide_atapi_cmd_reply_end
,
1776 ide_dummy_transfer_stop
,
1779 static int transfer_end_table_idx(EndTransferFunc
*fn
)
1783 for (i
= 0; i
< ARRAY_SIZE(transfer_end_table
); i
++)
1784 if (transfer_end_table
[i
] == fn
)
1790 static int ide_drive_post_load(void *opaque
, int version_id
)
1792 IDEState
*s
= opaque
;
1794 if (version_id
< 3) {
1795 if (s
->sense_key
== SENSE_UNIT_ATTENTION
&&
1796 s
->asc
== ASC_MEDIUM_MAY_HAVE_CHANGED
) {
1797 s
->cdrom_changed
= 1;
1803 static int ide_drive_pio_post_load(void *opaque
, int version_id
)
1805 IDEState
*s
= opaque
;
1807 if (s
->end_transfer_fn_idx
> ARRAY_SIZE(transfer_end_table
)) {
1810 s
->end_transfer_func
= transfer_end_table
[s
->end_transfer_fn_idx
];
1811 s
->data_ptr
= s
->io_buffer
+ s
->cur_io_buffer_offset
;
1812 s
->data_end
= s
->data_ptr
+ s
->cur_io_buffer_len
;
1817 static void ide_drive_pio_pre_save(void *opaque
)
1819 IDEState
*s
= opaque
;
1822 s
->cur_io_buffer_offset
= s
->data_ptr
- s
->io_buffer
;
1823 s
->cur_io_buffer_len
= s
->data_end
- s
->data_ptr
;
1825 idx
= transfer_end_table_idx(s
->end_transfer_func
);
1827 fprintf(stderr
, "%s: invalid end_transfer_func for DRQ_STAT\n",
1829 s
->end_transfer_fn_idx
= 2;
1831 s
->end_transfer_fn_idx
= idx
;
1835 static bool ide_drive_pio_state_needed(void *opaque
)
1837 IDEState
*s
= opaque
;
1839 return (s
->status
& DRQ_STAT
) != 0;
1842 static bool ide_atapi_gesn_needed(void *opaque
)
1844 IDEState
*s
= opaque
;
1846 return s
->events
.new_media
|| s
->events
.eject_request
;
1849 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
1850 const VMStateDescription vmstate_ide_atapi_gesn_state
= {
1851 .name
="ide_drive/atapi/gesn_state",
1853 .minimum_version_id
= 1,
1854 .minimum_version_id_old
= 1,
1855 .fields
= (VMStateField
[]) {
1856 VMSTATE_BOOL(events
.new_media
, IDEState
),
1857 VMSTATE_BOOL(events
.eject_request
, IDEState
),
1861 const VMStateDescription vmstate_ide_drive_pio_state
= {
1862 .name
= "ide_drive/pio_state",
1864 .minimum_version_id
= 1,
1865 .minimum_version_id_old
= 1,
1866 .pre_save
= ide_drive_pio_pre_save
,
1867 .post_load
= ide_drive_pio_post_load
,
1868 .fields
= (VMStateField
[]) {
1869 VMSTATE_INT32(req_nb_sectors
, IDEState
),
1870 VMSTATE_VARRAY_INT32(io_buffer
, IDEState
, io_buffer_total_len
, 1,
1871 vmstate_info_uint8
, uint8_t),
1872 VMSTATE_INT32(cur_io_buffer_offset
, IDEState
),
1873 VMSTATE_INT32(cur_io_buffer_len
, IDEState
),
1874 VMSTATE_UINT8(end_transfer_fn_idx
, IDEState
),
1875 VMSTATE_INT32(elementary_transfer_size
, IDEState
),
1876 VMSTATE_INT32(packet_transfer_size
, IDEState
),
1877 VMSTATE_END_OF_LIST()
1881 const VMStateDescription vmstate_ide_drive
= {
1882 .name
= "ide_drive",
1884 .minimum_version_id
= 0,
1885 .minimum_version_id_old
= 0,
1886 .post_load
= ide_drive_post_load
,
1887 .fields
= (VMStateField
[]) {
1888 VMSTATE_INT32(mult_sectors
, IDEState
),
1889 VMSTATE_INT32(identify_set
, IDEState
),
1890 VMSTATE_BUFFER_TEST(identify_data
, IDEState
, is_identify_set
),
1891 VMSTATE_UINT8(feature
, IDEState
),
1892 VMSTATE_UINT8(error
, IDEState
),
1893 VMSTATE_UINT32(nsector
, IDEState
),
1894 VMSTATE_UINT8(sector
, IDEState
),
1895 VMSTATE_UINT8(lcyl
, IDEState
),
1896 VMSTATE_UINT8(hcyl
, IDEState
),
1897 VMSTATE_UINT8(hob_feature
, IDEState
),
1898 VMSTATE_UINT8(hob_sector
, IDEState
),
1899 VMSTATE_UINT8(hob_nsector
, IDEState
),
1900 VMSTATE_UINT8(hob_lcyl
, IDEState
),
1901 VMSTATE_UINT8(hob_hcyl
, IDEState
),
1902 VMSTATE_UINT8(select
, IDEState
),
1903 VMSTATE_UINT8(status
, IDEState
),
1904 VMSTATE_UINT8(lba48
, IDEState
),
1905 VMSTATE_UINT8(sense_key
, IDEState
),
1906 VMSTATE_UINT8(asc
, IDEState
),
1907 VMSTATE_UINT8_V(cdrom_changed
, IDEState
, 3),
1908 VMSTATE_END_OF_LIST()
1910 .subsections
= (VMStateSubsection
[]) {
1912 .vmsd
= &vmstate_ide_drive_pio_state
,
1913 .needed
= ide_drive_pio_state_needed
,
1915 .vmsd
= &vmstate_ide_atapi_gesn_state
,
1916 .needed
= ide_atapi_gesn_needed
,
1923 const VMStateDescription vmstate_ide_bus
= {
1926 .minimum_version_id
= 1,
1927 .minimum_version_id_old
= 1,
1928 .fields
= (VMStateField
[]) {
1929 VMSTATE_UINT8(cmd
, IDEBus
),
1930 VMSTATE_UINT8(unit
, IDEBus
),
1931 VMSTATE_END_OF_LIST()
1935 void ide_drive_get(DriveInfo
**hd
, int max_bus
)
1939 if (drive_get_max_bus(IF_IDE
) >= max_bus
) {
1940 fprintf(stderr
, "qemu: too many IDE bus: %d\n", max_bus
);
1944 for(i
= 0; i
< max_bus
* MAX_IDE_DEVS
; i
++) {
1945 hd
[i
] = drive_get(IF_IDE
, i
/ MAX_IDE_DEVS
, i
% MAX_IDE_DEVS
);