Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d371c0c1 authored by David S. Miller's avatar David S. Miller Committed by David S. Miller
Browse files

[SPARC64]: Pass multiple CPUs at once to hypervisor cross-call API.

parent c79f7677
Loading
Loading
Loading
Loading
+0 −54
Original line number Original line Diff line number Diff line
@@ -557,7 +557,6 @@ static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mas
	}
	}
}
}


#if 0
/* Multi-cpu list version.  */
/* Multi-cpu list version.  */
static int init_cpu_list(u16 *list, cpumask_t mask)
static int init_cpu_list(u16 *list, cpumask_t mask)
{
{
@@ -631,59 +630,6 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t


	put_cpu();
	put_cpu();
}
}
#else
/* Single-cpu list version.  */
static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
{
	int this_cpu = get_cpu();
	struct trap_per_cpu *tb = &trap_block[this_cpu];
	u64 *mondo = __va(tb->cpu_mondo_block_pa);
	u16 *cpu_list = __va(tb->cpu_list_pa);
	int i;

	mondo[0] = data0;
	mondo[1] = data1;
	mondo[2] = data2;
	wmb();

	for_each_cpu_mask(i, mask) {
		int retries = 0;

		do {
			register unsigned long func __asm__("%o5");
			register unsigned long arg0 __asm__("%o0");
			register unsigned long arg1 __asm__("%o1");
			register unsigned long arg2 __asm__("%o2");

			cpu_list[0] = i;
			func = HV_FAST_CPU_MONDO_SEND;
			arg0 = 1;
			arg1 = tb->cpu_list_pa;
			arg2 = tb->cpu_mondo_block_pa;

			__asm__ __volatile__("ta	%8"
					     : "=&r" (func), "=&r" (arg0),
					       "=&r" (arg1), "=&r" (arg2)
					     : "0" (func), "1" (arg0),
					       "2" (arg1), "3" (arg2),
					       "i" (HV_FAST_TRAP)
					     : "memory");
			if (likely(arg0 == HV_EOK))
				break;

			if (unlikely(++retries > 100)) {
				printk("CPU[%d]: sun4v mondo error %lu\n",
				       this_cpu, func);
				break;
			}

			udelay(2 * i);
		} while (1);
	}

	put_cpu();
}
#endif


/* Send cross call to all processors mentioned in MASK
/* Send cross call to all processors mentioned in MASK
 * except self.
 * except self.