grandcentral: Add DMA channel enum.

This commit is contained in:
joevt 2023-10-30 23:28:06 -07:00 committed by Maxim Poliakovski
parent cf14144d5b
commit 8a800062dd
2 changed files with 44 additions and 26 deletions

View File

@ -102,7 +102,7 @@ void GrandCentral::notify_bar_change(int bar_num)
if (this->base_addr != (this->bars[bar_num] & 0xFFFFFFF0UL)) { if (this->base_addr != (this->bars[bar_num] & 0xFFFFFFF0UL)) {
if (this->base_addr) { if (this->base_addr) {
LOG_F(WARNING, "GC: deallocating I/O memory not implemented"); LOG_F(WARNING, "%s: deallocating I/O memory not implemented", this->name.c_str());
} }
this->base_addr = this->bars[0] & 0xFFFFFFF0UL; this->base_addr = this->bars[0] & 0xFFFFFFF0UL;
this->host_instance->pci_register_mmio_region(this->base_addr, 0x20000, this); this->host_instance->pci_register_mmio_region(this->base_addr, 0x20000, this);
@ -146,7 +146,8 @@ uint32_t GrandCentral::read(uint32_t rgn_start, uint32_t offset, int size)
result &= 0xFFFFFFFFUL >> (4 - size) * 8; // strip unused bits result &= 0xFFFFFFFFUL >> (4 - size) * 8; // strip unused bits
return BYTESWAP_SIZED(result, size); return BYTESWAP_SIZED(result, size);
} else { } else {
LOG_F(ERROR, "GC: IOBus device #%d doesn't exist", subdev_num - 9); LOG_F(ERROR, "%s: IOBus device #%d doesn't exist", this->name.c_str(),
subdev_num - 9);
return 0; return 0;
} }
break; break;
@ -155,20 +156,20 @@ uint32_t GrandCentral::read(uint32_t rgn_start, uint32_t offset, int size)
(this->nvram_addr_hi << 5) + ((offset >> 4) & 0x1F)); (this->nvram_addr_hi << 5) + ((offset >> 4) & 0x1F));
} }
} else if (offset & 0x8000) { // DMA register space } else if (offset & 0x8000) { // DMA register space
unsigned subdev_num = (offset >> 8) & 0xF; unsigned dma_channel = (offset >> 8) & 0xF;
switch (subdev_num) { switch (dma_channel) {
case 0: case MIO_GC_DMA_SCSI_CURIO:
return this->ext_scsi_dma->reg_read(offset & 0xFF, size); return this->ext_scsi_dma->reg_read(offset & 0xFF, size);
case 1: case MIO_GC_DMA_FLOPPY:
return this->floppy_dma->reg_read(offset & 0xFF, size); return this->floppy_dma->reg_read(offset & 0xFF, size);
case 8: case MIO_GC_DMA_AUDIO_OUT:
return this->snd_out_dma->reg_read(offset & 0xFF, size); return this->snd_out_dma->reg_read(offset & 0xFF, size);
case 10: case MIO_GC_DMA_SCSI_MESH:
return this->mesh_dma->reg_read(offset & 0xFF, size); return this->mesh_dma->reg_read(offset & 0xFF, size);
default: default:
LOG_F(WARNING, "GC: unimplemented DMA register at 0x%X", LOG_F(WARNING, "%s: unimplemented DMA register at 0x%X",
this->base_addr + offset); this->name.c_str(), this->base_addr + offset);
} }
} else { // Interrupt related registers } else { // Interrupt related registers
switch (offset) { switch (offset) {
@ -185,7 +186,8 @@ uint32_t GrandCentral::read(uint32_t rgn_start, uint32_t offset, int size)
} }
} }
LOG_F(WARNING, "GC: reading from unmapped I/O memory 0x%X", this->base_addr + offset); LOG_F(WARNING, "%s: reading from unmapped I/O memory 0x%X", this->name.c_str(),
this->base_addr + offset);
return 0; return 0;
} }
@ -231,7 +233,8 @@ void GrandCentral::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
this->iobus_devs[subdev_num - 10]->iodev_write( this->iobus_devs[subdev_num - 10]->iodev_write(
(offset >> 4) & 0x1F, value); (offset >> 4) & 0x1F, value);
} else { } else {
LOG_F(ERROR, "GC: IOBus device #%d doesn't exist", subdev_num - 9); LOG_F(ERROR, "%s: IOBus device #%d doesn't exist", this->name.c_str(),
subdev_num - 9);
} }
break; break;
case 0xD: // NVRAM High Address (IOBus dev #4) case 0xD: // NVRAM High Address (IOBus dev #4)
@ -251,28 +254,28 @@ void GrandCentral::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
(this->nvram_addr_hi << 5) + ((offset >> 4) & 0x1F), value); (this->nvram_addr_hi << 5) + ((offset >> 4) & 0x1F), value);
break; break;
default: default:
LOG_F(WARNING, "GC: writing to unmapped I/O memory 0x%X", LOG_F(WARNING, "%s: writing to unmapped I/O memory 0x%X",
this->base_addr + offset); this->name.c_str(), this->base_addr + offset);
} }
} else if (offset & 0x8000) { // DMA register space } else if (offset & 0x8000) { // DMA register space
unsigned subdev_num = (offset >> 8) & 0xF; unsigned dma_channel = (offset >> 8) & 0xF;
switch (subdev_num) { switch (dma_channel) {
case 0: case MIO_GC_DMA_SCSI_CURIO:
this->ext_scsi_dma->reg_write(offset & 0xFF, value, size); this->ext_scsi_dma->reg_write(offset & 0xFF, value, size);
break; break;
case 1: case MIO_GC_DMA_FLOPPY:
this->floppy_dma->reg_write(offset & 0xFF, value, size); this->floppy_dma->reg_write(offset & 0xFF, value, size);
break; break;
case 8: case MIO_GC_DMA_AUDIO_OUT:
this->snd_out_dma->reg_write(offset & 0xFF, value, size); this->snd_out_dma->reg_write(offset & 0xFF, value, size);
break; break;
case 10: case MIO_GC_DMA_SCSI_MESH:
this->mesh_dma->reg_write(offset & 0xFF, value, size); this->mesh_dma->reg_write(offset & 0xFF, value, size);
break; break;
default: default:
LOG_F(WARNING, "GC: unimplemented DMA register at 0x%X", LOG_F(WARNING, "%s: unimplemented DMA register at 0x%X",
this->base_addr + offset); this->name.c_str(), this->base_addr + offset);
} }
} else { // Interrupt related registers } else { // Interrupt related registers
switch (offset) { switch (offset) {
@ -289,8 +292,8 @@ void GrandCentral::write(uint32_t rgn_start, uint32_t offset, uint32_t value, in
case MIO_INT_LEVELS1: case MIO_INT_LEVELS1:
break; // ignore writes to this read-only register break; // ignore writes to this read-only register
default: default:
LOG_F(WARNING, "GC: writing to unmapped I/O memory 0x%X", LOG_F(WARNING, "%s: writing to unmapped I/O memory 0x%X",
this->base_addr + offset); this->name.c_str(), this->base_addr + offset);
} }
} }
} }
@ -362,9 +365,9 @@ void GrandCentral::signal_cpu_int(uint32_t irq_id) {
if (!this->cpu_int_latch) { if (!this->cpu_int_latch) {
this->cpu_int_latch = true; this->cpu_int_latch = true;
ppc_assert_int(); ppc_assert_int();
LOG_F(5, "GC: CPU INT asserted, source: %d", irq_id); LOG_F(5, "%s: CPU INT asserted, source: %d", this->name.c_str(), irq_id);
} else { } else {
LOG_F(5, "GC: CPU INT already latched"); LOG_F(5, "%s: CPU INT already latched", this->name.c_str());
} }
} }
} }

View File

@ -92,6 +92,21 @@ public:
virtual void iodev_write(uint32_t address, uint16_t value) = 0; virtual void iodev_write(uint32_t address, uint16_t value) = 0;
}; };
/** GrandCentral DBDMA channels. */
enum : uint8_t {
MIO_GC_DMA_SCSI_CURIO = 0,
MIO_GC_DMA_FLOPPY = 1,
MIO_GC_DMA_ETH_XMIT = 2,
MIO_GC_DMA_ETH_RCV = 3,
MIO_GC_DMA_ESCC_A_XMIT = 4,
MIO_GC_DMA_ESCC_A_RCV = 5,
MIO_GC_DMA_ESCC_B_XMIT = 6,
MIO_GC_DMA_ESCC_B_RCV = 7,
MIO_GC_DMA_AUDIO_OUT = 8,
MIO_GC_DMA_AUDIO_IN = 9,
MIO_GC_DMA_SCSI_MESH = 0xA,
};
class GrandCentral : public PCIDevice, public InterruptCtrl { class GrandCentral : public PCIDevice, public InterruptCtrl {
public: public:
GrandCentral(); GrandCentral();