diff --git a/bochs/iodev/display/banshee.cc b/bochs/iodev/display/banshee.cc index 5ba6903b1..031aa2725 100644 --- a/bochs/iodev/display/banshee.cc +++ b/bochs/iodev/display/banshee.cc @@ -935,10 +935,20 @@ void bx_banshee_c::mem_write(bx_phy_address addr, unsigned len, void *data) } else if ((addr & ~0x1ffffff) == pci_bar[1].addr) { if (v->fbi.cmdfifo[0].enabled && (offset >= v->fbi.cmdfifo[0].base) && (offset < v->fbi.cmdfifo[0].end)) { - cmdfifo_w(&v->fbi.cmdfifo[0], offset, value); + if (len == 4) { + cmdfifo_w(&v->fbi.cmdfifo[0], offset, value); + } else { + BX_ERROR(("CMDFIFO #0 write with len = %d redirected to LFB", len)); + mem_write_linear(offset, value, len); + } } else if (v->fbi.cmdfifo[1].enabled && (offset >= v->fbi.cmdfifo[1].base) && (offset < v->fbi.cmdfifo[1].end)) { - cmdfifo_w(&v->fbi.cmdfifo[1], offset, value); + if (len == 4) { + cmdfifo_w(&v->fbi.cmdfifo[1], offset, value); + } else { + BX_ERROR(("CMDFIFO #1 write with len = %d redirected to LFB", len)); + mem_write_linear(offset, value, len); + } } else { mem_write_linear(offset, value, len); } diff --git a/bochs/iodev/display/voodoo_func.h b/bochs/iodev/display/voodoo_func.h index 379c28322..26c0ae333 100644 --- a/bochs/iodev/display/voodoo_func.h +++ b/bochs/iodev/display/voodoo_func.h @@ -2962,7 +2962,7 @@ void cmdfifo_process(cmdfifo_info *f) BX_DEBUG(("cmdfifo_process(): JMP 0x%08x", f->rdptr)); } break; - case 4: // JMP AGP + case 4: // TODO: JMP AGP data = cmdfifo_r(f); default: BX_ERROR(("CMDFIFO packet type 0: unsupported code %d", code)); @@ -3194,6 +3194,12 @@ void cmdfifo_process(cmdfifo_info *f) BX_ERROR(("CMDFIFO packet type 5: unsupported destination type %d", code)); } break; + case 6: + // TODO: AGP to VRAM transfer + cmdfifo_r(f); + cmdfifo_r(f); + cmdfifo_r(f); + cmdfifo_r(f); default: BX_ERROR(("CMDFIFO: unsupported packet type %d", type)); }