Ignore:
Timestamp:
Jul 9, 2013, 3:54:53 PM (11 years ago)
Author:
meunier
Message:

Cosmétique + gestion du reset de l'irq du timer ou de l'xicu lors d'un task_switch

File:
1 edited

Legend:

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

    r238 r246  
    248248
    249249
    250 ////////////////////////////////////////////////
     250
     251///////////////////////////////////////////////////////////////////////
    251252// _timer_reset_irq_cpt()
    252 ////////////////////////////////////////////////
    253 //unsigned int _timer_reset_irq_cpt(unsigned int cluster_id, unsigned int local_id) {
    254 //    // parameters checking
    255 //    if (cluster_id >= NB_CLUSTERS) {
    256 //        return 1;
    257 //    }
    258 //    if (local_id >= NB_TIM_CHANNELS) {
    259 //        return 2;
    260 //    }
    261 //
    262 //#if USE_XICU
    263 //#error // not implemented
    264 //#else
    265 //    unsigned int * timer_address = (unsigned int *) ((char *) &seg_tim_base + (cluster_id * GIET_CLUSTER_INCREMENT));
    266 //    unsigned int timer_period = timer_address[local_id * TIMER_SPAN + TIMER_PERIOD];
    267 //
    268 //    timer_address[local_id * TIMER_SPAN + TIMER_PERIOD] = timer_period;
    269 //#endif
    270 //
    271 //    return 0;
    272 //}
     253///////////////////////////////////////////////////////////////////////
     254// This function resets the period at the end of which
     255// an interrupt is sent. To do so, we re-write the period
     256// ini the proper register, what causes the count to restart.
     257// The period value is read from the same (TIMER_PERIOD) register,
     258// this is why in appearance we do nothing useful (read a value
     259// from a register and write this value in the same register)
     260// This function is called during a context switch (user or preemptive)
     261///////////////////////////////////////////////////////////////////////
     262unsigned int _timer_reset_irq_cpt(unsigned int cluster_id, unsigned int local_id) {
     263    // parameters checking
     264    if (cluster_id >= NB_CLUSTERS) {
     265        return 1;
     266    }
     267    if (local_id >= NB_TIM_CHANNELS) {
     268        return 2;
     269    }
     270
     271#if USE_XICU
     272    unsigned int * timer_address = (unsigned int *) ((char *) &seg_icu_base + (cluster_id * GIET_CLUSTER_INCREMENT));
     273    unsigned int timer_period = timer_address[XICU_REG(XICU_PTI_PER, local_id)];
     274
     275    // we write 0 first because if the timer is currently running, the corresponding timer counter is not reset
     276    timer_address[XICU_REG(XICU_PTI_PER, local_id)] = 0;
     277    timer_address[XICU_REG(XICU_PTI_PER, local_id)] = timer_period;
     278#else
     279    // We suppose that the TIMER_MODE register value is 0x3
     280    unsigned int * timer_address = (unsigned int *) ((char *) &seg_tim_base + (cluster_id * GIET_CLUSTER_INCREMENT));
     281    unsigned int timer_period = timer_address[local_id * TIMER_SPAN + TIMER_PERIOD];
     282
     283    timer_address[local_id * TIMER_SPAN + TIMER_PERIOD] = timer_period;
     284#endif
     285
     286    return 0;
     287}
    273288
    274289
     
    599614    unsigned int buf_xaddr = 0;    // user buffer virtual address in IO space (if IOMMU)
    600615    paddr_t      buf_paddr = 0;    // user buffer physical address (if no IOMMU),
    601                                
     616
    602617    // check buffer alignment
    603618    if ((unsigned int) user_vaddr & 0x3)
     
    626641    {
    627642        // get ppn and flags for each vpn
    628         unsigned int ko = _v2p_translate( (page_table_t*)user_pt_vbase,
    629                                            vpn,
    630                                            &ppn,
    631                                            &flags);
     643        unsigned int ko = _v2p_translate((page_table_t *) user_pt_vbase,
     644                                          vpn,
     645                                          &ppn,
     646                                          &flags);
    632647        // check access rights
    633         if (ko)                                 
     648        if (ko)
    634649        {
    635650            _get_lock(&_tty_put_lock);
     
    12541269// - length : number of bytes to be transfered.
    12551270//////////////////////////////////////////////////////////////////////////////////
    1256 unsigned int _fb_sync_write( unsigned int   offset,
    1257                              const void*    buffer,
    1258                              unsigned int   length)
    1259 {
    1260     unsigned char* fb_address = (unsigned char *) &seg_fbf_base + offset;
     1271
     1272unsigned int _fb_sync_write(unsigned int offset,
     1273                            const void * buffer,
     1274                            unsigned int length)
     1275{
     1276    unsigned char * fb_address = (unsigned char *) &seg_fbf_base + offset;
    12611277    memcpy((void *) fb_address, (void *) buffer, length);
    12621278    return 0;
Note: See TracChangeset for help on using the changeset viewer.