Subject: Re: [RFC] Fix for interrupt distribution

From: Anton Blanchard <[email-masked]>
Date: Fri, 17 Nov 2006 02:36:16 +1100

Hi,

Thanks for fixing this problem. One thing I noticed in the patch:

> +	np = cpuid_to_of_node(boot_cpuid);
> +	BUG_ON(!np);
> +	ireg = get_property(np, "ibm,ppc-interrupt-gserver#s", &ilen);
> +	hcpuid = get_hard_smp_processor_id(boot_cpuid);
> +
> +	if (ireg[0] == hcpuid)
> +		default_distrib_server = ireg[1];
> +	else
> +		default_distrib_server = ireg[3];

While this will work on current firmware it would be more robust to loop
through interrupt-gserver#s until you find your cpuid. For example we
set up multiple interrupt-gserver#s entries in the lab so we can have
chip, node local and global targets:

ibm,ppc-interrupt-server#s
	00000002 00000003

ibm,ppc-interrupt-gserver#s
	00000002 000000ff 00000003 000000ff 00000002 000000f7
	00000003 000000f7 00000002 000000d7
	00000003 000000d7

We always put the global target at the end (0xd7 in this case) because
the current code in Linux just grabs the last entry in the array to get
the global server. So the question is, do we look for the first or the
last entry that matches your cpuid to find the global server?

It might be worth getting something added to the architecture (PAPR) to
clear it up. To match what current Linux does, we would want servers to
go from including the least to the most cpus, so the global one is at
the end.

Anton