Changeset de57e060 in mainline for kernel/arch/ia64/src/ski/ski.c


Ignore:
Timestamp:
2006-10-18T20:51:15Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
80ca47e
Parents:
cd13c2a
Message:

Convert ia64 to the new IRQ and notification scheme.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/ski/ski.c

    rcd13c2a rde57e060  
    3838#include <arch/interrupt.h>
    3939#include <sysinfo/sysinfo.h>
     40#include <arch/types.h>
     41#include <typedefs.h>
     42#include <ddi/device.h>
     43#include <ddi/irq.h>
     44#include <ipc/irq.h>
     45#include <synch/spinlock.h>
     46#include <arch/asm.h>
     47
     48#define SKI_KBD_INR     0
     49
     50static irq_t ski_kbd_irq;
     51static devno_t ski_kbd_devno;
    4052
    4153chardev_t ski_console;
    4254chardev_t ski_uconsole;
    43 static bool kb_disable;
    44 int kbd_uspace=0;
     55
     56static bool kbd_disabled;
    4557
    4658static void ski_putchar(chardev_t *d, const char ch);
     
    5870{
    5971        __asm__ volatile (
    60                 "mov r15=%0\n"
    61                 "mov r32=%1\n"          /* r32 is in0 */
     72                "mov r15 = %0\n"
     73                "mov r32 = %1\n"        /* r32 is in0 */
    6274                "break 0x80000\n"       /* modifies r8 */
    6375                :
     
    8496       
    8597        __asm__ volatile (
    86                 "mov r15=%1\n"
     98                "mov r15 = %1\n"
    8799                "break 0x80000;;\n"     /* modifies r8 */
    88                 "mov %0=r8;;\n"         
     100                "mov %0 = r8;;\n"               
    89101
    90102                : "=r" (ch)
    91103                : "i" (SKI_GETCHAR)
    92                 : "r15",  "r8"
     104                : "r15", "r8"
    93105        );
    94106
     
    104116        int ch;
    105117
    106         while(!(ch=ski_getchar()))
     118        while(!(ch = ski_getchar()))
    107119                ;
    108120        if(ch == '\r')
     
    116128        char ch;
    117129        static char last;
    118 
    119         if (kb_disable)
     130        ipl_t ipl;
     131
     132        ipl = interrupts_disable();
     133
     134        if (kbd_disabled) {
     135                interrupts_restore(ipl);
    120136                return;
     137        }
     138               
     139        spinlock_lock(&ski_kbd_irq.lock);
    121140
    122141        ch = ski_getchar();
    123142        if(ch == '\r')
    124143                ch = '\n';
    125         if (ch){
    126                 if(kbd_uspace){
     144        if (ch) {
     145                if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) {
    127146                        chardev_push_character(&ski_uconsole, ch);
    128                         virtual_interrupt(IRQ_KBD,NULL);
    129                 }
    130                 else {
     147                        ipc_irq_send_notif(&ski_kbd_irq);
     148                } else {
    131149                        chardev_push_character(&ski_console, ch);
    132150                }       
    133                 last = ch;             
     151                last = ch;
     152                spinlock_unlock(&ski_kbd_irq.lock);
     153                interrupts_restore(ipl);
    134154                return;
    135         }       
    136 
    137         if (last){
    138                 if(kbd_uspace){
     155        }
     156
     157        if (last) {
     158                if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) {
    139159                        chardev_push_character(&ski_uconsole, 0);
    140                         virtual_interrupt(IRQ_KBD,NULL);
     160                        ipc_irq_send_notif(&ski_kbd_irq);
    141161                }
    142                 else {
    143                 }       
    144                 last = 0;               
    145         }       
    146 
     162                last = 0;
     163        }
     164
     165        spinlock_unlock(&ski_kbd_irq.lock);
     166        interrupts_restore(ipl);
    147167}
    148168
    149169/* Called from getc(). */
    150 static void ski_kb_enable(chardev_t *d)
    151 {
    152         kb_disable = false;
     170static void ski_kbd_enable(chardev_t *d)
     171{
     172        kbd_disabled = false;
    153173}
    154174
    155175/* Called from getc(). */
    156 static void ski_kb_disable(chardev_t *d)
    157 {
    158         kb_disable = true;     
     176static void ski_kbd_disable(chardev_t *d)
     177{
     178        kbd_disabled = true;   
     179}
     180
     181/** Decline to service hardware IRQ.
     182 *
     183 * This is only a virtual IRQ, so always decline.
     184 *
     185 * @return Always IRQ_DECLINE.
     186 */
     187static irq_ownership_t ski_kbd_claim(void)
     188{
     189        return IRQ_DECLINE;
    159190}
    160191
    161192static chardev_operations_t ski_ops = {
    162         .resume = ski_kb_enable,
    163         .suspend = ski_kb_disable,
     193        .resume = ski_kbd_enable,
     194        .suspend = ski_kbd_disable,
    164195        .write = ski_putchar,
    165196        .read = ski_getchar_blocking
     
    174205{
    175206        __asm__ volatile (
    176                 "mov r15=%0\n"
     207                "mov r15 = %0\n"
    177208                "break 0x80000\n"
    178209                :
     
    186217        stdout = &ski_console;
    187218
     219        ski_kbd_devno = device_assign_devno();
     220       
     221        irq_initialize(&ski_kbd_irq);
     222        ski_kbd_irq.inr = SKI_KBD_INR;
     223        ski_kbd_irq.devno = ski_kbd_devno;
     224        ski_kbd_irq.claim = ski_kbd_claim;
     225        irq_register(&ski_kbd_irq);
     226
    188227}
    189228
     
    196235void ski_set_console_sysinfo(void)
    197236{
    198         sysinfo_set_item_val("kbd",NULL,true);
    199         sysinfo_set_item_val("kbd.irq",NULL,IRQ_KBD);
     237        sysinfo_set_item_val("kbd", NULL, true);
     238        sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR);
     239        sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno);
     240}
     241
     242void ski_kbd_grab(void)
     243{
     244        ski_kbd_irq.notif_cfg.notify = false;
     245}
     246
     247void ski_kbd_release(void)
     248{
     249        if (ski_kbd_irq.notif_cfg.answerbox)
     250                ski_kbd_irq.notif_cfg.notify = true;
    200251}
    201252
Note: See TracChangeset for help on using the changeset viewer.