1 /* 2 * QEMU IDE disk and CD/DVD-ROM Emulator 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * Copyright (c) 2006 Openedhand Ltd. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal 9 * in the Software without restriction, including without limitation the rights 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 * copies of the Software, and to permit persons to whom the Software is 12 * furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 * THE SOFTWARE. 24 */ 25 #include <hw/hw.h> 26 #include <hw/pc.h> 27 #include <hw/pci.h> 28 #include <hw/scsi.h> 29 #include "qemu-error.h" 30 #include "qemu-timer.h" 31 #include "sysemu.h" 32 #include "dma.h" 33 #include "blockdev.h" 34 35 #include <hw/ide/internal.h> 36 37 /* These values were based on a Seagate ST3500418AS but have been modified 38 to make more sense in QEMU */ 39 static const int smart_attributes[][12] = { 40 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */ 41 /* raw read error rate*/ 42 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06}, 43 /* spin up */ 44 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 45 /* start stop count */ 46 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14}, 47 /* remapped sectors */ 48 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24}, 49 /* power on hours */ 50 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 51 /* power cycle count */ 52 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 53 /* airflow-temperature-celsius */ 54 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32}, 55 /* end of list */ 56 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 57 }; 58 59 /* XXX: DVDs that could fit on a CD will be reported as a CD */ 60 static inline int media_present(IDEState *s) 61 { 62 return (s->nb_sectors > 0); 63 } 64 65 static inline int media_is_dvd(IDEState *s) 66 { 67 return (media_present(s) && s->nb_sectors > CD_MAX_SECTORS); 68 } 69 70 static inline int media_is_cd(IDEState *s) 71 { 72 return (media_present(s) && s->nb_sectors <= CD_MAX_SECTORS); 73 } 74 75 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret); 76 static int ide_handle_rw_error(IDEState *s, int error, int op); 77 78 static void padstr(char *str, const char *src, int len) 79 { 80 int i, v; 81 for(i = 0; i < len; i++) { 82 if (*src) 83 v = *src++; 84 else 85 v = ' '; 86 str[i^1] = v; 87 } 88 } 89 90 static void padstr8(uint8_t *buf, int buf_size, const char *src) 91 { 92 int i; 93 for(i = 0; i < buf_size; i++) { 94 if (*src) 95 buf[i] = *src++; 96 else 97 buf[i] = ' '; 98 } 99 } 100 101 static void put_le16(uint16_t *p, unsigned int v) 102 { 103 *p = cpu_to_le16(v); 104 } 105 106 static void ide_identify(IDEState *s) 107 { 108 uint16_t *p; 109 unsigned int oldsize; 110 IDEDevice *dev; 111 112 if (s->identify_set) { 113 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data)); 114 return; 115 } 116 117 memset(s->io_buffer, 0, 512); 118 p = (uint16_t *)s->io_buffer; 119 put_le16(p + 0, 0x0040); 120 put_le16(p + 1, s->cylinders); 121 put_le16(p + 3, s->heads); 122 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */ 123 put_le16(p + 5, 512); /* XXX: retired, remove ? */ 124 put_le16(p + 6, s->sectors); 125 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */ 126 put_le16(p + 20, 3); /* XXX: retired, remove ? */ 127 put_le16(p + 21, 512); /* cache size in sectors */ 128 put_le16(p + 22, 4); /* ecc bytes */ 129 padstr((char *)(p + 23), s->version, 8); /* firmware version */ 130 padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */ 131 #if MAX_MULT_SECTORS > 1 132 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS); 133 #endif 134 put_le16(p + 48, 1); /* dword I/O */ 135 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */ 136 put_le16(p + 51, 0x200); /* PIO transfer cycle */ 137 put_le16(p + 52, 0x200); /* DMA transfer cycle */ 138 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */ 139 put_le16(p + 54, s->cylinders); 140 put_le16(p + 55, s->heads); 141 put_le16(p + 56, s->sectors); 142 oldsize = s->cylinders * s->heads * s->sectors; 143 put_le16(p + 57, oldsize); 144 put_le16(p + 58, oldsize >> 16); 145 if (s->mult_sectors) 146 put_le16(p + 59, 0x100 | s->mult_sectors); 147 put_le16(p + 60, s->nb_sectors); 148 put_le16(p + 61, s->nb_sectors >> 16); 149 put_le16(p + 62, 0x07); /* single word dma0-2 supported */ 150 put_le16(p + 63, 0x07); /* mdma0-2 supported */ 151 put_le16(p + 64, 0x03); /* pio3-4 supported */ 152 put_le16(p + 65, 120); 153 put_le16(p + 66, 120); 154 put_le16(p + 67, 120); 155 put_le16(p + 68, 120); 156 157 if (s->ncq_queues) { 158 put_le16(p + 75, s->ncq_queues - 1); 159 /* NCQ supported */ 160 put_le16(p + 76, (1 << 8)); 161 } 162 163 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */ 164 put_le16(p + 81, 0x16); /* conforms to ata5 */ 165 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */ 166 put_le16(p + 82, (1 << 14) | (1 << 5) | 1); 167 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */ 168 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10)); 169 /* 14=set to 1, 1=SMART self test, 0=SMART error logging */ 170 put_le16(p + 84, (1 << 14) | 0); 171 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */ 172 if (bdrv_enable_write_cache(s->bs)) 173 put_le16(p + 85, (1 << 14) | (1 << 5) | 1); 174 else 175 put_le16(p + 85, (1 << 14) | 1); 176 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */ 177 put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10)); 178 /* 14=set to 1, 1=smart self test, 0=smart error logging */ 179 put_le16(p + 87, (1 << 14) | 0); 180 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */ 181 put_le16(p + 93, 1 | (1 << 14) | 0x2000); 182 put_le16(p + 100, s->nb_sectors); 183 put_le16(p + 101, s->nb_sectors >> 16); 184 put_le16(p + 102, s->nb_sectors >> 32); 185 put_le16(p + 103, s->nb_sectors >> 48); 186 dev = s->unit ? s->bus->slave : s->bus->master; 187 if (dev && dev->conf.physical_block_size) 188 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf)); 189 190 memcpy(s->identify_data, p, sizeof(s->identify_data)); 191 s->identify_set = 1; 192 } 193 194 static void ide_atapi_identify(IDEState *s) 195 { 196 uint16_t *p; 197 198 if (s->identify_set) { 199 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data)); 200 return; 201 } 202 203 memset(s->io_buffer, 0, 512); 204 p = (uint16_t *)s->io_buffer; 205 /* Removable CDROM, 50us response, 12 byte packets */ 206 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0)); 207 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */ 208 put_le16(p + 20, 3); /* buffer type */ 209 put_le16(p + 21, 512); /* cache size in sectors */ 210 put_le16(p + 22, 4); /* ecc bytes */ 211 padstr((char *)(p + 23), s->version, 8); /* firmware version */ 212 padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */ 213 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */ 214 #ifdef USE_DMA_CDROM 215 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */ 216 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */ 217 put_le16(p + 62, 7); /* single word dma0-2 supported */ 218 put_le16(p + 63, 7); /* mdma0-2 supported */ 219 #else 220 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */ 221 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */ 222 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */ 223 #endif 224 put_le16(p + 64, 3); /* pio3-4 supported */ 225 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */ 226 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */ 227 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */ 228 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */ 229 230 put_le16(p + 71, 30); /* in ns */ 231 put_le16(p + 72, 30); /* in ns */ 232 233 if (s->ncq_queues) { 234 put_le16(p + 75, s->ncq_queues - 1); 235 /* NCQ supported */ 236 put_le16(p + 76, (1 << 8)); 237 } 238 239 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */ 240 #ifdef USE_DMA_CDROM 241 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */ 242 #endif 243 memcpy(s->identify_data, p, sizeof(s->identify_data)); 244 s->identify_set = 1; 245 } 246 247 static void ide_cfata_identify(IDEState *s) 248 { 249 uint16_t *p; 250 uint32_t cur_sec; 251 252 p = (uint16_t *) s->identify_data; 253 if (s->identify_set) 254 goto fill_buffer; 255 256 memset(p, 0, sizeof(s->identify_data)); 257 258 cur_sec = s->cylinders * s->heads * s->sectors; 259 260 put_le16(p + 0, 0x848a); /* CF Storage Card signature */ 261 put_le16(p + 1, s->cylinders); /* Default cylinders */ 262 put_le16(p + 3, s->heads); /* Default heads */ 263 put_le16(p + 6, s->sectors); /* Default sectors per track */ 264 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */ 265 put_le16(p + 8, s->nb_sectors); /* Sectors per card */ 266 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */ 267 put_le16(p + 22, 0x0004); /* ECC bytes */ 268 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */ 269 padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */ 270 #if MAX_MULT_SECTORS > 1 271 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS); 272 #else 273 put_le16(p + 47, 0x0000); 274 #endif 275 put_le16(p + 49, 0x0f00); /* Capabilities */ 276 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */ 277 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */ 278 put_le16(p + 53, 0x0003); /* Translation params valid */ 279 put_le16(p + 54, s->cylinders); /* Current cylinders */ 280 put_le16(p + 55, s->heads); /* Current heads */ 281 put_le16(p + 56, s->sectors); /* Current sectors */ 282 put_le16(p + 57, cur_sec); /* Current capacity */ 283 put_le16(p + 58, cur_sec >> 16); /* Current capacity */ 284 if (s->mult_sectors) /* Multiple sector setting */ 285 put_le16(p + 59, 0x100 | s->mult_sectors); 286 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */ 287 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */ 288 put_le16(p + 63, 0x0203); /* Multiword DMA capability */ 289 put_le16(p + 64, 0x0001); /* Flow Control PIO support */ 290 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */ 291 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */ 292 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */ 293 put_le16(p + 82, 0x400c); /* Command Set supported */ 294 put_le16(p + 83, 0x7068); /* Command Set supported */ 295 put_le16(p + 84, 0x4000); /* Features supported */ 296 put_le16(p + 85, 0x000c); /* Command Set enabled */ 297 put_le16(p + 86, 0x7044); /* Command Set enabled */ 298 put_le16(p + 87, 0x4000); /* Features enabled */ 299 put_le16(p + 91, 0x4060); /* Current APM level */ 300 put_le16(p + 129, 0x0002); /* Current features option */ 301 put_le16(p + 130, 0x0005); /* Reassigned sectors */ 302 put_le16(p + 131, 0x0001); /* Initial power mode */ 303 put_le16(p + 132, 0x0000); /* User signature */ 304 put_le16(p + 160, 0x8100); /* Power requirement */ 305 put_le16(p + 161, 0x8001); /* CF command set */ 306 307 s->identify_set = 1; 308 309 fill_buffer: 310 memcpy(s->io_buffer, p, sizeof(s->identify_data)); 311 } 312 313 static void ide_set_signature(IDEState *s) 314 { 315 s->select &= 0xf0; /* clear head */ 316 /* put signature */ 317 s->nsector = 1; 318 s->sector = 1; 319 if (s->drive_kind == IDE_CD) { 320 s->lcyl = 0x14; 321 s->hcyl = 0xeb; 322 } else if (s->bs) { 323 s->lcyl = 0; 324 s->hcyl = 0; 325 } else { 326 s->lcyl = 0xff; 327 s->hcyl = 0xff; 328 } 329 } 330 331 static inline void ide_abort_command(IDEState *s) 332 { 333 s->status = READY_STAT | ERR_STAT; 334 s->error = ABRT_ERR; 335 } 336 337 /* prepare data transfer and tell what to do after */ 338 static void ide_transfer_start(IDEState *s, uint8_t *buf, int size, 339 EndTransferFunc *end_transfer_func) 340 { 341 s->end_transfer_func = end_transfer_func; 342 s->data_ptr = buf; 343 s->data_end = buf + size; 344 if (!(s->status & ERR_STAT)) { 345 s->status |= DRQ_STAT; 346 } 347 s->bus->dma->ops->start_transfer(s->bus->dma); 348 } 349 350 static void ide_transfer_stop(IDEState *s) 351 { 352 s->end_transfer_func = ide_transfer_stop; 353 s->data_ptr = s->io_buffer; 354 s->data_end = s->io_buffer; 355 s->status &= ~DRQ_STAT; 356 } 357 358 int64_t ide_get_sector(IDEState *s) 359 { 360 int64_t sector_num; 361 if (s->select & 0x40) { 362 /* lba */ 363 if (!s->lba48) { 364 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) | 365 (s->lcyl << 8) | s->sector; 366 } else { 367 sector_num = ((int64_t)s->hob_hcyl << 40) | 368 ((int64_t) s->hob_lcyl << 32) | 369 ((int64_t) s->hob_sector << 24) | 370 ((int64_t) s->hcyl << 16) | 371 ((int64_t) s->lcyl << 8) | s->sector; 372 } 373 } else { 374 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors + 375 (s->select & 0x0f) * s->sectors + (s->sector - 1); 376 } 377 return sector_num; 378 } 379 380 void ide_set_sector(IDEState *s, int64_t sector_num) 381 { 382 unsigned int cyl, r; 383 if (s->select & 0x40) { 384 if (!s->lba48) { 385 s->select = (s->select & 0xf0) | (sector_num >> 24); 386 s->hcyl = (sector_num >> 16); 387 s->lcyl = (sector_num >> 8); 388 s->sector = (sector_num); 389 } else { 390 s->sector = sector_num; 391 s->lcyl = sector_num >> 8; 392 s->hcyl = sector_num >> 16; 393 s->hob_sector = sector_num >> 24; 394 s->hob_lcyl = sector_num >> 32; 395 s->hob_hcyl = sector_num >> 40; 396 } 397 } else { 398 cyl = sector_num / (s->heads * s->sectors); 399 r = sector_num % (s->heads * s->sectors); 400 s->hcyl = cyl >> 8; 401 s->lcyl = cyl; 402 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f); 403 s->sector = (r % s->sectors) + 1; 404 } 405 } 406 407 static void ide_rw_error(IDEState *s) { 408 ide_abort_command(s); 409 ide_set_irq(s->bus); 410 } 411 412 void ide_sector_read(IDEState *s) 413 { 414 int64_t sector_num; 415 int ret, n; 416 417 s->status = READY_STAT | SEEK_STAT; 418 s->error = 0; /* not needed by IDE spec, but needed by Windows */ 419 sector_num = ide_get_sector(s); 420 n = s->nsector; 421 if (n == 0) { 422 /* no more sector to read from disk */ 423 ide_transfer_stop(s); 424 } else { 425 #if defined(DEBUG_IDE) 426 printf("read sector=%" PRId64 "\n", sector_num); 427 #endif 428 if (n > s->req_nb_sectors) 429 n = s->req_nb_sectors; 430 ret = bdrv_read(s->bs, sector_num, s->io_buffer, n); 431 if (ret != 0) { 432 if (ide_handle_rw_error(s, -ret, 433 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ)) 434 { 435 return; 436 } 437 } 438 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read); 439 ide_set_irq(s->bus); 440 ide_set_sector(s, sector_num + n); 441 s->nsector -= n; 442 } 443 } 444 445 static void dma_buf_commit(IDEState *s, int is_write) 446 { 447 qemu_sglist_destroy(&s->sg); 448 } 449 450 static void ide_set_inactive(IDEState *s) 451 { 452 s->bus->dma->aiocb = NULL; 453 s->bus->dma->ops->set_inactive(s->bus->dma); 454 } 455 456 void ide_dma_error(IDEState *s) 457 { 458 ide_transfer_stop(s); 459 s->error = ABRT_ERR; 460 s->status = READY_STAT | ERR_STAT; 461 ide_set_inactive(s); 462 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); 463 ide_set_irq(s->bus); 464 } 465 466 static int ide_handle_rw_error(IDEState *s, int error, int op) 467 { 468 int is_read = (op & BM_STATUS_RETRY_READ); 469 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read); 470 471 if (action == BLOCK_ERR_IGNORE) { 472 bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read); 473 return 0; 474 } 475 476 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC) 477 || action == BLOCK_ERR_STOP_ANY) { 478 s->bus->dma->ops->set_unit(s->bus->dma, s->unit); 479 s->bus->dma->ops->add_status(s->bus->dma, op); 480 bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read); 481 vm_stop(VMSTOP_DISKFULL); 482 } else { 483 if (op & BM_STATUS_DMA_RETRY) { 484 dma_buf_commit(s, 0); 485 ide_dma_error(s); 486 } else { 487 ide_rw_error(s); 488 } 489 bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read); 490 } 491 492 return 1; 493 } 494 495 void ide_dma_cb(void *opaque, int ret) 496 { 497 IDEState *s = opaque; 498 int n; 499 int64_t sector_num; 500 501 handle_rw_error: 502 if (ret < 0) { 503 int op = BM_STATUS_DMA_RETRY; 504 505 if (s->is_read) 506 op |= BM_STATUS_RETRY_READ; 507 if (ide_handle_rw_error(s, -ret, op)) { 508 return; 509 } 510 } 511 512 n = s->io_buffer_size >> 9; 513 sector_num = ide_get_sector(s); 514 if (n > 0) { 515 dma_buf_commit(s, s->is_read); 516 sector_num += n; 517 ide_set_sector(s, sector_num); 518 s->nsector -= n; 519 } 520 521 /* end of transfer ? */ 522 if (s->nsector == 0) { 523 s->status = READY_STAT | SEEK_STAT; 524 ide_set_irq(s->bus); 525 goto eot; 526 } 527 528 /* launch next transfer */ 529 n = s->nsector; 530 s->io_buffer_index = 0; 531 s->io_buffer_size = n * 512; 532 if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0) 533 goto eot; 534 535 #ifdef DEBUG_AIO 536 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, is_read=%d\n", 537 sector_num, n, s->is_read); 538 #endif 539 540 if (s->is_read) { 541 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, 542 ide_dma_cb, s); 543 } else { 544 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, 545 ide_dma_cb, s); 546 } 547 548 if (!s->bus->dma->aiocb) { 549 ret = -1; 550 goto handle_rw_error; 551 } 552 return; 553 554 eot: 555 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); 556 ide_set_inactive(s); 557 } 558 559 static void ide_sector_start_dma(IDEState *s, int is_read) 560 { 561 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; 562 s->io_buffer_index = 0; 563 s->io_buffer_size = 0; 564 s->is_read = is_read; 565 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb); 566 } 567 568 static void ide_sector_write_timer_cb(void *opaque) 569 { 570 IDEState *s = opaque; 571 ide_set_irq(s->bus); 572 } 573 574 void ide_sector_write(IDEState *s) 575 { 576 int64_t sector_num; 577 int ret, n, n1; 578 579 s->status = READY_STAT | SEEK_STAT; 580 sector_num = ide_get_sector(s); 581 #if defined(DEBUG_IDE) 582 printf("write sector=%" PRId64 "\n", sector_num); 583 #endif 584 n = s->nsector; 585 if (n > s->req_nb_sectors) 586 n = s->req_nb_sectors; 587 ret = bdrv_write(s->bs, sector_num, s->io_buffer, n); 588 589 if (ret != 0) { 590 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY)) 591 return; 592 } 593 594 s->nsector -= n; 595 if (s->nsector == 0) { 596 /* no more sectors to write */ 597 ide_transfer_stop(s); 598 } else { 599 n1 = s->nsector; 600 if (n1 > s->req_nb_sectors) 601 n1 = s->req_nb_sectors; 602 ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write); 603 } 604 ide_set_sector(s, sector_num + n); 605 606 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { 607 /* It seems there is a bug in the Windows 2000 installer HDD 608 IDE driver which fills the disk with empty logs when the 609 IDE write IRQ comes too early. This hack tries to correct 610 that at the expense of slower write performances. Use this 611 option _only_ to install Windows 2000. You must disable it 612 for normal use. */ 613 qemu_mod_timer(s->sector_write_timer, 614 qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000)); 615 } else { 616 ide_set_irq(s->bus); 617 } 618 } 619 620 void ide_atapi_cmd_ok(IDEState *s) 621 { 622 s->error = 0; 623 s->status = READY_STAT | SEEK_STAT; 624 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 625 ide_set_irq(s->bus); 626 } 627 628 void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc) 629 { 630 #ifdef DEBUG_IDE_ATAPI 631 printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc); 632 #endif 633 s->error = sense_key << 4; 634 s->status = READY_STAT | ERR_STAT; 635 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 636 s->sense_key = sense_key; 637 s->asc = asc; 638 ide_set_irq(s->bus); 639 } 640 641 static void ide_atapi_cmd_check_status(IDEState *s) 642 { 643 #ifdef DEBUG_IDE_ATAPI 644 printf("atapi_cmd_check_status\n"); 645 #endif 646 s->error = MC_ERR | (SENSE_UNIT_ATTENTION << 4); 647 s->status = ERR_STAT; 648 s->nsector = 0; 649 ide_set_irq(s->bus); 650 } 651 652 static void ide_flush_cb(void *opaque, int ret) 653 { 654 IDEState *s = opaque; 655 656 if (ret < 0) { 657 /* XXX: What sector number to set here? */ 658 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) { 659 return; 660 } 661 } 662 663 s->status = READY_STAT | SEEK_STAT; 664 ide_set_irq(s->bus); 665 } 666 667 void ide_flush_cache(IDEState *s) 668 { 669 BlockDriverAIOCB *acb; 670 671 if (s->bs == NULL) { 672 ide_flush_cb(s, 0); 673 return; 674 } 675 676 acb = bdrv_aio_flush(s->bs, ide_flush_cb, s); 677 if (acb == NULL) { 678 ide_flush_cb(s, -EIO); 679 } 680 } 681 682 static inline void cpu_to_ube16(uint8_t *buf, int val) 683 { 684 buf[0] = val >> 8; 685 buf[1] = val & 0xff; 686 } 687 688 static inline void cpu_to_ube32(uint8_t *buf, unsigned int val) 689 { 690 buf[0] = val >> 24; 691 buf[1] = val >> 16; 692 buf[2] = val >> 8; 693 buf[3] = val & 0xff; 694 } 695 696 static inline int ube16_to_cpu(const uint8_t *buf) 697 { 698 return (buf[0] << 8) | buf[1]; 699 } 700 701 static inline int ube32_to_cpu(const uint8_t *buf) 702 { 703 return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; 704 } 705 706 static void lba_to_msf(uint8_t *buf, int lba) 707 { 708 lba += 150; 709 buf[0] = (lba / 75) / 60; 710 buf[1] = (lba / 75) % 60; 711 buf[2] = lba % 75; 712 } 713 714 static void cd_data_to_raw(uint8_t *buf, int lba) 715 { 716 /* sync bytes */ 717 buf[0] = 0x00; 718 memset(buf + 1, 0xff, 10); 719 buf[11] = 0x00; 720 buf += 12; 721 /* MSF */ 722 lba_to_msf(buf, lba); 723 buf[3] = 0x01; /* mode 1 data */ 724 buf += 4; 725 /* data */ 726 buf += 2048; 727 /* XXX: ECC not computed */ 728 memset(buf, 0, 288); 729 } 730 731 static int cd_read_sector(BlockDriverState *bs, int lba, uint8_t *buf, 732 int sector_size) 733 { 734 int ret; 735 736 switch(sector_size) { 737 case 2048: 738 ret = bdrv_read(bs, (int64_t)lba << 2, buf, 4); 739 break; 740 case 2352: 741 ret = bdrv_read(bs, (int64_t)lba << 2, buf + 16, 4); 742 if (ret < 0) 743 return ret; 744 cd_data_to_raw(buf, lba); 745 break; 746 default: 747 ret = -EIO; 748 break; 749 } 750 return ret; 751 } 752 753 void ide_atapi_io_error(IDEState *s, int ret) 754 { 755 /* XXX: handle more errors */ 756 if (ret == -ENOMEDIUM) { 757 ide_atapi_cmd_error(s, SENSE_NOT_READY, 758 ASC_MEDIUM_NOT_PRESENT); 759 } else { 760 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 761 ASC_LOGICAL_BLOCK_OOR); 762 } 763 } 764 765 /* The whole ATAPI transfer logic is handled in this function */ 766 static void ide_atapi_cmd_reply_end(IDEState *s) 767 { 768 int byte_count_limit, size, ret; 769 #ifdef DEBUG_IDE_ATAPI 770 printf("reply: tx_size=%d elem_tx_size=%d index=%d\n", 771 s->packet_transfer_size, 772 s->elementary_transfer_size, 773 s->io_buffer_index); 774 #endif 775 if (s->packet_transfer_size <= 0) { 776 /* end of transfer */ 777 ide_transfer_stop(s); 778 s->status = READY_STAT | SEEK_STAT; 779 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 780 ide_set_irq(s->bus); 781 #ifdef DEBUG_IDE_ATAPI 782 printf("status=0x%x\n", s->status); 783 #endif 784 } else { 785 /* see if a new sector must be read */ 786 if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) { 787 ret = cd_read_sector(s->bs, s->lba, s->io_buffer, s->cd_sector_size); 788 if (ret < 0) { 789 ide_transfer_stop(s); 790 ide_atapi_io_error(s, ret); 791 return; 792 } 793 s->lba++; 794 s->io_buffer_index = 0; 795 } 796 if (s->elementary_transfer_size > 0) { 797 /* there are some data left to transmit in this elementary 798 transfer */ 799 size = s->cd_sector_size - s->io_buffer_index; 800 if (size > s->elementary_transfer_size) 801 size = s->elementary_transfer_size; 802 s->packet_transfer_size -= size; 803 s->elementary_transfer_size -= size; 804 s->io_buffer_index += size; 805 ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size, 806 size, ide_atapi_cmd_reply_end); 807 } else { 808 /* a new transfer is needed */ 809 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO; 810 byte_count_limit = s->lcyl | (s->hcyl << 8); 811 #ifdef DEBUG_IDE_ATAPI 812 printf("byte_count_limit=%d\n", byte_count_limit); 813 #endif 814 if (byte_count_limit == 0xffff) 815 byte_count_limit--; 816 size = s->packet_transfer_size; 817 if (size > byte_count_limit) { 818 /* byte count limit must be even if this case */ 819 if (byte_count_limit & 1) 820 byte_count_limit--; 821 size = byte_count_limit; 822 } 823 s->lcyl = size; 824 s->hcyl = size >> 8; 825 s->elementary_transfer_size = size; 826 /* we cannot transmit more than one sector at a time */ 827 if (s->lba != -1) { 828 if (size > (s->cd_sector_size - s->io_buffer_index)) 829 size = (s->cd_sector_size - s->io_buffer_index); 830 } 831 s->packet_transfer_size -= size; 832 s->elementary_transfer_size -= size; 833 s->io_buffer_index += size; 834 ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size, 835 size, ide_atapi_cmd_reply_end); 836 ide_set_irq(s->bus); 837 #ifdef DEBUG_IDE_ATAPI 838 printf("status=0x%x\n", s->status); 839 #endif 840 } 841 } 842 } 843 844 /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */ 845 static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size) 846 { 847 if (size > max_size) 848 size = max_size; 849 s->lba = -1; /* no sector read */ 850 s->packet_transfer_size = size; 851 s->io_buffer_size = size; /* dma: send the reply data as one chunk */ 852 s->elementary_transfer_size = 0; 853 s->io_buffer_index = 0; 854 855 if (s->atapi_dma) { 856 s->status = READY_STAT | SEEK_STAT | DRQ_STAT; 857 s->bus->dma->ops->start_dma(s->bus->dma, s, 858 ide_atapi_cmd_read_dma_cb); 859 } else { 860 s->status = READY_STAT | SEEK_STAT; 861 ide_atapi_cmd_reply_end(s); 862 } 863 } 864 865 /* start a CD-CDROM read command */ 866 static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors, 867 int sector_size) 868 { 869 s->lba = lba; 870 s->packet_transfer_size = nb_sectors * sector_size; 871 s->elementary_transfer_size = 0; 872 s->io_buffer_index = sector_size; 873 s->cd_sector_size = sector_size; 874 875 s->status = READY_STAT | SEEK_STAT; 876 ide_atapi_cmd_reply_end(s); 877 } 878 879 /* ATAPI DMA support */ 880 881 /* XXX: handle read errors */ 882 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) 883 { 884 IDEState *s = opaque; 885 int data_offset, n; 886 887 if (ret < 0) { 888 ide_atapi_io_error(s, ret); 889 goto eot; 890 } 891 892 if (s->io_buffer_size > 0) { 893 /* 894 * For a cdrom read sector command (s->lba != -1), 895 * adjust the lba for the next s->io_buffer_size chunk 896 * and dma the current chunk. 897 * For a command != read (s->lba == -1), just transfer 898 * the reply data. 899 */ 900 if (s->lba != -1) { 901 if (s->cd_sector_size == 2352) { 902 n = 1; 903 cd_data_to_raw(s->io_buffer, s->lba); 904 } else { 905 n = s->io_buffer_size >> 11; 906 } 907 s->lba += n; 908 } 909 s->packet_transfer_size -= s->io_buffer_size; 910 if (s->bus->dma->ops->rw_buf(s->bus->dma, 1) == 0) 911 goto eot; 912 } 913 914 if (s->packet_transfer_size <= 0) { 915 s->status = READY_STAT | SEEK_STAT; 916 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 917 ide_set_irq(s->bus); 918 eot: 919 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT); 920 ide_set_inactive(s); 921 return; 922 } 923 924 s->io_buffer_index = 0; 925 if (s->cd_sector_size == 2352) { 926 n = 1; 927 s->io_buffer_size = s->cd_sector_size; 928 data_offset = 16; 929 } else { 930 n = s->packet_transfer_size >> 11; 931 if (n > (IDE_DMA_BUF_SECTORS / 4)) 932 n = (IDE_DMA_BUF_SECTORS / 4); 933 s->io_buffer_size = n * 2048; 934 data_offset = 0; 935 } 936 #ifdef DEBUG_AIO 937 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n); 938 #endif 939 s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset); 940 s->bus->dma->iov.iov_len = n * 4 * 512; 941 qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1); 942 s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, 943 &s->bus->dma->qiov, n * 4, 944 ide_atapi_cmd_read_dma_cb, s); 945 if (!s->bus->dma->aiocb) { 946 /* Note: media not present is the most likely case */ 947 ide_atapi_cmd_error(s, SENSE_NOT_READY, 948 ASC_MEDIUM_NOT_PRESENT); 949 goto eot; 950 } 951 } 952 953 /* start a CD-CDROM read command with DMA */ 954 /* XXX: test if DMA is available */ 955 static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors, 956 int sector_size) 957 { 958 s->lba = lba; 959 s->packet_transfer_size = nb_sectors * sector_size; 960 s->io_buffer_index = 0; 961 s->io_buffer_size = 0; 962 s->cd_sector_size = sector_size; 963 964 /* XXX: check if BUSY_STAT should be set */ 965 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; 966 s->bus->dma->ops->start_dma(s->bus->dma, s, 967 ide_atapi_cmd_read_dma_cb); 968 } 969 970 static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors, 971 int sector_size) 972 { 973 #ifdef DEBUG_IDE_ATAPI 974 printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio", 975 lba, nb_sectors); 976 #endif 977 if (s->atapi_dma) { 978 ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size); 979 } else { 980 ide_atapi_cmd_read_pio(s, lba, nb_sectors, sector_size); 981 } 982 } 983 984 static inline uint8_t ide_atapi_set_profile(uint8_t *buf, uint8_t *index, 985 uint16_t profile) 986 { 987 uint8_t *buf_profile = buf + 12; /* start of profiles */ 988 989 buf_profile += ((*index) * 4); /* start of indexed profile */ 990 cpu_to_ube16 (buf_profile, profile); 991 buf_profile[2] = ((buf_profile[0] == buf[6]) && (buf_profile[1] == buf[7])); 992 993 /* each profile adds 4 bytes to the response */ 994 (*index)++; 995 buf[11] += 4; /* Additional Length */ 996 997 return 4; 998 } 999 1000 static int ide_dvd_read_structure(IDEState *s, int format, 1001 const uint8_t *packet, uint8_t *buf) 1002 { 1003 switch (format) { 1004 case 0x0: /* Physical format information */ 1005 { 1006 int layer = packet[6]; 1007 uint64_t total_sectors; 1008 1009 if (layer != 0) 1010 return -ASC_INV_FIELD_IN_CMD_PACKET; 1011 1012 bdrv_get_geometry(s->bs, &total_sectors); 1013 total_sectors >>= 2; 1014 if (total_sectors == 0) 1015 return -ASC_MEDIUM_NOT_PRESENT; 1016 1017 buf[4] = 1; /* DVD-ROM, part version 1 */ 1018 buf[5] = 0xf; /* 120mm disc, minimum rate unspecified */ 1019 buf[6] = 1; /* one layer, read-only (per MMC-2 spec) */ 1020 buf[7] = 0; /* default densities */ 1021 1022 /* FIXME: 0x30000 per spec? */ 1023 cpu_to_ube32(buf + 8, 0); /* start sector */ 1024 cpu_to_ube32(buf + 12, total_sectors - 1); /* end sector */ 1025 cpu_to_ube32(buf + 16, total_sectors - 1); /* l0 end sector */ 1026 1027 /* Size of buffer, not including 2 byte size field */ 1028 cpu_to_be16wu((uint16_t *)buf, 2048 + 2); 1029 1030 /* 2k data + 4 byte header */ 1031 return (2048 + 4); 1032 } 1033 1034 case 0x01: /* DVD copyright information */ 1035 buf[4] = 0; /* no copyright data */ 1036 buf[5] = 0; /* no region restrictions */ 1037 1038 /* Size of buffer, not including 2 byte size field */ 1039 cpu_to_be16wu((uint16_t *)buf, 4 + 2); 1040 1041 /* 4 byte header + 4 byte data */ 1042 return (4 + 4); 1043 1044 case 0x03: /* BCA information - invalid field for no BCA info */ 1045 return -ASC_INV_FIELD_IN_CMD_PACKET; 1046 1047 case 0x04: /* DVD disc manufacturing information */ 1048 /* Size of buffer, not including 2 byte size field */ 1049 cpu_to_be16wu((uint16_t *)buf, 2048 + 2); 1050 1051 /* 2k data + 4 byte header */ 1052 return (2048 + 4); 1053 1054 case 0xff: 1055 /* 1056 * This lists all the command capabilities above. Add new ones 1057 * in order and update the length and buffer return values. 1058 */ 1059 1060 buf[4] = 0x00; /* Physical format */ 1061 buf[5] = 0x40; /* Not writable, is readable */ 1062 cpu_to_be16wu((uint16_t *)(buf + 6), 2048 + 4); 1063 1064 buf[8] = 0x01; /* Copyright info */ 1065 buf[9] = 0x40; /* Not writable, is readable */ 1066 cpu_to_be16wu((uint16_t *)(buf + 10), 4 + 4); 1067 1068 buf[12] = 0x03; /* BCA info */ 1069 buf[13] = 0x40; /* Not writable, is readable */ 1070 cpu_to_be16wu((uint16_t *)(buf + 14), 188 + 4); 1071 1072 buf[16] = 0x04; /* Manufacturing info */ 1073 buf[17] = 0x40; /* Not writable, is readable */ 1074 cpu_to_be16wu((uint16_t *)(buf + 18), 2048 + 4); 1075 1076 /* Size of buffer, not including 2 byte size field */ 1077 cpu_to_be16wu((uint16_t *)buf, 16 + 2); 1078 1079 /* data written + 4 byte header */ 1080 return (16 + 4); 1081 1082 default: /* TODO: formats beyond DVD-ROM requires */ 1083 return -ASC_INV_FIELD_IN_CMD_PACKET; 1084 } 1085 } 1086 1087 static void ide_atapi_cmd(IDEState *s) 1088 { 1089 const uint8_t *packet; 1090 uint8_t *buf; 1091 int max_len; 1092 1093 packet = s->io_buffer; 1094 buf = s->io_buffer; 1095 #ifdef DEBUG_IDE_ATAPI 1096 { 1097 int i; 1098 printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8)); 1099 for(i = 0; i < ATAPI_PACKET_SIZE; i++) { 1100 printf(" %02x", packet[i]); 1101 } 1102 printf("\n"); 1103 } 1104 #endif 1105 /* If there's a UNIT_ATTENTION condition pending, only 1106 REQUEST_SENSE and INQUIRY commands are allowed to complete. */ 1107 if (s->sense_key == SENSE_UNIT_ATTENTION && 1108 s->io_buffer[0] != GPCMD_REQUEST_SENSE && 1109 s->io_buffer[0] != GPCMD_INQUIRY) { 1110 ide_atapi_cmd_check_status(s); 1111 return; 1112 } 1113 switch(s->io_buffer[0]) { 1114 case GPCMD_TEST_UNIT_READY: 1115 if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) { 1116 ide_atapi_cmd_ok(s); 1117 } else { 1118 s->cdrom_changed = 0; 1119 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1120 ASC_MEDIUM_NOT_PRESENT); 1121 } 1122 break; 1123 case GPCMD_MODE_SENSE_6: 1124 case GPCMD_MODE_SENSE_10: 1125 { 1126 int action, code; 1127 if (packet[0] == GPCMD_MODE_SENSE_10) 1128 max_len = ube16_to_cpu(packet + 7); 1129 else 1130 max_len = packet[4]; 1131 action = packet[2] >> 6; 1132 code = packet[2] & 0x3f; 1133 switch(action) { 1134 case 0: /* current values */ 1135 switch(code) { 1136 case GPMODE_R_W_ERROR_PAGE: /* error recovery */ 1137 cpu_to_ube16(&buf[0], 16 + 6); 1138 buf[2] = 0x70; 1139 buf[3] = 0; 1140 buf[4] = 0; 1141 buf[5] = 0; 1142 buf[6] = 0; 1143 buf[7] = 0; 1144 1145 buf[8] = 0x01; 1146 buf[9] = 0x06; 1147 buf[10] = 0x00; 1148 buf[11] = 0x05; 1149 buf[12] = 0x00; 1150 buf[13] = 0x00; 1151 buf[14] = 0x00; 1152 buf[15] = 0x00; 1153 ide_atapi_cmd_reply(s, 16, max_len); 1154 break; 1155 case GPMODE_AUDIO_CTL_PAGE: 1156 cpu_to_ube16(&buf[0], 24 + 6); 1157 buf[2] = 0x70; 1158 buf[3] = 0; 1159 buf[4] = 0; 1160 buf[5] = 0; 1161 buf[6] = 0; 1162 buf[7] = 0; 1163 1164 /* Fill with CDROM audio volume */ 1165 buf[17] = 0; 1166 buf[19] = 0; 1167 buf[21] = 0; 1168 buf[23] = 0; 1169 1170 ide_atapi_cmd_reply(s, 24, max_len); 1171 break; 1172 case GPMODE_CAPABILITIES_PAGE: 1173 cpu_to_ube16(&buf[0], 28 + 6); 1174 buf[2] = 0x70; 1175 buf[3] = 0; 1176 buf[4] = 0; 1177 buf[5] = 0; 1178 buf[6] = 0; 1179 buf[7] = 0; 1180 1181 buf[8] = 0x2a; 1182 buf[9] = 0x12; 1183 buf[10] = 0x00; 1184 buf[11] = 0x00; 1185 1186 /* Claim PLAY_AUDIO capability (0x01) since some Linux 1187 code checks for this to automount media. */ 1188 buf[12] = 0x71; 1189 buf[13] = 3 << 5; 1190 buf[14] = (1 << 0) | (1 << 3) | (1 << 5); 1191 if (bdrv_is_locked(s->bs)) 1192 buf[6] |= 1 << 1; 1193 buf[15] = 0x00; 1194 cpu_to_ube16(&buf[16], 706); 1195 buf[18] = 0; 1196 buf[19] = 2; 1197 cpu_to_ube16(&buf[20], 512); 1198 cpu_to_ube16(&buf[22], 706); 1199 buf[24] = 0; 1200 buf[25] = 0; 1201 buf[26] = 0; 1202 buf[27] = 0; 1203 ide_atapi_cmd_reply(s, 28, max_len); 1204 break; 1205 default: 1206 goto error_cmd; 1207 } 1208 break; 1209 case 1: /* changeable values */ 1210 goto error_cmd; 1211 case 2: /* default values */ 1212 goto error_cmd; 1213 default: 1214 case 3: /* saved values */ 1215 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1216 ASC_SAVING_PARAMETERS_NOT_SUPPORTED); 1217 break; 1218 } 1219 } 1220 break; 1221 case GPCMD_REQUEST_SENSE: 1222 max_len = packet[4]; 1223 memset(buf, 0, 18); 1224 buf[0] = 0x70 | (1 << 7); 1225 buf[2] = s->sense_key; 1226 buf[7] = 10; 1227 buf[12] = s->asc; 1228 if (s->sense_key == SENSE_UNIT_ATTENTION) 1229 s->sense_key = SENSE_NONE; 1230 ide_atapi_cmd_reply(s, 18, max_len); 1231 break; 1232 case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL: 1233 if (bdrv_is_inserted(s->bs)) { 1234 bdrv_set_locked(s->bs, packet[4] & 1); 1235 ide_atapi_cmd_ok(s); 1236 } else { 1237 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1238 ASC_MEDIUM_NOT_PRESENT); 1239 } 1240 break; 1241 case GPCMD_READ_10: 1242 case GPCMD_READ_12: 1243 { 1244 int nb_sectors, lba; 1245 1246 if (packet[0] == GPCMD_READ_10) 1247 nb_sectors = ube16_to_cpu(packet + 7); 1248 else 1249 nb_sectors = ube32_to_cpu(packet + 6); 1250 lba = ube32_to_cpu(packet + 2); 1251 if (nb_sectors == 0) { 1252 ide_atapi_cmd_ok(s); 1253 break; 1254 } 1255 ide_atapi_cmd_read(s, lba, nb_sectors, 2048); 1256 } 1257 break; 1258 case GPCMD_READ_CD: 1259 { 1260 int nb_sectors, lba, transfer_request; 1261 1262 nb_sectors = (packet[6] << 16) | (packet[7] << 8) | packet[8]; 1263 lba = ube32_to_cpu(packet + 2); 1264 if (nb_sectors == 0) { 1265 ide_atapi_cmd_ok(s); 1266 break; 1267 } 1268 transfer_request = packet[9]; 1269 switch(transfer_request & 0xf8) { 1270 case 0x00: 1271 /* nothing */ 1272 ide_atapi_cmd_ok(s); 1273 break; 1274 case 0x10: 1275 /* normal read */ 1276 ide_atapi_cmd_read(s, lba, nb_sectors, 2048); 1277 break; 1278 case 0xf8: 1279 /* read all data */ 1280 ide_atapi_cmd_read(s, lba, nb_sectors, 2352); 1281 break; 1282 default: 1283 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1284 ASC_INV_FIELD_IN_CMD_PACKET); 1285 break; 1286 } 1287 } 1288 break; 1289 case GPCMD_SEEK: 1290 { 1291 unsigned int lba; 1292 uint64_t total_sectors; 1293 1294 bdrv_get_geometry(s->bs, &total_sectors); 1295 total_sectors >>= 2; 1296 if (total_sectors == 0) { 1297 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1298 ASC_MEDIUM_NOT_PRESENT); 1299 break; 1300 } 1301 lba = ube32_to_cpu(packet + 2); 1302 if (lba >= total_sectors) { 1303 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1304 ASC_LOGICAL_BLOCK_OOR); 1305 break; 1306 } 1307 ide_atapi_cmd_ok(s); 1308 } 1309 break; 1310 case GPCMD_START_STOP_UNIT: 1311 { 1312 int start, eject, err = 0; 1313 start = packet[4] & 1; 1314 eject = (packet[4] >> 1) & 1; 1315 1316 if (eject) { 1317 err = bdrv_eject(s->bs, !start); 1318 } 1319 1320 switch (err) { 1321 case 0: 1322 ide_atapi_cmd_ok(s); 1323 break; 1324 case -EBUSY: 1325 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1326 ASC_MEDIA_REMOVAL_PREVENTED); 1327 break; 1328 default: 1329 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1330 ASC_MEDIUM_NOT_PRESENT); 1331 break; 1332 } 1333 } 1334 break; 1335 case GPCMD_MECHANISM_STATUS: 1336 { 1337 max_len = ube16_to_cpu(packet + 8); 1338 cpu_to_ube16(buf, 0); 1339 /* no current LBA */ 1340 buf[2] = 0; 1341 buf[3] = 0; 1342 buf[4] = 0; 1343 buf[5] = 1; 1344 cpu_to_ube16(buf + 6, 0); 1345 ide_atapi_cmd_reply(s, 8, max_len); 1346 } 1347 break; 1348 case GPCMD_READ_TOC_PMA_ATIP: 1349 { 1350 int format, msf, start_track, len; 1351 uint64_t total_sectors; 1352 1353 bdrv_get_geometry(s->bs, &total_sectors); 1354 total_sectors >>= 2; 1355 if (total_sectors == 0) { 1356 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1357 ASC_MEDIUM_NOT_PRESENT); 1358 break; 1359 } 1360 max_len = ube16_to_cpu(packet + 7); 1361 format = packet[9] >> 6; 1362 msf = (packet[1] >> 1) & 1; 1363 start_track = packet[6]; 1364 switch(format) { 1365 case 0: 1366 len = cdrom_read_toc(total_sectors, buf, msf, start_track); 1367 if (len < 0) 1368 goto error_cmd; 1369 ide_atapi_cmd_reply(s, len, max_len); 1370 break; 1371 case 1: 1372 /* multi session : only a single session defined */ 1373 memset(buf, 0, 12); 1374 buf[1] = 0x0a; 1375 buf[2] = 0x01; 1376 buf[3] = 0x01; 1377 ide_atapi_cmd_reply(s, 12, max_len); 1378 break; 1379 case 2: 1380 len = cdrom_read_toc_raw(total_sectors, buf, msf, start_track); 1381 if (len < 0) 1382 goto error_cmd; 1383 ide_atapi_cmd_reply(s, len, max_len); 1384 break; 1385 default: 1386 error_cmd: 1387 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1388 ASC_INV_FIELD_IN_CMD_PACKET); 1389 break; 1390 } 1391 } 1392 break; 1393 case GPCMD_READ_CDVD_CAPACITY: 1394 { 1395 uint64_t total_sectors; 1396 1397 bdrv_get_geometry(s->bs, &total_sectors); 1398 total_sectors >>= 2; 1399 if (total_sectors == 0) { 1400 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1401 ASC_MEDIUM_NOT_PRESENT); 1402 break; 1403 } 1404 /* NOTE: it is really the number of sectors minus 1 */ 1405 cpu_to_ube32(buf, total_sectors - 1); 1406 cpu_to_ube32(buf + 4, 2048); 1407 ide_atapi_cmd_reply(s, 8, 8); 1408 } 1409 break; 1410 case GPCMD_READ_DVD_STRUCTURE: 1411 { 1412 int media = packet[1]; 1413 int format = packet[7]; 1414 int ret; 1415 1416 max_len = ube16_to_cpu(packet + 8); 1417 1418 if (format < 0xff) { 1419 if (media_is_cd(s)) { 1420 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1421 ASC_INCOMPATIBLE_FORMAT); 1422 break; 1423 } else if (!media_present(s)) { 1424 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1425 ASC_INV_FIELD_IN_CMD_PACKET); 1426 break; 1427 } 1428 } 1429 1430 memset(buf, 0, max_len > IDE_DMA_BUF_SECTORS * 512 + 4 ? 1431 IDE_DMA_BUF_SECTORS * 512 + 4 : max_len); 1432 1433 switch (format) { 1434 case 0x00 ... 0x7f: 1435 case 0xff: 1436 if (media == 0) { 1437 ret = ide_dvd_read_structure(s, format, packet, buf); 1438 1439 if (ret < 0) 1440 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, -ret); 1441 else 1442 ide_atapi_cmd_reply(s, ret, max_len); 1443 1444 break; 1445 } 1446 /* TODO: BD support, fall through for now */ 1447 1448 /* Generic disk structures */ 1449 case 0x80: /* TODO: AACS volume identifier */ 1450 case 0x81: /* TODO: AACS media serial number */ 1451 case 0x82: /* TODO: AACS media identifier */ 1452 case 0x83: /* TODO: AACS media key block */ 1453 case 0x90: /* TODO: List of recognized format layers */ 1454 case 0xc0: /* TODO: Write protection status */ 1455 default: 1456 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1457 ASC_INV_FIELD_IN_CMD_PACKET); 1458 break; 1459 } 1460 } 1461 break; 1462 case GPCMD_SET_SPEED: 1463 ide_atapi_cmd_ok(s); 1464 break; 1465 case GPCMD_INQUIRY: 1466 max_len = packet[4]; 1467 buf[0] = 0x05; /* CD-ROM */ 1468 buf[1] = 0x80; /* removable */ 1469 buf[2] = 0x00; /* ISO */ 1470 buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */ 1471 buf[4] = 31; /* additional length */ 1472 buf[5] = 0; /* reserved */ 1473 buf[6] = 0; /* reserved */ 1474 buf[7] = 0; /* reserved */ 1475 padstr8(buf + 8, 8, "QEMU"); 1476 padstr8(buf + 16, 16, "QEMU DVD-ROM"); 1477 padstr8(buf + 32, 4, s->version); 1478 ide_atapi_cmd_reply(s, 36, max_len); 1479 break; 1480 case GPCMD_GET_CONFIGURATION: 1481 { 1482 uint32_t len; 1483 uint8_t index = 0; 1484 1485 /* only feature 0 is supported */ 1486 if (packet[2] != 0 || packet[3] != 0) { 1487 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1488 ASC_INV_FIELD_IN_CMD_PACKET); 1489 break; 1490 } 1491 1492 /* XXX: could result in alignment problems in some architectures */ 1493 max_len = ube16_to_cpu(packet + 7); 1494 1495 /* 1496 * XXX: avoid overflow for io_buffer if max_len is bigger than 1497 * the size of that buffer (dimensioned to max number of 1498 * sectors to transfer at once) 1499 * 1500 * Only a problem if the feature/profiles grow. 1501 */ 1502 if (max_len > 512) /* XXX: assume 1 sector */ 1503 max_len = 512; 1504 1505 memset(buf, 0, max_len); 1506 /* 1507 * the number of sectors from the media tells us which profile 1508 * to use as current. 0 means there is no media 1509 */ 1510 if (media_is_dvd(s)) 1511 cpu_to_ube16(buf + 6, MMC_PROFILE_DVD_ROM); 1512 else if (media_is_cd(s)) 1513 cpu_to_ube16(buf + 6, MMC_PROFILE_CD_ROM); 1514 1515 buf[10] = 0x02 | 0x01; /* persistent and current */ 1516 len = 12; /* headers: 8 + 4 */ 1517 len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_DVD_ROM); 1518 len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_CD_ROM); 1519 cpu_to_ube32(buf, len - 4); /* data length */ 1520 1521 ide_atapi_cmd_reply(s, len, max_len); 1522 break; 1523 } 1524 case GPCMD_GET_EVENT_STATUS_NOTIFICATION: 1525 max_len = ube16_to_cpu(packet + 7); 1526 1527 if (packet[1] & 0x01) { /* polling */ 1528 /* We don't support any event class (yet). */ 1529 cpu_to_ube16(buf, 0x00); /* No event descriptor returned */ 1530 buf[2] = 0x80; /* No Event Available (NEA) */ 1531 buf[3] = 0x00; /* Empty supported event classes */ 1532 ide_atapi_cmd_reply(s, 4, max_len); 1533 } else { /* asynchronous mode */ 1534 /* Only polling is supported, asynchronous mode is not. */ 1535 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1536 ASC_INV_FIELD_IN_CMD_PACKET); 1537 } 1538 break; 1539 default: 1540 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, 1541 ASC_ILLEGAL_OPCODE); 1542 break; 1543 } 1544 } 1545 1546 static void ide_cfata_metadata_inquiry(IDEState *s) 1547 { 1548 uint16_t *p; 1549 uint32_t spd; 1550 1551 p = (uint16_t *) s->io_buffer; 1552 memset(p, 0, 0x200); 1553 spd = ((s->mdata_size - 1) >> 9) + 1; 1554 1555 put_le16(p + 0, 0x0001); /* Data format revision */ 1556 put_le16(p + 1, 0x0000); /* Media property: silicon */ 1557 put_le16(p + 2, s->media_changed); /* Media status */ 1558 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */ 1559 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */ 1560 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */ 1561 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */ 1562 } 1563 1564 static void ide_cfata_metadata_read(IDEState *s) 1565 { 1566 uint16_t *p; 1567 1568 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) { 1569 s->status = ERR_STAT; 1570 s->error = ABRT_ERR; 1571 return; 1572 } 1573 1574 p = (uint16_t *) s->io_buffer; 1575 memset(p, 0, 0x200); 1576 1577 put_le16(p + 0, s->media_changed); /* Media status */ 1578 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9), 1579 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9), 1580 s->nsector << 9), 0x200 - 2)); 1581 } 1582 1583 static void ide_cfata_metadata_write(IDEState *s) 1584 { 1585 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) { 1586 s->status = ERR_STAT; 1587 s->error = ABRT_ERR; 1588 return; 1589 } 1590 1591 s->media_changed = 0; 1592 1593 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9), 1594 s->io_buffer + 2, 1595 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9), 1596 s->nsector << 9), 0x200 - 2)); 1597 } 1598 1599 /* called when the inserted state of the media has changed */ 1600 static void cdrom_change_cb(void *opaque, int reason) 1601 { 1602 IDEState *s = opaque; 1603 uint64_t nb_sectors; 1604 1605 if (!(reason & CHANGE_MEDIA)) { 1606 return; 1607 } 1608 1609 bdrv_get_geometry(s->bs, &nb_sectors); 1610 s->nb_sectors = nb_sectors; 1611 1612 s->sense_key = SENSE_UNIT_ATTENTION; 1613 s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED; 1614 s->cdrom_changed = 1; 1615 ide_set_irq(s->bus); 1616 } 1617 1618 static void ide_cmd_lba48_transform(IDEState *s, int lba48) 1619 { 1620 s->lba48 = lba48; 1621 1622 /* handle the 'magic' 0 nsector count conversion here. to avoid 1623 * fiddling with the rest of the read logic, we just store the 1624 * full sector count in ->nsector and ignore ->hob_nsector from now 1625 */ 1626 if (!s->lba48) { 1627 if (!s->nsector) 1628 s->nsector = 256; 1629 } else { 1630 if (!s->nsector && !s->hob_nsector) 1631 s->nsector = 65536; 1632 else { 1633 int lo = s->nsector; 1634 int hi = s->hob_nsector; 1635 1636 s->nsector = (hi << 8) | lo; 1637 } 1638 } 1639 } 1640 1641 static void ide_clear_hob(IDEBus *bus) 1642 { 1643 /* any write clears HOB high bit of device control register */ 1644 bus->ifs[0].select &= ~(1 << 7); 1645 bus->ifs[1].select &= ~(1 << 7); 1646 } 1647 1648 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) 1649 { 1650 IDEBus *bus = opaque; 1651 1652 #ifdef DEBUG_IDE 1653 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val); 1654 #endif 1655 1656 addr &= 7; 1657 1658 /* ignore writes to command block while busy with previous command */ 1659 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT))) 1660 return; 1661 1662 switch(addr) { 1663 case 0: 1664 break; 1665 case 1: 1666 ide_clear_hob(bus); 1667 /* NOTE: data is written to the two drives */ 1668 bus->ifs[0].hob_feature = bus->ifs[0].feature; 1669 bus->ifs[1].hob_feature = bus->ifs[1].feature; 1670 bus->ifs[0].feature = val; 1671 bus->ifs[1].feature = val; 1672 break; 1673 case 2: 1674 ide_clear_hob(bus); 1675 bus->ifs[0].hob_nsector = bus->ifs[0].nsector; 1676 bus->ifs[1].hob_nsector = bus->ifs[1].nsector; 1677 bus->ifs[0].nsector = val; 1678 bus->ifs[1].nsector = val; 1679 break; 1680 case 3: 1681 ide_clear_hob(bus); 1682 bus->ifs[0].hob_sector = bus->ifs[0].sector; 1683 bus->ifs[1].hob_sector = bus->ifs[1].sector; 1684 bus->ifs[0].sector = val; 1685 bus->ifs[1].sector = val; 1686 break; 1687 case 4: 1688 ide_clear_hob(bus); 1689 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl; 1690 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl; 1691 bus->ifs[0].lcyl = val; 1692 bus->ifs[1].lcyl = val; 1693 break; 1694 case 5: 1695 ide_clear_hob(bus); 1696 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl; 1697 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl; 1698 bus->ifs[0].hcyl = val; 1699 bus->ifs[1].hcyl = val; 1700 break; 1701 case 6: 1702 /* FIXME: HOB readback uses bit 7 */ 1703 bus->ifs[0].select = (val & ~0x10) | 0xa0; 1704 bus->ifs[1].select = (val | 0x10) | 0xa0; 1705 /* select drive */ 1706 bus->unit = (val >> 4) & 1; 1707 break; 1708 default: 1709 case 7: 1710 /* command */ 1711 ide_exec_cmd(bus, val); 1712 break; 1713 } 1714 } 1715 1716 1717 void ide_exec_cmd(IDEBus *bus, uint32_t val) 1718 { 1719 IDEState *s; 1720 int n; 1721 int lba48 = 0; 1722 1723 #if defined(DEBUG_IDE) 1724 printf("ide: CMD=%02x\n", val); 1725 #endif 1726 s = idebus_active_if(bus); 1727 /* ignore commands to non existant slave */ 1728 if (s != bus->ifs && !s->bs) 1729 return; 1730 1731 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */ 1732 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET) 1733 return; 1734 1735 switch(val) { 1736 case WIN_IDENTIFY: 1737 if (s->bs && s->drive_kind != IDE_CD) { 1738 if (s->drive_kind != IDE_CFATA) 1739 ide_identify(s); 1740 else 1741 ide_cfata_identify(s); 1742 s->status = READY_STAT | SEEK_STAT; 1743 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop); 1744 } else { 1745 if (s->drive_kind == IDE_CD) { 1746 ide_set_signature(s); 1747 } 1748 ide_abort_command(s); 1749 } 1750 ide_set_irq(s->bus); 1751 break; 1752 case WIN_SPECIFY: 1753 case WIN_RECAL: 1754 s->error = 0; 1755 s->status = READY_STAT | SEEK_STAT; 1756 ide_set_irq(s->bus); 1757 break; 1758 case WIN_SETMULT: 1759 if (s->drive_kind == IDE_CFATA && s->nsector == 0) { 1760 /* Disable Read and Write Multiple */ 1761 s->mult_sectors = 0; 1762 s->status = READY_STAT | SEEK_STAT; 1763 } else if ((s->nsector & 0xff) != 0 && 1764 ((s->nsector & 0xff) > MAX_MULT_SECTORS || 1765 (s->nsector & (s->nsector - 1)) != 0)) { 1766 ide_abort_command(s); 1767 } else { 1768 s->mult_sectors = s->nsector & 0xff; 1769 s->status = READY_STAT | SEEK_STAT; 1770 } 1771 ide_set_irq(s->bus); 1772 break; 1773 case WIN_VERIFY_EXT: 1774 lba48 = 1; 1775 case WIN_VERIFY: 1776 case WIN_VERIFY_ONCE: 1777 /* do sector number check ? */ 1778 ide_cmd_lba48_transform(s, lba48); 1779 s->status = READY_STAT | SEEK_STAT; 1780 ide_set_irq(s->bus); 1781 break; 1782 case WIN_READ_EXT: 1783 lba48 = 1; 1784 case WIN_READ: 1785 case WIN_READ_ONCE: 1786 if (!s->bs) 1787 goto abort_cmd; 1788 ide_cmd_lba48_transform(s, lba48); 1789 s->req_nb_sectors = 1; 1790 ide_sector_read(s); 1791 break; 1792 case WIN_WRITE_EXT: 1793 lba48 = 1; 1794 case WIN_WRITE: 1795 case WIN_WRITE_ONCE: 1796 case CFA_WRITE_SECT_WO_ERASE: 1797 case WIN_WRITE_VERIFY: 1798 ide_cmd_lba48_transform(s, lba48); 1799 s->error = 0; 1800 s->status = SEEK_STAT | READY_STAT; 1801 s->req_nb_sectors = 1; 1802 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write); 1803 s->media_changed = 1; 1804 break; 1805 case WIN_MULTREAD_EXT: 1806 lba48 = 1; 1807 case WIN_MULTREAD: 1808 if (!s->mult_sectors) 1809 goto abort_cmd; 1810 ide_cmd_lba48_transform(s, lba48); 1811 s->req_nb_sectors = s->mult_sectors; 1812 ide_sector_read(s); 1813 break; 1814 case WIN_MULTWRITE_EXT: 1815 lba48 = 1; 1816 case WIN_MULTWRITE: 1817 case CFA_WRITE_MULTI_WO_ERASE: 1818 if (!s->mult_sectors) 1819 goto abort_cmd; 1820 ide_cmd_lba48_transform(s, lba48); 1821 s->error = 0; 1822 s->status = SEEK_STAT | READY_STAT; 1823 s->req_nb_sectors = s->mult_sectors; 1824 n = s->nsector; 1825 if (n > s->req_nb_sectors) 1826 n = s->req_nb_sectors; 1827 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write); 1828 s->media_changed = 1; 1829 break; 1830 case WIN_READDMA_EXT: 1831 lba48 = 1; 1832 case WIN_READDMA: 1833 case WIN_READDMA_ONCE: 1834 if (!s->bs) 1835 goto abort_cmd; 1836 ide_cmd_lba48_transform(s, lba48); 1837 ide_sector_start_dma(s, 1); 1838 break; 1839 case WIN_WRITEDMA_EXT: 1840 lba48 = 1; 1841 case WIN_WRITEDMA: 1842 case WIN_WRITEDMA_ONCE: 1843 if (!s->bs) 1844 goto abort_cmd; 1845 ide_cmd_lba48_transform(s, lba48); 1846 ide_sector_start_dma(s, 0); 1847 s->media_changed = 1; 1848 break; 1849 case WIN_READ_NATIVE_MAX_EXT: 1850 lba48 = 1; 1851 case WIN_READ_NATIVE_MAX: 1852 ide_cmd_lba48_transform(s, lba48); 1853 ide_set_sector(s, s->nb_sectors - 1); 1854 s->status = READY_STAT | SEEK_STAT; 1855 ide_set_irq(s->bus); 1856 break; 1857 case WIN_CHECKPOWERMODE1: 1858 case WIN_CHECKPOWERMODE2: 1859 s->error = 0; 1860 s->nsector = 0xff; /* device active or idle */ 1861 s->status = READY_STAT | SEEK_STAT; 1862 ide_set_irq(s->bus); 1863 break; 1864 case WIN_SETFEATURES: 1865 if (!s->bs) 1866 goto abort_cmd; 1867 /* XXX: valid for CDROM ? */ 1868 switch(s->feature) { 1869 case 0xcc: /* reverting to power-on defaults enable */ 1870 case 0x66: /* reverting to power-on defaults disable */ 1871 case 0x02: /* write cache enable */ 1872 case 0x82: /* write cache disable */ 1873 case 0xaa: /* read look-ahead enable */ 1874 case 0x55: /* read look-ahead disable */ 1875 case 0x05: /* set advanced power management mode */ 1876 case 0x85: /* disable advanced power management mode */ 1877 case 0x69: /* NOP */ 1878 case 0x67: /* NOP */ 1879 case 0x96: /* NOP */ 1880 case 0x9a: /* NOP */ 1881 case 0x42: /* enable Automatic Acoustic Mode */ 1882 case 0xc2: /* disable Automatic Acoustic Mode */ 1883 s->status = READY_STAT | SEEK_STAT; 1884 ide_set_irq(s->bus); 1885 break; 1886 case 0x03: { /* set transfer mode */ 1887 uint8_t val = s->nsector & 0x07; 1888 uint16_t *identify_data = (uint16_t *)s->identify_data; 1889 1890 switch (s->nsector >> 3) { 1891 case 0x00: /* pio default */ 1892 case 0x01: /* pio mode */ 1893 put_le16(identify_data + 62,0x07); 1894 put_le16(identify_data + 63,0x07); 1895 put_le16(identify_data + 88,0x3f); 1896 break; 1897 case 0x02: /* sigle word dma mode*/ 1898 put_le16(identify_data + 62,0x07 | (1 << (val + 8))); 1899 put_le16(identify_data + 63,0x07); 1900 put_le16(identify_data + 88,0x3f); 1901 break; 1902 case 0x04: /* mdma mode */ 1903 put_le16(identify_data + 62,0x07); 1904 put_le16(identify_data + 63,0x07 | (1 << (val + 8))); 1905 put_le16(identify_data + 88,0x3f); 1906 break; 1907 case 0x08: /* udma mode */ 1908 put_le16(identify_data + 62,0x07); 1909 put_le16(identify_data + 63,0x07); 1910 put_le16(identify_data + 88,0x3f | (1 << (val + 8))); 1911 break; 1912 default: 1913 goto abort_cmd; 1914 } 1915 s->status = READY_STAT | SEEK_STAT; 1916 ide_set_irq(s->bus); 1917 break; 1918 } 1919 default: 1920 goto abort_cmd; 1921 } 1922 break; 1923 case WIN_FLUSH_CACHE: 1924 case WIN_FLUSH_CACHE_EXT: 1925 ide_flush_cache(s); 1926 break; 1927 case WIN_STANDBY: 1928 case WIN_STANDBY2: 1929 case WIN_STANDBYNOW1: 1930 case WIN_STANDBYNOW2: 1931 case WIN_IDLEIMMEDIATE: 1932 case CFA_IDLEIMMEDIATE: 1933 case WIN_SETIDLE1: 1934 case WIN_SETIDLE2: 1935 case WIN_SLEEPNOW1: 1936 case WIN_SLEEPNOW2: 1937 s->status = READY_STAT; 1938 ide_set_irq(s->bus); 1939 break; 1940 case WIN_SEEK: 1941 if(s->drive_kind == IDE_CD) 1942 goto abort_cmd; 1943 /* XXX: Check that seek is within bounds */ 1944 s->status = READY_STAT | SEEK_STAT; 1945 ide_set_irq(s->bus); 1946 break; 1947 /* ATAPI commands */ 1948 case WIN_PIDENTIFY: 1949 if (s->drive_kind == IDE_CD) { 1950 ide_atapi_identify(s); 1951 s->status = READY_STAT | SEEK_STAT; 1952 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop); 1953 } else { 1954 ide_abort_command(s); 1955 } 1956 ide_set_irq(s->bus); 1957 break; 1958 case WIN_DIAGNOSE: 1959 ide_set_signature(s); 1960 if (s->drive_kind == IDE_CD) 1961 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet 1962 * devices to return a clear status register 1963 * with READY_STAT *not* set. */ 1964 else 1965 s->status = READY_STAT | SEEK_STAT; 1966 s->error = 0x01; /* Device 0 passed, Device 1 passed or not 1967 * present. 1968 */ 1969 ide_set_irq(s->bus); 1970 break; 1971 case WIN_SRST: 1972 if (s->drive_kind != IDE_CD) 1973 goto abort_cmd; 1974 ide_set_signature(s); 1975 s->status = 0x00; /* NOTE: READY is _not_ set */ 1976 s->error = 0x01; 1977 break; 1978 case WIN_PACKETCMD: 1979 if (s->drive_kind != IDE_CD) 1980 goto abort_cmd; 1981 /* overlapping commands not supported */ 1982 if (s->feature & 0x02) 1983 goto abort_cmd; 1984 s->status = READY_STAT | SEEK_STAT; 1985 s->atapi_dma = s->feature & 1; 1986 s->nsector = 1; 1987 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE, 1988 ide_atapi_cmd); 1989 break; 1990 /* CF-ATA commands */ 1991 case CFA_REQ_EXT_ERROR_CODE: 1992 if (s->drive_kind != IDE_CFATA) 1993 goto abort_cmd; 1994 s->error = 0x09; /* miscellaneous error */ 1995 s->status = READY_STAT | SEEK_STAT; 1996 ide_set_irq(s->bus); 1997 break; 1998 case CFA_ERASE_SECTORS: 1999 case CFA_WEAR_LEVEL: 2000 if (s->drive_kind != IDE_CFATA) 2001 goto abort_cmd; 2002 if (val == CFA_WEAR_LEVEL) 2003 s->nsector = 0; 2004 if (val == CFA_ERASE_SECTORS) 2005 s->media_changed = 1; 2006 s->error = 0x00; 2007 s->status = READY_STAT | SEEK_STAT; 2008 ide_set_irq(s->bus); 2009 break; 2010 case CFA_TRANSLATE_SECTOR: 2011 if (s->drive_kind != IDE_CFATA) 2012 goto abort_cmd; 2013 s->error = 0x00; 2014 s->status = READY_STAT | SEEK_STAT; 2015 memset(s->io_buffer, 0, 0x200); 2016 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */ 2017 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */ 2018 s->io_buffer[0x02] = s->select; /* Head */ 2019 s->io_buffer[0x03] = s->sector; /* Sector */ 2020 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */ 2021 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */ 2022 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */ 2023 s->io_buffer[0x13] = 0x00; /* Erase flag */ 2024 s->io_buffer[0x18] = 0x00; /* Hot count */ 2025 s->io_buffer[0x19] = 0x00; /* Hot count */ 2026 s->io_buffer[0x1a] = 0x01; /* Hot count */ 2027 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); 2028 ide_set_irq(s->bus); 2029 break; 2030 case CFA_ACCESS_METADATA_STORAGE: 2031 if (s->drive_kind != IDE_CFATA) 2032 goto abort_cmd; 2033 switch (s->feature) { 2034 case 0x02: /* Inquiry Metadata Storage */ 2035 ide_cfata_metadata_inquiry(s); 2036 break; 2037 case 0x03: /* Read Metadata Storage */ 2038 ide_cfata_metadata_read(s); 2039 break; 2040 case 0x04: /* Write Metadata Storage */ 2041 ide_cfata_metadata_write(s); 2042 break; 2043 default: 2044 goto abort_cmd; 2045 } 2046 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); 2047 s->status = 0x00; /* NOTE: READY is _not_ set */ 2048 ide_set_irq(s->bus); 2049 break; 2050 case IBM_SENSE_CONDITION: 2051 if (s->drive_kind != IDE_CFATA) 2052 goto abort_cmd; 2053 switch (s->feature) { 2054 case 0x01: /* sense temperature in device */ 2055 s->nsector = 0x50; /* +20 C */ 2056 break; 2057 default: 2058 goto abort_cmd; 2059 } 2060 s->status = READY_STAT | SEEK_STAT; 2061 ide_set_irq(s->bus); 2062 break; 2063 2064 case WIN_SMART: 2065 if (s->drive_kind == IDE_CD) 2066 goto abort_cmd; 2067 if (s->hcyl != 0xc2 || s->lcyl != 0x4f) 2068 goto abort_cmd; 2069 if (!s->smart_enabled && s->feature != SMART_ENABLE) 2070 goto abort_cmd; 2071 switch (s->feature) { 2072 case SMART_DISABLE: 2073 s->smart_enabled = 0; 2074 s->status = READY_STAT | SEEK_STAT; 2075 ide_set_irq(s->bus); 2076 break; 2077 case SMART_ENABLE: 2078 s->smart_enabled = 1; 2079 s->status = READY_STAT | SEEK_STAT; 2080 ide_set_irq(s->bus); 2081 break; 2082 case SMART_ATTR_AUTOSAVE: 2083 switch (s->sector) { 2084 case 0x00: 2085 s->smart_autosave = 0; 2086 break; 2087 case 0xf1: 2088 s->smart_autosave = 1; 2089 break; 2090 default: 2091 goto abort_cmd; 2092 } 2093 s->status = READY_STAT | SEEK_STAT; 2094 ide_set_irq(s->bus); 2095 break; 2096 case SMART_STATUS: 2097 if (!s->smart_errors) { 2098 s->hcyl = 0xc2; 2099 s->lcyl = 0x4f; 2100 } else { 2101 s->hcyl = 0x2c; 2102 s->lcyl = 0xf4; 2103 } 2104 s->status = READY_STAT | SEEK_STAT; 2105 ide_set_irq(s->bus); 2106 break; 2107 case SMART_READ_THRESH: 2108 memset(s->io_buffer, 0, 0x200); 2109 s->io_buffer[0] = 0x01; /* smart struct version */ 2110 for (n=0; n<30; n++) { 2111 if (smart_attributes[n][0] == 0) 2112 break; 2113 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0]; 2114 s->io_buffer[2+1+(n*12)] = smart_attributes[n][11]; 2115 } 2116 for (n=0; n<511; n++) /* checksum */ 2117 s->io_buffer[511] += s->io_buffer[n]; 2118 s->io_buffer[511] = 0x100 - s->io_buffer[511]; 2119 s->status = READY_STAT | SEEK_STAT; 2120 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); 2121 ide_set_irq(s->bus); 2122 break; 2123 case SMART_READ_DATA: 2124 memset(s->io_buffer, 0, 0x200); 2125 s->io_buffer[0] = 0x01; /* smart struct version */ 2126 for (n=0; n<30; n++) { 2127 if (smart_attributes[n][0] == 0) { 2128 break; 2129 } 2130 int i; 2131 for(i = 0; i < 11; i++) { 2132 s->io_buffer[2+i+(n*12)] = smart_attributes[n][i]; 2133 } 2134 } 2135 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00); 2136 if (s->smart_selftest_count == 0) { 2137 s->io_buffer[363] = 0; 2138 } else { 2139 s->io_buffer[363] = 2140 s->smart_selftest_data[3 + 2141 (s->smart_selftest_count - 1) * 2142 24]; 2143 } 2144 s->io_buffer[364] = 0x20; 2145 s->io_buffer[365] = 0x01; 2146 /* offline data collection capacity: execute + self-test*/ 2147 s->io_buffer[367] = (1<<4 | 1<<3 | 1); 2148 s->io_buffer[368] = 0x03; /* smart capability (1) */ 2149 s->io_buffer[369] = 0x00; /* smart capability (2) */ 2150 s->io_buffer[370] = 0x01; /* error logging supported */ 2151 s->io_buffer[372] = 0x02; /* minutes for poll short test */ 2152 s->io_buffer[373] = 0x36; /* minutes for poll ext test */ 2153 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */ 2154 2155 for (n=0; n<511; n++) 2156 s->io_buffer[511] += s->io_buffer[n]; 2157 s->io_buffer[511] = 0x100 - s->io_buffer[511]; 2158 s->status = READY_STAT | SEEK_STAT; 2159 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); 2160 ide_set_irq(s->bus); 2161 break; 2162 case SMART_READ_LOG: 2163 switch (s->sector) { 2164 case 0x01: /* summary smart error log */ 2165 memset(s->io_buffer, 0, 0x200); 2166 s->io_buffer[0] = 0x01; 2167 s->io_buffer[1] = 0x00; /* no error entries */ 2168 s->io_buffer[452] = s->smart_errors & 0xff; 2169 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8; 2170 2171 for (n=0; n<511; n++) 2172 s->io_buffer[511] += s->io_buffer[n]; 2173 s->io_buffer[511] = 0x100 - s->io_buffer[511]; 2174 break; 2175 case 0x06: /* smart self test log */ 2176 memset(s->io_buffer, 0, 0x200); 2177 s->io_buffer[0] = 0x01; 2178 if (s->smart_selftest_count == 0) { 2179 s->io_buffer[508] = 0; 2180 } else { 2181 s->io_buffer[508] = s->smart_selftest_count; 2182 for (n=2; n<506; n++) 2183 s->io_buffer[n] = s->smart_selftest_data[n]; 2184 } 2185 for (n=0; n<511; n++) 2186 s->io_buffer[511] += s->io_buffer[n]; 2187 s->io_buffer[511] = 0x100 - s->io_buffer[511]; 2188 break; 2189 default: 2190 goto abort_cmd; 2191 } 2192 s->status = READY_STAT | SEEK_STAT; 2193 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); 2194 ide_set_irq(s->bus); 2195 break; 2196 case SMART_EXECUTE_OFFLINE: 2197 switch (s->sector) { 2198 case 0: /* off-line routine */ 2199 case 1: /* short self test */ 2200 case 2: /* extended self test */ 2201 s->smart_selftest_count++; 2202 if(s->smart_selftest_count > 21) 2203 s->smart_selftest_count = 0; 2204 n = 2 + (s->smart_selftest_count - 1) * 24; 2205 s->smart_selftest_data[n] = s->sector; 2206 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */ 2207 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */ 2208 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */ 2209 s->status = READY_STAT | SEEK_STAT; 2210 ide_set_irq(s->bus); 2211 break; 2212 default: 2213 goto abort_cmd; 2214 } 2215 break; 2216 default: 2217 goto abort_cmd; 2218 } 2219 break; 2220 default: 2221 abort_cmd: 2222 ide_abort_command(s); 2223 ide_set_irq(s->bus); 2224 break; 2225 } 2226 } 2227 2228 uint32_t ide_ioport_read(void *opaque, uint32_t addr1) 2229 { 2230 IDEBus *bus = opaque; 2231 IDEState *s = idebus_active_if(bus); 2232 uint32_t addr; 2233 int ret, hob; 2234 2235 addr = addr1 & 7; 2236 /* FIXME: HOB readback uses bit 7, but it's always set right now */ 2237 //hob = s->select & (1 << 7); 2238 hob = 0; 2239 switch(addr) { 2240 case 0: 2241 ret = 0xff; 2242 break; 2243 case 1: 2244 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) || 2245 (s != bus->ifs && !s->bs)) 2246 ret = 0; 2247 else if (!hob) 2248 ret = s->error; 2249 else 2250 ret = s->hob_feature; 2251 break; 2252 case 2: 2253 if (!bus->ifs[0].bs && !bus->ifs[1].bs) 2254 ret = 0; 2255 else if (!hob) 2256 ret = s->nsector & 0xff; 2257 else 2258 ret = s->hob_nsector; 2259 break; 2260 case 3: 2261 if (!bus->ifs[0].bs && !bus->ifs[1].bs) 2262 ret = 0; 2263 else if (!hob) 2264 ret = s->sector; 2265 else 2266 ret = s->hob_sector; 2267 break; 2268 case 4: 2269 if (!bus->ifs[0].bs && !bus->ifs[1].bs) 2270 ret = 0; 2271 else if (!hob) 2272 ret = s->lcyl; 2273 else 2274 ret = s->hob_lcyl; 2275 break; 2276 case 5: 2277 if (!bus->ifs[0].bs && !bus->ifs[1].bs) 2278 ret = 0; 2279 else if (!hob) 2280 ret = s->hcyl; 2281 else 2282 ret = s->hob_hcyl; 2283 break; 2284 case 6: 2285 if (!bus->ifs[0].bs && !bus->ifs[1].bs) 2286 ret = 0; 2287 else 2288 ret = s->select; 2289 break; 2290 default: 2291 case 7: 2292 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) || 2293 (s != bus->ifs && !s->bs)) 2294 ret = 0; 2295 else 2296 ret = s->status; 2297 qemu_irq_lower(bus->irq); 2298 break; 2299 } 2300 #ifdef DEBUG_IDE 2301 printf("ide: read addr=0x%x val=%02x\n", addr1, ret); 2302 #endif 2303 return ret; 2304 } 2305 2306 uint32_t ide_status_read(void *opaque, uint32_t addr) 2307 { 2308 IDEBus *bus = opaque; 2309 IDEState *s = idebus_active_if(bus); 2310 int ret; 2311 2312 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) || 2313 (s != bus->ifs && !s->bs)) 2314 ret = 0; 2315 else 2316 ret = s->status; 2317 #ifdef DEBUG_IDE 2318 printf("ide: read status addr=0x%x val=%02x\n", addr, ret); 2319 #endif 2320 return ret; 2321 } 2322 2323 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val) 2324 { 2325 IDEBus *bus = opaque; 2326 IDEState *s; 2327 int i; 2328 2329 #ifdef DEBUG_IDE 2330 printf("ide: write control addr=0x%x val=%02x\n", addr, val); 2331 #endif 2332 /* common for both drives */ 2333 if (!(bus->cmd & IDE_CMD_RESET) && 2334 (val & IDE_CMD_RESET)) { 2335 /* reset low to high */ 2336 for(i = 0;i < 2; i++) { 2337 s = &bus->ifs[i]; 2338 s->status = BUSY_STAT | SEEK_STAT; 2339 s->error = 0x01; 2340 } 2341 } else if ((bus->cmd & IDE_CMD_RESET) && 2342 !(val & IDE_CMD_RESET)) { 2343 /* high to low */ 2344 for(i = 0;i < 2; i++) { 2345 s = &bus->ifs[i]; 2346 if (s->drive_kind == IDE_CD) 2347 s->status = 0x00; /* NOTE: READY is _not_ set */ 2348 else 2349 s->status = READY_STAT | SEEK_STAT; 2350 ide_set_signature(s); 2351 } 2352 } 2353 2354 bus->cmd = val; 2355 } 2356 2357 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val) 2358 { 2359 IDEBus *bus = opaque; 2360 IDEState *s = idebus_active_if(bus); 2361 uint8_t *p; 2362 2363 /* PIO data access allowed only when DRQ bit is set */ 2364 if (!(s->status & DRQ_STAT)) 2365 return; 2366 2367 p = s->data_ptr; 2368 *(uint16_t *)p = le16_to_cpu(val); 2369 p += 2; 2370 s->data_ptr = p; 2371 if (p >= s->data_end) 2372 s->end_transfer_func(s); 2373 } 2374 2375 uint32_t ide_data_readw(void *opaque, uint32_t addr) 2376 { 2377 IDEBus *bus = opaque; 2378 IDEState *s = idebus_active_if(bus); 2379 uint8_t *p; 2380 int ret; 2381 2382 /* PIO data access allowed only when DRQ bit is set */ 2383 if (!(s->status & DRQ_STAT)) 2384 return 0; 2385 2386 p = s->data_ptr; 2387 ret = cpu_to_le16(*(uint16_t *)p); 2388 p += 2; 2389 s->data_ptr = p; 2390 if (p >= s->data_end) 2391 s->end_transfer_func(s); 2392 return ret; 2393 } 2394 2395 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val) 2396 { 2397 IDEBus *bus = opaque; 2398 IDEState *s = idebus_active_if(bus); 2399 uint8_t *p; 2400 2401 /* PIO data access allowed only when DRQ bit is set */ 2402 if (!(s->status & DRQ_STAT)) 2403 return; 2404 2405 p = s->data_ptr; 2406 *(uint32_t *)p = le32_to_cpu(val); 2407 p += 4; 2408 s->data_ptr = p; 2409 if (p >= s->data_end) 2410 s->end_transfer_func(s); 2411 } 2412 2413 uint32_t ide_data_readl(void *opaque, uint32_t addr) 2414 { 2415 IDEBus *bus = opaque; 2416 IDEState *s = idebus_active_if(bus); 2417 uint8_t *p; 2418 int ret; 2419 2420 /* PIO data access allowed only when DRQ bit is set */ 2421 if (!(s->status & DRQ_STAT)) 2422 return 0; 2423 2424 p = s->data_ptr; 2425 ret = cpu_to_le32(*(uint32_t *)p); 2426 p += 4; 2427 s->data_ptr = p; 2428 if (p >= s->data_end) 2429 s->end_transfer_func(s); 2430 return ret; 2431 } 2432 2433 static void ide_dummy_transfer_stop(IDEState *s) 2434 { 2435 s->data_ptr = s->io_buffer; 2436 s->data_end = s->io_buffer; 2437 s->io_buffer[0] = 0xff; 2438 s->io_buffer[1] = 0xff; 2439 s->io_buffer[2] = 0xff; 2440 s->io_buffer[3] = 0xff; 2441 } 2442 2443 static void ide_reset(IDEState *s) 2444 { 2445 #ifdef DEBUG_IDE 2446 printf("ide: reset\n"); 2447 #endif 2448 if (s->drive_kind == IDE_CFATA) 2449 s->mult_sectors = 0; 2450 else 2451 s->mult_sectors = MAX_MULT_SECTORS; 2452 /* ide regs */ 2453 s->feature = 0; 2454 s->error = 0; 2455 s->nsector = 0; 2456 s->sector = 0; 2457 s->lcyl = 0; 2458 s->hcyl = 0; 2459 2460 /* lba48 */ 2461 s->hob_feature = 0; 2462 s->hob_sector = 0; 2463 s->hob_nsector = 0; 2464 s->hob_lcyl = 0; 2465 s->hob_hcyl = 0; 2466 2467 s->select = 0xa0; 2468 s->status = READY_STAT | SEEK_STAT; 2469 2470 s->lba48 = 0; 2471 2472 /* ATAPI specific */ 2473 s->sense_key = 0; 2474 s->asc = 0; 2475 s->cdrom_changed = 0; 2476 s->packet_transfer_size = 0; 2477 s->elementary_transfer_size = 0; 2478 s->io_buffer_index = 0; 2479 s->cd_sector_size = 0; 2480 s->atapi_dma = 0; 2481 /* ATA DMA state */ 2482 s->io_buffer_size = 0; 2483 s->req_nb_sectors = 0; 2484 2485 ide_set_signature(s); 2486 /* init the transfer handler so that 0xffff is returned on data 2487 accesses */ 2488 s->end_transfer_func = ide_dummy_transfer_stop; 2489 ide_dummy_transfer_stop(s); 2490 s->media_changed = 0; 2491 } 2492 2493 void ide_bus_reset(IDEBus *bus) 2494 { 2495 bus->unit = 0; 2496 bus->cmd = 0; 2497 ide_reset(&bus->ifs[0]); 2498 ide_reset(&bus->ifs[1]); 2499 ide_clear_hob(bus); 2500 2501 /* pending async DMA */ 2502 if (bus->dma->aiocb) { 2503 #ifdef DEBUG_AIO 2504 printf("aio_cancel\n"); 2505 #endif 2506 bdrv_aio_cancel(bus->dma->aiocb); 2507 bus->dma->aiocb = NULL; 2508 } 2509 2510 /* reset dma provider too */ 2511 bus->dma->ops->reset(bus->dma); 2512 } 2513 2514 int ide_init_drive(IDEState *s, BlockDriverState *bs, 2515 const char *version, const char *serial) 2516 { 2517 int cylinders, heads, secs; 2518 uint64_t nb_sectors; 2519 2520 s->bs = bs; 2521 bdrv_get_geometry(bs, &nb_sectors); 2522 bdrv_guess_geometry(bs, &cylinders, &heads, &secs); 2523 if (cylinders < 1 || cylinders > 16383) { 2524 error_report("cyls must be between 1 and 16383"); 2525 return -1; 2526 } 2527 if (heads < 1 || heads > 16) { 2528 error_report("heads must be between 1 and 16"); 2529 return -1; 2530 } 2531 if (secs < 1 || secs > 63) { 2532 error_report("secs must be between 1 and 63"); 2533 return -1; 2534 } 2535 s->cylinders = cylinders; 2536 s->heads = heads; 2537 s->sectors = secs; 2538 s->nb_sectors = nb_sectors; 2539 /* The SMART values should be preserved across power cycles 2540 but they aren't. */ 2541 s->smart_enabled = 1; 2542 s->smart_autosave = 1; 2543 s->smart_errors = 0; 2544 s->smart_selftest_count = 0; 2545 if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) { 2546 s->drive_kind = IDE_CD; 2547 bdrv_set_change_cb(bs, cdrom_change_cb, s); 2548 bs->buffer_alignment = 2048; 2549 } else { 2550 if (!bdrv_is_inserted(s->bs)) { 2551 error_report("Device needs media, but drive is empty"); 2552 return -1; 2553 } 2554 if (bdrv_is_read_only(bs)) { 2555 error_report("Can't use a read-only drive"); 2556 return -1; 2557 } 2558 } 2559 if (serial) { 2560 strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str)); 2561 } else { 2562 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str), 2563 "QM%05d", s->drive_serial); 2564 } 2565 if (version) { 2566 pstrcpy(s->version, sizeof(s->version), version); 2567 } else { 2568 pstrcpy(s->version, sizeof(s->version), QEMU_VERSION); 2569 } 2570 2571 ide_reset(s); 2572 bdrv_set_removable(bs, s->drive_kind == IDE_CD); 2573 return 0; 2574 } 2575 2576 static void ide_init1(IDEBus *bus, int unit) 2577 { 2578 static int drive_serial = 1; 2579 IDEState *s = &bus->ifs[unit]; 2580 2581 s->bus = bus; 2582 s->unit = unit; 2583 s->drive_serial = drive_serial++; 2584 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */ 2585 s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4); 2586 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4; 2587 s->smart_selftest_data = qemu_blockalign(s->bs, 512); 2588 s->sector_write_timer = qemu_new_timer_ns(vm_clock, 2589 ide_sector_write_timer_cb, s); 2590 } 2591 2592 static void ide_nop_start(IDEDMA *dma, IDEState *s, 2593 BlockDriverCompletionFunc *cb) 2594 { 2595 } 2596 2597 static int ide_nop(IDEDMA *dma) 2598 { 2599 return 0; 2600 } 2601 2602 static int ide_nop_int(IDEDMA *dma, int x) 2603 { 2604 return 0; 2605 } 2606 2607 static void ide_nop_restart(void *opaque, int x, int y) 2608 { 2609 } 2610 2611 static const IDEDMAOps ide_dma_nop_ops = { 2612 .start_dma = ide_nop_start, 2613 .start_transfer = ide_nop, 2614 .prepare_buf = ide_nop_int, 2615 .rw_buf = ide_nop_int, 2616 .set_unit = ide_nop_int, 2617 .add_status = ide_nop_int, 2618 .set_inactive = ide_nop, 2619 .restart_cb = ide_nop_restart, 2620 .reset = ide_nop, 2621 }; 2622 2623 static IDEDMA ide_dma_nop = { 2624 .ops = &ide_dma_nop_ops, 2625 .aiocb = NULL, 2626 }; 2627 2628 void ide_init2(IDEBus *bus, qemu_irq irq) 2629 { 2630 int i; 2631 2632 for(i = 0; i < 2; i++) { 2633 ide_init1(bus, i); 2634 ide_reset(&bus->ifs[i]); 2635 } 2636 bus->irq = irq; 2637 bus->dma = &ide_dma_nop; 2638 } 2639 2640 /* TODO convert users to qdev and remove */ 2641 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0, 2642 DriveInfo *hd1, qemu_irq irq) 2643 { 2644 int i; 2645 DriveInfo *dinfo; 2646 2647 for(i = 0; i < 2; i++) { 2648 dinfo = i == 0 ? hd0 : hd1; 2649 ide_init1(bus, i); 2650 if (dinfo) { 2651 if (ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL, 2652 *dinfo->serial ? dinfo->serial : NULL) < 0) { 2653 error_report("Can't set up IDE drive %s", dinfo->id); 2654 exit(1); 2655 } 2656 } else { 2657 ide_reset(&bus->ifs[i]); 2658 } 2659 } 2660 bus->irq = irq; 2661 bus->dma = &ide_dma_nop; 2662 } 2663 2664 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2) 2665 { 2666 register_ioport_write(iobase, 8, 1, ide_ioport_write, bus); 2667 register_ioport_read(iobase, 8, 1, ide_ioport_read, bus); 2668 if (iobase2) { 2669 register_ioport_read(iobase2, 1, 1, ide_status_read, bus); 2670 register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus); 2671 } 2672 2673 /* data ports */ 2674 register_ioport_write(iobase, 2, 2, ide_data_writew, bus); 2675 register_ioport_read(iobase, 2, 2, ide_data_readw, bus); 2676 register_ioport_write(iobase, 4, 4, ide_data_writel, bus); 2677 register_ioport_read(iobase, 4, 4, ide_data_readl, bus); 2678 } 2679 2680 static bool is_identify_set(void *opaque, int version_id) 2681 { 2682 IDEState *s = opaque; 2683 2684 return s->identify_set != 0; 2685 } 2686 2687 static EndTransferFunc* transfer_end_table[] = { 2688 ide_sector_read, 2689 ide_sector_write, 2690 ide_transfer_stop, 2691 ide_atapi_cmd_reply_end, 2692 ide_atapi_cmd, 2693 ide_dummy_transfer_stop, 2694 }; 2695 2696 static int transfer_end_table_idx(EndTransferFunc *fn) 2697 { 2698 int i; 2699 2700 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++) 2701 if (transfer_end_table[i] == fn) 2702 return i; 2703 2704 return -1; 2705 } 2706 2707 static int ide_drive_post_load(void *opaque, int version_id) 2708 { 2709 IDEState *s = opaque; 2710 2711 if (version_id < 3) { 2712 if (s->sense_key == SENSE_UNIT_ATTENTION && 2713 s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) { 2714 s->cdrom_changed = 1; 2715 } 2716 } 2717 return 0; 2718 } 2719 2720 static int ide_drive_pio_post_load(void *opaque, int version_id) 2721 { 2722 IDEState *s = opaque; 2723 2724 if (s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) { 2725 return -EINVAL; 2726 } 2727 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx]; 2728 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset; 2729 s->data_end = s->data_ptr + s->cur_io_buffer_len; 2730 2731 return 0; 2732 } 2733 2734 static void ide_drive_pio_pre_save(void *opaque) 2735 { 2736 IDEState *s = opaque; 2737 int idx; 2738 2739 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer; 2740 s->cur_io_buffer_len = s->data_end - s->data_ptr; 2741 2742 idx = transfer_end_table_idx(s->end_transfer_func); 2743 if (idx == -1) { 2744 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n", 2745 __func__); 2746 s->end_transfer_fn_idx = 2; 2747 } else { 2748 s->end_transfer_fn_idx = idx; 2749 } 2750 } 2751 2752 static bool ide_drive_pio_state_needed(void *opaque) 2753 { 2754 IDEState *s = opaque; 2755 2756 return (s->status & DRQ_STAT) != 0; 2757 } 2758 2759 const VMStateDescription vmstate_ide_drive_pio_state = { 2760 .name = "ide_drive/pio_state", 2761 .version_id = 1, 2762 .minimum_version_id = 1, 2763 .minimum_version_id_old = 1, 2764 .pre_save = ide_drive_pio_pre_save, 2765 .post_load = ide_drive_pio_post_load, 2766 .fields = (VMStateField []) { 2767 VMSTATE_INT32(req_nb_sectors, IDEState), 2768 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1, 2769 vmstate_info_uint8, uint8_t), 2770 VMSTATE_INT32(cur_io_buffer_offset, IDEState), 2771 VMSTATE_INT32(cur_io_buffer_len, IDEState), 2772 VMSTATE_UINT8(end_transfer_fn_idx, IDEState), 2773 VMSTATE_INT32(elementary_transfer_size, IDEState), 2774 VMSTATE_INT32(packet_transfer_size, IDEState), 2775 VMSTATE_END_OF_LIST() 2776 } 2777 }; 2778 2779 const VMStateDescription vmstate_ide_drive = { 2780 .name = "ide_drive", 2781 .version_id = 3, 2782 .minimum_version_id = 0, 2783 .minimum_version_id_old = 0, 2784 .post_load = ide_drive_post_load, 2785 .fields = (VMStateField []) { 2786 VMSTATE_INT32(mult_sectors, IDEState), 2787 VMSTATE_INT32(identify_set, IDEState), 2788 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set), 2789 VMSTATE_UINT8(feature, IDEState), 2790 VMSTATE_UINT8(error, IDEState), 2791 VMSTATE_UINT32(nsector, IDEState), 2792 VMSTATE_UINT8(sector, IDEState), 2793 VMSTATE_UINT8(lcyl, IDEState), 2794 VMSTATE_UINT8(hcyl, IDEState), 2795 VMSTATE_UINT8(hob_feature, IDEState), 2796 VMSTATE_UINT8(hob_sector, IDEState), 2797 VMSTATE_UINT8(hob_nsector, IDEState), 2798 VMSTATE_UINT8(hob_lcyl, IDEState), 2799 VMSTATE_UINT8(hob_hcyl, IDEState), 2800 VMSTATE_UINT8(select, IDEState), 2801 VMSTATE_UINT8(status, IDEState), 2802 VMSTATE_UINT8(lba48, IDEState), 2803 VMSTATE_UINT8(sense_key, IDEState), 2804 VMSTATE_UINT8(asc, IDEState), 2805 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3), 2806 VMSTATE_END_OF_LIST() 2807 }, 2808 .subsections = (VMStateSubsection []) { 2809 { 2810 .vmsd = &vmstate_ide_drive_pio_state, 2811 .needed = ide_drive_pio_state_needed, 2812 }, { 2813 /* empty */ 2814 } 2815 } 2816 }; 2817 2818 const VMStateDescription vmstate_ide_bus = { 2819 .name = "ide_bus", 2820 .version_id = 1, 2821 .minimum_version_id = 1, 2822 .minimum_version_id_old = 1, 2823 .fields = (VMStateField []) { 2824 VMSTATE_UINT8(cmd, IDEBus), 2825 VMSTATE_UINT8(unit, IDEBus), 2826 VMSTATE_END_OF_LIST() 2827 } 2828 }; 2829 2830 void ide_drive_get(DriveInfo **hd, int max_bus) 2831 { 2832 int i; 2833 2834 if (drive_get_max_bus(IF_IDE) >= max_bus) { 2835 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus); 2836 exit(1); 2837 } 2838 2839 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) { 2840 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS); 2841 } 2842 } 2843