Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/src/mach/malta/malta.c

    r69c31abc rc5429fe  
    3838#include <console/chardev.h>
    3939#include <arch/mm/page.h>
    40 #include <genarch/drivers/i8259/i8259.h>
    41 #include <genarch/drivers/ns16550/ns16550.h>
    42 #include <genarch/srln/srln.h>
    43 #include <arch/interrupt.h>
    44 #include <stdbool.h>
    45 #include <byteorder.h>
    46 #include <sysinfo/sysinfo.h>
    47 #include <log.h>
    48 #include <str.h>
    4940
    5041static void malta_init(void);
     
    6657};
    6758
    68 #ifdef CONFIG_NS16550
    69 static ns16550_instance_t *tty_instance;
    70 #endif
    71 #ifdef CONFIG_NS16550_OUT
    72 static outdev_t *tty_out;
    73 #endif
    74 
    75 static void malta_isa_irq_handler(unsigned int i)
    76 {
    77         uint8_t isa_irq = host2uint32_t_le(pio_read_32(GT64120_PCI0_INTACK));
    78         if (pic_is_spurious(isa_irq)) {
    79                 pic_handle_spurious(isa_irq);
    80 #ifdef CONFIG_DEBUG
    81                 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u",
    82                     CPU->id, isa_irq);
    83                 return;
    84 #endif
    85         }
    86         irq_t *irq = irq_dispatch_and_lock(isa_irq);
    87         if (irq) {
    88                 irq->handler(irq);
    89                 irq_spinlock_unlock(&irq->lock, false);
    90         } else {
    91 #ifdef CONFIG_DEBUG
    92                 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ (irq=%u)",
    93                     CPU->id, isa_irq);
    94 #endif
    95         }
    96         pic_eoi(isa_irq);
    97 }
    98 
    9959void malta_init(void)
    10060{
    101         irq_init(ISA_IRQ_COUNT, ISA_IRQ_COUNT);
    102 
    103         i8259_init((i8259_t *) PIC0_BASE, (i8259_t *) PIC1_BASE, 0);
    104         sysinfo_set_item_val("i8259", NULL, true);
    105 
    106         int_handler[INT_HW0] = malta_isa_irq_handler;
    107         cp0_unmask_int(INT_HW0);
    108 
    109 #if (defined(CONFIG_NS16550) || defined(CONFIG_NS16550_OUT))
    110 #ifdef CONFIG_NS16550_OUT
    111         outdev_t **tty_out_ptr = &tty_out;
    112 #else
    113         outdev_t **tty_out_ptr = NULL;
    114 #endif
    115         tty_instance = ns16550_init((ioport8_t *) TTY_BASE, 0, TTY_ISA_IRQ,
    116             NULL, NULL, tty_out_ptr);
    117 #endif
    118 
    119         const char *args = "console=devices/\\hw\\pci0\\00:0a.0\\com1\\a";
    120         str_ncpy(bargs, CONFIG_BOOT_ARGUMENTS_BUFLEN, args, str_length(args));
    12161}
    12262
     
    13373}
    13474
     75#define YAMON_SUBR_BASE         PA2KA(0x1fc00500)
     76#define YAMON_SUBR_PRINT_COUNT  (YAMON_SUBR_BASE + 0x4)
     77
     78typedef void (**yamon_print_count_ptr_t)(uint32_t, const char *, uint32_t);
     79
     80yamon_print_count_ptr_t yamon_print_count =
     81    (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
     82
     83static void yamon_putwchar(outdev_t *dev, const wchar_t wch)
     84{
     85
     86        const char ch = (char) wch;
     87
     88        (*yamon_print_count)(0, &ch, 1);
     89}
     90
     91static outdev_t yamon_outdev;
     92static outdev_operations_t yamon_outdev_ops = {
     93        .write = yamon_putwchar,
     94        .redraw = NULL,
     95        .scroll_up = NULL,
     96        .scroll_down = NULL
     97};
     98
    13599void malta_output_init(void)
    136100{
    137 #ifdef CONFIG_NS16550_OUT
    138         if (tty_out)
    139                 stdout_wire(tty_out);
    140 #endif
     101        outdev_initialize("yamon", &yamon_outdev, &yamon_outdev_ops);
     102        stdout_wire(&yamon_outdev);
    141103}
    142104
    143105void malta_input_init(void)
    144106{
    145 #ifdef CONFIG_NS16550
    146         if (tty_instance) {
    147                 srln_instance_t *srln_instance = srln_init();
    148                 if (srln_instance) {
    149                         indev_t *sink = stdin_wire();
    150                         indev_t *srln = srln_wire(srln_instance, sink);
    151                         ns16550_wire(tty_instance, srln);
    152                         pic_enable_irqs(1 << TTY_ISA_IRQ);
    153                 }
    154         }
    155 #endif
     107        (void) stdin_wire();
    156108}
    157109
Note: See TracChangeset for help on using the changeset viewer.