[Skiboot] [PATCH 2/2] nvlink: Associate NPUs with GPUs using slots instead of PBCQ

Russell Currey ruscur at russell.cc
Thu May 26 15:28:14 AEST 2016


On Thu, 2016-05-26 at 15:01 +1000, Alistair Popple wrote:
> Hi Russell,
> 
> We also need to update the bdfn allocation - see npu_allocate_bdfn(). At the 
> moment we compare pbcq's to determine if nvlink devices go to the same GPU or 
> not. Now that we have slot information we need to update the bdfn allocator
> to 
> use that instead to determine if nvlinks are going to the same GPU or not, 
> similar to what you've done below for the device binding.
> 
> A final patch to remove the ibm,npu-pbcq properties and associated code from 
> platforms/astbmc/garrison.c would also be great if you have time. Thanks!
> 

Makes sense, will do.

> Regards,
> 
> Alistair
> 
> On Mon, 23 May 2016 14:43:25 Russell Currey wrote:
> > NPU links (npu_dev) need to be associated with their corresponding
> > physical GPU's PCI devices.  On Garrison systems, this works by comparing
> > the PBCQ handle of the NPU and GPU.  However, this will fail if a system
> > has multiple GPUs behind a single PHB.  Instead, associate GPUs and NPUs
> > by comparing slot locations.
> > 
> > Signed-off-by: Russell Currey <ruscur at russell.cc>
> > ---
> >  hw/npu.c | 18 ++++++++----------
> >  1 file changed, 8 insertions(+), 10 deletions(-)
> > 
> > diff --git a/hw/npu.c b/hw/npu.c
> > index 476a1d2..ac5e0d7 100644
> > --- a/hw/npu.c
> > +++ b/hw/npu.c
> > @@ -29,6 +29,7 @@
> >  #include <npu-regs.h>
> >  #include <npu.h>
> >  #include <xscom.h>
> > +#include <string.h>
> >  
> >  /*
> >   * Terminology:
> > @@ -502,25 +503,22 @@ static int __npu_dev_bind_pci_dev(struct phb *phb 
> __unused,
> >  {
> >  	struct npu_dev *dev = data;
> >  	struct dt_node *pci_dt_node;
> > -	uint32_t npu_npcq_phandle;
> >  
> >  	/* Ignore non-nvidia PCI devices */
> >  	if ((pd->vdid & 0xffff) != 0x10de)
> >  		return 0;
> >  
> > -	/* Find the PCI devices pbcq */
> > -	for (pci_dt_node = pd->dn->parent;
> > -	     pci_dt_node && !dt_find_property(pci_dt_node, "ibm,pbcq");
> > +	/* Find the PCI device's slot location */
> > +	for (pci_dt_node = pd->dn;
> > +	     pci_dt_node && !dt_find_property(pci_dt_node, "ibm,slot-
> > label");
> >  	     pci_dt_node = pci_dt_node->parent);
> >  
> > -	if (!pci_dt_node)
> > +	if (!pci_dt_node || !dt_find_property(pci_dt_node, "ibm,slot-
> > label"))
> >  		return 0;
> >  
> > -	npu_npcq_phandle = dt_prop_get_u32(dev->dt_node, "ibm,npu-pbcq");
> > -
> > -	if (dt_prop_get_u32(pci_dt_node, "ibm,pbcq") == npu_npcq_phandle &&
> > -	    (pd->vdid & 0xffff) == 0x10de)
> > -			return 1;
> > +	if (streq((char *)dt_prop_get(pci_dt_node, "ibm,slot-label"),
> > +		  dev->slot_info->label))
> > +		return 1;
> >  
> >  	return 0;
> >  }
> > 



More information about the Skiboot mailing list