Esempio n. 1
0
static void calibrate(void)
{
	static RTIME cpu_tbase;
	static unsigned long apic_tbase;

	times.cpu_time = rd_CPU_ts();
#ifdef CONFIG_X86_LOCAL_APIC
	if (params.mp) {
		times.apic_time = apic_read(APIC_TMCCT);
	}
#endif /* CONFIG_X86_LOCAL_APIC */
	if (times.intrs < 0) {
		cpu_tbase  = times.cpu_time;
		apic_tbase = times.apic_time;
	}
	times.intrs++;
	if (++count == reset_count) {
		count = 0;
		times.cpu_time -= cpu_tbase;
		times.apic_time = apic_tbase - times.apic_time;
		rtf_put(0, &times, sizeof(times));
	}
	rt_pend_linux_irq(TIMER_8254_IRQ);
#ifdef CONFIG_X86_LOCAL_APIC
	if (params.mp) {
	        unsigned temp = (apic_read(APIC_ICR) & (~0xCDFFF)) | (APIC_DM_FIXED | APIC_DEST_ALLINC | LOCAL_TIMER_VECTOR);
		apic_write(APIC_ICR, temp);
	}
#endif /* CONFIG_X86_LOCAL_APIC */
}
Esempio n. 2
0
static int rt_timer_tick_ext(int irq, unsigned long data)
{
	RTIME t;
	int jit;

	if (loops++ < INILOOPS) {
		t0 = rdtsc();
	} else {
		t = rdtsc();
		if (use_parport) {
			outb(bit = 1 - bit, PARPORT); 
		}
		if ((jit = abs((int)(t - t0) - bus_period)) > maxj) {
			maxj = jit;
			if (maxj > bus_threshold) {
				int msg;
				msg = imuldiv(maxj, 1000000000, CPU_FREQ);
				rtf_put(0, &msg, sizeof(msg));
			}
		}
		t0 = t;
	}
	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		rt_times.linux_time += rt_times.linux_tick;
		hard_sti();
		rt_pend_linux_irq(TIMER_8254_IRQ);
		return 0;
	} 
	hard_sti();
	return 1;
}
Esempio n. 3
0
static int rt_timer_tick_ext(int irq, unsigned long data)
{
	int ret = 1;
	cpu_used[NR_RT_CPUS]++;
	if (passed++ < 5) {
		t0 = rdtsc();
	} else {
		t = rdtsc();
		if ((jit = t - t0 - imuldiv(rt_times.periodic_tick, CPU_FREQ, FREQ_8254)) < 0) {
			jit = -jit;
		}
		if (jit > maxj) {
			maxj = jit;
		}
		t0 = t;
	}

	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		rt_times.linux_time += rt_times.linux_tick;
		rt_pend_linux_irq(TIMER_8254_IRQ);
		ret = 0;
	} 
rt_sched_lock();
	if (Mode) {
		rt_sem_signal(&sem);
	} else {
		rt_task_resume(&thread);
	}
rt_sched_unlock();
	return ret;
}
Esempio n. 4
0
static void timer_tick(void)
{
	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		rt_times.linux_time += rt_times.linux_tick;
		rt_pend_linux_irq(TIMER_8254_IRQ);
	}
	if (run) {
		if (rt_waiting_return(tasknode, taskport)) {
			overuns++;
		}
		switch(run) {
			case 1: RT_sem_signal(tasknode, -taskport, rmt_sem);
				rt_printk("SEM SIGNAL %d\n", ++cnt);
				break;
			case 2:
				RT_task_resume(tasknode, -taskport, rmt_task);
				rt_printk("TASK RESUME %d\n", ++cnt);
				break;
			case 3:
				RT_send_if(tasknode, -taskport, rmt_task, run);
				rt_printk("TASK SEND %d\n", ++cnt);
				break;
		}
	}
}
Esempio n. 5
0
static void rt_timer_tick(void)
{
	cpu_used[NR_RT_CPUS]++;
	if (passed++ < 5) {
		t0 = rdtsc();
	} else {
		t = rdtsc();
		if ((jit = t - t0 - imuldiv(rt_times.periodic_tick, CPU_FREQ, FREQ_8254)) < 0) {
			jit = -jit;
		}
		if (jit > maxj) {
			maxj = jit;
		}
		t0 = t;
	}

	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		rt_times.linux_time += rt_times.linux_tick;
		rt_pend_linux_irq(TIMER_8254_IRQ);
	} 
	if (Mode) {
		rt_sem_signal(&sem);
	} else {
		rt_task_resume(&thread);
	}
}
Esempio n. 6
0
static void rtai_handler(int irqa, void *idx)
{
    int i;
    i = (long)idx;
    cnt[i]++;
    rt_pend_linux_irq(irq[i]);
}
Esempio n. 7
0
static void tmrisr(int irq)
{
	int cnt;
        outb(0x00, 0x43);
        cnt = inb(0x40);
        cnt |= (inb(0x40) << 8);
	if (cnt > tmrcnt) {
		tmrcnt = cnt;
	}
	rt_pend_linux_irq(irq);
}
Esempio n. 8
0
int irq_handler(int irq, xnintr_t *intr)
{
	int r = ((int (*)(void *))intr->isr)(intr);
	if (r & ENABLE_IRQ) {
		rt_enable_irq((intr)->irq);
	}
	if (r & PEND_IRQ) {
		rt_pend_linux_irq(intr->irq);
	}
	++intr->cnt;
	return 0;
}
Esempio n. 9
0
void c_handler (void)
{
	hal_root_domain->irqs[IRQ].acknowledge(IRQ);
	save_fpcr_and_enable_fpu(cr0);
	save_fpenv(saved_fpu_reg);
	restore_fpenv(my_fpu_reg);
	++cnt;
	++fcnt;
	save_fpenv(my_fpu_reg);
	restore_fpenv(saved_fpu_reg);
	restore_fpcr(cr0);
	rt_pend_linux_irq(IRQ);
}
Esempio n. 10
0
static void rt_timer_tick(void)
{
	char wakeup;
	rtf_put(CMDF, &wakeup, sizeof(wakeup));
	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		if (rt_times.linux_tick > 0) {
			rt_times.linux_time += rt_times.linux_tick;
		}
		rt_pend_linux_irq(TIMER_8254_IRQ);
	} 
}
Esempio n. 11
0
static void rt_timer_tick(void)
{
	struct rt_tasklet_struct *tasklet;
	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		if (rt_times.linux_tick > 0) {
			rt_times.linux_time += rt_times.linux_tick;
		}
		rt_pend_linux_irq(TIMER_8254_IRQ);
	}
	if ((tasklet = rt_find_tasklet_by_id(nam2num("TSKLET")))) {
		rt_exec_tasklet(tasklet);
	}
}
Esempio n. 12
0
static void timer_tick(void)
{
	rt_times.tick_time = rt_times.intr_time;
	rt_times.intr_time = rt_times.tick_time + rt_times.periodic_tick;
	rt_set_timer_delay(0);
	if (rt_times.tick_time >= rt_times.linux_time) {
		if (rt_times.linux_tick) {
			rt_times.linux_time += rt_times.linux_tick;
		}
		rt_pend_linux_irq(TIMER_8254_IRQ);
	}
	if (run) {
		if (rt_waiting_return(tasknode, taskport)) {
			overuns++;
		}
		rt_task_resume(&sup_task);
	}
}
Esempio n. 13
0
void rt_request_timer(void (*handler)(void), unsigned int tick, int unused)
{
	RTIME t;
	extern union rtai_tsc rtai_tsc;
	unsigned long flags;

	TRACE_RTAI_TIMER(TRACE_RTAI_EV_TIMER_REQUEST, handler, tick);
	flags = hard_lock_all();
/*
 * sync w/jiffie, wait for a OS timer 0 match and clear the match bit
 */
	rtai_tsc.tsc = 0;
	/* wait for a timer match 0 and clear the match bit */
	do {
	} while ( (signed long)(OSMR0 - OSCR) >= 0 );
        OSSR = OSSR_M0;

	/* set up rt_times structure */
	rt_times.linux_tick = LATCH;
	rt_times.periodic_tick = tick > 0 && tick < (RTIME)rt_times.linux_tick ? tick : rt_times.linux_tick;
	rt_times.tick_time  = t = rdtsc();
	rt_times.intr_time  = t + (RTIME)rt_times.periodic_tick;
	rt_times.linux_time = t + (RTIME)rt_times.linux_tick;

	/* Trick the scheduler - set this our way. */
//	tuned.setup_time_TIMER_CPUNIT = (int)(~(~0 >> 1)) + 1; /* smallest negative + 1 - for extra safety:-) */

	/* update Match-register */
	rt_set_timer_match_reg(rt_times.periodic_tick);

	irq_desc[TIMER_8254_IRQ].action->handler = soft_timer_interrupt;

	rt_free_global_irq(TIMER_8254_IRQ);
	rt_request_global_irq(TIMER_8254_IRQ, handler);

/*
 * pend linux timer irq to handle current jiffie 
 */
 	rt_pend_linux_irq(TIMER_8254_IRQ);
 
	hard_unlock_all(flags);

	return;
}
Esempio n. 14
0
static void calibrate(void)
{
	static int count = 0, gcount = -1;
	static unsigned long tbase, time, temp;
	time = apic_read(APIC_TMCCT);
	if (gcount < 0) {
		tbase = time;
	}
	gcount++;
	if (++count == RESET_COUNT) {
		time = tbase - time;
		count =  imuldiv(time, CLOCK_TICK_RATE, gcount*LATCH);
		printk("\n->>> MEASURED APIC_FREQ: %d (hz) [%d (s)], IN USE %d (hz) <<<-\n", count, gcount/100 + 1, FREQ_APIC);
		count = 0;
	}
	rt_pend_linux_irq(TIMER_8254_IRQ);
	temp = (apic_read(APIC_ICR) & (~0xCDFFF)) |
	       (APIC_DM_FIXED | APIC_DEST_ALLINC | LOCAL_TIMER_VECTOR);
	apic_write(APIC_ICR, temp);
}