[Skiboot] [PATCH 06/13] hw/npu2: Rework npu2_add_interrupt_map() and skip non-NVLink devices

Alexey Kardashevskiy aik at ozlabs.ru
Fri Dec 14 16:24:25 AEDT 2018



On 12/12/2018 17:58, Andrew Donnellan wrote:
> Rework npu2_add_interrupt_map() so it only includes NVLink devices. Use the
> existing struct npu2_devs rather than accessing the device tree.
> 
> Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
> 
> ---
> 
> I don't really know how to test this.
> ---
>  hw/npu2.c | 36 ++++++++++++++++++++----------------
>  1 file changed, 20 insertions(+), 16 deletions(-)
> 
> diff --git a/hw/npu2.c b/hw/npu2.c
> index 07213f9f75e1..9e2c7d5fdda4 100644
> --- a/hw/npu2.c
> +++ b/hw/npu2.c
> @@ -1686,11 +1686,11 @@ static void npu2_configure_devices(struct npu2 *p)
>  	}
>  }
>  
> -static void npu2_add_interrupt_map(struct npu2 *p,
> -				  struct dt_node *dn)
> +static void npu2_add_interrupt_map(struct npu2 *p)
>  {
> -	struct dt_node *npu2_dn, *link, *phb_dn;
> -	uint32_t npu2_phandle, index = 0, i;
> +	struct dt_node *phb_dn;
> +	struct npu2_dev *dev;
> +	int index, i = 0, nv_devices = 0;
>  	uint32_t icsp = get_ics_phandle();
>  	uint32_t *map;
>  	size_t map_size;
> @@ -1699,23 +1699,27 @@ static void npu2_add_interrupt_map(struct npu2 *p,
>  	assert(p->phb_nvlink.dt_node);
>  	phb_dn = p->phb_nvlink.dt_node;
>  
> -	npu2_phandle = dt_prop_get_u32(dn, "ibm,npcq");
> -	npu2_dn = dt_find_by_phandle(dt_root, npu2_phandle);
> -	assert(npu2_dn);
> -	map_size = 7 * sizeof(*map) * p->total_devices;
> +	for (index = 0; index < p->total_devices; index++) {
> +		if (p->devices[index].type == NPU2_DEV_TYPE_NVLINK)
> +			nv_devices++;
> +	}
> +
> +	map_size = 7 * sizeof(*map) * nv_devices;
>  	map = malloc(map_size);
> -	index = 0;
> -	dt_for_each_compatible(npu2_dn, link, "ibm,npu-link") {
> -		i = index * 7;
> -		map[i + 0] = (p->devices[index].bdfn << 8);
> +
> +	for (index = 0; index < p->total_devices; index++) {
> +		dev = &p->devices[index];
> +		if (dev->type != NPU2_DEV_TYPE_NVLINK)
> +			continue;
> +
> +		map[i + 0] = (dev->bdfn << 8);
>  		map[i + 1] = 0;
>  		map[i + 2] = 0;
> -
>  		map[i + 3] = 1; /* INT A */
>  		map[i + 4] = icsp; /* interrupt-parent */
> -		map[i + 5] = p->base_lsi + (index * 2) + 1; /* NDL No-Stall Event */
> +		map[i + 5] = p->base_lsi + (dev->brick_index * 2) + 1; /* NDL No-Stall Event */


The comment in hw/npu2-common.c says "May be overridden by platform
presence detection" about dev->brick_index initialization. And
brick_index is initialized from link_index which is (as I figured out
recently) not exactly the index into npu2::devices[]. So probably
switching from npu2::devices[]'s index to dev->brick_index is the right
move but please make it a separate patch for bisectability.



>  		map[i + 6] = 0; /* 0 = EDGE, 1 = LEVEL. */
> -		index++;
> +		i += 7;
>  	}
>  	dt_add_property(phb_dn, "interrupt-map", map, map_size);
>  	free(map);
> @@ -1885,7 +1889,7 @@ void npu2_nvlink_create_phb(struct npu2 *npu, struct dt_node *dn)
>  
>  	npu2_setup_irqs(npu);
>  	npu2_configure_devices(npu);
> -	npu2_add_interrupt_map(npu, dn);
> +	npu2_add_interrupt_map(npu);
>  	npu2_add_phb_properties(npu);
>  
>  	slot = npu2_slot_create(&npu->phb_nvlink);
> 

-- 
Alexey


More information about the Skiboot mailing list