BT-958D now correctly handles the BIOS using the PCI BAR, and I also fixed a stupid bug in scsi_device.c - the BT-958D BIOS will now boot from SCSI CD-ROM.

This commit is contained in:
OBattler
2017-08-27 06:20:38 +02:00
parent e59e799ce7
commit cb7b1051d8
3 changed files with 43 additions and 50 deletions

View File

@@ -25,16 +25,22 @@
#include "scsi_bios_command.h" #include "scsi_bios_command.h"
#include "scsi_device.h" #include "scsi_device.h"
/* #define ENABLE_SCSI_BIOS_COMMAND_LOG 0 */
int scsi_bios_command_do_log = 0;
static void static void
scsi_bios_command_log(const char *format, ...) scsi_bios_command_log(const char *format, ...)
{ {
#ifdef ENABLE_SCSI_BIOS_COMMAND_LOG #ifdef ENABLE_SCSI_BIOS_COMMAND_LOG
if (scsi_bios_command_do_log)
{
va_list ap; va_list ap;
va_start(ap, format); va_start(ap, format);
vprintf(format, ap); vprintf(format, ap);
va_end(ap); va_end(ap);
fflush(stdout); fflush(stdout);
}
#endif #endif
} }
@@ -133,7 +139,7 @@ int scsi_bios_command_15(uint8_t id, uint8_t lun, uint8_t *buffer)
return sc; return sc;
} }
static void BuslogicIDCheck(uint8_t id, uint8_t lun) static void scsi_bios_command_id_check(uint8_t id, uint8_t lun)
{ {
if (!scsi_device_valid(id, lun)) if (!scsi_device_valid(id, lun))
{ {
@@ -189,7 +195,7 @@ uint8_t scsi_bios_command(uint8_t last_id, BIOSCMD *BiosCmd, int8_t islba)
return 0; return 0;
case 0x01: /* Read Status of Last Operation */ case 0x01: /* Read Status of Last Operation */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
/* Assuming 14 bytes because that's the default length for SCSI sense, and no command-specific /* Assuming 14 bytes because that's the default length for SCSI sense, and no command-specific
indication is given. */ indication is given. */
@@ -217,7 +223,7 @@ uint8_t scsi_bios_command(uint8_t last_id, BIOSCMD *BiosCmd, int8_t islba)
break; break;
case 0x02: /* Read Desired Sectors to Memory */ case 0x02: /* Read Desired Sectors to Memory */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift; SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
@@ -255,7 +261,7 @@ pclog("BIOS CMD(READ, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x03: /* Write Desired Sectors from Memory */ case 0x03: /* Write Desired Sectors from Memory */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift; SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
@@ -293,7 +299,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x04: /* Verify Desired Sectors */ case 0x04: /* Verify Desired Sectors */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
cdb[0] = GPCMD_VERIFY_10; cdb[0] = GPCMD_VERIFY_10;
cdb[1] = (BiosCmd->lun & 7) << 5; cdb[1] = (BiosCmd->lun & 7) << 5;
@@ -321,7 +327,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x07: /* Format Unit */ case 0x07: /* Format Unit */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
cdb[0] = GPCMD_FORMAT_UNIT; cdb[0] = GPCMD_FORMAT_UNIT;
cdb[1] = (BiosCmd->lun & 7) << 5; cdb[1] = (BiosCmd->lun & 7) << 5;
@@ -333,7 +339,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x08: /* Read Drive Parameters */ case 0x08: /* Read Drive Parameters */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6; SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6;
@@ -361,7 +367,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x0C: /* Seek */ case 0x0C: /* Seek */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift; SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
@@ -384,7 +390,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x10: /* Test Drive Ready */ case 0x10: /* Test Drive Ready */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
cdb[0] = GPCMD_TEST_UNIT_READY; cdb[0] = GPCMD_TEST_UNIT_READY;
cdb[1] = (BiosCmd->lun & 7) << 5; cdb[1] = (BiosCmd->lun & 7) << 5;
@@ -396,7 +402,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x11: /* Recalibrate */ case 0x11: /* Recalibrate */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
cdb[0] = GPCMD_REZERO_UNIT; cdb[0] = GPCMD_REZERO_UNIT;
cdb[1] = (BiosCmd->lun & 7) << 5; cdb[1] = (BiosCmd->lun & 7) << 5;
@@ -413,7 +419,7 @@ pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
break; break;
case 0x15: /* Read DASD Type */ case 0x15: /* Read DASD Type */
BuslogicIDCheck(BiosCmd->id, BiosCmd->lun); scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6; SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6;

View File

@@ -710,8 +710,6 @@ BuslogicInitializeAutoSCSIRam(Buslogic_t *bl, uint8_t safe)
HALR->structured.autoSCSIData.uAutoSCSIMaximumLUN = 7; HALR->structured.autoSCSIData.uAutoSCSIMaximumLUN = 7;
HALR->structured.autoSCSIData.fForceBusDeviceScanningOrder = 1; HALR->structured.autoSCSIData.fForceBusDeviceScanningOrder = 1;
HALR->structured.autoSCSIData.uReserved12 = 0x7f;
HALR->structured.autoSCSIData.fInt13Extension = safe ? 0 : 1; HALR->structured.autoSCSIData.fInt13Extension = safe ? 0 : 1;
HALR->structured.autoSCSIData.fCDROMBoot = safe ? 0 : 1; HALR->structured.autoSCSIData.fCDROMBoot = safe ? 0 : 1;
HALR->structured.autoSCSIData.fMultiBoot = safe ? 0 : 1; HALR->structured.autoSCSIData.fMultiBoot = safe ? 0 : 1;
@@ -1904,7 +1902,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
aModelName[0] = '9'; aModelName[0] = '9';
aModelName[1] = '5'; aModelName[1] = '5';
aModelName[2] = '8'; aModelName[2] = '8';
aModelName[3] = 'C'; aModelName[3] = 'D';
break; break;
} }
cCharsToTransfer = bl->DataReplyLeft <= sizeof(aModelName) cCharsToTransfer = bl->DataReplyLeft <= sizeof(aModelName)
@@ -2499,7 +2497,6 @@ uint8_t buslogic_pci_regs[256];
bar_t buslogic_pci_bar[3]; bar_t buslogic_pci_bar[3];
#if 0
static void static void
BuslogicBIOSUpdate(Buslogic_t *bl) BuslogicBIOSUpdate(Buslogic_t *bl)
{ {
@@ -2514,20 +2511,19 @@ BuslogicBIOSUpdate(Buslogic_t *bl)
mem_mapping_enable(&bl->bios.mapping); mem_mapping_enable(&bl->bios.mapping);
mem_mapping_set_addr(&bl->bios.mapping, mem_mapping_set_addr(&bl->bios.mapping,
bl->bios_addr, bl->bios_size); bl->bios_addr, bl->bios_size);
pclog("BT-946C: BIOS now at: %06X\n", bl->bios_addr); pclog("BT-958D: BIOS now at: %06X\n", bl->bios_addr);
} else { } else {
pclog("BT-946C: BIOS disabled\n"); pclog("BT-958D: BIOS disabled\n");
mem_mapping_disable(&bl->bios.mapping); mem_mapping_disable(&bl->bios.mapping);
} }
} }
#endif
static uint8_t static uint8_t
BuslogicPCIRead(int func, int addr, void *p) BuslogicPCIRead(int func, int addr, void *p)
{ {
Buslogic_t *bl = (Buslogic_t *)p; Buslogic_t *bl = (Buslogic_t *)p;
pclog("BT-946C: Reading register %02X\n", addr & 0xff); pclog("BT-958D: Reading register %02X\n", addr & 0xff);
switch (addr) { switch (addr) {
case 0x00: case 0x00:
@@ -2578,23 +2574,21 @@ BuslogicPCIRead(int func, int addr, void *p)
return 0x40; return 0x40;
case 0x2F: case 0x2F:
return 0x10; return 0x10;
#if 0
case 0x30: /* PCI_ROMBAR */ case 0x30: /* PCI_ROMBAR */
pclog("BT-946C: BIOS BAR 00 = %02X\n", buslogic_pci_bar[2].addr_regs[0] & 0x01); pclog("BT-958D: BIOS BAR 00 = %02X\n", buslogic_pci_bar[2].addr_regs[0] & 0x01);
return buslogic_pci_bar[2].addr_regs[0] & 0x01; return buslogic_pci_bar[2].addr_regs[0] & 0x01;
case 0x31: /* PCI_ROMBAR 15:11 */ case 0x31: /* PCI_ROMBAR 15:11 */
pclog("BT-946C: BIOS BAR 01 = %02X\n", (buslogic_pci_bar[2].addr_regs[1] & bl->bios_mask)); pclog("BT-958D: BIOS BAR 01 = %02X\n", (buslogic_pci_bar[2].addr_regs[1] & bl->bios_mask));
return (buslogic_pci_bar[2].addr_regs[1] & bl->bios_mask); return buslogic_pci_bar[2].addr_regs[1];
break; break;
case 0x32: /* PCI_ROMBAR 23:16 */ case 0x32: /* PCI_ROMBAR 23:16 */
pclog("BT-946C: BIOS BAR 02 = %02X\n", buslogic_pci_bar[2].addr_regs[2]); pclog("BT-958D: BIOS BAR 02 = %02X\n", buslogic_pci_bar[2].addr_regs[2]);
return buslogic_pci_bar[2].addr_regs[2]; return buslogic_pci_bar[2].addr_regs[2];
break; break;
case 0x33: /* PCI_ROMBAR 31:24 */ case 0x33: /* PCI_ROMBAR 31:24 */
pclog("BT-946C: BIOS BAR 03 = %02X\n", buslogic_pci_bar[2].addr_regs[3]); pclog("BT-958D: BIOS BAR 03 = %02X\n", buslogic_pci_bar[2].addr_regs[3]);
return buslogic_pci_bar[2].addr_regs[3]; return buslogic_pci_bar[2].addr_regs[3];
break; break;
#endif
case 0x3C: case 0x3C:
return bl->Irq; return bl->Irq;
case 0x3D: case 0x3D:
@@ -2611,7 +2605,7 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
Buslogic_t *bl = (Buslogic_t *)p; Buslogic_t *bl = (Buslogic_t *)p;
uint8_t valxor; uint8_t valxor;
pclog("BT-946C: Write value %02X to register %02X\n", val, addr & 0xff); pclog("BT-958D: Write value %02X to register %02X\n", val, addr & 0xff);
switch (addr) { switch (addr) {
case 0x04: case 0x04:
@@ -2689,19 +2683,17 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
} }
} }
return; return;
#if 0
case 0x30: /* PCI_ROMBAR */ case 0x30: /* PCI_ROMBAR */
case 0x31: /* PCI_ROMBAR */ case 0x31: /* PCI_ROMBAR */
case 0x32: /* PCI_ROMBAR */ case 0x32: /* PCI_ROMBAR */
case 0x33: /* PCI_ROMBAR */ case 0x33: /* PCI_ROMBAR */
buslogic_pci_bar[2].addr_regs[addr & 3] = val; buslogic_pci_bar[2].addr_regs[addr & 3] = val;
buslogic_pci_bar[2].addr_regs[1] &= bl->bios_mask; buslogic_pci_bar[2].addr &= 0xffffc001;
buslogic_pci_bar[2].addr &= 0xffffe001; bl->bios_addr = buslogic_pci_bar[2].addr & 0xffffc000;
bl->bios_addr = buslogic_pci_bar[2].addr; pclog("BT-958D: BIOS BAR %02X = NOW %02X (%02X)\n", addr & 3, buslogic_pci_bar[2].addr_regs[addr & 3], val);
pclog("BT-946C: BIOS BAR %02X = NOW %02X (%02X)\n", addr & 3, buslogic_pci_bar[2].addr_regs[addr & 3], val);
BuslogicBIOSUpdate(bl); BuslogicBIOSUpdate(bl);
return; return;
#endif
case 0x3C: case 0x3C:
buslogic_pci_regs[addr] = val; buslogic_pci_regs[addr] = val;
@@ -2804,8 +2796,8 @@ BuslogicInit(int chip)
break; break;
case CHIP_BUSLOGIC_PCI: case CHIP_BUSLOGIC_PCI:
bios_rom_name = L"roms/scsi/buslogic/BT-958D_BIOS.rom"; bios_rom_name = L"roms/scsi/buslogic/BT-958D_BIOS.rom";
bios_rom_size = 0x8000; bios_rom_size = 0x4000;
bios_rom_mask = 0x7fff; bios_rom_mask = 0x3fff;
has_autoscsi_rom = 1; has_autoscsi_rom = 1;
autoscsi_rom_name = L"roms/scsi/buslogic/BT-958D_AutoSCSI.rom"; autoscsi_rom_name = L"roms/scsi/buslogic/BT-958D_AutoSCSI.rom";
autoscsi_rom_size = 0x8000; autoscsi_rom_size = 0x8000;
@@ -2823,10 +2815,9 @@ BuslogicInit(int chip)
if (bl->has_bios) if (bl->has_bios)
{ {
bl->bios_size = 0x8000; bl->bios_size = bios_rom_size;
bl->bios_mask = (bl->bios_size >> 8) & 0xff; bl->bios_mask = 0xffffc000;
bl->bios_mask = (0x100 - bl->bios_mask) & 0xff;
rom_init(&bl->bios, bios_rom_name, 0xd8000, bios_rom_size, bios_rom_mask, 0, MEM_MAPPING_EXTERNAL); rom_init(&bl->bios, bios_rom_name, 0xd8000, bios_rom_size, bios_rom_mask, 0, MEM_MAPPING_EXTERNAL);
@@ -2875,26 +2866,22 @@ BuslogicInit(int chip)
buslogic_pci_regs[0x07] = 2; buslogic_pci_regs[0x07] = 2;
#endif #endif
#if 0
/* Enable our BIOS space in PCI, if needed. */ /* Enable our BIOS space in PCI, if needed. */
if (bl->has_bios) if (bl->has_bios)
{ {
buslogic_pci_bar[2].addr = 0x000D8000; buslogic_pci_bar[2].addr = 0xFFFFC000;
} }
else else
{ {
buslogic_pci_bar[2].addr = 0; buslogic_pci_bar[2].addr = 0;
} }
#endif
mem_mapping_add(&bl->mmio_mapping, 0xfffd0000, 0x20, mem_mapping_add(&bl->mmio_mapping, 0xfffd0000, 0x20,
BuslogicMemRead, BuslogicMemReadW, BuslogicMemReadL, BuslogicMemRead, BuslogicMemReadW, BuslogicMemReadL,
BuslogicMemWrite, BuslogicMemWriteW, BuslogicMemWriteL, BuslogicMemWrite, BuslogicMemWriteW, BuslogicMemWriteL,
NULL, MEM_MAPPING_EXTERNAL, bl); NULL, MEM_MAPPING_EXTERNAL, bl);
mem_mapping_disable(&bl->mmio_mapping); mem_mapping_disable(&bl->mmio_mapping);
#if 0
mem_mapping_disable(&bl->bios.mapping); mem_mapping_disable(&bl->bios.mapping);
#endif
} }
pclog("Buslogic on port 0x%04X\n", bl->Base); pclog("Buslogic on port 0x%04X\n", bl->Base);

View File

@@ -195,7 +195,7 @@ int scsi_device_read_capacity(uint8_t scsi_id, uint8_t scsi_lun, uint8_t *cdb, u
id = scsi_hard_disks[scsi_id][scsi_lun]; id = scsi_hard_disks[scsi_id][scsi_lun];
return scsi_hd_read_capacity(id, cdb, buffer, len); return scsi_hd_read_capacity(id, cdb, buffer, len);
case SCSI_CDROM: case SCSI_CDROM:
id = scsi_hard_disks[scsi_id][scsi_lun]; id = scsi_cdrom_drives[scsi_id][scsi_lun];
return cdrom_read_capacity(id, cdb, buffer, len); return cdrom_read_capacity(id, cdb, buffer, len);
default: default:
return 0; return 0;