Ignore:
Timestamp:
Aug 13, 2012, 10:52:25 PM (12 years ago)
Author:
alain
Message:

Introducing support for XICU

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/sys/kernel_init.c

    r199 r203  
    7676
    7777    // step 2 : initialise page table addresse arrays
    78     //          it scans all tasks contexts in the scheduler
    79     //          and get VSID, PTAB and PTPR values
     78    //          each processor scans all tasks contexts in its
     79    //          private scheduler and get VSID, PTAB and PTPR values
    8080
    8181    unsigned int ltid;
     
    8787        unsigned int ptab_vaddr = _get_context_slot( ltid , CTX_PTAB_ID );
    8888        unsigned int ptab_paddr = _get_context_slot( ltid , CTX_PTPR_ID ) << 13;
     89
    8990        _ptabs_vaddr[vspace_id] = ptab_vaddr;
    9091        _ptabs_paddr[vspace_id] = ptab_paddr;
     
    106107    }
    107108 
    108     // step 3 : compute and set ICU mask
     109    // step 3 : compute and set ICU masks
     110    //          there is at most 32 interrupts per processor
     111    //          software interrupts are not supported yet
     112
    109113    unsigned int irq_id;
    110     unsigned int mask = 0;
     114    unsigned int hwi_mask = 0;
     115    unsigned int pti_mask = 0;
     116
    111117    for ( irq_id = 0 ; irq_id < 32 ; irq_id++ )
    112118    {
    113         unsigned int entry   = _get_interrupt_vector_entry(irq_id);
    114         if ( entry ) mask = mask | 0x1<< irq_id;
    115     }
    116     _icu_write( cluster_id,
    117                 lpid,
    118                 ICU_MASK_SET,
    119                 mask );
     119        unsigned int entry  = _get_interrupt_vector_entry(irq_id);
     120        unsigned int isr    = entry & 0x000000FF;
     121
     122        if ( (isr == ISR_DMA) || (isr == ISR_IOC) || (isr == ISR_TTY) )
     123        {
     124             hwi_mask = hwi_mask | 0x1<< irq_id;
     125        }
     126        else if ( (isr == ISR_SWITCH) || (isr == ISR_TIMER) )
     127        {
     128            pti_mask = pti_mask | 0x1<< irq_id;
     129        }
     130    }
     131    _icu_set_mask( cluster_id, lpid, hwi_mask, 0 ); // set HWI_MASK
     132    _icu_set_mask( cluster_id, lpid, pti_mask, 1 );     // set PTI_MASK
    120133   
    121134#if GIET_DEBUG_INIT
     
    123136_puts("\n[GIET DEBUG] step 3 for processor ");
    124137_putd( proc_id );
    125 _puts(" / ICU mask = ");
    126 _putw( mask );
     138_puts("\n - ICU HWI_MASK = ");
     139_putw( hwi_mask );
     140_puts("\n - ICU PTI_MASK = ");
     141_putw( pti_mask );
    127142_puts("\n");
    128143_release_lock(&_tty_put_lock);
     
    133148    if ( tasks > 1 )
    134149    {
    135         unsigned int period     = GIET_TICK_VALUE;
    136         unsigned int mode       = 0x3;
    137         _timer_access( 0,                       // write access
    138                        cluster_id,
    139                        proc_id,
    140                        TIMER_PERIOD,
    141                        &period );
    142         _timer_access( 0,                       // write access
    143                        cluster_id,
    144                        proc_id,
    145                        TIMER_MODE,
    146                        &mode );
     150        _timer_start( cluster_id,
     151                      proc_id,
     152                      GIET_TICK_VALUE );
    147153       
    148154#if GIET_DEBUG_INIT
     
    150156_puts("\n[GIET DEBUG] Step 4 for processor ");
    151157_putd( proc_id );
    152 _puts(" / TICK activated\n");
     158_puts(" / context switch activated\n");
    153159_release_lock(&_tty_put_lock);
    154160#endif
Note: See TracChangeset for help on using the changeset viewer.