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; }
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; }
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 }