[Skiboot] [PATCH] core/interrupts: Clean up OPAL ICS node

Maxim Polyakov m.polyakov at yadro.com
Tue May 14 23:11:45 AEST 2019



23.04.2019 9:29, Oliver O'Halloran пишет:
> For some reason that's lost to time the OPAL interrupt-controller source
> device node has a unit address of 0. This causes dtc to emit warnings
> since the node overlaps with the memory at 0 node. There is also no real need
> for the OPAL ICS node to even have a unit address since it has no
> registers (reflected by the zero length in reg).
> 
> This patch reworks the OPAL ICS node so that it has no unit address
> which results in a bare top-level node called "interrupt-controller."
> While we're here get rid of the explicit device-tree traversal in
> get_ics_phandle() and use a cached copy that is setup in add_ics_node().
> 
> Suggested-by: Maxim Polyakov <m.polyakov at yadro.com>
> Signed-off-by: Oliver O'Halloran <oohall at gmail.com>
> ---
> I had a look at the xics/xive code in linux and it doesn't seem that
> either make any assumptions about the @0 being in the unit address.
> 
> Boot tested on a Tuleta and a Witherspoon without issues.
> ---
>  core/interrupts.c    | 32 +++++++++++++++++++-------------
>  include/interrupts.h |  2 +-
>  2 files changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/core/interrupts.c b/core/interrupts.c
> index 5d7a68cd5eff..b4602d374ec3 100644
> --- a/core/interrupts.c
> +++ b/core/interrupts.c
> @@ -173,18 +173,27 @@ uint32_t get_psi_interrupt(uint32_t chip_id)
>  	return irq;
>  }
>  
> +static struct dt_node *ics_node;
>  
> -struct dt_node *add_ics_node(void)
> +void add_ics_node(void)
>  {
> -	struct dt_node *ics = dt_new_addr(dt_root, "interrupt-controller", 0);
> +	struct dt_node *ics;
>  	bool has_xive;
>  
> -	if (!ics)
> -		return NULL;
> +	/*
> +	 * This should never happen, but this code is ancient so maybe there's
> +	 * some obscure edge case it's covering
> +	 */
> +	ics = dt_new(dt_root, "interrupt-controller");
> +	if (!ics) {
> +		ics_node = dt_find_by_name(dt_root, "interrupt-controller");
> +		prlog(PR_DEBUG, "OPAL ICS node already exists?\n");
> +
> +		return;
> +	}
>  
>  	has_xive = proc_gen >= proc_gen_p9;
>  
> -	dt_add_property_cells(ics, "reg", 0, 0, 0, 0);
>  	dt_add_property_strings(ics, "compatible",
>  				has_xive ? "ibm,opal-xive-vc" : "IBM,ppc-xics",
>  				"IBM,opal-xics");
> @@ -194,19 +203,16 @@ struct dt_node *add_ics_node(void)
>  			       "PowerPC-Interrupt-Source-Controller");
>  	dt_add_property(ics, "interrupt-controller", NULL, 0);
>  
> -	return ics;
> +	ics_node = ics;
>  }
>  
>  uint32_t get_ics_phandle(void)
>  {
> -	struct dt_node *i;
>  
> -	for (i = dt_first(dt_root); i; i = dt_next(dt_root, i)) {
> -		if (streq(i->name, "interrupt-controller at 0")) {
> -			return i->phandle;
> -		}
> -	}
> -	abort();
> +	if (!ics_node)
> +		abort();
> +
> +	return ics_node->phandle;
>  }
>  
>  void add_opal_interrupts(void)
> diff --git a/include/interrupts.h b/include/interrupts.h
> index 2c4fa7e92399..4a49bbaeb601 100644
> --- a/include/interrupts.h
> +++ b/include/interrupts.h
> @@ -312,7 +312,7 @@ extern void irq_for_each_source(void (*cb)(struct irq_source *, void *),
>  
>  extern uint32_t get_psi_interrupt(uint32_t chip_id);
>  
> -extern struct dt_node *add_ics_node(void);
> +extern void add_ics_node(void);
>  extern void add_opal_interrupts(void);
>  extern uint32_t get_ics_phandle(void);
>  
> 

Hi all. Any news about this patch?

-- 
Regards,
Maxim Polyakov 
Software Engineer, YADRO.


More information about the Skiboot mailing list