Changeset 323a5aaf in mainline for kernel


Ignore:
Timestamp:
2008-11-30T12:17:56Z (17 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0ad9e47
Parents:
57e76cb
Message:

Legacy IRQ support, uspace NS16550 support, some minor changes

Location:
kernel
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • kernel/Makefile

    r57e76cb r323a5aaf  
    127127endif
    128128
     129ifeq ($(CONFIG_I8042_INTERRUPT_DRIVEN),y)
     130        DEFS += -DCONFIG_I8042_INTERRUPT_DRIVEN
     131endif
     132
    129133ifeq ($(CONFIG_NS16550_INTERRUPT_DRIVEN),y)
    130134        DEFS += -DCONFIG_NS16550_INTERRUPT_DRIVEN
     135endif
     136
     137ifeq ($(CONFIG_IOSAPIC),y)
     138        DEFS += -DCONFIG_IOSAPIC
    131139endif
    132140
  • kernel/arch/ia64/include/interrupt.h

    r57e76cb r323a5aaf  
    5757#define IRQ_MOUSE               252
    5858#define INTERRUPT_SPURIOUS      15
     59#define LAGACY_INTERRUPT_BASE   0x20
    5960
    6061/** General Exception codes. */
     
    153154extern void disabled_fp_register(uint64_t vector, istate_t *istate);
    154155
     156
    155157#endif
    156158
  • kernel/arch/ia64/src/drivers/ega.c

    r57e76cb r323a5aaf  
    9595        sysinfo_set_item_val("fb.width", NULL, ROW);
    9696        sysinfo_set_item_val("fb.height", NULL, ROWS);
     97        sysinfo_set_item_val("fb.blinking", NULL, true);
    9798        sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM & 0xffffffff);
    9899       
  • kernel/arch/ia64/src/ia64.c

    r57e76cb r323a5aaf  
    6464
    6565/*NS16550 as a COM 1*/
    66 #define NS16550_IRQ 4
     66#define NS16550_IRQ (4+LAGACY_INTERRUPT_BASE)
    6767#define NS16550_PORT 0x3f8
    6868
    6969bootinfo_t *bootinfo;
     70
     71static uint64_t iosapic_base=0xfec00000;
    7072
    7173void arch_pre_main(void)
     
    112114}
    113115
     116static void iosapic_init(void)
     117{
     118
     119        uint64_t IOSAPIC = PA2KA((unative_t)(iosapic_base))|FW_OFFSET;
     120        int i;
     121       
     122       
     123        for(i=0;i<16;i++)
     124        {
     125       
     126                if(i==2) continue;       //Disable Cascade interrupt
     127                ((uint32_t*)(IOSAPIC+0x00))[0]=0x10+2*i;
     128                srlz_d();
     129                ((uint32_t*)(IOSAPIC+0x10))[0]=LAGACY_INTERRUPT_BASE+i;
     130                srlz_d();
     131                ((uint32_t*)(IOSAPIC+0x00))[0]=0x10+2*i+1;
     132                srlz_d();
     133                ((uint32_t*)(IOSAPIC+0x10))[0]=1<<(56-32);
     134                srlz_d();
     135        }
     136
     137}
     138
     139
    114140void arch_post_mm_init(void)
    115141{
    116142        if(config.cpu_active==1)
    117143        {
     144                iosapic_init();
     145       
    118146                irq_init(INR_COUNT, INR_COUNT);
    119147#ifdef SKI
     
    123151#endif 
    124152        }
    125         it_init();     
     153        it_init();
     154               
    126155}
    127156
     
    143172                i8042_poll();
    144173#ifdef CONFIG_NS16550
     174        #ifndef CONFIG_NS16550_INTERRUPT_DRIVEN
    145175                ns16550_poll();
     176        #endif 
    146177#endif
    147178                thread_usleep(POLL_INTERVAL);
     
    149180}
    150181#endif
     182
     183
     184static void end_of_irq_void(void *cir_arg __attribute__((unused)),inr_t inr __attribute__((unused)))
     185{
     186        return;
     187}
     188
    151189
    152190void arch_post_smp_init(void)
     
    172210
    173211#ifdef CONFIG_NS16550
    174                 ns16550_init(kbd, NS16550_IRQ, NS16550_PORT); // as a COM 1
     212                ns16550_init(kbd, NS16550_IRQ, NS16550_PORT,end_of_irq_void,NULL); // as a COM 1
    175213#else
    176214#endif
     
    188226        sysinfo_set_item_val("ia64_iospace.address", NULL, true);
    189227        sysinfo_set_item_val("ia64_iospace.address.virtual", NULL, IO_OFFSET);
     228
     229
     230
     231
    190232
    191233}
     
    238280#ifdef SKI
    239281        ski_kbd_grab();
     282#else
     283        i8042_grab();
     284        #ifdef CONFIG_NS16550
     285                ns16550_grab();
     286        #endif 
     287               
    240288#endif 
    241289}
     
    247295#ifdef SKI
    248296        ski_kbd_release();
     297        i8042_release();
     298#else   
     299        #ifdef CONFIG_NS16550
     300                ns16550_release();
     301        #endif 
     302
    249303#endif
    250304}
  • kernel/arch/ia64/src/interrupt.c

    r57e76cb r323a5aaf  
    236236}
    237237
    238 static void end_of_local_irq()
     238static void end_of_local_irq(void)
    239239{
    240240        asm volatile ("mov cr.eoi=r0;;");
     
    244244void external_interrupt(uint64_t vector, istate_t *istate)
    245245{
    246         irq_t *irq;
    247246        cr_ivr_t ivr;
    248247       
     
    250249        srlz_d();
    251250
    252         irq = irq_dispatch_and_lock(ivr.vector);
    253         if (irq) {
    254                 irq->handler(irq, irq->arg);
    255                 spinlock_unlock(&irq->lock);
    256         } else {
    257251                switch (ivr.vector) {
    258252                case INTERRUPT_SPURIOUS:
     
    271265
    272266                default:
    273                         panic("\nUnhandled External Interrupt Vector %d\n",
    274                             ivr.vector);
     267                        {
     268
     269                                int ack=false;
     270                                irq_t *irq = irq_dispatch_and_lock(ivr.vector);
     271                                if (irq) {
     272                                        /*
     273                                         * The IRQ handler was found.
     274                                         */
     275                 
     276                                        if (irq->preack) {
     277                                                /* Send EOI before processing the interrupt */
     278                                                end_of_local_irq();
     279                                                ack=true;
     280                                        }
     281                                        irq->handler(irq, irq->arg);
     282                                        spinlock_unlock(&irq->lock);
     283                                } else {
     284                                        /*
     285                                         * Unhandled interrupt.
     286                                         */
     287                                        end_of_local_irq();
     288                                        ack=true;
     289#ifdef CONFIG_DEBUG
     290                                        printf("\nUnhandled External Interrupt Vector %d\n",ivr.vector);
     291#endif
     292                                }
     293                                if(!ack) end_of_local_irq();
     294
     295                        }       
     296
     297
    275298                        break;
    276299                }
    277         }
    278300}
    279301
  • kernel/arch/ia64/src/ski/ski.c

    r57e76cb r323a5aaf  
    4545#include <synch/spinlock.h>
    4646#include <arch/asm.h>
     47#include <drivers/kbd.h>
    4748
    4849#define SKI_KBD_INR     0
     
    228229        sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR);
    229230        sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno);
     231        sysinfo_set_item_val("kbd.type", NULL, KBD_SKI);
    230232}
    231233
  • kernel/genarch/src/kbd/ns16550.c

    r57e76cb r323a5aaf  
    3939#include <genarch/kbd/scanc.h>
    4040#include <genarch/kbd/scanc_sun.h>
     41#include <arch/drivers/kbd.h>
    4142#ifndef ia64
    42 #include <arch/drivers/kbd.h>
    4343#include <arch/drivers/ns16550.h>
    4444#endif
     
    131131        ns16550_irq.cir_arg = cir_arg;
    132132        irq_register(&ns16550_irq);
     133
     134
     135        while ((ns16550_lsr_read(&ns16550) & LSR_DATA_READY))
     136                ns16550_rbr_read(&ns16550);
     137
    133138       
    134139        sysinfo_set_item_val("kbd", NULL, true);
    135 #ifndef ia64
    136140        sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
    137 #endif
    138141        sysinfo_set_item_val("kbd.devno", NULL, devno);
    139142        sysinfo_set_item_val("kbd.inr", NULL, inr);
    140143        sysinfo_set_item_val("kbd.address.virtual", NULL, port);
     144        sysinfo_set_item_val("kbd.port", NULL, port);
    141145
    142146#ifdef CONFIG_NS16550_INTERRUPT_DRIVEN
     
    148152#ifdef ia64
    149153        uint8_t c;
     154        // This switches rbr & ier to mode when accept baudrate constant
    150155        c = ns16550_lcr_read(&ns16550);
    151156        ns16550_lcr_write(&ns16550, 0x80 | c);
  • kernel/generic/src/ipc/irq.c

    r57e76cb r323a5aaf  
    101101                            code->cmds[i].value;
    102102                        break;
    103 #if defined(ia32) || defined(amd64)
     103#if defined(ia32) || defined(amd64) || defined(ia64)
    104104                case CMD_PORT_READ_1:
    105105                        dstval = inb((long) code->cmds[i].addr);
  • kernel/kernel.config

    r57e76cb r323a5aaf  
    142142! [ARCH=sparc64|ARCH=ia64] CONFIG_NS16550 (y/n)
    143143
     144# IOSapic on default address support (including legacy IRQ)
     145! [ARCH=ia64] CONFIG_IOSAPIC (y/n)
     146
     147# Interrupt-driven driver for Legacy Keyboard?
     148! [CONFIG_IOSAPIC=y] CONFIG_I8042_INTERRUPT_DRIVEN (y/n)
     149
    144150# Interrupt-driven driver for NS16550?
    145 ! [CONFIG_NS16550=y] CONFIG_NS16550_INTERRUPT_DRIVEN (n/y)
     151! [CONFIG_NS16550=y&((ARCH!=ia64)|CONFIG_IOSAPIC=y)] CONFIG_NS16550_INTERRUPT_DRIVEN (y/n)
    146152
    147153# Virtually indexed D-cache support
Note: See TracChangeset for help on using the changeset viewer.