Changeset 7688b5d in mainline


Ignore:
Timestamp:
2006-10-18T09:54:13Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6fb30a1
Parents:
19de05f
Message:

mips32: update for new IRQ subsystem

Location:
kernel/arch/mips32
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/mips32/include/console.h

    r19de05f r7688b5d  
    3636#define KERN_mips32_CONSOLE_H_
    3737
    38 void console_init(void);
     38extern void console_init(devno_t devno);
    3939
    4040#endif
  • kernel/arch/mips32/include/drivers/msim.h

    r19de05f r7688b5d  
    3838#include <console/chardev.h>
    3939
    40 #define MSIM_VIDEORAM                   0xB0000000
    41 /** Address of 'keyboard' device. */
    42 #define MSIM_KBD_ADDRESS                0xB0000000
    43 #define MSIM_KBD_IRQ    2
    44 
    45 void msim_console(void);
     40void msim_console(devno_t devno);
    4641void msim_kbd_release(void);
    4742void msim_kbd_grab(void);
  • kernel/arch/mips32/include/drivers/serial.h

    r19de05f r7688b5d  
    6363}serial_t;
    6464
    65 void serial_console(void);
    66 int serial_init(void);
     65extern void serial_console(devno_t devno);
     66extern int serial_init(void);
    6767
    6868#endif
  • kernel/arch/mips32/include/interrupt.h

    r19de05f r7688b5d  
    3838#include <arch/exception.h>
    3939
    40 #define IVT_ITEMS   40
    41 #define INT_OFFSET  32
    42 #define IRQ_COUNT   8
     40#define IVT_ITEMS 32
     41#define IVT_FIRST 0
    4342
    44 #define int_register(it, name, handler) exc_register(((it)+INT_OFFSET),name,handler)
    45 
    46 #define IRQ2    2
    47 #define IRQ3    3
    48 #define IRQ7    7
    49 
    50 #define TIMER_IRQ       IRQ7
     43extern function timer_fnc;
    5144
    5245extern void interrupt_init(void);
  • kernel/arch/mips32/src/console.c

    r19de05f r7688b5d  
    3939#include <arch/drivers/msim.h>
    4040
    41 void console_init(void)
     41void console_init(devno_t devno)
    4242{
    4343        if (arc_enabled()) {
    4444                arc_console();
    4545        } else if (serial_init()) {
    46                 serial_console();
     46                serial_console(devno);
    4747        } else {
    48                 msim_console();
     48                msim_console(devno);
    4949        }
    5050}
     
    5757        msim_kbd_grab();
    5858}
     59
    5960/** Return console to userspace
    6061 *
  • kernel/arch/mips32/src/drivers/arc.c

    r19de05f r7688b5d  
    354354};
    355355
    356 iroutine old_timer;
    357 /** Do polling on timer interrupt */
    358 static void timer_replace(int n, istate_t *istate)
    359 {
    360         arc_keyboard_poll();
    361         old_timer(n, istate);
    362         arc_keyboard_poll();
    363 }
    364 
    365356void arc_console(void)
    366357{
     
    368359       
    369360        chardev_initialize("arc_console", &console, &arc_ops);
    370         old_timer = int_register(TIMER_IRQ, "arc_kb_poll", timer_replace);
     361        timer_fnc = &arc_keyboard_poll;
    371362        stdin = &console;
    372363        stdout = &console;
  • kernel/arch/mips32/src/drivers/msim.c

    r19de05f r7688b5d  
    3838#include <arch/cp0.h>
    3939#include <console/console.h>
     40#include <ddi/irq.h>
     41#include <sysinfo/sysinfo.h>
     42
     43/** Address of devices. */
     44#define MSIM_VIDEORAM           0xB0000000
     45#define MSIM_KBD_ADDRESS        0xB0000000
     46#define MSIM_KBD_IRQ            2
    4047
    4148static chardev_t console;
     49static irq_t msim_irq;
    4250
    4351static void msim_write(chardev_t *dev, const char ch);
     
    9098
    9199/** Process keyboard interrupt. */
    92 static void msim_interrupt(int n, istate_t *istate)
     100static void msim_irq_handler(irq_t *irq, void *arg, ...)
    93101{
    94         char ch = 0;
     102        if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
     103                ipc_irq_send_notif(irq);
     104        else {
     105                char ch = 0;
     106               
     107                        ch = *((char *) MSIM_KBD_ADDRESS);
     108                        if (ch =='\r')
     109                                ch = '\n';
     110                        if (ch == 0x7f)
     111                                ch = '\b';
     112                        chardev_push_character(&console, ch);
     113        }
     114}
    95115
    96         ch = *((char *) MSIM_KBD_ADDRESS);
    97         if (ch =='\r')
    98                 ch = '\n';
    99         if (ch == 0x7f)
    100                 ch = '\b';
    101         chardev_push_character(&console, ch);
     116static irq_ownership_t msim_claim(void)
     117{
     118        return IRQ_ACCEPT;
     119}
     120
     121void msim_kbd_grab(void)
     122{
     123        msim_irq.notif_cfg.notify = false;
     124}
     125
     126void msim_kbd_release(void)
     127{
     128        if (msim_irq.notif_cfg.answerbox)
     129                msim_irq.notif_cfg.notify = true;
    102130}
    103131
    104132
    105133/* Return console object representing msim console */
    106 void msim_console(void)
     134void msim_console(devno_t devno)
    107135{
    108136        chardev_initialize("msim_console", &console, &msim_ops);
    109 
    110         int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);
    111 
    112         cp0_unmask_int(MSIM_KBD_IRQ);
    113 
    114137        stdin = &console;
    115138        stdout = &console;
    116 }
    117 
    118 static iroutine oldvector;
    119 void msim_kbd_grab(void)
    120 {
    121         oldvector = int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);
    122 }
    123 void msim_kbd_release(void)
    124 {
    125         if (oldvector)
    126                 int_register(MSIM_KBD_IRQ, "user_interrupt", oldvector);
     139       
     140        irq_initialize(&msim_irq);
     141        msim_irq.devno = devno;
     142        msim_irq.inr = MSIM_KBD_IRQ;
     143        msim_irq.claim = msim_claim;
     144        msim_irq.handler = msim_irq_handler;
     145        irq_register(&msim_irq);
     146       
     147        cp0_unmask_int(MSIM_KBD_IRQ);
     148       
     149        sysinfo_set_item_val("kbd", NULL, true);
     150        sysinfo_set_item_val("kbd.devno", NULL, devno);
     151        sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
     152        sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS);
    127153}
    128154
  • kernel/arch/mips32/src/drivers/serial.c

    r19de05f r7688b5d  
    3838#include <console/chardev.h>
    3939#include <console/console.h>
     40#include <ddi/irq.h>
    4041
     42#define SERIAL_IRQ 2
     43
     44static irq_t serial_irq;
    4145static chardev_t console;
    4246static serial_t sconf[SERIAL_MAX];
     
    9296}
    9397
    94 
    95 /** Process keyboard interrupt. Does not work in simics? */
    96 static void serial_interrupt(int n, void *stack)
     98static void serial_handler(void)
    9799{
    98         serial_t *sd = (serial_t *)console.data;
     100        serial_t *sd = (serial_t *) console.data;
    99101        char ch;
    100102
     
    108110}
    109111
     112/** Process keyboard interrupt. Does not work in simics? */
     113static void serial_irq_handler(irq_t *irq, void *arg, ...)
     114{
     115        if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
     116                ipc_irq_send_notif(irq);
     117        else
     118                serial_handler();
     119}
    110120
     121static irq_ownership_t serial_claim(void)
     122{
     123        return IRQ_ACCEPT;
     124}
    111125
    112126static chardev_operations_t serial_ops = {
     
    117131};
    118132
    119 iroutine old_timer;
    120 /** Do polling on timer interrupt */
    121 static void timer_replace(int n, istate_t *istate)
    122 {
    123         old_timer(n, istate);
    124         serial_interrupt(n, istate);
    125 }
    126 
    127 void serial_console(void)
     133void serial_console(devno_t devno)
    128134{
    129135        serial_t *sd = &sconf[0];
     
    133139        console.data = sd;
    134140        kb_enabled = true;
     141       
     142        irq_initialize(&serial_irq);
     143        serial_irq.devno = devno;
     144        serial_irq.inr = SERIAL_IRQ;
     145        serial_irq.claim = serial_claim;
     146        serial_irq.handler = serial_irq_handler;
     147        irq_register(&serial_irq);
    135148
    136 //      int_register(2, "serial_drvr", serial_interrupt);
    137149        /* I don't know why, but the serial interrupts simply
    138150         * don't work on simics
    139151         */
    140         old_timer = int_register(TIMER_IRQ, "serial_drvr_poll", timer_replace);
     152        timer_fnc = &serial_handler;
    141153       
    142154        stdin = &console;
  • kernel/arch/mips32/src/exception.c

    r19de05f r7688b5d  
    4646#include <func.h>
    4747#include <console/kconsole.h>
     48#include <ddi/irq.h>
    4849#include <arch/debugger.h>
    4950
     
    146147        cause = (cp0_cause_read() >> 8) &0xff;
    147148       
    148         for (i = 0; i < 8; i++)
    149                 if (cause & (1 << i))
    150                         exc_dispatch(i+INT_OFFSET, istate);
     149        for (i = 0; i < 8; i++) {
     150                if (cause & (1 << i)) {
     151                        irq_t *irq = irq_dispatch_and_lock(i);
     152                        if (irq) {
     153                                /*
     154                                 * The IRQ handler was found.
     155                                 */
     156                                irq->handler(irq, irq->arg);
     157                                spinlock_unlock(&irq->lock);
     158                        } else {
     159                                /*
     160                                 * Spurious interrupt.
     161                                 */
     162#ifdef CONFIG_DEBUG
     163                                printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, i);
     164#endif
     165                        }
     166                }
     167        }
    151168}
    152169
     
    162179
    163180        /* Clear exception table */
    164         for (i=0;i < IVT_ITEMS; i++)
     181        for (i = 0; i < IVT_ITEMS; i++)
    165182                exc_register(i, "undef", (iroutine) unhandled_exception);
     183       
    166184        exc_register(EXC_Bp, "bkpoint", (iroutine) breakpoint_exception);
    167185        exc_register(EXC_RI, "resinstr", (iroutine) reserved_instr_exception);
  • kernel/arch/mips32/src/interrupt.c

    r19de05f r7688b5d  
    4040#include <time/clock.h>
    4141#include <arch/drivers/arc.h>
     42#include <ipc/sysipc.h>
     43#include <ddi/device.h>
     44#include <ddi/irq.h>
    4245
    43 #include <ipc/sysipc.h>
     46#define IRQ_COUNT 8
     47#define TIMER_IRQ 7
     48
     49function timer_fnc = NULL;
     50static irq_t timer_irq;
    4451
    4552/** Disable interrupts.
     
    9299}
    93100
    94 static void timer_exception(int n, istate_t *istate)
     101static irq_ownership_t timer_claim(void)
     102{
     103        return IRQ_ACCEPT;
     104}
     105
     106static void timer_irq_handler(irq_t *irq, void *arg, ...)
    95107{
    96108        unsigned long drift;
     
    104116        cp0_compare_write(nextcount);
    105117        clock();
    106 }
    107 
    108 static void swint0(int n, istate_t *istate)
    109 {
    110         cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */
    111         ipc_irq_send_notif(0);
    112 }
    113 
    114 static void swint1(int n, istate_t *istate)
    115 {
    116         cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */
    117         ipc_irq_send_notif(1);
     118       
     119        if (timer_fnc != NULL)
     120                timer_fnc();
    118121}
    119122
     
    121124void interrupt_init(void)
    122125{
    123         int_register(TIMER_IRQ, "timer", timer_exception);
    124         int_register(0, "swint0", swint0);
    125         int_register(1, "swint1", swint1);
     126        irq_init(IRQ_COUNT, IRQ_COUNT);
     127       
     128        irq_initialize(&timer_irq);
     129        timer_irq.devno = device_assign_devno();
     130        timer_irq.inr = TIMER_IRQ;
     131        timer_irq.claim = timer_claim;
     132        timer_irq.handler = timer_irq_handler;
     133        irq_register(&timer_irq);
     134       
    126135        timer_start();
    127 }
    128 
    129 static void ipc_int(int n, istate_t *istate)
    130 {
    131         ipc_irq_send_notif(n-INT_OFFSET);
    132 }
    133 
    134 /* Reregister irq to be IPC-ready */
    135 void irq_ipc_bind_arch(unative_t irq)
    136 {
    137         /* Do not allow to redefine timer */
    138         /* Swint0, Swint1 are already handled */
    139         if (irq == TIMER_IRQ || irq < 2)
    140                 return;
    141         int_register(irq, "ipc_int", ipc_int);
     136        cp0_unmask_int(TIMER_IRQ);
    142137}
    143138
  • kernel/arch/mips32/src/mips32.c

    r19de05f r7688b5d  
    5555#include <genarch/fb/fb.h>
    5656#include <macros.h>
     57#include <ddi/device.h>
    5758
    5859#include <arch/asm/regname.h>
     
    99100
    100101        /* Copy the exception vectors to the right places */
    101         memcpy(TLB_EXC, (char *)tlb_refill_entry, EXCEPTION_JUMP_SIZE);
    102         memcpy(NORM_EXC, (char *)exception_entry, EXCEPTION_JUMP_SIZE);
    103         memcpy(CACHE_EXC, (char *)cache_error_entry, EXCEPTION_JUMP_SIZE);
    104 
    105         interrupt_init();
     102        memcpy(TLB_EXC, (char *) tlb_refill_entry, EXCEPTION_JUMP_SIZE);
     103        memcpy(NORM_EXC, (char *) exception_entry, EXCEPTION_JUMP_SIZE);
     104        memcpy(CACHE_EXC, (char *) cache_error_entry, EXCEPTION_JUMP_SIZE);
     105       
    106106        /*
    107107         * Switch to BEV normal level so that exception vectors point to the kernel.
     
    114114         */
    115115        cp0_mask_all_int();
    116 
    117         /*
    118          * Unmask hardware clock interrupt.
    119          */
    120         cp0_unmask_int(TIMER_IRQ);
    121 
    122         console_init();
     116               
    123117        debugger_init();
    124118}
     
    126120void arch_post_mm_init(void)
    127121{
     122        interrupt_init();
     123        console_init(device_assign_devno());
    128124#ifdef CONFIG_FB
    129125        fb_init(0x12000000, 640, 480, 24, 1920, false); // gxemul framebuffer
    130126#endif
    131         sysinfo_set_item_val("machine." STRING(MACHINE),NULL,1);
     127        sysinfo_set_item_val("machine." STRING(MACHINE), NULL, 1);
    132128}
    133129
Note: See TracChangeset for help on using the changeset viewer.