target-mips: DMA support for RC4030 chipset

Attached patch implements DMA support to RC4030 chipset and simplifies
jazz IO part (at 0xf0000000), where registers contain 16 bit values.
Config register has not a clear meaning (only one value is always valid,
and sometimes another one), so use a magic value instead.
The patch also wires DMA transfers for the SCSI adapter in the Jazz
emulation (Mips Magnum 4000 and Acer Pica 61).

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6145 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
aurel32 2009-01-01 13:03:36 +00:00
parent 3aa9bd6c35
commit c6945b153c
3 changed files with 250 additions and 96 deletions

View file

@ -75,6 +75,24 @@ static CPUWriteMemoryFunc *rtc_write[3] = {
rtc_writeb,
};
static void dma_dummy_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
{
/* Nothing to do. That is only to ensure that
* the current DMA acknowledge cycle is completed. */
}
static CPUReadMemoryFunc *dma_dummy_read[3] = {
NULL,
NULL,
NULL,
};
static CPUWriteMemoryFunc *dma_dummy_write[3] = {
dma_dummy_writeb,
dma_dummy_writeb,
dma_dummy_writeb,
};
#ifdef HAS_AUDIO
static void audio_init(qemu_irq *pic)
{
@ -102,16 +120,6 @@ static void audio_init(qemu_irq *pic)
}
#endif
static void espdma_memory_read(void *opaque, uint8_t *buf, int len)
{
printf("espdma_memory_read(buf %p, len %d) not implemented\n", buf, len);
}
static void espdma_memory_write(void *opaque, uint8_t *buf, int len)
{
printf("espdma_memory_write(buf %p, len %d) not implemented\n", buf, len);
}
#define MAGNUM_BIOS_SIZE_MAX 0x7e000
#define MAGNUM_BIOS_SIZE (BIOS_SIZE < MAGNUM_BIOS_SIZE_MAX ? BIOS_SIZE : MAGNUM_BIOS_SIZE_MAX)
@ -125,9 +133,11 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size,
int bios_size, n;
CPUState *env;
qemu_irq *rc4030, *i8259;
rc4030_dma *dmas;
rc4030_dma_function dma_read, dma_write;
void *scsi_hba;
int hd;
int s_rtc;
int s_rtc, s_dma_dummy;
PITState *pit;
BlockDriverState *fds[MAX_FD];
qemu_irq esp_reset;
@ -153,7 +163,9 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size,
/* load the BIOS image. */
bios_offset = ram_size + vga_ram_size;
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, BIOS_FILENAME);
if (bios_name == NULL)
bios_name = BIOS_FILENAME;
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
bios_size = load_image(buf, phys_ram_base + bios_offset);
if (bios_size < 0 || bios_size > MAGNUM_BIOS_SIZE) {
fprintf(stderr, "qemu: Could not load MIPS bios '%s'\n",
@ -171,10 +183,14 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size,
cpu_mips_clock_init(env);
/* Chipset */
rc4030 = rc4030_init(env->irq[6], env->irq[3]);
rc4030 = rc4030_init(env->irq[6], env->irq[3],
&dmas, &dma_read, &dma_write);
s_dma_dummy = cpu_register_io_memory(0, dma_dummy_read, dma_dummy_write, NULL);
cpu_register_physical_memory(0x8000d000, 0x00001000, s_dma_dummy);
/* ISA devices */
i8259 = i8259_init(env->irq[4]);
DMA_init(0);
pit = pit_init(0x40, i8259[0]);
pcspk_init(pit);
@ -200,7 +216,7 @@ void mips_jazz_init (ram_addr_t ram_size, int vga_ram_size,
/* SCSI adapter */
scsi_hba = esp_init(0x80002000, 0,
espdma_memory_read, espdma_memory_write, NULL,
dma_read, dma_write, dmas[0],
rc4030[5], &esp_reset);
for (n = 0; n < ESP_MAX_DEVS; n++) {
hd = drive_get_index(IF_SCSI, 0, n);
@ -278,6 +294,7 @@ QEMUMachine mips_magnum_machine = {
.init = mips_magnum_init,
.ram_require = MAGNUM_BIOS_SIZE + VGA_RAM_SIZE,
.nodisk_ok = 1,
.use_scsi = 1,
};
QEMUMachine mips_pica61_machine = {
@ -286,4 +303,5 @@ QEMUMachine mips_pica61_machine = {
.init = mips_pica61_init,
.ram_require = MAGNUM_BIOS_SIZE + VGA_RAM_SIZE,
.nodisk_ok = 1,
.use_scsi = 1,
};