[Skiboot] [PATCH v2 1/4] npu2: Rework phb-index assignments for virtual PHBs
Andrew Donnellan
ajd at linux.ibm.com
Thu Sep 26 21:49:13 AEST 2019
On 9/8/19 3:05 pm, Frederic Barrat wrote:
> Until now, opencapi PHBs were not using the 'ibm,phb-index' property,
> as it was thought unnecessary. For nvlink, a phb-index was associated
> to the npu when parsing hdat data, and the nvlink PHB was reusing the
> same value.
>
> It turns out it helps to have the 'ibm,phb-index' property for
> opencapi PHBs after all. Otherwise it can lead to wrong results on
> platforms like mihawk when trying to match entries in the slot
> table. We end up with an opencapi device inheriting wrong properties
> in the device tree, because match_slot_phb_entry() default to
> phb-index 0 if it cannot find the property. Though it doesn't seem to
> cause any harm, it's wrong and a future patch is expected to start
> using the slot table for opencapi, so it needs fixing.
>
> The twist is that with opencapi, we can have multiple virtual PHBs for
> a single NPU on P9. There's one PHB per (opencapi) brick. Therefore
> there's no 1-to-1 mapping between the NPU and PHB index and it no
> longer makes sense to associate a phb-index to a npu.
>
> With this patch, opencapi PHBs created under a NPU use a fixed mapping
> for their phb-index, based on the brick index. The range of possible
> values is 7 to 12. Because there can only be one nvlink PHB per NPU,
> it is always using a phb-index of 7.
>
> A side effect is that 2 virtual PHBs on 2 different chips can have the
> same phb-index, which is similar to what happens for 'real' PCI PHBs,
> but is different from what was happening on a nvlink-only witherspoon
> so far.
>
> Signed-off-by: Frederic Barrat <fbarrat at linux.ibm.com>
> ---
Comment is good.
Reviewed-by: Andrew Donnellan <ajd at linux.ibm.com>
> Changelog:
> v2:
> - add comment summarizing the commit msg in the code (Andrew)
> - move the axone changes to separate patch
>
>
> hw/npu2-common.c | 1 -
> hw/npu2-opencapi.c | 2 ++
> hw/npu2.c | 2 +-
> include/npu2.h | 20 +++++++++++++++++++-
> 4 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/hw/npu2-common.c b/hw/npu2-common.c
> index 6d5c35af..7326e165 100644
> --- a/hw/npu2-common.c
> +++ b/hw/npu2-common.c
> @@ -530,7 +530,6 @@ static struct npu2 *setup_npu(struct dt_node *dn)
> npu->index = dt_prop_get_u32(dn, "ibm,npu-index");
> npu->chip_id = gcid;
> npu->xscom_base = dt_get_address(dn, 0, NULL);
> - npu->phb_index = dt_prop_get_u32(dn, "ibm,phb-index");
>
> init_lock(&npu->i2c_lock);
> npu->i2c_pin_mode = ~0; // input mode by default
> diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c
> index 9a391bb0..c8c95631 100644
> --- a/hw/npu2-opencapi.c
> +++ b/hw/npu2-opencapi.c
> @@ -1665,6 +1665,8 @@ static void setup_device(struct npu2_dev *dev)
> dt_add_property_strings(dn_phb, "device_type", "pciex");
> dt_add_property(dn_phb, "reg", mm_win, sizeof(mm_win));
> dt_add_property_cells(dn_phb, "ibm,npu-index", dev->npu->index);
> + dt_add_property_cells(dn_phb, "ibm,phb-index",
> + npu2_get_phb_index(dev->brick_index));
> dt_add_property_cells(dn_phb, "ibm,chip-id", dev->npu->chip_id);
> dt_add_property_cells(dn_phb, "ibm,xscom-base", dev->npu->xscom_base);
> dt_add_property_cells(dn_phb, "ibm,npcq", dev->npu->dt_node->phandle);
> diff --git a/hw/npu2.c b/hw/npu2.c
> index 29c998f6..324d492f 100644
> --- a/hw/npu2.c
> +++ b/hw/npu2.c
> @@ -1478,7 +1478,7 @@ int npu2_nvlink_init_npu(struct npu2 *npu)
> "ibm,ioda2-npu2-phb");
> dt_add_property_strings(np, "device_type", "pciex");
> dt_add_property(np, "reg", reg, sizeof(reg));
> - dt_add_property_cells(np, "ibm,phb-index", npu->phb_index);
> + dt_add_property_cells(np, "ibm,phb-index", npu2_get_phb_index(0));
> dt_add_property_cells(np, "ibm,npu-index", npu->index);
> dt_add_property_cells(np, "ibm,chip-id", npu->chip_id);
> dt_add_property_cells(np, "ibm,xscom-base", npu->xscom_base);
> diff --git a/include/npu2.h b/include/npu2.h
> index 92b58988..5a8dc32b 100644
> --- a/include/npu2.h
> +++ b/include/npu2.h
> @@ -175,7 +175,6 @@ struct npu2 {
>
> /* NVLink */
> struct phb phb_nvlink;
> - uint32_t phb_index;
>
> /* OCAPI */
> uint64_t i2c_port_id_ocapi;
> @@ -251,4 +250,23 @@ int64_t npu2_map_lpar(struct phb *phb, uint64_t bdf, uint64_t lparid,
> int64_t npu2_set_relaxed_order(struct phb *phb, uint32_t gcid, int pec,
> bool enable);
>
> +#define NPU2_PHB_INDEX_BASE 7
> +/* to avoid conflicts with PCI and for historical reasons */
> +
> +static inline int npu2_get_phb_index(unsigned int brick_index)
> +{
> + /*
> + * There's one virtual PHB per brick with opencapi, so we no
> + * longer have a 1-to-1 mapping between a NPU and a virtual
> + * PHB. And we want a static phb-index, as it is needed to use
> + * a slot table on some platforms. So we associate a per-chip
> + * phb-index based on the brick index.
> + *
> + * nvlink only creates one virtual PHB per chip, so it is
> + * treated as if using brick 0, which is never used by
> + * opencapi.
> + */
> + return NPU2_PHB_INDEX_BASE + brick_index;
> +}
> +
> #endif /* __NPU2_H */
>
--
Andrew Donnellan OzLabs, ADL Canberra
ajd at linux.ibm.com IBM Australia Limited
More information about the Skiboot
mailing list