Commit e5d13e2f64904a3181c7656f9d0eb884bb994bb1

Authored by bellard
1 parent 2023a2c8

more generic serial port (initial patch by Jocelyn Mayer)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1654 c046a42c-6fe2-441c-8c8c-71466251a162
hw/mips_r4k.c
... ... @@ -251,7 +251,7 @@ void mips_r4k_init (int ram_size, int vga_ram_size, int boot_device,
251 251  
252 252 isa_pic = pic_init(pic_irq_request, env);
253 253 pit = pit_init(0x40, 0);
254   - serial_init(0x3f8, 4, serial_hds[0]);
  254 + serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
255 255 vga_initialize(NULL, ds, phys_ram_base + ram_size, ram_size,
256 256 vga_ram_size, 0, 0);
257 257  
... ...
... ... @@ -599,7 +599,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
599 599 /* XXX: enable it in all cases */
600 600 env->cpuid_features |= CPUID_APIC;
601 601 }
602   - register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
  602 + register_savevm("cpu", i, 3, cpu_save, cpu_load, env);
603 603 qemu_register_reset(main_cpu_reset, env);
604 604 if (pci_enabled) {
605 605 apic_init(env);
... ... @@ -757,7 +757,8 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
757 757  
758 758 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
759 759 if (serial_hds[i]) {
760   - serial_init(serial_io[i], serial_irq[i], serial_hds[i]);
  760 + serial_init(&pic_set_irq_new, isa_pic,
  761 + serial_io[i], serial_irq[i], serial_hds[i]);
761 762 }
762 763 }
763 764  
... ...
hw/ppc_chrp.c
... ... @@ -433,7 +433,7 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
433 433 isa_pic = pic_init(pic_irq_request, NULL);
434 434  
435 435 /* XXX: use Mac Serial port */
436   - serial_init(0x3f8, 4, serial_hds[0]);
  436 + serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
437 437  
438 438 for(i = 0; i < nb_nics; i++) {
439 439 pci_ne2000_init(pci_bus, &nd_table[i]);
... ... @@ -482,7 +482,7 @@ static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
482 482 isa_pic = pic_init(pic_irq_request, NULL);
483 483  
484 484 /* XXX: use Mac Serial port */
485   - serial_init(0x3f8, 4, serial_hds[0]);
  485 + serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
486 486  
487 487 for(i = 0; i < nb_nics; i++) {
488 488 pci_ne2000_init(pci_bus, &nd_table[i]);
... ...
hw/ppc_prep.c
... ... @@ -525,6 +525,7 @@ static void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device,
525 525 {
526 526 CPUState *env;
527 527 char buf[1024];
  528 + SetIRQFunc *set_irq;
528 529 m48t59_t *nvram;
529 530 int PPC_io_memory;
530 531 int linux_boot, i, nb_nics1, bios_size;
... ... @@ -618,7 +619,7 @@ static void ppc_prep_init(int ram_size, int vga_ram_size, int boot_device,
618 619 isa_pic = pic_init(pic_irq_request, first_cpu);
619 620 // pit = pit_init(0x40, 0);
620 621  
621   - serial_init(0x3f8, 4, serial_hds[0]);
  622 + serial_init(&pic_set_irq_new, isa_pic, 0x3f8, 4, serial_hds[0]);
622 623 nb_nics1 = nb_nics;
623 624 if (nb_nics1 > NE2000_NB_MAX)
624 625 nb_nics1 = NE2000_NB_MAX;
... ...
hw/serial.c
... ... @@ -83,9 +83,13 @@ struct SerialState {
83 83 /* NOTE: this hidden state is necessary for tx irq generation as
84 84 it can be reset while reading iir */
85 85 int thr_ipending;
  86 + SetIRQFunc *set_irq;
  87 + void *irq_opaque;
86 88 int irq;
87 89 CharDriverState *chr;
88 90 int last_break_enable;
  91 + target_ulong base;
  92 + int it_shift;
89 93 };
90 94  
91 95 static void serial_update_irq(SerialState *s)
... ... @@ -98,9 +102,9 @@ static void serial_update_irq(SerialState *s)
98 102 s->iir = UART_IIR_NO_INT;
99 103 }
100 104 if (s->iir != UART_IIR_NO_INT) {
101   - pic_set_irq(s->irq, 1);
  105 + s->set_irq(s->irq_opaque, s->irq, 1);
102 106 } else {
103   - pic_set_irq(s->irq, 0);
  107 + s->set_irq(s->irq_opaque, s->irq, 0);
104 108 }
105 109 }
106 110  
... ... @@ -339,13 +343,16 @@ static int serial_load(QEMUFile *f, void *opaque, int version_id)
339 343 }
340 344  
341 345 /* If fd is zero, it means that the serial device uses the console */
342   -SerialState *serial_init(int base, int irq, CharDriverState *chr)
  346 +SerialState *serial_init(SetIRQFunc *set_irq, void *opaque,
  347 + int base, int irq, CharDriverState *chr)
343 348 {
344 349 SerialState *s;
345 350  
346 351 s = qemu_mallocz(sizeof(SerialState));
347 352 if (!s)
348 353 return NULL;
  354 + s->set_irq = set_irq;
  355 + s->irq_opaque = opaque;
349 356 s->irq = irq;
350 357 s->lsr = UART_LSR_TEMT | UART_LSR_THRE;
351 358 s->iir = UART_IIR_NO_INT;
... ... @@ -359,3 +366,90 @@ SerialState *serial_init(int base, int irq, CharDriverState *chr)
359 366 qemu_chr_add_event_handler(chr, serial_event);
360 367 return s;
361 368 }
  369 +
  370 +/* Memory mapped interface */
  371 +static uint32_t serial_mm_readb (void *opaque, target_phys_addr_t addr)
  372 +{
  373 + SerialState *s = opaque;
  374 +
  375 + return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFF;
  376 +}
  377 +
  378 +static void serial_mm_writeb (void *opaque,
  379 + target_phys_addr_t addr, uint32_t value)
  380 +{
  381 + SerialState *s = opaque;
  382 +
  383 + serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFF);
  384 +}
  385 +
  386 +static uint32_t serial_mm_readw (void *opaque, target_phys_addr_t addr)
  387 +{
  388 + SerialState *s = opaque;
  389 +
  390 + return serial_ioport_read(s, (addr - s->base) >> s->it_shift) & 0xFFFF;
  391 +}
  392 +
  393 +static void serial_mm_writew (void *opaque,
  394 + target_phys_addr_t addr, uint32_t value)
  395 +{
  396 + SerialState *s = opaque;
  397 +
  398 + serial_ioport_write(s, (addr - s->base) >> s->it_shift, value & 0xFFFF);
  399 +}
  400 +
  401 +static uint32_t serial_mm_readl (void *opaque, target_phys_addr_t addr)
  402 +{
  403 + SerialState *s = opaque;
  404 +
  405 + return serial_ioport_read(s, (addr - s->base) >> s->it_shift);
  406 +}
  407 +
  408 +static void serial_mm_writel (void *opaque,
  409 + target_phys_addr_t addr, uint32_t value)
  410 +{
  411 + SerialState *s = opaque;
  412 +
  413 + serial_ioport_write(s, (addr - s->base) >> s->it_shift, value);
  414 +}
  415 +
  416 +static CPUReadMemoryFunc *serial_mm_read[] = {
  417 + &serial_mm_readb,
  418 + &serial_mm_readw,
  419 + &serial_mm_readl,
  420 +};
  421 +
  422 +static CPUWriteMemoryFunc *serial_mm_write[] = {
  423 + &serial_mm_writeb,
  424 + &serial_mm_writew,
  425 + &serial_mm_writel,
  426 +};
  427 +
  428 +SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque,
  429 + target_ulong base, int it_shift,
  430 + int irq, CharDriverState *chr)
  431 +{
  432 + SerialState *s;
  433 + int s_io_memory;
  434 +
  435 + s = qemu_mallocz(sizeof(SerialState));
  436 + if (!s)
  437 + return NULL;
  438 + s->set_irq = set_irq;
  439 + s->irq_opaque = opaque;
  440 + s->irq = irq;
  441 + s->lsr = UART_LSR_TEMT | UART_LSR_THRE;
  442 + s->iir = UART_IIR_NO_INT;
  443 + s->base = base;
  444 + s->it_shift = it_shift;
  445 +
  446 + register_savevm("serial", base, 1, serial_save, serial_load, s);
  447 +
  448 + s_io_memory = cpu_register_io_memory(0, serial_mm_read,
  449 + serial_mm_write, s);
  450 + cpu_register_physical_memory(base, 8 << it_shift, s_io_memory);
  451 + s->chr = chr;
  452 + qemu_chr_add_read_handler(chr, serial_can_receive1, serial_receive1, s);
  453 + qemu_chr_add_event_handler(chr, serial_event);
  454 + return s;
  455 +}
... ...
hw/sun4u.c
... ... @@ -335,7 +335,8 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device,
335 335  
336 336 for(i = 0; i < MAX_SERIAL_PORTS; i++) {
337 337 if (serial_hds[i]) {
338   - serial_init(serial_io[i], serial_irq[i], serial_hds[i]);
  338 + serial_init(&pic_set_irq_new, NULL,
  339 + serial_io[i], serial_irq[i], serial_hds[i]);
339 340 }
340 341 }
341 342  
... ...
... ... @@ -733,7 +733,11 @@ void rtc_set_date(RTCState *s, const struct tm *tm);
733 733 /* serial.c */
734 734  
735 735 typedef struct SerialState SerialState;
736   -SerialState *serial_init(int base, int irq, CharDriverState *chr);
  736 +SerialState *serial_init(SetIRQFunc *set_irq, void *opaque,
  737 + int base, int irq, CharDriverState *chr);
  738 +SerialState *serial_mm_init (SetIRQFunc *set_irq, void *opaque,
  739 + target_ulong base, int it_shift,
  740 + int irq, CharDriverState *chr);
737 741  
738 742 /* parallel.c */
739 743  
... ...