Changeset 323a5aaf in mainline for kernel/arch/ia64/src


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/arch/ia64/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.