On Thu, Dec 07, 2006 at 06:29:37PM +0530, Mohan Kumar M wrote:
> Maneesh,
>
> Can you check this ;-)
>
> =============================
>
> Hello,
>
> We have encountered a strange problem with kdump in ppc970 based
> machines. When a kdump kernel is booted with maxcpus=1 parameter,
> interrupt is distributed to non-existent cpus also. It created lot of
> interrupt missing problems.
>
> This problem can be resolved by passing the additional kernel parameter
> "noirqdistrib", which uses boot cpu id as interrupt distribution server.
>
> To overcome this problem, I have created the patch, which
> checks for the condition if the machine is ppc970 based and maxcpus
> kernel parameter is specified. If the condition is met, the default
> distribution server is assigned to be current boot cpu instead of
> reading from the gserver#s property.
>
> Tested on PPC970 based box and POWER5 based box.
>
Mohan,
This looks ok to me but perhaps you would like to take it through
ppc64 maintainers (ie on ppc64 mailinglist).
Thanks
Maneesh
> Patch is generated over 2.6.19-git7.
>
>
> o Kdump with maxcpus kernel parameter in PPC970xx creates interrupt
> distribution problem, so set default distribution server to the
> current cpu (i.e. boot cpu)
>
> Signed-off-by: Mohan Kumar M <[EMAIL PROTECTED]>
> ---
> arch/powerpc/platforms/pseries/xics.c | 35
> +++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> Index: linux-2.6.19-git7/arch/powerpc/platforms/pseries/xics.c
> ===================================================================
> --- linux-2.6.19-git7.orig/arch/powerpc/platforms/pseries/xics.c
> +++ linux-2.6.19-git7/arch/powerpc/platforms/pseries/xics.c
> @@ -680,6 +680,27 @@ static struct device_node *cpuid_to_of_n
> return NULL;
> }
>
> +static int is_processor_970(void)
> +{
> + unsigned long rval;
> + int rc;
> + rval = PVR_VER(mfspr(SPRN_PVR));
> +
> + switch(rval) {
> + case PV_970:
> + case PV_970FX:
> + case PV_970MP:
> + case PV_970GX:
> + rc = 1;
> + break;
> + default:
> + rc = 0;
> + break;
> + }
> +
> + return rc;
> +}
> +
> void __init xics_init_IRQ(void)
> {
> int i, j;
> @@ -688,6 +709,7 @@ void __init xics_init_IRQ(void)
> const u32 *ireg, *isize;
> int found = 0;
> u32 hcpuid;
> + int fix_970_intr_distrib = 0;
>
> ppc64_boot_msg(0x20, "XICS Init");
>
> @@ -707,6 +729,13 @@ void __init xics_init_IRQ(void)
>
> xics_init_host();
>
> + /* Kdump with maxcpus kernel parameter in PPC970xx creates interrupt
> + * distribution problem, so set default distribution server to the
> + * current cpu (i.e. boot cpu)
> + */
> + if (strstr(saved_command_line, "maxcpus=") && is_processor_970())
> + fix_970_intr_distrib = 1;
> +
> /* Find the server numbers for the boot cpu. */
> np = cpuid_to_of_node(boot_cpuid);
> BUG_ON(!np);
> @@ -724,7 +753,11 @@ void __init xics_init_IRQ(void)
> for (j = 0; j < i; j += 2) {
> if (ireg[j] == hcpuid) {
> default_server = hcpuid;
> - default_distrib_server = ireg[j+1];
> +
> + if (fix_970_intr_distrib)
> + default_distrib_server = hcpuid;
> + else
> + default_distrib_server = ireg[j+1];
>
> isize = get_property(np,
> "ibm,interrupt-server#-size", NULL);
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot