2 * QEMU IDE disk and CD/DVD-ROM Emulator
4 * Copyright (c) 2003 Fabrice Bellard
5 * Copyright (c) 2006 Openedhand Ltd.
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 #include "qemu-error.h"
30 #include "qemu-timer.h"
35 #include <hw/ide/internal.h>
37 #define IDE_PAGE_SIZE 4096
39 static const int smart_attributes
[][5] = {
40 /* id, flags, val, wrst, thrsh */
41 { 0x01, 0x03, 0x64, 0x64, 0x06}, /* raw read */
42 { 0x03, 0x03, 0x64, 0x64, 0x46}, /* spin up */
43 { 0x04, 0x02, 0x64, 0x64, 0x14}, /* start stop count */
44 { 0x05, 0x03, 0x64, 0x64, 0x36}, /* remapped sectors */
45 { 0x00, 0x00, 0x00, 0x00, 0x00}
48 /* XXX: DVDs that could fit on a CD will be reported as a CD */
49 static inline int media_present(IDEState
*s
)
51 return (s
->nb_sectors
> 0);
54 static inline int media_is_dvd(IDEState
*s
)
56 return (media_present(s
) && s
->nb_sectors
> CD_MAX_SECTORS
);
59 static inline int media_is_cd(IDEState
*s
)
61 return (media_present(s
) && s
->nb_sectors
<= CD_MAX_SECTORS
);
64 static void ide_dma_start(IDEState
*s
, BlockDriverCompletionFunc
*dma_cb
);
65 static void ide_dma_restart(IDEState
*s
, int is_read
);
66 static void ide_atapi_cmd_read_dma_cb(void *opaque
, int ret
);
67 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
);
68 static void ide_flush_cache(IDEState
*s
);
70 static void padstr(char *str
, const char *src
, int len
)
73 for(i
= 0; i
< len
; i
++) {
82 static void padstr8(uint8_t *buf
, int buf_size
, const char *src
)
85 for(i
= 0; i
< buf_size
; i
++) {
93 static void put_le16(uint16_t *p
, unsigned int v
)
98 static void ide_identify(IDEState
*s
)
101 unsigned int oldsize
;
104 if (s
->identify_set
) {
105 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
109 memset(s
->io_buffer
, 0, 512);
110 p
= (uint16_t *)s
->io_buffer
;
111 put_le16(p
+ 0, 0x0040);
112 put_le16(p
+ 1, s
->cylinders
);
113 put_le16(p
+ 3, s
->heads
);
114 put_le16(p
+ 4, 512 * s
->sectors
); /* XXX: retired, remove ? */
115 put_le16(p
+ 5, 512); /* XXX: retired, remove ? */
116 put_le16(p
+ 6, s
->sectors
);
117 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
118 put_le16(p
+ 20, 3); /* XXX: retired, remove ? */
119 put_le16(p
+ 21, 512); /* cache size in sectors */
120 put_le16(p
+ 22, 4); /* ecc bytes */
121 padstr((char *)(p
+ 23), s
->version
, 8); /* firmware version */
122 padstr((char *)(p
+ 27), "QEMU HARDDISK", 40); /* model */
123 #if MAX_MULT_SECTORS > 1
124 put_le16(p
+ 47, 0x8000 | MAX_MULT_SECTORS
);
126 put_le16(p
+ 48, 1); /* dword I/O */
127 put_le16(p
+ 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
128 put_le16(p
+ 51, 0x200); /* PIO transfer cycle */
129 put_le16(p
+ 52, 0x200); /* DMA transfer cycle */
130 put_le16(p
+ 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
131 put_le16(p
+ 54, s
->cylinders
);
132 put_le16(p
+ 55, s
->heads
);
133 put_le16(p
+ 56, s
->sectors
);
134 oldsize
= s
->cylinders
* s
->heads
* s
->sectors
;
135 put_le16(p
+ 57, oldsize
);
136 put_le16(p
+ 58, oldsize
>> 16);
138 put_le16(p
+ 59, 0x100 | s
->mult_sectors
);
139 put_le16(p
+ 60, s
->nb_sectors
);
140 put_le16(p
+ 61, s
->nb_sectors
>> 16);
141 put_le16(p
+ 62, 0x07); /* single word dma0-2 supported */
142 put_le16(p
+ 63, 0x07); /* mdma0-2 supported */
143 put_le16(p
+ 64, 0x03); /* pio3-4 supported */
144 put_le16(p
+ 65, 120);
145 put_le16(p
+ 66, 120);
146 put_le16(p
+ 67, 120);
147 put_le16(p
+ 68, 120);
148 put_le16(p
+ 80, 0xf0); /* ata3 -> ata6 supported */
149 put_le16(p
+ 81, 0x16); /* conforms to ata5 */
150 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
151 put_le16(p
+ 82, (1 << 14) | (1 << 5) | 1);
152 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
153 put_le16(p
+ 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
154 /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
155 put_le16(p
+ 84, (1 << 14) | 0);
156 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
157 if (bdrv_enable_write_cache(s
->bs
))
158 put_le16(p
+ 85, (1 << 14) | (1 << 5) | 1);
160 put_le16(p
+ 85, (1 << 14) | 1);
161 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
162 put_le16(p
+ 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
163 /* 14=set to 1, 1=smart self test, 0=smart error logging */
164 put_le16(p
+ 87, (1 << 14) | 0);
165 put_le16(p
+ 88, 0x3f | (1 << 13)); /* udma5 set and supported */
166 put_le16(p
+ 93, 1 | (1 << 14) | 0x2000);
167 put_le16(p
+ 100, s
->nb_sectors
);
168 put_le16(p
+ 101, s
->nb_sectors
>> 16);
169 put_le16(p
+ 102, s
->nb_sectors
>> 32);
170 put_le16(p
+ 103, s
->nb_sectors
>> 48);
171 dev
= s
->unit
? s
->bus
->slave
: s
->bus
->master
;
172 if (dev
&& dev
->conf
.physical_block_size
)
173 put_le16(p
+ 106, 0x6000 | get_physical_block_exp(&dev
->conf
));
175 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
179 static void ide_atapi_identify(IDEState
*s
)
183 if (s
->identify_set
) {
184 memcpy(s
->io_buffer
, s
->identify_data
, sizeof(s
->identify_data
));
188 memset(s
->io_buffer
, 0, 512);
189 p
= (uint16_t *)s
->io_buffer
;
190 /* Removable CDROM, 50us response, 12 byte packets */
191 put_le16(p
+ 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
192 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
193 put_le16(p
+ 20, 3); /* buffer type */
194 put_le16(p
+ 21, 512); /* cache size in sectors */
195 put_le16(p
+ 22, 4); /* ecc bytes */
196 padstr((char *)(p
+ 23), s
->version
, 8); /* firmware version */
197 padstr((char *)(p
+ 27), "QEMU DVD-ROM", 40); /* model */
198 put_le16(p
+ 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
200 put_le16(p
+ 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
201 put_le16(p
+ 53, 7); /* words 64-70, 54-58, 88 valid */
202 put_le16(p
+ 62, 7); /* single word dma0-2 supported */
203 put_le16(p
+ 63, 7); /* mdma0-2 supported */
205 put_le16(p
+ 49, 1 << 9); /* LBA supported, no DMA */
206 put_le16(p
+ 53, 3); /* words 64-70, 54-58 valid */
207 put_le16(p
+ 63, 0x103); /* DMA modes XXX: may be incorrect */
209 put_le16(p
+ 64, 3); /* pio3-4 supported */
210 put_le16(p
+ 65, 0xb4); /* minimum DMA multiword tx cycle time */
211 put_le16(p
+ 66, 0xb4); /* recommended DMA multiword tx cycle time */
212 put_le16(p
+ 67, 0x12c); /* minimum PIO cycle time without flow control */
213 put_le16(p
+ 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
215 put_le16(p
+ 71, 30); /* in ns */
216 put_le16(p
+ 72, 30); /* in ns */
218 put_le16(p
+ 80, 0x1e); /* support up to ATA/ATAPI-4 */
220 put_le16(p
+ 88, 0x3f | (1 << 13)); /* udma5 set and supported */
222 memcpy(s
->identify_data
, p
, sizeof(s
->identify_data
));
226 static void ide_cfata_identify(IDEState
*s
)
231 p
= (uint16_t *) s
->identify_data
;
235 memset(p
, 0, sizeof(s
->identify_data
));
237 cur_sec
= s
->cylinders
* s
->heads
* s
->sectors
;
239 put_le16(p
+ 0, 0x848a); /* CF Storage Card signature */
240 put_le16(p
+ 1, s
->cylinders
); /* Default cylinders */
241 put_le16(p
+ 3, s
->heads
); /* Default heads */
242 put_le16(p
+ 6, s
->sectors
); /* Default sectors per track */
243 put_le16(p
+ 7, s
->nb_sectors
>> 16); /* Sectors per card */
244 put_le16(p
+ 8, s
->nb_sectors
); /* Sectors per card */
245 padstr((char *)(p
+ 10), s
->drive_serial_str
, 20); /* serial number */
246 put_le16(p
+ 22, 0x0004); /* ECC bytes */
247 padstr((char *) (p
+ 23), s
->version
, 8); /* Firmware Revision */
248 padstr((char *) (p
+ 27), "QEMU MICRODRIVE", 40);/* Model number */
249 #if MAX_MULT_SECTORS > 1
250 put_le16(p
+ 47, 0x8000 | MAX_MULT_SECTORS
);
252 put_le16(p
+ 47, 0x0000);
254 put_le16(p
+ 49, 0x0f00); /* Capabilities */
255 put_le16(p
+ 51, 0x0002); /* PIO cycle timing mode */
256 put_le16(p
+ 52, 0x0001); /* DMA cycle timing mode */
257 put_le16(p
+ 53, 0x0003); /* Translation params valid */
258 put_le16(p
+ 54, s
->cylinders
); /* Current cylinders */
259 put_le16(p
+ 55, s
->heads
); /* Current heads */
260 put_le16(p
+ 56, s
->sectors
); /* Current sectors */
261 put_le16(p
+ 57, cur_sec
); /* Current capacity */
262 put_le16(p
+ 58, cur_sec
>> 16); /* Current capacity */
263 if (s
->mult_sectors
) /* Multiple sector setting */
264 put_le16(p
+ 59, 0x100 | s
->mult_sectors
);
265 put_le16(p
+ 60, s
->nb_sectors
); /* Total LBA sectors */
266 put_le16(p
+ 61, s
->nb_sectors
>> 16); /* Total LBA sectors */
267 put_le16(p
+ 63, 0x0203); /* Multiword DMA capability */
268 put_le16(p
+ 64, 0x0001); /* Flow Control PIO support */
269 put_le16(p
+ 65, 0x0096); /* Min. Multiword DMA cycle */
270 put_le16(p
+ 66, 0x0096); /* Rec. Multiword DMA cycle */
271 put_le16(p
+ 68, 0x00b4); /* Min. PIO cycle time */
272 put_le16(p
+ 82, 0x400c); /* Command Set supported */
273 put_le16(p
+ 83, 0x7068); /* Command Set supported */
274 put_le16(p
+ 84, 0x4000); /* Features supported */
275 put_le16(p
+ 85, 0x000c); /* Command Set enabled */
276 put_le16(p
+ 86, 0x7044); /* Command Set enabled */
277 put_le16(p
+ 87, 0x4000); /* Features enabled */
278 put_le16(p
+ 91, 0x4060); /* Current APM level */
279 put_le16(p
+ 129, 0x0002); /* Current features option */
280 put_le16(p
+ 130, 0x0005); /* Reassigned sectors */
281 put_le16(p
+ 131, 0x0001); /* Initial power mode */
282 put_le16(p
+ 132, 0x0000); /* User signature */
283 put_le16(p
+ 160, 0x8100); /* Power requirement */
284 put_le16(p
+ 161, 0x8001); /* CF command set */
289 memcpy(s
->io_buffer
, p
, sizeof(s
->identify_data
));
292 static void ide_set_signature(IDEState
*s
)
294 s
->select
&= 0xf0; /* clear head */
298 if (s
->drive_kind
== IDE_CD
) {
310 static inline void ide_abort_command(IDEState
*s
)
312 s
->status
= READY_STAT
| ERR_STAT
;
316 static inline void ide_dma_submit_check(IDEState
*s
,
317 BlockDriverCompletionFunc
*dma_cb
, BMDMAState
*bm
)
324 /* prepare data transfer and tell what to do after */
325 static void ide_transfer_start(IDEState
*s
, uint8_t *buf
, int size
,
326 EndTransferFunc
*end_transfer_func
)
328 s
->end_transfer_func
= end_transfer_func
;
330 s
->data_end
= buf
+ size
;
331 if (!(s
->status
& ERR_STAT
))
332 s
->status
|= DRQ_STAT
;
335 static void ide_transfer_stop(IDEState
*s
)
337 s
->end_transfer_func
= ide_transfer_stop
;
338 s
->data_ptr
= s
->io_buffer
;
339 s
->data_end
= s
->io_buffer
;
340 s
->status
&= ~DRQ_STAT
;
343 int64_t ide_get_sector(IDEState
*s
)
346 if (s
->select
& 0x40) {
349 sector_num
= ((s
->select
& 0x0f) << 24) | (s
->hcyl
<< 16) |
350 (s
->lcyl
<< 8) | s
->sector
;
352 sector_num
= ((int64_t)s
->hob_hcyl
<< 40) |
353 ((int64_t) s
->hob_lcyl
<< 32) |
354 ((int64_t) s
->hob_sector
<< 24) |
355 ((int64_t) s
->hcyl
<< 16) |
356 ((int64_t) s
->lcyl
<< 8) | s
->sector
;
359 sector_num
= ((s
->hcyl
<< 8) | s
->lcyl
) * s
->heads
* s
->sectors
+
360 (s
->select
& 0x0f) * s
->sectors
+ (s
->sector
- 1);
365 void ide_set_sector(IDEState
*s
, int64_t sector_num
)
368 if (s
->select
& 0x40) {
370 s
->select
= (s
->select
& 0xf0) | (sector_num
>> 24);
371 s
->hcyl
= (sector_num
>> 16);
372 s
->lcyl
= (sector_num
>> 8);
373 s
->sector
= (sector_num
);
375 s
->sector
= sector_num
;
376 s
->lcyl
= sector_num
>> 8;
377 s
->hcyl
= sector_num
>> 16;
378 s
->hob_sector
= sector_num
>> 24;
379 s
->hob_lcyl
= sector_num
>> 32;
380 s
->hob_hcyl
= sector_num
>> 40;
383 cyl
= sector_num
/ (s
->heads
* s
->sectors
);
384 r
= sector_num
% (s
->heads
* s
->sectors
);
387 s
->select
= (s
->select
& 0xf0) | ((r
/ s
->sectors
) & 0x0f);
388 s
->sector
= (r
% s
->sectors
) + 1;
392 static void ide_rw_error(IDEState
*s
) {
393 ide_abort_command(s
);
397 static void ide_sector_read(IDEState
*s
)
402 s
->status
= READY_STAT
| SEEK_STAT
;
403 s
->error
= 0; /* not needed by IDE spec, but needed by Windows */
404 sector_num
= ide_get_sector(s
);
407 /* no more sector to read from disk */
408 ide_transfer_stop(s
);
410 #if defined(DEBUG_IDE)
411 printf("read sector=%" PRId64
"\n", sector_num
);
413 if (n
> s
->req_nb_sectors
)
414 n
= s
->req_nb_sectors
;
415 ret
= bdrv_read(s
->bs
, sector_num
, s
->io_buffer
, n
);
417 if (ide_handle_rw_error(s
, -ret
,
418 BM_STATUS_PIO_RETRY
| BM_STATUS_RETRY_READ
))
423 ide_transfer_start(s
, s
->io_buffer
, 512 * n
, ide_sector_read
);
425 ide_set_sector(s
, sector_num
+ n
);
431 /* return 0 if buffer completed */
432 static int dma_buf_prepare(BMDMAState
*bm
, int is_write
)
434 IDEState
*s
= bmdma_active_if(bm
);
441 qemu_sglist_init(&s
->sg
, s
->nsector
/ (IDE_PAGE_SIZE
/ 512) + 1);
442 s
->io_buffer_size
= 0;
444 if (bm
->cur_prd_len
== 0) {
445 /* end of table (with a fail safe of one page) */
446 if (bm
->cur_prd_last
||
447 (bm
->cur_addr
- bm
->addr
) >= IDE_PAGE_SIZE
)
448 return s
->io_buffer_size
!= 0;
449 cpu_physical_memory_read(bm
->cur_addr
, (uint8_t *)&prd
, 8);
451 prd
.addr
= le32_to_cpu(prd
.addr
);
452 prd
.size
= le32_to_cpu(prd
.size
);
453 len
= prd
.size
& 0xfffe;
456 bm
->cur_prd_len
= len
;
457 bm
->cur_prd_addr
= prd
.addr
;
458 bm
->cur_prd_last
= (prd
.size
& 0x80000000);
462 qemu_sglist_add(&s
->sg
, bm
->cur_prd_addr
, l
);
463 bm
->cur_prd_addr
+= l
;
464 bm
->cur_prd_len
-= l
;
465 s
->io_buffer_size
+= l
;
471 static void dma_buf_commit(IDEState
*s
, int is_write
)
473 qemu_sglist_destroy(&s
->sg
);
476 static void ide_dma_set_inactive(BMDMAState
*bm
)
478 bm
->status
&= ~BM_STATUS_DMAING
;
484 void ide_dma_error(IDEState
*s
)
486 ide_transfer_stop(s
);
488 s
->status
= READY_STAT
| ERR_STAT
;
489 ide_dma_set_inactive(s
->bus
->bmdma
);
490 s
->bus
->bmdma
->status
|= BM_STATUS_INT
;
494 static int ide_handle_rw_error(IDEState
*s
, int error
, int op
)
496 int is_read
= (op
& BM_STATUS_RETRY_READ
);
497 BlockErrorAction action
= bdrv_get_on_error(s
->bs
, is_read
);
499 if (action
== BLOCK_ERR_IGNORE
) {
500 bdrv_mon_event(s
->bs
, BDRV_ACTION_IGNORE
, is_read
);
504 if ((error
== ENOSPC
&& action
== BLOCK_ERR_STOP_ENOSPC
)
505 || action
== BLOCK_ERR_STOP_ANY
) {
506 s
->bus
->bmdma
->unit
= s
->unit
;
507 s
->bus
->bmdma
->status
|= op
;
508 bdrv_mon_event(s
->bs
, BDRV_ACTION_STOP
, is_read
);
511 if (op
& BM_STATUS_DMA_RETRY
) {
512 dma_buf_commit(s
, 0);
517 bdrv_mon_event(s
->bs
, BDRV_ACTION_REPORT
, is_read
);
523 /* return 0 if buffer completed */
524 static int dma_buf_rw(BMDMAState
*bm
, int is_write
)
526 IDEState
*s
= bmdma_active_if(bm
);
534 l
= s
->io_buffer_size
- s
->io_buffer_index
;
537 if (bm
->cur_prd_len
== 0) {
538 /* end of table (with a fail safe of one page) */
539 if (bm
->cur_prd_last
||
540 (bm
->cur_addr
- bm
->addr
) >= IDE_PAGE_SIZE
)
542 cpu_physical_memory_read(bm
->cur_addr
, (uint8_t *)&prd
, 8);
544 prd
.addr
= le32_to_cpu(prd
.addr
);
545 prd
.size
= le32_to_cpu(prd
.size
);
546 len
= prd
.size
& 0xfffe;
549 bm
->cur_prd_len
= len
;
550 bm
->cur_prd_addr
= prd
.addr
;
551 bm
->cur_prd_last
= (prd
.size
& 0x80000000);
553 if (l
> bm
->cur_prd_len
)
557 cpu_physical_memory_write(bm
->cur_prd_addr
,
558 s
->io_buffer
+ s
->io_buffer_index
, l
);
560 cpu_physical_memory_read(bm
->cur_prd_addr
,
561 s
->io_buffer
+ s
->io_buffer_index
, l
);
563 bm
->cur_prd_addr
+= l
;
564 bm
->cur_prd_len
-= l
;
565 s
->io_buffer_index
+= l
;
571 static void ide_read_dma_cb(void *opaque
, int ret
)
573 BMDMAState
*bm
= opaque
;
574 IDEState
*s
= bmdma_active_if(bm
);
579 if (ide_handle_rw_error(s
, -ret
,
580 BM_STATUS_DMA_RETRY
| BM_STATUS_RETRY_READ
))
586 n
= s
->io_buffer_size
>> 9;
587 sector_num
= ide_get_sector(s
);
589 dma_buf_commit(s
, 1);
591 ide_set_sector(s
, sector_num
);
595 /* end of transfer ? */
596 if (s
->nsector
== 0) {
597 s
->status
= READY_STAT
| SEEK_STAT
;
600 bm
->status
|= BM_STATUS_INT
;
601 ide_dma_set_inactive(bm
);
605 /* launch next transfer */
607 s
->io_buffer_index
= 0;
608 s
->io_buffer_size
= n
* 512;
609 if (dma_buf_prepare(bm
, 1) == 0)
612 printf("aio_read: sector_num=%" PRId64
" n=%d\n", sector_num
, n
);
614 bm
->aiocb
= dma_bdrv_read(s
->bs
, &s
->sg
, sector_num
, ide_read_dma_cb
, bm
);
615 ide_dma_submit_check(s
, ide_read_dma_cb
, bm
);
618 static void ide_sector_read_dma(IDEState
*s
)
620 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
| BUSY_STAT
;
621 s
->io_buffer_index
= 0;
622 s
->io_buffer_size
= 0;
624 ide_dma_start(s
, ide_read_dma_cb
);
627 static void ide_sector_write_timer_cb(void *opaque
)
629 IDEState
*s
= opaque
;
633 static void ide_sector_write(IDEState
*s
)
638 s
->status
= READY_STAT
| SEEK_STAT
;
639 sector_num
= ide_get_sector(s
);
640 #if defined(DEBUG_IDE)
641 printf("write sector=%" PRId64
"\n", sector_num
);
644 if (n
> s
->req_nb_sectors
)
645 n
= s
->req_nb_sectors
;
646 ret
= bdrv_write(s
->bs
, sector_num
, s
->io_buffer
, n
);
649 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_PIO_RETRY
))
654 if (s
->nsector
== 0) {
655 /* no more sectors to write */
656 ide_transfer_stop(s
);
659 if (n1
> s
->req_nb_sectors
)
660 n1
= s
->req_nb_sectors
;
661 ide_transfer_start(s
, s
->io_buffer
, 512 * n1
, ide_sector_write
);
663 ide_set_sector(s
, sector_num
+ n
);
665 if (win2k_install_hack
&& ((++s
->irq_count
% 16) == 0)) {
666 /* It seems there is a bug in the Windows 2000 installer HDD
667 IDE driver which fills the disk with empty logs when the
668 IDE write IRQ comes too early. This hack tries to correct
669 that at the expense of slower write performances. Use this
670 option _only_ to install Windows 2000. You must disable it
672 qemu_mod_timer(s
->sector_write_timer
,
673 qemu_get_clock(vm_clock
) + (get_ticks_per_sec() / 1000));
679 static void ide_dma_restart_bh(void *opaque
)
681 BMDMAState
*bm
= opaque
;
684 qemu_bh_delete(bm
->bh
);
687 is_read
= !!(bm
->status
& BM_STATUS_RETRY_READ
);
689 if (bm
->status
& BM_STATUS_DMA_RETRY
) {
690 bm
->status
&= ~(BM_STATUS_DMA_RETRY
| BM_STATUS_RETRY_READ
);
691 ide_dma_restart(bmdma_active_if(bm
), is_read
);
692 } else if (bm
->status
& BM_STATUS_PIO_RETRY
) {
693 bm
->status
&= ~(BM_STATUS_PIO_RETRY
| BM_STATUS_RETRY_READ
);
695 ide_sector_read(bmdma_active_if(bm
));
697 ide_sector_write(bmdma_active_if(bm
));
699 } else if (bm
->status
& BM_STATUS_RETRY_FLUSH
) {
700 ide_flush_cache(bmdma_active_if(bm
));
704 void ide_dma_restart_cb(void *opaque
, int running
, int reason
)
706 BMDMAState
*bm
= opaque
;
712 bm
->bh
= qemu_bh_new(ide_dma_restart_bh
, bm
);
713 qemu_bh_schedule(bm
->bh
);
717 static void ide_write_dma_cb(void *opaque
, int ret
)
719 BMDMAState
*bm
= opaque
;
720 IDEState
*s
= bmdma_active_if(bm
);
725 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_DMA_RETRY
))
729 n
= s
->io_buffer_size
>> 9;
730 sector_num
= ide_get_sector(s
);
732 dma_buf_commit(s
, 0);
734 ide_set_sector(s
, sector_num
);
738 /* end of transfer ? */
739 if (s
->nsector
== 0) {
740 s
->status
= READY_STAT
| SEEK_STAT
;
743 bm
->status
|= BM_STATUS_INT
;
744 ide_dma_set_inactive(bm
);
749 s
->io_buffer_size
= n
* 512;
750 /* launch next transfer */
751 if (dma_buf_prepare(bm
, 0) == 0)
754 printf("aio_write: sector_num=%" PRId64
" n=%d\n", sector_num
, n
);
756 bm
->aiocb
= dma_bdrv_write(s
->bs
, &s
->sg
, sector_num
, ide_write_dma_cb
, bm
);
757 ide_dma_submit_check(s
, ide_write_dma_cb
, bm
);
760 static void ide_sector_write_dma(IDEState
*s
)
762 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
| BUSY_STAT
;
763 s
->io_buffer_index
= 0;
764 s
->io_buffer_size
= 0;
766 ide_dma_start(s
, ide_write_dma_cb
);
769 void ide_atapi_cmd_ok(IDEState
*s
)
772 s
->status
= READY_STAT
| SEEK_STAT
;
773 s
->nsector
= (s
->nsector
& ~7) | ATAPI_INT_REASON_IO
| ATAPI_INT_REASON_CD
;
777 void ide_atapi_cmd_error(IDEState
*s
, int sense_key
, int asc
)
779 #ifdef DEBUG_IDE_ATAPI
780 printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key
, asc
);
782 s
->error
= sense_key
<< 4;
783 s
->status
= READY_STAT
| ERR_STAT
;
784 s
->nsector
= (s
->nsector
& ~7) | ATAPI_INT_REASON_IO
| ATAPI_INT_REASON_CD
;
785 s
->sense_key
= sense_key
;
790 static void ide_atapi_cmd_check_status(IDEState
*s
)
792 #ifdef DEBUG_IDE_ATAPI
793 printf("atapi_cmd_check_status\n");
795 s
->error
= MC_ERR
| (SENSE_UNIT_ATTENTION
<< 4);
796 s
->status
= ERR_STAT
;
801 static void ide_flush_cb(void *opaque
, int ret
)
803 IDEState
*s
= opaque
;
806 /* XXX: What sector number to set here? */
807 if (ide_handle_rw_error(s
, -ret
, BM_STATUS_RETRY_FLUSH
)) {
812 s
->status
= READY_STAT
| SEEK_STAT
;
816 static void ide_flush_cache(IDEState
*s
)
818 BlockDriverAIOCB
*acb
;
825 acb
= bdrv_aio_flush(s
->bs
, ide_flush_cb
, s
);
827 ide_flush_cb(s
, -EIO
);
831 static inline void cpu_to_ube16(uint8_t *buf
, int val
)
837 static inline void cpu_to_ube32(uint8_t *buf
, unsigned int val
)
845 static inline int ube16_to_cpu(const uint8_t *buf
)
847 return (buf
[0] << 8) | buf
[1];
850 static inline int ube32_to_cpu(const uint8_t *buf
)
852 return (buf
[0] << 24) | (buf
[1] << 16) | (buf
[2] << 8) | buf
[3];
855 static void lba_to_msf(uint8_t *buf
, int lba
)
858 buf
[0] = (lba
/ 75) / 60;
859 buf
[1] = (lba
/ 75) % 60;
863 static void cd_data_to_raw(uint8_t *buf
, int lba
)
867 memset(buf
+ 1, 0xff, 10);
871 lba_to_msf(buf
, lba
);
872 buf
[3] = 0x01; /* mode 1 data */
876 /* XXX: ECC not computed */
880 static int cd_read_sector(BlockDriverState
*bs
, int lba
, uint8_t *buf
,
885 switch(sector_size
) {
887 ret
= bdrv_read(bs
, (int64_t)lba
<< 2, buf
, 4);
890 ret
= bdrv_read(bs
, (int64_t)lba
<< 2, buf
+ 16, 4);
893 cd_data_to_raw(buf
, lba
);
902 void ide_atapi_io_error(IDEState
*s
, int ret
)
904 /* XXX: handle more errors */
905 if (ret
== -ENOMEDIUM
) {
906 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
907 ASC_MEDIUM_NOT_PRESENT
);
909 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
910 ASC_LOGICAL_BLOCK_OOR
);
914 /* The whole ATAPI transfer logic is handled in this function */
915 static void ide_atapi_cmd_reply_end(IDEState
*s
)
917 int byte_count_limit
, size
, ret
;
918 #ifdef DEBUG_IDE_ATAPI
919 printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
920 s
->packet_transfer_size
,
921 s
->elementary_transfer_size
,
924 if (s
->packet_transfer_size
<= 0) {
925 /* end of transfer */
926 ide_transfer_stop(s
);
927 s
->status
= READY_STAT
| SEEK_STAT
;
928 s
->nsector
= (s
->nsector
& ~7) | ATAPI_INT_REASON_IO
| ATAPI_INT_REASON_CD
;
930 #ifdef DEBUG_IDE_ATAPI
931 printf("status=0x%x\n", s
->status
);
934 /* see if a new sector must be read */
935 if (s
->lba
!= -1 && s
->io_buffer_index
>= s
->cd_sector_size
) {
936 ret
= cd_read_sector(s
->bs
, s
->lba
, s
->io_buffer
, s
->cd_sector_size
);
938 ide_transfer_stop(s
);
939 ide_atapi_io_error(s
, ret
);
943 s
->io_buffer_index
= 0;
945 if (s
->elementary_transfer_size
> 0) {
946 /* there are some data left to transmit in this elementary
948 size
= s
->cd_sector_size
- s
->io_buffer_index
;
949 if (size
> s
->elementary_transfer_size
)
950 size
= s
->elementary_transfer_size
;
951 ide_transfer_start(s
, s
->io_buffer
+ s
->io_buffer_index
,
952 size
, ide_atapi_cmd_reply_end
);
953 s
->packet_transfer_size
-= size
;
954 s
->elementary_transfer_size
-= size
;
955 s
->io_buffer_index
+= size
;
957 /* a new transfer is needed */
958 s
->nsector
= (s
->nsector
& ~7) | ATAPI_INT_REASON_IO
;
959 byte_count_limit
= s
->lcyl
| (s
->hcyl
<< 8);
960 #ifdef DEBUG_IDE_ATAPI
961 printf("byte_count_limit=%d\n", byte_count_limit
);
963 if (byte_count_limit
== 0xffff)
965 size
= s
->packet_transfer_size
;
966 if (size
> byte_count_limit
) {
967 /* byte count limit must be even if this case */
968 if (byte_count_limit
& 1)
970 size
= byte_count_limit
;
974 s
->elementary_transfer_size
= size
;
975 /* we cannot transmit more than one sector at a time */
977 if (size
> (s
->cd_sector_size
- s
->io_buffer_index
))
978 size
= (s
->cd_sector_size
- s
->io_buffer_index
);
980 ide_transfer_start(s
, s
->io_buffer
+ s
->io_buffer_index
,
981 size
, ide_atapi_cmd_reply_end
);
982 s
->packet_transfer_size
-= size
;
983 s
->elementary_transfer_size
-= size
;
984 s
->io_buffer_index
+= size
;
986 #ifdef DEBUG_IDE_ATAPI
987 printf("status=0x%x\n", s
->status
);
993 /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
994 static void ide_atapi_cmd_reply(IDEState
*s
, int size
, int max_size
)
998 s
->lba
= -1; /* no sector read */
999 s
->packet_transfer_size
= size
;
1000 s
->io_buffer_size
= size
; /* dma: send the reply data as one chunk */
1001 s
->elementary_transfer_size
= 0;
1002 s
->io_buffer_index
= 0;
1005 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
;
1006 ide_dma_start(s
, ide_atapi_cmd_read_dma_cb
);
1008 s
->status
= READY_STAT
| SEEK_STAT
;
1009 ide_atapi_cmd_reply_end(s
);
1013 /* start a CD-CDROM read command */
1014 static void ide_atapi_cmd_read_pio(IDEState
*s
, int lba
, int nb_sectors
,
1018 s
->packet_transfer_size
= nb_sectors
* sector_size
;
1019 s
->elementary_transfer_size
= 0;
1020 s
->io_buffer_index
= sector_size
;
1021 s
->cd_sector_size
= sector_size
;
1023 s
->status
= READY_STAT
| SEEK_STAT
;
1024 ide_atapi_cmd_reply_end(s
);
1027 /* ATAPI DMA support */
1029 /* XXX: handle read errors */
1030 static void ide_atapi_cmd_read_dma_cb(void *opaque
, int ret
)
1032 BMDMAState
*bm
= opaque
;
1033 IDEState
*s
= bmdma_active_if(bm
);
1037 ide_atapi_io_error(s
, ret
);
1041 if (s
->io_buffer_size
> 0) {
1043 * For a cdrom read sector command (s->lba != -1),
1044 * adjust the lba for the next s->io_buffer_size chunk
1045 * and dma the current chunk.
1046 * For a command != read (s->lba == -1), just transfer
1050 if (s
->cd_sector_size
== 2352) {
1052 cd_data_to_raw(s
->io_buffer
, s
->lba
);
1054 n
= s
->io_buffer_size
>> 11;
1058 s
->packet_transfer_size
-= s
->io_buffer_size
;
1059 if (dma_buf_rw(bm
, 1) == 0)
1063 if (s
->packet_transfer_size
<= 0) {
1064 s
->status
= READY_STAT
| SEEK_STAT
;
1065 s
->nsector
= (s
->nsector
& ~7) | ATAPI_INT_REASON_IO
| ATAPI_INT_REASON_CD
;
1066 ide_set_irq(s
->bus
);
1068 bm
->status
|= BM_STATUS_INT
;
1069 ide_dma_set_inactive(bm
);
1073 s
->io_buffer_index
= 0;
1074 if (s
->cd_sector_size
== 2352) {
1076 s
->io_buffer_size
= s
->cd_sector_size
;
1079 n
= s
->packet_transfer_size
>> 11;
1080 if (n
> (IDE_DMA_BUF_SECTORS
/ 4))
1081 n
= (IDE_DMA_BUF_SECTORS
/ 4);
1082 s
->io_buffer_size
= n
* 2048;
1086 printf("aio_read_cd: lba=%u n=%d\n", s
->lba
, n
);
1088 bm
->iov
.iov_base
= (void *)(s
->io_buffer
+ data_offset
);
1089 bm
->iov
.iov_len
= n
* 4 * 512;
1090 qemu_iovec_init_external(&bm
->qiov
, &bm
->iov
, 1);
1091 bm
->aiocb
= bdrv_aio_readv(s
->bs
, (int64_t)s
->lba
<< 2, &bm
->qiov
,
1092 n
* 4, ide_atapi_cmd_read_dma_cb
, bm
);
1094 /* Note: media not present is the most likely case */
1095 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1096 ASC_MEDIUM_NOT_PRESENT
);
1101 /* start a CD-CDROM read command with DMA */
1102 /* XXX: test if DMA is available */
1103 static void ide_atapi_cmd_read_dma(IDEState
*s
, int lba
, int nb_sectors
,
1107 s
->packet_transfer_size
= nb_sectors
* sector_size
;
1108 s
->io_buffer_index
= 0;
1109 s
->io_buffer_size
= 0;
1110 s
->cd_sector_size
= sector_size
;
1112 /* XXX: check if BUSY_STAT should be set */
1113 s
->status
= READY_STAT
| SEEK_STAT
| DRQ_STAT
| BUSY_STAT
;
1114 ide_dma_start(s
, ide_atapi_cmd_read_dma_cb
);
1117 static void ide_atapi_cmd_read(IDEState
*s
, int lba
, int nb_sectors
,
1120 #ifdef DEBUG_IDE_ATAPI
1121 printf("read %s: LBA=%d nb_sectors=%d\n", s
->atapi_dma
? "dma" : "pio",
1125 ide_atapi_cmd_read_dma(s
, lba
, nb_sectors
, sector_size
);
1127 ide_atapi_cmd_read_pio(s
, lba
, nb_sectors
, sector_size
);
1131 static inline uint8_t ide_atapi_set_profile(uint8_t *buf
, uint8_t *index
,
1134 uint8_t *buf_profile
= buf
+ 12; /* start of profiles */
1136 buf_profile
+= ((*index
) * 4); /* start of indexed profile */
1137 cpu_to_ube16 (buf_profile
, profile
);
1138 buf_profile
[2] = ((buf_profile
[0] == buf
[6]) && (buf_profile
[1] == buf
[7]));
1140 /* each profile adds 4 bytes to the response */
1142 buf
[11] += 4; /* Additional Length */
1147 static int ide_dvd_read_structure(IDEState
*s
, int format
,
1148 const uint8_t *packet
, uint8_t *buf
)
1151 case 0x0: /* Physical format information */
1153 int layer
= packet
[6];
1154 uint64_t total_sectors
;
1157 return -ASC_INV_FIELD_IN_CMD_PACKET
;
1159 bdrv_get_geometry(s
->bs
, &total_sectors
);
1160 total_sectors
>>= 2;
1161 if (total_sectors
== 0)
1162 return -ASC_MEDIUM_NOT_PRESENT
;
1164 buf
[4] = 1; /* DVD-ROM, part version 1 */
1165 buf
[5] = 0xf; /* 120mm disc, minimum rate unspecified */
1166 buf
[6] = 1; /* one layer, read-only (per MMC-2 spec) */
1167 buf
[7] = 0; /* default densities */
1169 /* FIXME: 0x30000 per spec? */
1170 cpu_to_ube32(buf
+ 8, 0); /* start sector */
1171 cpu_to_ube32(buf
+ 12, total_sectors
- 1); /* end sector */
1172 cpu_to_ube32(buf
+ 16, total_sectors
- 1); /* l0 end sector */
1174 /* Size of buffer, not including 2 byte size field */
1175 cpu_to_be16wu((uint16_t *)buf
, 2048 + 2);
1177 /* 2k data + 4 byte header */
1181 case 0x01: /* DVD copyright information */
1182 buf
[4] = 0; /* no copyright data */
1183 buf
[5] = 0; /* no region restrictions */
1185 /* Size of buffer, not including 2 byte size field */
1186 cpu_to_be16wu((uint16_t *)buf
, 4 + 2);
1188 /* 4 byte header + 4 byte data */
1191 case 0x03: /* BCA information - invalid field for no BCA info */
1192 return -ASC_INV_FIELD_IN_CMD_PACKET
;
1194 case 0x04: /* DVD disc manufacturing information */
1195 /* Size of buffer, not including 2 byte size field */
1196 cpu_to_be16wu((uint16_t *)buf
, 2048 + 2);
1198 /* 2k data + 4 byte header */
1203 * This lists all the command capabilities above. Add new ones
1204 * in order and update the length and buffer return values.
1207 buf
[4] = 0x00; /* Physical format */
1208 buf
[5] = 0x40; /* Not writable, is readable */
1209 cpu_to_be16wu((uint16_t *)(buf
+ 6), 2048 + 4);
1211 buf
[8] = 0x01; /* Copyright info */
1212 buf
[9] = 0x40; /* Not writable, is readable */
1213 cpu_to_be16wu((uint16_t *)(buf
+ 10), 4 + 4);
1215 buf
[12] = 0x03; /* BCA info */
1216 buf
[13] = 0x40; /* Not writable, is readable */
1217 cpu_to_be16wu((uint16_t *)(buf
+ 14), 188 + 4);
1219 buf
[16] = 0x04; /* Manufacturing info */
1220 buf
[17] = 0x40; /* Not writable, is readable */
1221 cpu_to_be16wu((uint16_t *)(buf
+ 18), 2048 + 4);
1223 /* Size of buffer, not including 2 byte size field */
1224 cpu_to_be16wu((uint16_t *)buf
, 16 + 2);
1226 /* data written + 4 byte header */
1229 default: /* TODO: formats beyond DVD-ROM requires */
1230 return -ASC_INV_FIELD_IN_CMD_PACKET
;
1234 static void ide_atapi_cmd(IDEState
*s
)
1236 const uint8_t *packet
;
1240 packet
= s
->io_buffer
;
1242 #ifdef DEBUG_IDE_ATAPI
1245 printf("ATAPI limit=0x%x packet:", s
->lcyl
| (s
->hcyl
<< 8));
1246 for(i
= 0; i
< ATAPI_PACKET_SIZE
; i
++) {
1247 printf(" %02x", packet
[i
]);
1252 /* If there's a UNIT_ATTENTION condition pending, only
1253 REQUEST_SENSE and INQUIRY commands are allowed to complete. */
1254 if (s
->sense_key
== SENSE_UNIT_ATTENTION
&&
1255 s
->io_buffer
[0] != GPCMD_REQUEST_SENSE
&&
1256 s
->io_buffer
[0] != GPCMD_INQUIRY
) {
1257 ide_atapi_cmd_check_status(s
);
1260 switch(s
->io_buffer
[0]) {
1261 case GPCMD_TEST_UNIT_READY
:
1262 if (bdrv_is_inserted(s
->bs
) && !s
->cdrom_changed
) {
1263 ide_atapi_cmd_ok(s
);
1265 s
->cdrom_changed
= 0;
1266 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1267 ASC_MEDIUM_NOT_PRESENT
);
1270 case GPCMD_MODE_SENSE_6
:
1271 case GPCMD_MODE_SENSE_10
:
1274 if (packet
[0] == GPCMD_MODE_SENSE_10
)
1275 max_len
= ube16_to_cpu(packet
+ 7);
1277 max_len
= packet
[4];
1278 action
= packet
[2] >> 6;
1279 code
= packet
[2] & 0x3f;
1281 case 0: /* current values */
1283 case GPMODE_R_W_ERROR_PAGE
: /* error recovery */
1284 cpu_to_ube16(&buf
[0], 16 + 6);
1300 ide_atapi_cmd_reply(s
, 16, max_len
);
1302 case GPMODE_AUDIO_CTL_PAGE
:
1303 cpu_to_ube16(&buf
[0], 24 + 6);
1311 /* Fill with CDROM audio volume */
1317 ide_atapi_cmd_reply(s
, 24, max_len
);
1319 case GPMODE_CAPABILITIES_PAGE
:
1320 cpu_to_ube16(&buf
[0], 28 + 6);
1333 /* Claim PLAY_AUDIO capability (0x01) since some Linux
1334 code checks for this to automount media. */
1337 buf
[14] = (1 << 0) | (1 << 3) | (1 << 5);
1338 if (bdrv_is_locked(s
->bs
))
1341 cpu_to_ube16(&buf
[16], 706);
1344 cpu_to_ube16(&buf
[20], 512);
1345 cpu_to_ube16(&buf
[22], 706);
1350 ide_atapi_cmd_reply(s
, 28, max_len
);
1356 case 1: /* changeable values */
1358 case 2: /* default values */
1361 case 3: /* saved values */
1362 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1363 ASC_SAVING_PARAMETERS_NOT_SUPPORTED
);
1368 case GPCMD_REQUEST_SENSE
:
1369 max_len
= packet
[4];
1371 buf
[0] = 0x70 | (1 << 7);
1372 buf
[2] = s
->sense_key
;
1375 if (s
->sense_key
== SENSE_UNIT_ATTENTION
)
1376 s
->sense_key
= SENSE_NONE
;
1377 ide_atapi_cmd_reply(s
, 18, max_len
);
1379 case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL
:
1380 if (bdrv_is_inserted(s
->bs
)) {
1381 bdrv_set_locked(s
->bs
, packet
[4] & 1);
1382 ide_atapi_cmd_ok(s
);
1384 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1385 ASC_MEDIUM_NOT_PRESENT
);
1391 int nb_sectors
, lba
;
1393 if (packet
[0] == GPCMD_READ_10
)
1394 nb_sectors
= ube16_to_cpu(packet
+ 7);
1396 nb_sectors
= ube32_to_cpu(packet
+ 6);
1397 lba
= ube32_to_cpu(packet
+ 2);
1398 if (nb_sectors
== 0) {
1399 ide_atapi_cmd_ok(s
);
1402 ide_atapi_cmd_read(s
, lba
, nb_sectors
, 2048);
1407 int nb_sectors
, lba
, transfer_request
;
1409 nb_sectors
= (packet
[6] << 16) | (packet
[7] << 8) | packet
[8];
1410 lba
= ube32_to_cpu(packet
+ 2);
1411 if (nb_sectors
== 0) {
1412 ide_atapi_cmd_ok(s
);
1415 transfer_request
= packet
[9];
1416 switch(transfer_request
& 0xf8) {
1419 ide_atapi_cmd_ok(s
);
1423 ide_atapi_cmd_read(s
, lba
, nb_sectors
, 2048);
1427 ide_atapi_cmd_read(s
, lba
, nb_sectors
, 2352);
1430 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1431 ASC_INV_FIELD_IN_CMD_PACKET
);
1439 uint64_t total_sectors
;
1441 bdrv_get_geometry(s
->bs
, &total_sectors
);
1442 total_sectors
>>= 2;
1443 if (total_sectors
== 0) {
1444 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1445 ASC_MEDIUM_NOT_PRESENT
);
1448 lba
= ube32_to_cpu(packet
+ 2);
1449 if (lba
>= total_sectors
) {
1450 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1451 ASC_LOGICAL_BLOCK_OOR
);
1454 ide_atapi_cmd_ok(s
);
1457 case GPCMD_START_STOP_UNIT
:
1459 int start
, eject
, err
= 0;
1460 start
= packet
[4] & 1;
1461 eject
= (packet
[4] >> 1) & 1;
1464 err
= bdrv_eject(s
->bs
, !start
);
1469 ide_atapi_cmd_ok(s
);
1472 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1473 ASC_MEDIA_REMOVAL_PREVENTED
);
1476 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1477 ASC_MEDIUM_NOT_PRESENT
);
1482 case GPCMD_MECHANISM_STATUS
:
1484 max_len
= ube16_to_cpu(packet
+ 8);
1485 cpu_to_ube16(buf
, 0);
1486 /* no current LBA */
1491 cpu_to_ube16(buf
+ 6, 0);
1492 ide_atapi_cmd_reply(s
, 8, max_len
);
1495 case GPCMD_READ_TOC_PMA_ATIP
:
1497 int format
, msf
, start_track
, len
;
1498 uint64_t total_sectors
;
1500 bdrv_get_geometry(s
->bs
, &total_sectors
);
1501 total_sectors
>>= 2;
1502 if (total_sectors
== 0) {
1503 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1504 ASC_MEDIUM_NOT_PRESENT
);
1507 max_len
= ube16_to_cpu(packet
+ 7);
1508 format
= packet
[9] >> 6;
1509 msf
= (packet
[1] >> 1) & 1;
1510 start_track
= packet
[6];
1513 len
= cdrom_read_toc(total_sectors
, buf
, msf
, start_track
);
1516 ide_atapi_cmd_reply(s
, len
, max_len
);
1519 /* multi session : only a single session defined */
1524 ide_atapi_cmd_reply(s
, 12, max_len
);
1527 len
= cdrom_read_toc_raw(total_sectors
, buf
, msf
, start_track
);
1530 ide_atapi_cmd_reply(s
, len
, max_len
);
1534 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1535 ASC_INV_FIELD_IN_CMD_PACKET
);
1540 case GPCMD_READ_CDVD_CAPACITY
:
1542 uint64_t total_sectors
;
1544 bdrv_get_geometry(s
->bs
, &total_sectors
);
1545 total_sectors
>>= 2;
1546 if (total_sectors
== 0) {
1547 ide_atapi_cmd_error(s
, SENSE_NOT_READY
,
1548 ASC_MEDIUM_NOT_PRESENT
);
1551 /* NOTE: it is really the number of sectors minus 1 */
1552 cpu_to_ube32(buf
, total_sectors
- 1);
1553 cpu_to_ube32(buf
+ 4, 2048);
1554 ide_atapi_cmd_reply(s
, 8, 8);
1557 case GPCMD_READ_DVD_STRUCTURE
:
1559 int media
= packet
[1];
1560 int format
= packet
[7];
1563 max_len
= ube16_to_cpu(packet
+ 8);
1565 if (format
< 0xff) {
1566 if (media_is_cd(s
)) {
1567 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1568 ASC_INCOMPATIBLE_FORMAT
);
1570 } else if (!media_present(s
)) {
1571 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1572 ASC_INV_FIELD_IN_CMD_PACKET
);
1577 memset(buf
, 0, max_len
> IDE_DMA_BUF_SECTORS
* 512 + 4 ?
1578 IDE_DMA_BUF_SECTORS
* 512 + 4 : max_len
);
1584 ret
= ide_dvd_read_structure(s
, format
, packet
, buf
);
1587 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
, -ret
);
1589 ide_atapi_cmd_reply(s
, ret
, max_len
);
1593 /* TODO: BD support, fall through for now */
1595 /* Generic disk structures */
1596 case 0x80: /* TODO: AACS volume identifier */
1597 case 0x81: /* TODO: AACS media serial number */
1598 case 0x82: /* TODO: AACS media identifier */
1599 case 0x83: /* TODO: AACS media key block */
1600 case 0x90: /* TODO: List of recognized format layers */
1601 case 0xc0: /* TODO: Write protection status */
1603 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1604 ASC_INV_FIELD_IN_CMD_PACKET
);
1609 case GPCMD_SET_SPEED
:
1610 ide_atapi_cmd_ok(s
);
1613 max_len
= packet
[4];
1614 buf
[0] = 0x05; /* CD-ROM */
1615 buf
[1] = 0x80; /* removable */
1616 buf
[2] = 0x00; /* ISO */
1617 buf
[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
1618 buf
[4] = 31; /* additional length */
1619 buf
[5] = 0; /* reserved */
1620 buf
[6] = 0; /* reserved */
1621 buf
[7] = 0; /* reserved */
1622 padstr8(buf
+ 8, 8, "QEMU");
1623 padstr8(buf
+ 16, 16, "QEMU DVD-ROM");
1624 padstr8(buf
+ 32, 4, s
->version
);
1625 ide_atapi_cmd_reply(s
, 36, max_len
);
1627 case GPCMD_GET_CONFIGURATION
:
1632 /* only feature 0 is supported */
1633 if (packet
[2] != 0 || packet
[3] != 0) {
1634 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1635 ASC_INV_FIELD_IN_CMD_PACKET
);
1639 /* XXX: could result in alignment problems in some architectures */
1640 max_len
= ube16_to_cpu(packet
+ 7);
1643 * XXX: avoid overflow for io_buffer if max_len is bigger than
1644 * the size of that buffer (dimensioned to max number of
1645 * sectors to transfer at once)
1647 * Only a problem if the feature/profiles grow.
1649 if (max_len
> 512) /* XXX: assume 1 sector */
1652 memset(buf
, 0, max_len
);
1654 * the number of sectors from the media tells us which profile
1655 * to use as current. 0 means there is no media
1657 if (media_is_dvd(s
))
1658 cpu_to_ube16(buf
+ 6, MMC_PROFILE_DVD_ROM
);
1659 else if (media_is_cd(s
))
1660 cpu_to_ube16(buf
+ 6, MMC_PROFILE_CD_ROM
);
1662 buf
[10] = 0x02 | 0x01; /* persistent and current */
1663 len
= 12; /* headers: 8 + 4 */
1664 len
+= ide_atapi_set_profile(buf
, &index
, MMC_PROFILE_DVD_ROM
);
1665 len
+= ide_atapi_set_profile(buf
, &index
, MMC_PROFILE_CD_ROM
);
1666 cpu_to_ube32(buf
, len
- 4); /* data length */
1668 ide_atapi_cmd_reply(s
, len
, max_len
);
1671 case GPCMD_GET_EVENT_STATUS_NOTIFICATION
:
1672 max_len
= ube16_to_cpu(packet
+ 7);
1674 if (packet
[1] & 0x01) { /* polling */
1675 /* We don't support any event class (yet). */
1676 cpu_to_ube16(buf
, 0x00); /* No event descriptor returned */
1677 buf
[2] = 0x80; /* No Event Available (NEA) */
1678 buf
[3] = 0x00; /* Empty supported event classes */
1679 ide_atapi_cmd_reply(s
, 4, max_len
);
1680 } else { /* asynchronous mode */
1681 /* Only polling is supported, asynchronous mode is not. */
1682 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1683 ASC_INV_FIELD_IN_CMD_PACKET
);
1687 ide_atapi_cmd_error(s
, SENSE_ILLEGAL_REQUEST
,
1688 ASC_ILLEGAL_OPCODE
);
1693 static void ide_cfata_metadata_inquiry(IDEState
*s
)
1698 p
= (uint16_t *) s
->io_buffer
;
1699 memset(p
, 0, 0x200);
1700 spd
= ((s
->mdata_size
- 1) >> 9) + 1;
1702 put_le16(p
+ 0, 0x0001); /* Data format revision */
1703 put_le16(p
+ 1, 0x0000); /* Media property: silicon */
1704 put_le16(p
+ 2, s
->media_changed
); /* Media status */
1705 put_le16(p
+ 3, s
->mdata_size
& 0xffff); /* Capacity in bytes (low) */
1706 put_le16(p
+ 4, s
->mdata_size
>> 16); /* Capacity in bytes (high) */
1707 put_le16(p
+ 5, spd
& 0xffff); /* Sectors per device (low) */
1708 put_le16(p
+ 6, spd
>> 16); /* Sectors per device (high) */
1711 static void ide_cfata_metadata_read(IDEState
*s
)
1715 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
1716 s
->status
= ERR_STAT
;
1717 s
->error
= ABRT_ERR
;
1721 p
= (uint16_t *) s
->io_buffer
;
1722 memset(p
, 0, 0x200);
1724 put_le16(p
+ 0, s
->media_changed
); /* Media status */
1725 memcpy(p
+ 1, s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
1726 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
1727 s
->nsector
<< 9), 0x200 - 2));
1730 static void ide_cfata_metadata_write(IDEState
*s
)
1732 if (((s
->hcyl
<< 16) | s
->lcyl
) << 9 > s
->mdata_size
+ 2) {
1733 s
->status
= ERR_STAT
;
1734 s
->error
= ABRT_ERR
;
1738 s
->media_changed
= 0;
1740 memcpy(s
->mdata_storage
+ (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
1742 MIN(MIN(s
->mdata_size
- (((s
->hcyl
<< 16) | s
->lcyl
) << 9),
1743 s
->nsector
<< 9), 0x200 - 2));
1746 /* called when the inserted state of the media has changed */
1747 static void cdrom_change_cb(void *opaque
)
1749 IDEState
*s
= opaque
;
1750 uint64_t nb_sectors
;
1752 bdrv_get_geometry(s
->bs
, &nb_sectors
);
1753 s
->nb_sectors
= nb_sectors
;
1755 s
->sense_key
= SENSE_UNIT_ATTENTION
;
1756 s
->asc
= ASC_MEDIUM_MAY_HAVE_CHANGED
;
1757 s
->cdrom_changed
= 1;
1758 ide_set_irq(s
->bus
);
1761 static void ide_cmd_lba48_transform(IDEState
*s
, int lba48
)
1765 /* handle the 'magic' 0 nsector count conversion here. to avoid
1766 * fiddling with the rest of the read logic, we just store the
1767 * full sector count in ->nsector and ignore ->hob_nsector from now
1773 if (!s
->nsector
&& !s
->hob_nsector
)
1776 int lo
= s
->nsector
;
1777 int hi
= s
->hob_nsector
;
1779 s
->nsector
= (hi
<< 8) | lo
;
1784 static void ide_clear_hob(IDEBus
*bus
)
1786 /* any write clears HOB high bit of device control register */
1787 bus
->ifs
[0].select
&= ~(1 << 7);
1788 bus
->ifs
[1].select
&= ~(1 << 7);
1791 void ide_ioport_write(void *opaque
, uint32_t addr
, uint32_t val
)
1793 IDEBus
*bus
= opaque
;
1796 printf("IDE: write addr=0x%x val=0x%02x\n", addr
, val
);
1801 /* ignore writes to command block while busy with previous command */
1802 if (addr
!= 7 && (idebus_active_if(bus
)->status
& (BUSY_STAT
|DRQ_STAT
)))
1810 /* NOTE: data is written to the two drives */
1811 bus
->ifs
[0].hob_feature
= bus
->ifs
[0].feature
;
1812 bus
->ifs
[1].hob_feature
= bus
->ifs
[1].feature
;
1813 bus
->ifs
[0].feature
= val
;
1814 bus
->ifs
[1].feature
= val
;
1818 bus
->ifs
[0].hob_nsector
= bus
->ifs
[0].nsector
;
1819 bus
->ifs
[1].hob_nsector
= bus
->ifs
[1].nsector
;
1820 bus
->ifs
[0].nsector
= val
;
1821 bus
->ifs
[1].nsector
= val
;
1825 bus
->ifs
[0].hob_sector
= bus
->ifs
[0].sector
;
1826 bus
->ifs
[1].hob_sector
= bus
->ifs
[1].sector
;
1827 bus
->ifs
[0].sector
= val
;
1828 bus
->ifs
[1].sector
= val
;
1832 bus
->ifs
[0].hob_lcyl
= bus
->ifs
[0].lcyl
;
1833 bus
->ifs
[1].hob_lcyl
= bus
->ifs
[1].lcyl
;
1834 bus
->ifs
[0].lcyl
= val
;
1835 bus
->ifs
[1].lcyl
= val
;
1839 bus
->ifs
[0].hob_hcyl
= bus
->ifs
[0].hcyl
;
1840 bus
->ifs
[1].hob_hcyl
= bus
->ifs
[1].hcyl
;
1841 bus
->ifs
[0].hcyl
= val
;
1842 bus
->ifs
[1].hcyl
= val
;
1845 /* FIXME: HOB readback uses bit 7 */
1846 bus
->ifs
[0].select
= (val
& ~0x10) | 0xa0;
1847 bus
->ifs
[1].select
= (val
| 0x10) | 0xa0;
1849 bus
->unit
= (val
>> 4) & 1;
1854 ide_exec_cmd(bus
, val
);
1860 void ide_exec_cmd(IDEBus
*bus
, uint32_t val
)
1866 #if defined(DEBUG_IDE)
1867 printf("ide: CMD=%02x\n", val
);
1869 s
= idebus_active_if(bus
);
1870 /* ignore commands to non existant slave */
1871 if (s
!= bus
->ifs
&& !s
->bs
)
1874 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1875 if ((s
->status
& (BUSY_STAT
|DRQ_STAT
)) && val
!= WIN_DEVICE_RESET
)
1880 if (s
->bs
&& s
->drive_kind
!= IDE_CD
) {
1881 if (s
->drive_kind
!= IDE_CFATA
)
1884 ide_cfata_identify(s
);
1885 s
->status
= READY_STAT
| SEEK_STAT
;
1886 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
1888 if (s
->drive_kind
== IDE_CD
) {
1889 ide_set_signature(s
);
1891 ide_abort_command(s
);
1893 ide_set_irq(s
->bus
);
1898 s
->status
= READY_STAT
| SEEK_STAT
;
1899 ide_set_irq(s
->bus
);
1902 if (s
->drive_kind
== IDE_CFATA
&& s
->nsector
== 0) {
1903 /* Disable Read and Write Multiple */
1904 s
->mult_sectors
= 0;
1905 s
->status
= READY_STAT
| SEEK_STAT
;
1906 } else if ((s
->nsector
& 0xff) != 0 &&
1907 ((s
->nsector
& 0xff) > MAX_MULT_SECTORS
||
1908 (s
->nsector
& (s
->nsector
- 1)) != 0)) {
1909 ide_abort_command(s
);
1911 s
->mult_sectors
= s
->nsector
& 0xff;
1912 s
->status
= READY_STAT
| SEEK_STAT
;
1914 ide_set_irq(s
->bus
);
1916 case WIN_VERIFY_EXT
:
1919 case WIN_VERIFY_ONCE
:
1920 /* do sector number check ? */
1921 ide_cmd_lba48_transform(s
, lba48
);
1922 s
->status
= READY_STAT
| SEEK_STAT
;
1923 ide_set_irq(s
->bus
);
1931 ide_cmd_lba48_transform(s
, lba48
);
1932 s
->req_nb_sectors
= 1;
1938 case WIN_WRITE_ONCE
:
1939 case CFA_WRITE_SECT_WO_ERASE
:
1940 case WIN_WRITE_VERIFY
:
1941 ide_cmd_lba48_transform(s
, lba48
);
1943 s
->status
= SEEK_STAT
| READY_STAT
;
1944 s
->req_nb_sectors
= 1;
1945 ide_transfer_start(s
, s
->io_buffer
, 512, ide_sector_write
);
1946 s
->media_changed
= 1;
1948 case WIN_MULTREAD_EXT
:
1951 if (!s
->mult_sectors
)
1953 ide_cmd_lba48_transform(s
, lba48
);
1954 s
->req_nb_sectors
= s
->mult_sectors
;
1957 case WIN_MULTWRITE_EXT
:
1960 case CFA_WRITE_MULTI_WO_ERASE
:
1961 if (!s
->mult_sectors
)
1963 ide_cmd_lba48_transform(s
, lba48
);
1965 s
->status
= SEEK_STAT
| READY_STAT
;
1966 s
->req_nb_sectors
= s
->mult_sectors
;
1968 if (n
> s
->req_nb_sectors
)
1969 n
= s
->req_nb_sectors
;
1970 ide_transfer_start(s
, s
->io_buffer
, 512 * n
, ide_sector_write
);
1971 s
->media_changed
= 1;
1973 case WIN_READDMA_EXT
:
1976 case WIN_READDMA_ONCE
:
1979 ide_cmd_lba48_transform(s
, lba48
);
1980 ide_sector_read_dma(s
);
1982 case WIN_WRITEDMA_EXT
:
1985 case WIN_WRITEDMA_ONCE
:
1988 ide_cmd_lba48_transform(s
, lba48
);
1989 ide_sector_write_dma(s
);
1990 s
->media_changed
= 1;
1992 case WIN_READ_NATIVE_MAX_EXT
:
1994 case WIN_READ_NATIVE_MAX
:
1995 ide_cmd_lba48_transform(s
, lba48
);
1996 ide_set_sector(s
, s
->nb_sectors
- 1);
1997 s
->status
= READY_STAT
| SEEK_STAT
;
1998 ide_set_irq(s
->bus
);
2000 case WIN_CHECKPOWERMODE1
:
2001 case WIN_CHECKPOWERMODE2
:
2002 s
->nsector
= 0xff; /* device active or idle */
2003 s
->status
= READY_STAT
| SEEK_STAT
;
2004 ide_set_irq(s
->bus
);
2006 case WIN_SETFEATURES
:
2009 /* XXX: valid for CDROM ? */
2010 switch(s
->feature
) {
2011 case 0xcc: /* reverting to power-on defaults enable */
2012 case 0x66: /* reverting to power-on defaults disable */
2013 case 0x02: /* write cache enable */
2014 case 0x82: /* write cache disable */
2015 case 0xaa: /* read look-ahead enable */
2016 case 0x55: /* read look-ahead disable */
2017 case 0x05: /* set advanced power management mode */
2018 case 0x85: /* disable advanced power management mode */
2019 case 0x69: /* NOP */
2020 case 0x67: /* NOP */
2021 case 0x96: /* NOP */
2022 case 0x9a: /* NOP */
2023 case 0x42: /* enable Automatic Acoustic Mode */
2024 case 0xc2: /* disable Automatic Acoustic Mode */
2025 s
->status
= READY_STAT
| SEEK_STAT
;
2026 ide_set_irq(s
->bus
);
2028 case 0x03: { /* set transfer mode */
2029 uint8_t val
= s
->nsector
& 0x07;
2030 uint16_t *identify_data
= (uint16_t *)s
->identify_data
;
2032 switch (s
->nsector
>> 3) {
2033 case 0x00: /* pio default */
2034 case 0x01: /* pio mode */
2035 put_le16(identify_data
+ 62,0x07);
2036 put_le16(identify_data
+ 63,0x07);
2037 put_le16(identify_data
+ 88,0x3f);
2039 case 0x02: /* sigle word dma mode*/
2040 put_le16(identify_data
+ 62,0x07 | (1 << (val
+ 8)));
2041 put_le16(identify_data
+ 63,0x07);
2042 put_le16(identify_data
+ 88,0x3f);
2044 case 0x04: /* mdma mode */
2045 put_le16(identify_data
+ 62,0x07);
2046 put_le16(identify_data
+ 63,0x07 | (1 << (val
+ 8)));
2047 put_le16(identify_data
+ 88,0x3f);
2049 case 0x08: /* udma mode */
2050 put_le16(identify_data
+ 62,0x07);
2051 put_le16(identify_data
+ 63,0x07);
2052 put_le16(identify_data
+ 88,0x3f | (1 << (val
+ 8)));
2057 s
->status
= READY_STAT
| SEEK_STAT
;
2058 ide_set_irq(s
->bus
);
2065 case WIN_FLUSH_CACHE
:
2066 case WIN_FLUSH_CACHE_EXT
:
2071 case WIN_STANDBYNOW1
:
2072 case WIN_STANDBYNOW2
:
2073 case WIN_IDLEIMMEDIATE
:
2074 case CFA_IDLEIMMEDIATE
:
2079 s
->status
= READY_STAT
;
2080 ide_set_irq(s
->bus
);
2083 if(s
->drive_kind
== IDE_CD
)
2085 /* XXX: Check that seek is within bounds */
2086 s
->status
= READY_STAT
| SEEK_STAT
;
2087 ide_set_irq(s
->bus
);
2089 /* ATAPI commands */
2091 if (s
->drive_kind
== IDE_CD
) {
2092 ide_atapi_identify(s
);
2093 s
->status
= READY_STAT
| SEEK_STAT
;
2094 ide_transfer_start(s
, s
->io_buffer
, 512, ide_transfer_stop
);
2096 ide_abort_command(s
);
2098 ide_set_irq(s
->bus
);
2101 ide_set_signature(s
);
2102 if (s
->drive_kind
== IDE_CD
)
2103 s
->status
= 0; /* ATAPI spec (v6) section 9.10 defines packet
2104 * devices to return a clear status register
2105 * with READY_STAT *not* set. */
2107 s
->status
= READY_STAT
| SEEK_STAT
;
2108 s
->error
= 0x01; /* Device 0 passed, Device 1 passed or not
2111 ide_set_irq(s
->bus
);
2114 if (s
->drive_kind
!= IDE_CD
)
2116 ide_set_signature(s
);
2117 s
->status
= 0x00; /* NOTE: READY is _not_ set */
2121 if (s
->drive_kind
!= IDE_CD
)
2123 /* overlapping commands not supported */
2124 if (s
->feature
& 0x02)
2126 s
->status
= READY_STAT
| SEEK_STAT
;
2127 s
->atapi_dma
= s
->feature
& 1;
2129 ide_transfer_start(s
, s
->io_buffer
, ATAPI_PACKET_SIZE
,
2132 /* CF-ATA commands */
2133 case CFA_REQ_EXT_ERROR_CODE
:
2134 if (s
->drive_kind
!= IDE_CFATA
)
2136 s
->error
= 0x09; /* miscellaneous error */
2137 s
->status
= READY_STAT
| SEEK_STAT
;
2138 ide_set_irq(s
->bus
);
2140 case CFA_ERASE_SECTORS
:
2141 case CFA_WEAR_LEVEL
:
2142 if (s
->drive_kind
!= IDE_CFATA
)
2144 if (val
== CFA_WEAR_LEVEL
)
2146 if (val
== CFA_ERASE_SECTORS
)
2147 s
->media_changed
= 1;
2149 s
->status
= READY_STAT
| SEEK_STAT
;
2150 ide_set_irq(s
->bus
);
2152 case CFA_TRANSLATE_SECTOR
:
2153 if (s
->drive_kind
!= IDE_CFATA
)
2156 s
->status
= READY_STAT
| SEEK_STAT
;
2157 memset(s
->io_buffer
, 0, 0x200);
2158 s
->io_buffer
[0x00] = s
->hcyl
; /* Cyl MSB */
2159 s
->io_buffer
[0x01] = s
->lcyl
; /* Cyl LSB */
2160 s
->io_buffer
[0x02] = s
->select
; /* Head */
2161 s
->io_buffer
[0x03] = s
->sector
; /* Sector */
2162 s
->io_buffer
[0x04] = ide_get_sector(s
) >> 16; /* LBA MSB */
2163 s
->io_buffer
[0x05] = ide_get_sector(s
) >> 8; /* LBA */
2164 s
->io_buffer
[0x06] = ide_get_sector(s
) >> 0; /* LBA LSB */
2165 s
->io_buffer
[0x13] = 0x00; /* Erase flag */
2166 s
->io_buffer
[0x18] = 0x00; /* Hot count */
2167 s
->io_buffer
[0x19] = 0x00; /* Hot count */
2168 s
->io_buffer
[0x1a] = 0x01; /* Hot count */
2169 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
2170 ide_set_irq(s
->bus
);
2172 case CFA_ACCESS_METADATA_STORAGE
:
2173 if (s
->drive_kind
!= IDE_CFATA
)
2175 switch (s
->feature
) {
2176 case 0x02: /* Inquiry Metadata Storage */
2177 ide_cfata_metadata_inquiry(s
);
2179 case 0x03: /* Read Metadata Storage */
2180 ide_cfata_metadata_read(s
);
2182 case 0x04: /* Write Metadata Storage */
2183 ide_cfata_metadata_write(s
);
2188 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
2189 s
->status
= 0x00; /* NOTE: READY is _not_ set */
2190 ide_set_irq(s
->bus
);
2192 case IBM_SENSE_CONDITION
:
2193 if (s
->drive_kind
!= IDE_CFATA
)
2195 switch (s
->feature
) {
2196 case 0x01: /* sense temperature in device */
2197 s
->nsector
= 0x50; /* +20 C */
2202 s
->status
= READY_STAT
| SEEK_STAT
;
2203 ide_set_irq(s
->bus
);
2207 if (s
->drive_kind
== IDE_CD
)
2209 if (s
->hcyl
!= 0xc2 || s
->lcyl
!= 0x4f)
2211 if (!s
->smart_enabled
&& s
->feature
!= SMART_ENABLE
)
2213 switch (s
->feature
) {
2215 s
->smart_enabled
= 0;
2216 s
->status
= READY_STAT
| SEEK_STAT
;
2217 ide_set_irq(s
->bus
);
2220 s
->smart_enabled
= 1;
2221 s
->status
= READY_STAT
| SEEK_STAT
;
2222 ide_set_irq(s
->bus
);
2224 case SMART_ATTR_AUTOSAVE
:
2225 switch (s
->sector
) {
2227 s
->smart_autosave
= 0;
2230 s
->smart_autosave
= 1;
2235 s
->status
= READY_STAT
| SEEK_STAT
;
2236 ide_set_irq(s
->bus
);
2239 if (!s
->smart_errors
) {
2246 s
->status
= READY_STAT
| SEEK_STAT
;
2247 ide_set_irq(s
->bus
);
2249 case SMART_READ_THRESH
:
2250 memset(s
->io_buffer
, 0, 0x200);
2251 s
->io_buffer
[0] = 0x01; /* smart struct version */
2252 for (n
=0; n
<30; n
++) {
2253 if (smart_attributes
[n
][0] == 0)
2255 s
->io_buffer
[2+0+(n
*12)] = smart_attributes
[n
][0];
2256 s
->io_buffer
[2+1+(n
*12)] = smart_attributes
[n
][4];
2258 for (n
=0; n
<511; n
++) /* checksum */
2259 s
->io_buffer
[511] += s
->io_buffer
[n
];
2260 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
2261 s
->status
= READY_STAT
| SEEK_STAT
;
2262 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
2263 ide_set_irq(s
->bus
);
2265 case SMART_READ_DATA
:
2266 memset(s
->io_buffer
, 0, 0x200);
2267 s
->io_buffer
[0] = 0x01; /* smart struct version */
2268 for (n
=0; n
<30; n
++) {
2269 if (smart_attributes
[n
][0] == 0)
2271 s
->io_buffer
[2+0+(n
*12)] = smart_attributes
[n
][0];
2272 s
->io_buffer
[2+1+(n
*12)] = smart_attributes
[n
][1];
2273 s
->io_buffer
[2+3+(n
*12)] = smart_attributes
[n
][2];
2274 s
->io_buffer
[2+4+(n
*12)] = smart_attributes
[n
][3];
2276 s
->io_buffer
[362] = 0x02 | (s
->smart_autosave
?0x80:0x00);
2277 if (s
->smart_selftest_count
== 0) {
2278 s
->io_buffer
[363] = 0;
2281 s
->smart_selftest_data
[3 +
2282 (s
->smart_selftest_count
- 1) *
2285 s
->io_buffer
[364] = 0x20;
2286 s
->io_buffer
[365] = 0x01;
2287 /* offline data collection capacity: execute + self-test*/
2288 s
->io_buffer
[367] = (1<<4 | 1<<3 | 1);
2289 s
->io_buffer
[368] = 0x03; /* smart capability (1) */
2290 s
->io_buffer
[369] = 0x00; /* smart capability (2) */
2291 s
->io_buffer
[370] = 0x01; /* error logging supported */
2292 s
->io_buffer
[372] = 0x02; /* minutes for poll short test */
2293 s
->io_buffer
[373] = 0x36; /* minutes for poll ext test */
2294 s
->io_buffer
[374] = 0x01; /* minutes for poll conveyance */
2296 for (n
=0; n
<511; n
++)
2297 s
->io_buffer
[511] += s
->io_buffer
[n
];
2298 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
2299 s
->status
= READY_STAT
| SEEK_STAT
;
2300 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
2301 ide_set_irq(s
->bus
);
2303 case SMART_READ_LOG
:
2304 switch (s
->sector
) {
2305 case 0x01: /* summary smart error log */
2306 memset(s
->io_buffer
, 0, 0x200);
2307 s
->io_buffer
[0] = 0x01;
2308 s
->io_buffer
[1] = 0x00; /* no error entries */
2309 s
->io_buffer
[452] = s
->smart_errors
& 0xff;
2310 s
->io_buffer
[453] = (s
->smart_errors
& 0xff00) >> 8;
2312 for (n
=0; n
<511; n
++)
2313 s
->io_buffer
[511] += s
->io_buffer
[n
];
2314 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
2316 case 0x06: /* smart self test log */
2317 memset(s
->io_buffer
, 0, 0x200);
2318 s
->io_buffer
[0] = 0x01;
2319 if (s
->smart_selftest_count
== 0) {
2320 s
->io_buffer
[508] = 0;
2322 s
->io_buffer
[508] = s
->smart_selftest_count
;
2323 for (n
=2; n
<506; n
++)
2324 s
->io_buffer
[n
] = s
->smart_selftest_data
[n
];
2326 for (n
=0; n
<511; n
++)
2327 s
->io_buffer
[511] += s
->io_buffer
[n
];
2328 s
->io_buffer
[511] = 0x100 - s
->io_buffer
[511];
2333 s
->status
= READY_STAT
| SEEK_STAT
;
2334 ide_transfer_start(s
, s
->io_buffer
, 0x200, ide_transfer_stop
);
2335 ide_set_irq(s
->bus
);
2337 case SMART_EXECUTE_OFFLINE
:
2338 switch (s
->sector
) {
2339 case 0: /* off-line routine */
2340 case 1: /* short self test */
2341 case 2: /* extended self test */
2342 s
->smart_selftest_count
++;
2343 if(s
->smart_selftest_count
> 21)
2344 s
->smart_selftest_count
= 0;
2345 n
= 2 + (s
->smart_selftest_count
- 1) * 24;
2346 s
->smart_selftest_data
[n
] = s
->sector
;
2347 s
->smart_selftest_data
[n
+1] = 0x00; /* OK and finished */
2348 s
->smart_selftest_data
[n
+2] = 0x34; /* hour count lsb */
2349 s
->smart_selftest_data
[n
+3] = 0x12; /* hour count msb */
2350 s
->status
= READY_STAT
| SEEK_STAT
;
2351 ide_set_irq(s
->bus
);
2363 ide_abort_command(s
);
2364 ide_set_irq(s
->bus
);
2369 uint32_t ide_ioport_read(void *opaque
, uint32_t addr1
)
2371 IDEBus
*bus
= opaque
;
2372 IDEState
*s
= idebus_active_if(bus
);
2377 /* FIXME: HOB readback uses bit 7, but it's always set right now */
2378 //hob = s->select & (1 << 7);
2385 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
2386 (s
!= bus
->ifs
&& !s
->bs
))
2391 ret
= s
->hob_feature
;
2394 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
2397 ret
= s
->nsector
& 0xff;
2399 ret
= s
->hob_nsector
;
2402 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
2407 ret
= s
->hob_sector
;
2410 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
2418 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
2426 if (!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
)
2433 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
2434 (s
!= bus
->ifs
&& !s
->bs
))
2438 qemu_irq_lower(bus
->irq
);
2442 printf("ide: read addr=0x%x val=%02x\n", addr1
, ret
);
2447 uint32_t ide_status_read(void *opaque
, uint32_t addr
)
2449 IDEBus
*bus
= opaque
;
2450 IDEState
*s
= idebus_active_if(bus
);
2453 if ((!bus
->ifs
[0].bs
&& !bus
->ifs
[1].bs
) ||
2454 (s
!= bus
->ifs
&& !s
->bs
))
2459 printf("ide: read status addr=0x%x val=%02x\n", addr
, ret
);
2464 void ide_cmd_write(void *opaque
, uint32_t addr
, uint32_t val
)
2466 IDEBus
*bus
= opaque
;
2471 printf("ide: write control addr=0x%x val=%02x\n", addr
, val
);
2473 /* common for both drives */
2474 if (!(bus
->cmd
& IDE_CMD_RESET
) &&
2475 (val
& IDE_CMD_RESET
)) {
2476 /* reset low to high */
2477 for(i
= 0;i
< 2; i
++) {
2479 s
->status
= BUSY_STAT
| SEEK_STAT
;
2482 } else if ((bus
->cmd
& IDE_CMD_RESET
) &&
2483 !(val
& IDE_CMD_RESET
)) {
2485 for(i
= 0;i
< 2; i
++) {
2487 if (s
->drive_kind
== IDE_CD
)
2488 s
->status
= 0x00; /* NOTE: READY is _not_ set */
2490 s
->status
= READY_STAT
| SEEK_STAT
;
2491 ide_set_signature(s
);
2498 void ide_data_writew(void *opaque
, uint32_t addr
, uint32_t val
)
2500 IDEBus
*bus
= opaque
;
2501 IDEState
*s
= idebus_active_if(bus
);
2504 /* PIO data access allowed only when DRQ bit is set */
2505 if (!(s
->status
& DRQ_STAT
))
2509 *(uint16_t *)p
= le16_to_cpu(val
);
2512 if (p
>= s
->data_end
)
2513 s
->end_transfer_func(s
);
2516 uint32_t ide_data_readw(void *opaque
, uint32_t addr
)
2518 IDEBus
*bus
= opaque
;
2519 IDEState
*s
= idebus_active_if(bus
);
2523 /* PIO data access allowed only when DRQ bit is set */
2524 if (!(s
->status
& DRQ_STAT
))
2528 ret
= cpu_to_le16(*(uint16_t *)p
);
2531 if (p
>= s
->data_end
)
2532 s
->end_transfer_func(s
);
2536 void ide_data_writel(void *opaque
, uint32_t addr
, uint32_t val
)
2538 IDEBus
*bus
= opaque
;
2539 IDEState
*s
= idebus_active_if(bus
);
2542 /* PIO data access allowed only when DRQ bit is set */
2543 if (!(s
->status
& DRQ_STAT
))
2547 *(uint32_t *)p
= le32_to_cpu(val
);
2550 if (p
>= s
->data_end
)
2551 s
->end_transfer_func(s
);
2554 uint32_t ide_data_readl(void *opaque
, uint32_t addr
)
2556 IDEBus
*bus
= opaque
;
2557 IDEState
*s
= idebus_active_if(bus
);
2561 /* PIO data access allowed only when DRQ bit is set */
2562 if (!(s
->status
& DRQ_STAT
))
2566 ret
= cpu_to_le32(*(uint32_t *)p
);
2569 if (p
>= s
->data_end
)
2570 s
->end_transfer_func(s
);
2574 static void ide_dummy_transfer_stop(IDEState
*s
)
2576 s
->data_ptr
= s
->io_buffer
;
2577 s
->data_end
= s
->io_buffer
;
2578 s
->io_buffer
[0] = 0xff;
2579 s
->io_buffer
[1] = 0xff;
2580 s
->io_buffer
[2] = 0xff;
2581 s
->io_buffer
[3] = 0xff;
2584 static void ide_reset(IDEState
*s
)
2587 printf("ide: reset\n");
2589 if (s
->drive_kind
== IDE_CFATA
)
2590 s
->mult_sectors
= 0;
2592 s
->mult_sectors
= MAX_MULT_SECTORS
;
2609 s
->status
= READY_STAT
| SEEK_STAT
;
2613 /* ATAPI specific */
2616 s
->cdrom_changed
= 0;
2617 s
->packet_transfer_size
= 0;
2618 s
->elementary_transfer_size
= 0;
2619 s
->io_buffer_index
= 0;
2620 s
->cd_sector_size
= 0;
2623 s
->io_buffer_size
= 0;
2624 s
->req_nb_sectors
= 0;
2626 ide_set_signature(s
);
2627 /* init the transfer handler so that 0xffff is returned on data
2629 s
->end_transfer_func
= ide_dummy_transfer_stop
;
2630 ide_dummy_transfer_stop(s
);
2631 s
->media_changed
= 0;
2634 void ide_bus_reset(IDEBus
*bus
)
2638 ide_reset(&bus
->ifs
[0]);
2639 ide_reset(&bus
->ifs
[1]);
2643 int ide_init_drive(IDEState
*s
, BlockDriverState
*bs
,
2644 const char *version
, const char *serial
)
2646 int cylinders
, heads
, secs
;
2647 uint64_t nb_sectors
;
2650 bdrv_get_geometry(bs
, &nb_sectors
);
2651 bdrv_guess_geometry(bs
, &cylinders
, &heads
, &secs
);
2652 if (cylinders
< 1 || cylinders
> 16383) {
2653 error_report("cyls must be between 1 and 16383");
2656 if (heads
< 1 || heads
> 16) {
2657 error_report("heads must be between 1 and 16");
2660 if (secs
< 1 || secs
> 63) {
2661 error_report("secs must be between 1 and 63");
2664 s
->cylinders
= cylinders
;
2667 s
->nb_sectors
= nb_sectors
;
2668 /* The SMART values should be preserved across power cycles
2670 s
->smart_enabled
= 1;
2671 s
->smart_autosave
= 1;
2672 s
->smart_errors
= 0;
2673 s
->smart_selftest_count
= 0;
2674 if (bdrv_get_type_hint(bs
) == BDRV_TYPE_CDROM
) {
2675 s
->drive_kind
= IDE_CD
;
2676 bdrv_set_change_cb(bs
, cdrom_change_cb
, s
);
2677 bs
->buffer_alignment
= 2048;
2679 if (!bdrv_is_inserted(s
->bs
)) {
2680 error_report("Device needs media, but drive is empty");
2683 if (bdrv_is_read_only(bs
)) {
2684 error_report("Can't use a read-only drive");
2689 strncpy(s
->drive_serial_str
, serial
, sizeof(s
->drive_serial_str
));
2691 snprintf(s
->drive_serial_str
, sizeof(s
->drive_serial_str
),
2692 "QM%05d", s
->drive_serial
);
2695 pstrcpy(s
->version
, sizeof(s
->version
), version
);
2697 pstrcpy(s
->version
, sizeof(s
->version
), QEMU_VERSION
);
2700 bdrv_set_removable(bs
, s
->drive_kind
== IDE_CD
);
2704 static void ide_init1(IDEBus
*bus
, int unit
)
2706 static int drive_serial
= 1;
2707 IDEState
*s
= &bus
->ifs
[unit
];
2711 s
->drive_serial
= drive_serial
++;
2712 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2713 s
->io_buffer
= qemu_memalign(2048, IDE_DMA_BUF_SECTORS
*512 + 4);
2714 s
->io_buffer_total_len
= IDE_DMA_BUF_SECTORS
*512 + 4;
2715 s
->smart_selftest_data
= qemu_blockalign(s
->bs
, 512);
2716 s
->sector_write_timer
= qemu_new_timer(vm_clock
,
2717 ide_sector_write_timer_cb
, s
);
2720 void ide_init2(IDEBus
*bus
, qemu_irq irq
)
2724 for(i
= 0; i
< 2; i
++) {
2726 ide_reset(&bus
->ifs
[i
]);
2731 /* TODO convert users to qdev and remove */
2732 void ide_init2_with_non_qdev_drives(IDEBus
*bus
, DriveInfo
*hd0
,
2733 DriveInfo
*hd1
, qemu_irq irq
)
2738 for(i
= 0; i
< 2; i
++) {
2739 dinfo
= i
== 0 ? hd0
: hd1
;
2742 if (ide_init_drive(&bus
->ifs
[i
], dinfo
->bdrv
, NULL
,
2743 *dinfo
->serial
? dinfo
->serial
: NULL
) < 0) {
2744 error_report("Can't set up IDE drive %s", dinfo
->id
);
2748 ide_reset(&bus
->ifs
[i
]);
2754 void ide_init_ioport(IDEBus
*bus
, int iobase
, int iobase2
)
2756 register_ioport_write(iobase
, 8, 1, ide_ioport_write
, bus
);
2757 register_ioport_read(iobase
, 8, 1, ide_ioport_read
, bus
);
2759 register_ioport_read(iobase2
, 1, 1, ide_status_read
, bus
);
2760 register_ioport_write(iobase2
, 1, 1, ide_cmd_write
, bus
);
2764 register_ioport_write(iobase
, 2, 2, ide_data_writew
, bus
);
2765 register_ioport_read(iobase
, 2, 2, ide_data_readw
, bus
);
2766 register_ioport_write(iobase
, 4, 4, ide_data_writel
, bus
);
2767 register_ioport_read(iobase
, 4, 4, ide_data_readl
, bus
);
2770 static bool is_identify_set(void *opaque
, int version_id
)
2772 IDEState
*s
= opaque
;
2774 return s
->identify_set
!= 0;
2777 static EndTransferFunc
* transfer_end_table
[] = {
2781 ide_atapi_cmd_reply_end
,
2783 ide_dummy_transfer_stop
,
2786 static int transfer_end_table_idx(EndTransferFunc
*fn
)
2790 for (i
= 0; i
< ARRAY_SIZE(transfer_end_table
); i
++)
2791 if (transfer_end_table
[i
] == fn
)
2797 static int ide_drive_post_load(void *opaque
, int version_id
)
2799 IDEState
*s
= opaque
;
2801 if (version_id
< 3) {
2802 if (s
->sense_key
== SENSE_UNIT_ATTENTION
&&
2803 s
->asc
== ASC_MEDIUM_MAY_HAVE_CHANGED
) {
2804 s
->cdrom_changed
= 1;
2810 static int ide_drive_pio_post_load(void *opaque
, int version_id
)
2812 IDEState
*s
= opaque
;
2814 if (s
->end_transfer_fn_idx
> ARRAY_SIZE(transfer_end_table
)) {
2817 s
->end_transfer_func
= transfer_end_table
[s
->end_transfer_fn_idx
];
2818 s
->data_ptr
= s
->io_buffer
+ s
->cur_io_buffer_offset
;
2819 s
->data_end
= s
->data_ptr
+ s
->cur_io_buffer_len
;
2824 static void ide_drive_pio_pre_save(void *opaque
)
2826 IDEState
*s
= opaque
;
2829 s
->cur_io_buffer_offset
= s
->data_ptr
- s
->io_buffer
;
2830 s
->cur_io_buffer_len
= s
->data_end
- s
->data_ptr
;
2832 idx
= transfer_end_table_idx(s
->end_transfer_func
);
2834 fprintf(stderr
, "%s: invalid end_transfer_func for DRQ_STAT\n",
2836 s
->end_transfer_fn_idx
= 2;
2838 s
->end_transfer_fn_idx
= idx
;
2842 static bool ide_drive_pio_state_needed(void *opaque
)
2844 IDEState
*s
= opaque
;
2846 return (s
->status
& DRQ_STAT
) != 0;
2849 const VMStateDescription vmstate_ide_drive_pio_state
= {
2850 .name
= "ide_drive/pio_state",
2852 .minimum_version_id
= 1,
2853 .minimum_version_id_old
= 1,
2854 .pre_save
= ide_drive_pio_pre_save
,
2855 .post_load
= ide_drive_pio_post_load
,
2856 .fields
= (VMStateField
[]) {
2857 VMSTATE_INT32(req_nb_sectors
, IDEState
),
2858 VMSTATE_VARRAY_INT32(io_buffer
, IDEState
, io_buffer_total_len
, 1,
2859 vmstate_info_uint8
, uint8_t),
2860 VMSTATE_INT32(cur_io_buffer_offset
, IDEState
),
2861 VMSTATE_INT32(cur_io_buffer_len
, IDEState
),
2862 VMSTATE_UINT8(end_transfer_fn_idx
, IDEState
),
2863 VMSTATE_INT32(elementary_transfer_size
, IDEState
),
2864 VMSTATE_INT32(packet_transfer_size
, IDEState
),
2865 VMSTATE_END_OF_LIST()
2869 const VMStateDescription vmstate_ide_drive
= {
2870 .name
= "ide_drive",
2872 .minimum_version_id
= 0,
2873 .minimum_version_id_old
= 0,
2874 .post_load
= ide_drive_post_load
,
2875 .fields
= (VMStateField
[]) {
2876 VMSTATE_INT32(mult_sectors
, IDEState
),
2877 VMSTATE_INT32(identify_set
, IDEState
),
2878 VMSTATE_BUFFER_TEST(identify_data
, IDEState
, is_identify_set
),
2879 VMSTATE_UINT8(feature
, IDEState
),
2880 VMSTATE_UINT8(error
, IDEState
),
2881 VMSTATE_UINT32(nsector
, IDEState
),
2882 VMSTATE_UINT8(sector
, IDEState
),
2883 VMSTATE_UINT8(lcyl
, IDEState
),
2884 VMSTATE_UINT8(hcyl
, IDEState
),
2885 VMSTATE_UINT8(hob_feature
, IDEState
),
2886 VMSTATE_UINT8(hob_sector
, IDEState
),
2887 VMSTATE_UINT8(hob_nsector
, IDEState
),
2888 VMSTATE_UINT8(hob_lcyl
, IDEState
),
2889 VMSTATE_UINT8(hob_hcyl
, IDEState
),
2890 VMSTATE_UINT8(select
, IDEState
),
2891 VMSTATE_UINT8(status
, IDEState
),
2892 VMSTATE_UINT8(lba48
, IDEState
),
2893 VMSTATE_UINT8(sense_key
, IDEState
),
2894 VMSTATE_UINT8(asc
, IDEState
),
2895 VMSTATE_UINT8_V(cdrom_changed
, IDEState
, 3),
2896 VMSTATE_END_OF_LIST()
2898 .subsections
= (VMStateSubsection
[]) {
2900 .vmsd
= &vmstate_ide_drive_pio_state
,
2901 .needed
= ide_drive_pio_state_needed
,
2908 const VMStateDescription vmstate_ide_bus
= {
2911 .minimum_version_id
= 1,
2912 .minimum_version_id_old
= 1,
2913 .fields
= (VMStateField
[]) {
2914 VMSTATE_UINT8(cmd
, IDEBus
),
2915 VMSTATE_UINT8(unit
, IDEBus
),
2916 VMSTATE_END_OF_LIST()
2920 /***********************************************************/
2921 /* PCI IDE definitions */
2923 static void ide_dma_start(IDEState
*s
, BlockDriverCompletionFunc
*dma_cb
)
2925 BMDMAState
*bm
= s
->bus
->bmdma
;
2929 bm
->dma_cb
= dma_cb
;
2930 bm
->cur_prd_last
= 0;
2931 bm
->cur_prd_addr
= 0;
2932 bm
->cur_prd_len
= 0;
2933 bm
->sector_num
= ide_get_sector(s
);
2934 bm
->nsector
= s
->nsector
;
2935 if (bm
->status
& BM_STATUS_DMAING
) {
2940 static void ide_dma_restart(IDEState
*s
, int is_read
)
2942 BMDMAState
*bm
= s
->bus
->bmdma
;
2943 ide_set_sector(s
, bm
->sector_num
);
2944 s
->io_buffer_index
= 0;
2945 s
->io_buffer_size
= 0;
2946 s
->nsector
= bm
->nsector
;
2947 bm
->cur_addr
= bm
->addr
;
2950 bm
->dma_cb
= ide_read_dma_cb
;
2952 bm
->dma_cb
= ide_write_dma_cb
;
2955 ide_dma_start(s
, bm
->dma_cb
);
2958 void ide_dma_cancel(BMDMAState
*bm
)
2960 if (bm
->status
& BM_STATUS_DMAING
) {
2963 printf("aio_cancel\n");
2965 bdrv_aio_cancel(bm
->aiocb
);
2968 /* cancel DMA request */
2969 ide_dma_set_inactive(bm
);
2973 void ide_dma_reset(BMDMAState
*bm
)
2976 printf("ide: dma_reset\n");
2983 bm
->cur_prd_last
= 0;
2984 bm
->cur_prd_addr
= 0;
2985 bm
->cur_prd_len
= 0;