[Skiboot] [PATCH v2 06/15] hw/npu2: Don't repopulate NPU devices in NVLink init path
Andrew Donnellan
andrew.donnellan at au1.ibm.com
Thu Jan 31 14:35:09 AEDT 2019
On 17/1/19 5:02 pm, Alexey Kardashevskiy wrote:
>
>
> On 11/01/2019 12:09, Andrew Donnellan wrote:
>> In 68415d5e38ef ("hw/npu2: Common NPU2 init routine between NVLink and
>> OpenCAPI") we refactored a large chunk of the NPU init path into common
>> code, including walking the device tree to setup npu2_devs based on the
>> ibm,npu-link device tree nodes.
>>
>> We didn't actually remove the code that does that in
>> npu2_populate_devices(), so currently we populate the devices in the common
>> setup path
>
> Please add here "in setup_npu()". For a firmware there is way too many
> callbacks to follow the initialization path :(
OK.
>
>
>> , then repopulate them incorrectly in the NVLink setup path.
>>
>> Currently this is fine, because we don't support having both NVLink and
>> OpenCAPI devices on the same NPU, but when we do, this will be a problem.
>>
>> Fix npu2_populate_devices() to only populate additional fields as required
>> for NVLink devices. Rename it to npu2_configure_devices() to better reflect
>> what it now does.
>>
>> Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
>> Reviewed-by: Frederic Barrat <fbarrat at linux.ibm.com>
>>
>> ---
>> v1->v2:
>> - remove unneeded scan_map assignment, it's zalloced anyway (Alexey)
>> - rebase on Reza's cleanups
>> ---
>> hw/npu2.c | 42 ++++++++++--------------------------------
>> 1 file changed, 10 insertions(+), 32 deletions(-)
>>
>> diff --git a/hw/npu2.c b/hw/npu2.c
>> index 1c7af14958e8..106b32150994 100644
>> --- a/hw/npu2.c
>> +++ b/hw/npu2.c
>> @@ -1599,12 +1599,12 @@ static void npu2_populate_cfg(struct npu2_dev *dev)
>> PCI_VIRT_CFG_INIT_RO(pvd, pos + 1, 1, 0);
>> }
>>
>> -static uint32_t npu_allocate_bdfn(struct npu2 *p, uint32_t group)
>> +static uint32_t npu_allocate_bdfn(struct npu2 *p, uint32_t group, int size)
>> {
>> int i;
>> int bdfn = (group << 3);
>>
>> - for (i = 0; i < p->total_devices; i++) {
>> + for (i = 0; i < size; i++) {
>> if ((p->devices[i].bdfn & 0xf8) == (bdfn & 0xf8))
>> bdfn++;
>> }
>> @@ -1612,51 +1612,29 @@ static uint32_t npu_allocate_bdfn(struct npu2 *p, uint32_t group)
>> return bdfn;
>> }
>>
>> -static void npu2_populate_devices(struct npu2 *p,
>> - struct dt_node *dn)
>> +static void npu2_configure_devices(struct npu2 *p)
>> {
>> struct npu2_dev *dev;
>> - struct dt_node *npu2_dn, *link;
>> - uint32_t npu_phandle, index = 0;
>> -
>> - /*
>> - * Get the npu node which has the links which we expand here
>> - * into pci like devices attached to our emulated phb.
>> - */
>> - npu_phandle = dt_prop_get_u32(dn, "ibm,npcq");
>> - npu2_dn = dt_find_by_phandle(dt_root, npu_phandle);
>> - assert(npu2_dn);
>> + uint32_t index = 0;
>
> Do not need to initialize index here.
ack
>
>
>>
>> - /* Walk the link at x nodes to initialize devices */
>> - p->total_devices = 0;
>> - p->phb_nvlink.scan_map = 0;
>> - dt_for_each_compatible(npu2_dn, link, "ibm,npu-link") {
>> + for (index = 0; index < p->total_devices; index++) {
>> uint32_t group_id;
>>
>> dev = &p->devices[index];
>> - dev->type = NPU2_DEV_TYPE_NVLINK;
>> - dev->npu = p;
>> - dev->dt_node = link;
>> - dev->link_index = dt_prop_get_u32(link, "ibm,npu-link-index");
>> - dev->brick_index = dev->link_index;
>> + if (dev->type != NPU2_DEV_TYPE_NVLINK)
>> + continue;
>
> Took me some time to realize where the type is set
> (platforms/astbmc/witherspoon.c set_link_details()). Ok, safe.
>
>
>>
>> - group_id = dt_prop_get_u32(link, "ibm,npu-group-id");
>> - dev->bdfn = npu_allocate_bdfn(p, group_id);
>> + group_id = dt_prop_get_u32(dev->dt_node, "ibm,npu-group-id");
>> + dev->bdfn = npu_allocate_bdfn(p, group_id, index);
>>
>> /* This must be done after calling
>> * npu_allocate_bdfn() */
>
> The comment is obsolete now.
ack
>
>
>> - p->total_devices++;
>> p->phb_nvlink.scan_map |= 0x1 << ((dev->bdfn & 0xf8) >> 3);
>>
>> - dev->pl_xscom_base = dt_prop_get_u64(link, "ibm,npu-phy");
>> - dev->lane_mask = dt_prop_get_u32(link, "ibm,npu-lane-mask");
>> -
>> /* Initialize PCI virtual device */
>> dev->nvlink.pvd = pci_virt_add_device(&p->phb_nvlink, dev->bdfn, 0x100, dev);
>> if (dev->nvlink.pvd)
>> npu2_populate_cfg(dev);
>> -
>> - index++;
>> }
>> }
>>
>> @@ -1857,7 +1835,7 @@ void npu2_nvlink_create_phb(struct npu2 *npu, struct dt_node *dn)
>> list_head_init(&npu->phb_nvlink.virt_devices);
>>
>> npu2_setup_irqs(npu);
>> - npu2_populate_devices(npu, dn);
>> + npu2_configure_devices(npu);
>> npu2_add_interrupt_map(npu, dn);
>> npu2_add_phb_properties(npu);
>>
>>
>
--
Andrew Donnellan OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com IBM Australia Limited
More information about the Skiboot
mailing list