Changeset 89211 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- May 21, 2021 8:18:45 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 144552
- Location:
- trunk/src/VBox/Devices/PC/BIOS
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/buslogic.c
r89168 r89211 32 32 #endif 33 33 34 #define BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND 0x02 35 #define BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX 0x81 34 #define BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND 0x02 35 #define BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX 0x81 36 #define BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT 0x25 37 36 38 37 39 #define RT_BIT(bit) (1 << (bit)) … … 275 277 /** I/O base of device. */ 276 278 uint16_t u16IoBase; 279 /** The sink buf. */ 280 void __far *pvSinkBuf; 277 281 } buslogic_t; 278 282 … … 355 359 356 360 int buslogic_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 357 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,358 uint16_t skip_ b)361 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 362 uint16_t skip_a) 359 363 { 360 364 buslogic_t __far *buslogic = (buslogic_t __far *)pvHba; … … 379 383 { 380 384 buslogic->aSge[idxSge].cbSegment = skip_b; 381 buslogic->aSge[idxSge].u32PhysAddrSegmentBase = 0; /* See ahci.c:sink_buf_phys */385 buslogic->aSge[idxSge].u32PhysAddrSegmentBase = buslogic_addr_to_phys(buslogic->pvSinkBuf); 382 386 idxSge++; 383 387 } … … 391 395 { 392 396 buslogic->aSge[idxSge].cbSegment = skip_a; 393 buslogic->aSge[idxSge].u32PhysAddrSegmentBase = 0; /* See ahci.c:sink_buf_phys */397 buslogic->aSge[idxSge].u32PhysAddrSegmentBase = buslogic_addr_to_phys(buslogic->pvSinkBuf); 394 398 idxSge++; 395 399 } … … 420 424 static int buslogic_scsi_hba_init(buslogic_t __far *buslogic) 421 425 { 426 int rc; 427 uint8_t bIrqOff = 0; 422 428 ReqInitExtMbx ReqInitMbx; 423 429 … … 426 432 while (!(inb(buslogic->u16IoBase + BUSLOGIC_REGISTER_STATUS) & BL_STAT_HARDY)); 427 433 428 /* Initialize mailbox. */ 429 ReqInitMbx.cMailbox = 1; 430 ReqInitMbx.uMailboxBaseAddress = buslogic_addr_to_phys(&buslogic->MbxOut32); 431 return buslogic_cmd(buslogic, BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX, 432 (unsigned char __far *)&ReqInitMbx, sizeof(ReqInitMbx), 433 NULL, 0); 434 /* Disable interrupts. */ 435 rc = buslogic_cmd(buslogic, BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT, 436 (unsigned char __far *)&bIrqOff, sizeof(bIrqOff), 437 NULL, 0); 438 if (!rc) 439 { 440 /* Initialize mailbox. */ 441 ReqInitMbx.cMailbox = 1; 442 ReqInitMbx.uMailboxBaseAddress = buslogic_addr_to_phys(&buslogic->MbxOut32); 443 rc = buslogic_cmd(buslogic, BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX, 444 (unsigned char __far *)&ReqInitMbx, sizeof(ReqInitMbx), 445 NULL, 0); 446 } 447 448 return rc; 434 449 } 435 450 … … 437 452 * Init the BusLogic SCSI driver and detect attached disks. 438 453 */ 439 int buslogic_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn)454 int buslogic_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn) 440 455 { 441 456 buslogic_t __far *buslogic = (buslogic_t __far *)pvHba; … … 457 472 DBG_BUSLOGIC("I/O base: 0x%x\n", u16IoBase); 458 473 buslogic->u16IoBase = u16IoBase; 474 buslogic->pvSinkBuf = pvSinkBuf; 459 475 return buslogic_scsi_hba_init(buslogic); 460 476 } -
trunk/src/VBox/Devices/PC/BIOS/lsilogic.c
r89168 r89211 289 289 /** I/O base of device. */ 290 290 uint16_t u16IoBase; 291 /** Saved high bits of EAX. */292 uint16_t saved_eax_hi;291 /** The sink buf. */ 292 void __far *pvSinkBuf; 293 293 } lsilogic_t; 294 294 … … 426 426 427 427 int lsilogic_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 428 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,429 uint16_t skip_ b)428 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 429 uint16_t skip_a) 430 430 { 431 431 lsilogic_t __far *lsilogic = (lsilogic_t __far *)pvHba; … … 459 459 lsilogic->aSge[idxSge].fEndOfBuffer = 0; 460 460 lsilogic->aSge[idxSge].fLastElement = 0; 461 lsilogic->aSge[idxSge].u32DataBufferAddressLow = 0; /* See ahci.c:sink_buf_phys */461 lsilogic->aSge[idxSge].u32DataBufferAddressLow = lsilogic_addr_to_phys(lsilogic->pvSinkBuf); 462 462 463 463 idxSge++; … … 479 479 if (skip_a) 480 480 { 481 lsilogic->aSge[idxSge].u24Length = length;481 lsilogic->aSge[idxSge].u24Length = skip_a; 482 482 lsilogic->aSge[idxSge].fEndOfList = 1; 483 483 lsilogic->aSge[idxSge].f64BitAddress = 0; … … 487 487 lsilogic->aSge[idxSge].fEndOfBuffer = 1; 488 488 lsilogic->aSge[idxSge].fLastElement = 1; 489 lsilogic->aSge[idxSge].u32DataBufferAddressLow = 0; /* See ahci.c:sink_buf_phys */489 lsilogic->aSge[idxSge].u32DataBufferAddressLow = lsilogic_addr_to_phys(lsilogic->pvSinkBuf); 490 490 idxSge++; 491 491 } … … 536 536 * Init the LsiLogic SCSI driver and detect attached disks. 537 537 */ 538 int lsilogic_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn)538 int lsilogic_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn) 539 539 { 540 540 lsilogic_t __far *lsilogic = (lsilogic_t __far *)pvHba; … … 556 556 DBG_LSILOGIC("I/O base: 0x%x\n", u16IoBase); 557 557 lsilogic->u16IoBase = u16IoBase; 558 lsilogic->pvSinkBuf = pvSinkBuf; 558 559 return lsilogic_scsi_hba_init(lsilogic); 559 560 } -
trunk/src/VBox/Devices/PC/BIOS/scsi.c
r89169 r89211 35 35 #define VBOX_SCSI_NO_HBA 0xffff 36 36 37 typedef int (* scsi_hba_init)(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn);37 typedef int (* scsi_hba_init)(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn); 38 38 typedef int (* scsi_hba_cmd_data_out)(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 39 39 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length); … … 112 112 113 113 return hba_seg; 114 } 115 116 /** 117 * Allocates 1K of conventional memory. 118 */ 119 static uint16_t scsi_sink_buf_alloc(void) 120 { 121 uint16_t base_mem_kb; 122 uint16_t sink_seg; 123 124 base_mem_kb = read_word(0x00, 0x0413); 125 126 DBG_SCSI("SCSI: %dK of base mem\n", base_mem_kb); 127 128 if (base_mem_kb == 0) 129 return 0; 130 131 base_mem_kb -= 2; /* Allocate 2K block. */ 132 sink_seg = (((uint32_t)base_mem_kb * 1024) >> 4); /* Calculate start segment. */ 133 134 write_word(0x00, 0x0413, base_mem_kb); 135 136 return sink_seg; 114 137 } 115 138 … … 521 544 { 522 545 int i; 546 uint16_t sink_seg = 0; 523 547 bio_dsk_t __far *bios_dsk; 524 548 … … 538 562 break; 539 563 564 if (!sink_seg) /* Allocate a sink buffer for throwing away data when accessing CD/DVD drives. */ 565 { 566 sink_seg = scsi_sink_buf_alloc(); 567 if (!sink_seg) 568 break; 569 } 570 540 571 u8Bus = (busdevfn & 0xff00) >> 8; 541 572 u8DevFn = busdevfn & 0x00ff; 542 573 543 574 DBG_SCSI("SCSI HBA at Bus %u DevFn 0x%x (raw 0x%x)\n", u8Bus, u8DevFn, busdevfn); 544 rc = hbaacc[i].init(hba_seg :> 0, u8Bus, u8DevFn);575 rc = hbaacc[i].init(hba_seg :> 0, sink_seg :> 0, u8Bus, u8DevFn); 545 576 if (!rc) 546 577 scsi_enumerate_attached_devices(hba_seg, i); -
trunk/src/VBox/Devices/PC/BIOS/scsi.h
r89168 r89211 57 57 ct_assert(sizeof(cdb_rw16) == 16); 58 58 59 extern int lsilogic_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn);59 extern int lsilogic_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn); 60 60 extern int lsilogic_scsi_cmd_data_out(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 61 61 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length); 62 62 extern int lsilogic_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 63 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,64 uint16_t skip_ b);63 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 64 uint16_t skip_a); 65 65 66 extern int buslogic_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn);66 extern int buslogic_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn); 67 67 extern int buslogic_scsi_cmd_data_out(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 68 68 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length); 69 69 extern int buslogic_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 70 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,71 uint16_t skip_ b);70 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 71 uint16_t skip_a); 72 72 73 extern int virtio_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn);73 extern int virtio_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn); 74 74 extern int virtio_scsi_cmd_data_out(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 75 75 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length); 76 76 extern int virtio_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 77 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,78 uint16_t skip_ b);77 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 78 uint16_t skip_a); 79 79 80 80 #endif /* !VBOX_INCLUDED_SRC_PC_BIOS_scsi_h */ -
trunk/src/VBox/Devices/PC/BIOS/virtio.c
r89168 r89211 209 209 /** Device/Function number. */ 210 210 uint8_t u8DevFn; 211 /** Saved high bits of EAX. */212 uint16_t saved_eax_hi;211 /** The sink buf. */ 212 void __far *pvSinkBuf; 213 213 /** The current executed command structure. */ 214 214 virtio_scsi_req_hdr_t ScsiReqHdr; … … 435 435 436 436 int virtio_scsi_cmd_data_in(void __far *pvHba, uint8_t idTgt, uint8_t __far *aCDB, 437 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_ a,438 uint16_t skip_ b)437 uint8_t cbCDB, uint8_t __far *buffer, uint32_t length, uint16_t skip_b, 438 uint16_t skip_a) 439 439 { 440 440 virtio_t __far *virtio = (virtio_t __far *)pvHba; … … 470 470 if (skip_b) 471 471 { 472 virtio->Queue.aDescTbl[idxDesc].GCPhysBufLow = 0; /* See ahci.c:sink_buf_phys */472 virtio->Queue.aDescTbl[idxDesc].GCPhysBufLow = virtio_addr_to_phys(virtio->pvSinkBuf); 473 473 virtio->Queue.aDescTbl[idxDesc].GCPhysBufHigh = 0; 474 474 virtio->Queue.aDescTbl[idxDesc].cbBuf = skip_b; … … 491 491 virtio->Queue.aDescTbl[idxDesc - 1].idxNext = idxDesc; 492 492 493 virtio->Queue.aDescTbl[idxDesc].GCPhysBufLow = 0; /* See ahci.c:sink_buf_phys */493 virtio->Queue.aDescTbl[idxDesc].GCPhysBufLow = virtio_addr_to_phys(virtio->pvSinkBuf); 494 494 virtio->Queue.aDescTbl[idxDesc].GCPhysBufHigh = 0; 495 495 virtio->Queue.aDescTbl[idxDesc].cbBuf = skip_a; … … 662 662 * Init the VirtIO SCSI driver and detect attached disks. 663 663 */ 664 int virtio_scsi_init(void __far *pvHba, uint8_t u8Bus, uint8_t u8DevFn)664 int virtio_scsi_init(void __far *pvHba, void __far *pvSinkBuf, uint8_t u8Bus, uint8_t u8DevFn) 665 665 { 666 666 virtio_t __far *virtio = (virtio_t __far *)pvHba; … … 715 715 pci_write_config_word(u8Bus, u8DevFn, 4, 0x7); 716 716 717 virtio->pvSinkBuf = pvSinkBuf; 717 718 return virtio_scsi_hba_init(virtio, u8Bus, u8DevFn, u8PciCapOffVirtIo); 718 719 }
Note:
See TracChangeset
for help on using the changeset viewer.