[linux-yocto] [PATCH 11/94] arm/mach-axxia: fix error with IRQ type setting at startup

Bruce Ashfield bruce.ashfield at windriver.com
Sat Nov 9 06:18:42 PST 2013


On 11/7/2013, 8:12 PM, Paul Butler wrote:
> From: David Mercado <david.mercado at windriver.com>
>
> This patch fixes the errors reported by gic_set_type() when booting a

Minor 'nit (and no need to change) .. it's a difficult habit to break, but
work on not starting commit messages with "This patch ...", since everyone
knows it is a patch already :)

Bruce

> kernel that's configured for more cores than the simulator has enabled
> (i.e., the DTS file has more cores enabled than cores enabled in the
> simulator topology.xml file).  The driver now checks if a cpu is online
> prior to attempting to set its IRQ type.
>
> Signed-off-by: David Mercado <david.mercado at windriver.com>
> ---
>   arch/arm/mach-axxia/axxia-gic.c | 47 +++++++++++++++++++++++------------------
>   1 file changed, 27 insertions(+), 20 deletions(-)
>
> diff --git a/arch/arm/mach-axxia/axxia-gic.c b/arch/arm/mach-axxia/axxia-gic.c
> index c074f6c..f899188 100644
> --- a/arch/arm/mach-axxia/axxia-gic.c
> +++ b/arch/arm/mach-axxia/axxia-gic.c
> @@ -310,7 +310,7 @@ static void gic_set_type_wrapper(void *data)
>   static int gic_set_type(struct irq_data *d, unsigned int type)
>   {
>   #ifdef CONFIG_SMP
> -	int i, nr_cluster_ids = ((nr_cpu_ids-1) / 4) + 1;
> +	int i, cpu, nr_cluster_ids = ((nr_cpu_ids-1) / 4) + 1;
>   	unsigned int gicirq = gic_irq(d);
>   	u32 pcpu = cpu_logical_map(smp_processor_id());
>   	struct gic_set_type_wrapper_struct data;
> @@ -337,19 +337,23 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
>   		if (i == (pcpu/4))
>   			continue;
>
> -		/*
> -		 * We are running here with local interrupts
> -		 * disabled. Temporarily re-enable them to
> -		 * avoid possible deadlock when calling
> -		 * smp_call_function_single().
> -		 */
> -		local_irq_enable();
> -		smp_call_function_single((i * 4),
> -			 gic_set_type_wrapper, &data, 1);
> -		local_irq_disable();
> -		if (data.status != 0)
> -			printk(KERN_ERR "gic_set_type() error (%d)!\n",
> -			       data.status);
> +		/* Have the first cpu in each cluster execute this. */
> +		cpu = i * 4;
> +		if (cpu_online(cpu)) {
> +			/*
> +			 * We are running here with local interrupts
> +			 * disabled. Temporarily re-enable them to
> +			 * avoid possible deadlock when calling
> +			 * smp_call_function_single().
> +			 */
> +			local_irq_enable();
> +			smp_call_function_single(cpu, gic_set_type_wrapper,
> +						 &data, 1);
> +			local_irq_disable();
> +			if (data.status != 0)
> +				pr_err("Failed to set IRQ type for cpu%d\n",
> +				       cpu);
> +		}
>   	}
>   #endif
>   	return _gic_set_type(d, type);
> @@ -892,7 +896,7 @@ static void gic_notifier_wrapper(void *data)
>
>   static int gic_notifier(struct notifier_block *self, unsigned long cmd,	void *v)
>   {
> -	int i;
> +	int i, cpu;
>   	struct gic_notifier_wrapper_struct data;
>   	int nr_cluster_ids = ((nr_cpu_ids-1) / 4) + 1;
>   	u32 pcpu = cpu_logical_map(smp_processor_id());
> @@ -907,11 +911,14 @@ static int gic_notifier(struct notifier_block *self, unsigned long cmd,	void *v)
>   			continue;
>
>   		/* Have the first cpu in each cluster execute this. */
> -		local_irq_enable(); /* Temporarily re-enable interrupts. */
> -		smp_call_function_single((i * 4),
> -					 gic_notifier_wrapper,
> -					 &data, 0);
> -		local_irq_disable();
> +		cpu = i * 4;
> +		if (cpu_online(cpu)) {
> +			local_irq_enable();
> +			smp_call_function_single(cpu,
> +						 gic_notifier_wrapper,
> +						 &data, 0);
> +			local_irq_disable();
> +		}
>   	}
>
>   	/* Execute on this cluster. */
>




More information about the linux-yocto mailing list