Commit a4bc3afc09b27cca4adfc1500551cc9a36219edf
1 parent
c62db105
Malta CBUS UART support.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2557 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
60 additions
and
18 deletions
hw/mips_int.c
| @@ -27,7 +27,7 @@ void cpu_mips_irq_request(void *opaque, int irq, int level) | @@ -27,7 +27,7 @@ void cpu_mips_irq_request(void *opaque, int irq, int level) | ||
| 27 | if (level) { | 27 | if (level) { |
| 28 | env->CP0_Cause |= 1 << (irq + CP0Ca_IP); | 28 | env->CP0_Cause |= 1 << (irq + CP0Ca_IP); |
| 29 | } else { | 29 | } else { |
| 30 | - env->CP0_Cause &= ~(1 << (irq +CP0Ca_IP)); | 30 | + env->CP0_Cause &= ~(1 << (irq + CP0Ca_IP)); |
| 31 | } | 31 | } |
| 32 | cpu_mips_update_irq(env); | 32 | cpu_mips_update_irq(env); |
| 33 | } | 33 | } |
hw/mips_malta.c
| @@ -55,6 +55,7 @@ typedef struct { | @@ -55,6 +55,7 @@ typedef struct { | ||
| 55 | uint32_t i2csel; | 55 | uint32_t i2csel; |
| 56 | CharDriverState *display; | 56 | CharDriverState *display; |
| 57 | char display_text[9]; | 57 | char display_text[9]; |
| 58 | + SerialState *uart; | ||
| 58 | } MaltaFPGAState; | 59 | } MaltaFPGAState; |
| 59 | 60 | ||
| 60 | static PITState *pit; | 61 | static PITState *pit; |
| @@ -241,6 +242,18 @@ static uint32_t malta_fpga_readl(void *opaque, target_phys_addr_t addr) | @@ -241,6 +242,18 @@ static uint32_t malta_fpga_readl(void *opaque, target_phys_addr_t addr) | ||
| 241 | val = s->brk; | 242 | val = s->brk; |
| 242 | break; | 243 | break; |
| 243 | 244 | ||
| 245 | + /* UART Registers */ | ||
| 246 | + case 0x00900: | ||
| 247 | + case 0x00904: | ||
| 248 | + case 0x00908: | ||
| 249 | + case 0x0090c: | ||
| 250 | + case 0x00910: | ||
| 251 | + case 0x00914: | ||
| 252 | + case 0x00918: | ||
| 253 | + case 0x0091c: | ||
| 254 | + val = serial_mm_readl(s->uart, addr); | ||
| 255 | + break; | ||
| 256 | + | ||
| 244 | /* GPOUT Register */ | 257 | /* GPOUT Register */ |
| 245 | case 0x00a00: | 258 | case 0x00a00: |
| 246 | val = s->gpout; | 259 | val = s->gpout; |
| @@ -341,6 +354,18 @@ static void malta_fpga_writel(void *opaque, target_phys_addr_t addr, | @@ -341,6 +354,18 @@ static void malta_fpga_writel(void *opaque, target_phys_addr_t addr, | ||
| 341 | s->brk = val & 0xff; | 354 | s->brk = val & 0xff; |
| 342 | break; | 355 | break; |
| 343 | 356 | ||
| 357 | + /* UART Registers */ | ||
| 358 | + case 0x00900: | ||
| 359 | + case 0x00904: | ||
| 360 | + case 0x00908: | ||
| 361 | + case 0x0090c: | ||
| 362 | + case 0x00910: | ||
| 363 | + case 0x00914: | ||
| 364 | + case 0x00918: | ||
| 365 | + case 0x0091c: | ||
| 366 | + serial_mm_writel(s->uart, addr, val); | ||
| 367 | + break; | ||
| 368 | + | ||
| 344 | /* GPOUT Register */ | 369 | /* GPOUT Register */ |
| 345 | case 0x00a00: | 370 | case 0x00a00: |
| 346 | s->gpout = val & 0xff; | 371 | s->gpout = val & 0xff; |
| @@ -400,15 +425,17 @@ void malta_fpga_reset(void *opaque) | @@ -400,15 +425,17 @@ void malta_fpga_reset(void *opaque) | ||
| 400 | malta_fpga_update_display(s); | 425 | malta_fpga_update_display(s); |
| 401 | } | 426 | } |
| 402 | 427 | ||
| 403 | -MaltaFPGAState *malta_fpga_init(target_phys_addr_t base) | 428 | +MaltaFPGAState *malta_fpga_init(target_phys_addr_t base, CPUState *env) |
| 404 | { | 429 | { |
| 405 | MaltaFPGAState *s; | 430 | MaltaFPGAState *s; |
| 431 | + CharDriverState *uart_chr; | ||
| 406 | int malta; | 432 | int malta; |
| 407 | 433 | ||
| 408 | s = (MaltaFPGAState *)qemu_mallocz(sizeof(MaltaFPGAState)); | 434 | s = (MaltaFPGAState *)qemu_mallocz(sizeof(MaltaFPGAState)); |
| 409 | 435 | ||
| 410 | malta = cpu_register_io_memory(0, malta_fpga_read, | 436 | malta = cpu_register_io_memory(0, malta_fpga_read, |
| 411 | malta_fpga_write, s); | 437 | malta_fpga_write, s); |
| 438 | + | ||
| 412 | cpu_register_physical_memory(base, 0x100000, malta); | 439 | cpu_register_physical_memory(base, 0x100000, malta); |
| 413 | 440 | ||
| 414 | s->display = qemu_chr_open("vc"); | 441 | s->display = qemu_chr_open("vc"); |
| @@ -422,6 +449,11 @@ MaltaFPGAState *malta_fpga_init(target_phys_addr_t base) | @@ -422,6 +449,11 @@ MaltaFPGAState *malta_fpga_init(target_phys_addr_t base) | ||
| 422 | qemu_chr_printf(s->display, "+ +\r\n"); | 449 | qemu_chr_printf(s->display, "+ +\r\n"); |
| 423 | qemu_chr_printf(s->display, "+--------+\r\n"); | 450 | qemu_chr_printf(s->display, "+--------+\r\n"); |
| 424 | 451 | ||
| 452 | + uart_chr = qemu_chr_open("vc"); | ||
| 453 | + qemu_chr_printf(uart_chr, "CBUS UART\r\n"); | ||
| 454 | + s->uart = serial_mm_init(&cpu_mips_irq_request, env, base, 3, 2, | ||
| 455 | + uart_chr, 0); | ||
| 456 | + | ||
| 425 | malta_fpga_reset(s); | 457 | malta_fpga_reset(s); |
| 426 | qemu_register_reset(malta_fpga_reset, s); | 458 | qemu_register_reset(malta_fpga_reset, s); |
| 427 | 459 | ||
| @@ -683,7 +715,7 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device, | @@ -683,7 +715,7 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device, | ||
| 683 | cpu_mips_irqctrl_init(); | 715 | cpu_mips_irqctrl_init(); |
| 684 | 716 | ||
| 685 | /* FPGA */ | 717 | /* FPGA */ |
| 686 | - malta_fpga = malta_fpga_init(0x1f000000LL); | 718 | + malta_fpga = malta_fpga_init(0x1f000000LL, env); |
| 687 | 719 | ||
| 688 | /* Interrupt controller */ | 720 | /* Interrupt controller */ |
| 689 | isa_pic = pic_init(pic_irq_request, env); | 721 | isa_pic = pic_init(pic_irq_request, env); |
hw/serial.c
| @@ -371,45 +371,45 @@ SerialState *serial_init(SetIRQFunc *set_irq, void *opaque, | @@ -371,45 +371,45 @@ SerialState *serial_init(SetIRQFunc *set_irq, void *opaque, | ||
| 371 | } | 371 | } |
| 372 | 372 | ||
| 373 | /* Memory mapped interface */ | 373 | /* Memory mapped interface */ |
| 374 | -static uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr) | 374 | +uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr) |
| 375 | { | 375 | { |
| 376 | SerialState *s = opaque; | 376 | SerialState *s = opaque; |
| 377 | 377 | ||
| 378 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF; | 378 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF; |
| 379 | } | 379 | } |
| 380 | 380 | ||
| 381 | -static void serial_mm_writeb (void *opaque, | ||
| 382 | - target_phys_addr_t addr, uint32_t value) | 381 | +void serial_mm_writeb (void *opaque, |
| 382 | + target_phys_addr_t addr, uint32_t value) | ||
| 383 | { | 383 | { |
| 384 | SerialState *s = opaque; | 384 | SerialState *s = opaque; |
| 385 | 385 | ||
| 386 | serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF); | 386 | serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF); |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | -static uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr) | 389 | +uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr) |
| 390 | { | 390 | { |
| 391 | SerialState *s = opaque; | 391 | SerialState *s = opaque; |
| 392 | 392 | ||
| 393 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF; | 393 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF; |
| 394 | } | 394 | } |
| 395 | 395 | ||
| 396 | -static void serial_mm_writew (void *opaque, | ||
| 397 | - target_phys_addr_t addr, uint32_t value) | 396 | +void serial_mm_writew (void *opaque, |
| 397 | + target_phys_addr_t addr, uint32_t value) | ||
| 398 | { | 398 | { |
| 399 | SerialState *s = opaque; | 399 | SerialState *s = opaque; |
| 400 | 400 | ||
| 401 | serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF); | 401 | serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF); |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | -static uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr) | 404 | +uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr) |
| 405 | { | 405 | { |
| 406 | SerialState *s = opaque; | 406 | SerialState *s = opaque; |
| 407 | 407 | ||
| 408 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift); | 408 | return serial_ioport_read(s, (addr - s->base) >> s->it_shift); |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | -static void serial_mm_writel (void *opaque, | ||
| 412 | - target_phys_addr_t addr, uint32_t value) | 411 | +void serial_mm_writel (void *opaque, |
| 412 | + target_phys_addr_t addr, uint32_t value) | ||
| 413 | { | 413 | { |
| 414 | SerialState *s = opaque; | 414 | SerialState *s = opaque; |
| 415 | 415 | ||
| @@ -430,7 +430,8 @@ static CPUWriteMemoryFunc *serial_mm_write[] = { | @@ -430,7 +430,8 @@ static CPUWriteMemoryFunc *serial_mm_write[] = { | ||
| 430 | 430 | ||
| 431 | SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, | 431 | SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, |
| 432 | target_ulong base, int it_shift, | 432 | target_ulong base, int it_shift, |
| 433 | - int irq, CharDriverState *chr) | 433 | + int irq, CharDriverState *chr, |
| 434 | + int ioregister) | ||
| 434 | { | 435 | { |
| 435 | SerialState *s; | 436 | SerialState *s; |
| 436 | int s_io_memory; | 437 | int s_io_memory; |
| @@ -449,9 +450,11 @@ SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, | @@ -449,9 +450,11 @@ SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, | ||
| 449 | 450 | ||
| 450 | register_savevm("serial", base, 2, serial_save, serial_load, s); | 451 | register_savevm("serial", base, 2, serial_save, serial_load, s); |
| 451 | 452 | ||
| 452 | - s_io_memory = cpu_register_io_memory(0, serial_mm_read, | ||
| 453 | - serial_mm_write, s); | ||
| 454 | - cpu_register_physical_memory(base, 8 << it_shift, s_io_memory); | 453 | + if (ioregister) { |
| 454 | + s_io_memory = cpu_register_io_memory(0, serial_mm_read, | ||
| 455 | + serial_mm_write, s); | ||
| 456 | + cpu_register_physical_memory(base, 8 << it_shift, s_io_memory); | ||
| 457 | + } | ||
| 455 | s->chr = chr; | 458 | s->chr = chr; |
| 456 | qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1, | 459 | qemu_chr_add_handlers(chr, serial_can_receive1, serial_receive1, |
| 457 | serial_event, s); | 460 | serial_event, s); |
target-mips/exec.h
| @@ -163,7 +163,7 @@ uint32_t cpu_mips_get_random (CPUState *env); | @@ -163,7 +163,7 @@ uint32_t cpu_mips_get_random (CPUState *env); | ||
| 163 | uint32_t cpu_mips_get_count (CPUState *env); | 163 | uint32_t cpu_mips_get_count (CPUState *env); |
| 164 | void cpu_mips_store_count (CPUState *env, uint32_t value); | 164 | void cpu_mips_store_count (CPUState *env, uint32_t value); |
| 165 | void cpu_mips_store_compare (CPUState *env, uint32_t value); | 165 | void cpu_mips_store_compare (CPUState *env, uint32_t value); |
| 166 | -void cpu_mips_update_irq(CPUState *env); | 166 | +void cpu_mips_update_irq (CPUState *env); |
| 167 | void cpu_mips_clock_init (CPUState *env); | 167 | void cpu_mips_clock_init (CPUState *env); |
| 168 | void cpu_mips_tlb_flush (CPUState *env, int flush_global); | 168 | void cpu_mips_tlb_flush (CPUState *env, int flush_global); |
| 169 | 169 |
vl.h
| @@ -1035,7 +1035,14 @@ SerialState *serial_init(SetIRQFunc *set_irq, void *opaque, | @@ -1035,7 +1035,14 @@ SerialState *serial_init(SetIRQFunc *set_irq, void *opaque, | ||
| 1035 | int base, int irq, CharDriverState *chr); | 1035 | int base, int irq, CharDriverState *chr); |
| 1036 | SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, | 1036 | SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque, |
| 1037 | target_ulong base, int it_shift, | 1037 | target_ulong base, int it_shift, |
| 1038 | - int irq, CharDriverState *chr); | 1038 | + int irq, CharDriverState *chr, |
| 1039 | + int ioregister); | ||
| 1040 | +uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr); | ||
| 1041 | +void serial_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value); | ||
| 1042 | +uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr); | ||
| 1043 | +void serial_mm_writew (void *opaque, target_phys_addr_t addr, uint32_t value); | ||
| 1044 | +uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr); | ||
| 1045 | +void serial_mm_writel (void *opaque, target_phys_addr_t addr, uint32_t value); | ||
| 1039 | 1046 | ||
| 1040 | /* parallel.c */ | 1047 | /* parallel.c */ |
| 1041 | 1048 |