Changeset 50091 in vbox for trunk/src/VBox/Devices/PC/BIOS/scsi.c
- Timestamp:
- Jan 17, 2014 12:06:45 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 91615
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/scsi.c
r48123 r50091 411 411 uint16_t heads, sectors_per_track; 412 412 uint8_t hdcount; 413 uint8_t cmos_base; 413 414 414 415 /* Issue a read capacity command now. */ … … 440 441 } 441 442 442 /* We need to calculate the geometry for the disk. From443 * the BusLogic driver in the Linux kernel. 444 */445 if (sectors >= (uint32_t)4 * 1024 * 1024)443 devcount_scsi = bios_dsk->scsi_devcount; 444 445 /* Get logical CHS geometry. */ 446 switch (devcount_scsi) 446 447 { 447 heads = 255; 448 sectors_per_track = 63; 448 case 0: 449 cmos_base = 0x90; 450 break; 451 case 1: 452 cmos_base = 0x98; 453 break; 454 case 2: 455 cmos_base = 0xA0; 456 break; 457 case 3: 458 cmos_base = 0xA8; 459 break; 460 default: 461 cmos_base = 0; 449 462 } 450 else if (sectors >= (uint32_t)2 * 1024 * 1024) 463 464 if (cmos_base && inb_cmos(cmos_base + 7)) 451 465 { 452 heads = 128; 453 sectors_per_track = 32; 466 /* If provided, grab the logical geometry from CMOS. */ 467 cylinders = inb_cmos(cmos_base + 0) + (inb_cmos(cmos_base + 1) << 8); 468 heads = inb_cmos(cmos_base + 2); 469 sectors_per_track = inb_cmos(cmos_base + 7); 454 470 } 455 471 else 456 472 { 457 heads = 64; 458 sectors_per_track = 32; 473 /* Calculate default logical geometry. NB: Very different 474 * from default ATA/SATA logical geometry! 475 */ 476 if (sectors >= (uint32_t)4 * 1024 * 1024) 477 { 478 heads = 255; 479 sectors_per_track = 63; 480 } 481 else if (sectors >= (uint32_t)2 * 1024 * 1024) 482 { 483 heads = 128; 484 sectors_per_track = 32; 485 } 486 else 487 { 488 heads = 64; 489 sectors_per_track = 32; 490 } 491 cylinders = (uint32_t)(sectors / (heads * sectors_per_track)); 459 492 } 460 cylinders = (uint32_t)(sectors / (heads * sectors_per_track));461 devcount_scsi = bios_dsk->scsi_devcount;462 493 463 494 /* Calculate index into the generic disk table. */
Note:
See TracChangeset
for help on using the changeset viewer.