[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