irqreturn_t px_hotspot_isr(int irq, void * dev)
{
	struct pt_regs *regs;

	unsigned int pid;
	unsigned int tid;
	unsigned int pc;
	unsigned int ts;
	unsigned long flags;
	irqreturn_t ret;

	local_irq_save(flags);

	ret = IRQ_NONE;

	regs = get_irq_regs();

	pid = current->tgid;
	tid = current->pid;
	pc  = regs->ARM_pc;
	ts  = get_timestamp();

	if (irq == get_timer_irq())
	{
		ret = px_timer_isr(pid, tid, pc, ts);
	}
	else if (irq == g_pmu_irq_num)
	{
		ret = px_pmu_isr(pid, tid, pc, ts);
	}

	local_irq_restore(flags);

	return ret;
}
示例#2
0
int stop_tbs(void)
{
#ifdef HW_TBS
	free_irq(get_timer_irq(), dev_id);
	tbs_running = false;

	/* Disable the timer */
	TMR_CER(timer_group) &= ~(0x1 << timer_no);

	/* Disable interrupt on match0 */;
	TMR_IERn(timer_group, timer_no) = 0;

	return 0;
#else
	tbs_running = false;

	hrtimer_cancel(&hrtimer_for_tbs);

	return 0;
#endif
}
irqreturn_t px_css_isr(int irq, void * dev)
{
	struct pt_regs *regs;

	unsigned int pid;
	unsigned int tid;
	unsigned int cpu;
	unsigned long flags;
	unsigned long long ts;
	irqreturn_t ret;

	local_irq_save(flags);

	ret = IRQ_NONE;

	regs = get_irq_regs();

	pid = current->tgid;
	tid = current->pid;

	cpu = smp_processor_id();
	
	ts = get_timestamp();

#ifdef HW_TBS
	if (irq == get_timer_irq())
	{
		ret = px_timer_isr(regs, pid, tid, cpu, ts);
	}
	else
#endif
	{
		ret = px_pmu_isr(regs, pid, tid, cpu, ts);
	}

	local_irq_restore(flags);

	return ret;
}
示例#4
0
int start_tbs(bool is_start_paused)
{
#ifdef HW_TBS
	int ret;

	select_timer();
	init_ap_timer();

	ret = request_irq(get_timer_irq(), px_hotspot_isr, IRQF_TIMER/*|IRQF_DISABLED*/, "CPA Timer", dev_id);

	if (ret != 0)
	{
		printk(KERN_ALERT "[CPA] Failed to request IRQ: %d\n", get_timer_irq());
		return ret;
	}

	/* Enable interrupt on match0 */
	TMR_IERn(timer_group, timer_no) = 1;

	/* Prime the match register */
	TMR_Tn_Mm(timer_group, timer_no, 0) = g_tbs_settings.interval * get_timer_freq() / 1000;

	if (!is_start_paused)
	{
		tbs_running = true;

		/* Enable the timer */;
		TMR_CER(timer_group) |= 0x1 << timer_no;
	}
	else
	{
		tbs_running = false;
		/* Disable the timer */
		//TMR_CER(timer_group) &= ~(0x1 << timer_no);

		/* Enable the timer */;
		TMR_CER(timer_group) |= 0x1 << timer_no;
	}

	return 0;
#else
	int ret;
	ktime_t ktime;
	unsigned long delay_in_ns = g_tbs_settings.interval * NSEC_PER_USEC;

	if (!is_start_paused)
	{
		tbs_running = true;
	}
	else
	{
		tbs_running = false;
	}

	ktime = ktime_set(0, delay_in_ns);

	hrtimer_init(&hrtimer_for_tbs, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

	hrtimer_for_tbs.function = hrtimer_func;

	ret = hrtimer_start(&hrtimer_for_tbs, ktime, HRTIMER_MODE_REL);

	return 0;
#endif
}