172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton/* 272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Copyright (C) 2013 Imagination Technologies 372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Author: Paul Burton <paul.burton@imgtec.com> 472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * 572e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Based on smp-cmp.c: 672e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Copyright (C) 2007 MIPS Technologies, Inc. 772e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Author: Chris Dearman (chris@mips.com) 872e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * 972e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * This program is free software; you can redistribute it and/or modify it 1072e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * under the terms of the GNU General Public License as published by the 1172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * Free Software Foundation; either version 2 of the License, or (at your 1272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton * option) any later version. 1372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton */ 1472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 1572e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton#include <linux/printk.h> 1672e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 1772e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton#include <asm/gic.h> 18d050894435cdc78807e714a0148527542a583e87Paul Burton#include <asm/mips-cpc.h> 1972e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton#include <asm/smp-ops.h> 2072e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 2172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burtonvoid gic_send_ipi_single(int cpu, unsigned int action) 2272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton{ 2372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton unsigned long flags; 2472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton unsigned int intr; 25d050894435cdc78807e714a0148527542a583e87Paul Burton unsigned int core = cpu_data[cpu].core; 2672e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 2772e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton pr_debug("CPU%d: %s cpu %d action %u status %08x\n", 2872e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton smp_processor_id(), __func__, cpu, action, read_c0_status()); 2972e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 3072e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton local_irq_save(flags); 3172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 3272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton switch (action) { 3372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton case SMP_CALL_FUNCTION: 3472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton intr = plat_ipi_call_int_xlate(cpu); 3572e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton break; 3672e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 3772e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton case SMP_RESCHEDULE_YOURSELF: 3872e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton intr = plat_ipi_resched_int_xlate(cpu); 3972e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton break; 4072e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 4172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton default: 4272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton BUG(); 4372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton } 4472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 4572e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton gic_send_ipi(intr); 46d050894435cdc78807e714a0148527542a583e87Paul Burton 47d050894435cdc78807e714a0148527542a583e87Paul Burton if (mips_cpc_present() && (core != current_cpu_data.core)) { 48d050894435cdc78807e714a0148527542a583e87Paul Burton while (!cpumask_test_cpu(cpu, &cpu_coherent_mask)) { 49d050894435cdc78807e714a0148527542a583e87Paul Burton mips_cpc_lock_other(core); 50d050894435cdc78807e714a0148527542a583e87Paul Burton write_cpc_co_cmd(CPC_Cx_CMD_PWRUP); 51d050894435cdc78807e714a0148527542a583e87Paul Burton mips_cpc_unlock_other(); 52d050894435cdc78807e714a0148527542a583e87Paul Burton } 53d050894435cdc78807e714a0148527542a583e87Paul Burton } 54d050894435cdc78807e714a0148527542a583e87Paul Burton 5572e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton local_irq_restore(flags); 5672e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton} 5772e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 5872e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burtonvoid gic_send_ipi_mask(const struct cpumask *mask, unsigned int action) 5972e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton{ 6072e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton unsigned int i; 6172e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton 6272e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton for_each_cpu(i, mask) 6372e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton gic_send_ipi_single(i, action); 6472e20142b2bf4cf1c3071e6cf49d01f55f2e1e53Paul Burton} 65