[Skiboot] [PATCH] hw/npu2: support creset of npu2 devices

Alistair Popple alistair at popple.id.au
Fri Dec 15 14:38:15 AEDT 2017


On Friday, 15 December 2017 1:59:42 PM AEDT Balbir Singh wrote:
> creset calls in the hw procedure that resets the PHY, we don't
> take them out of reset, just put them in reset.
> 
> Signed-off-by: Balbir Singh <bsingharora at gmail.com>
> ---
>  hw/npu2-hw-procedures.c |  2 +-
>  hw/npu2.c               | 21 ++++++++++++++++++++-
>  include/npu2.h          |  1 +
>  3 files changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/npu2-hw-procedures.c b/hw/npu2-hw-procedures.c
> index 1318e867..dfff4a2a 100644
> --- a/hw/npu2-hw-procedures.c
> +++ b/hw/npu2-hw-procedures.c
> @@ -233,7 +233,7 @@ static bool poll_fence_status(struct npu2_dev *ndev, uint64_t val)
>  }
>  
>  /* Procedure 1.2.1 - Reset NPU/NDL */
> -static uint32_t reset_ntl(struct npu2_dev *ndev)
> +uint32_t reset_ntl(struct npu2_dev *ndev)
>  {
>  	uint64_t val;
>  
> diff --git a/hw/npu2.c b/hw/npu2.c
> index 7ffb0941..ee75b6fd 100644
> --- a/hw/npu2.c
> +++ b/hw/npu2.c
> @@ -1170,6 +1170,25 @@ static int64_t npu2_freset(struct pci_slot *slot __unused)
>  	return OPAL_SUCCESS;
>  }
>  
> +static int64_t npu2_creset(struct pci_slot *slot)
> +{
> +	struct npu2 *p;
> +	int i;
> +	struct npu2_dev *ndev;
> +
> +	p = phb_to_npu2(slot->phb);
> +	NPU2INF(p, "Creset PHB state\n");
> +
> +	for (i = 0; i < p->total_devices; i++) {

Wont this reset every link on the NPU rather than just the given pci_slot? We
need to make sure this resets just the specified device.

> +		ndev = &p->devices[i];
> +		if (ndev) {
> +			NPU2DEVINF(ndev, "Resetting device\n");
> +			reset_ntl(ndev);

What is the motivation for implementing this? I suspect we should also reset the
DL and PHY.

Regards,

Alistair

> +		}
> +	}
> +	return OPAL_SUCCESS;
> +}
> +
>  static struct pci_slot *npu2_slot_create(struct phb *phb)
>  {
>  	struct pci_slot *slot;
> @@ -1191,7 +1210,7 @@ static struct pci_slot *npu2_slot_create(struct phb *phb)
>  	slot->ops.poll_link           = NULL;
>  	slot->ops.hreset              = npu2_hreset;
>  	slot->ops.freset              = npu2_freset;
> -	slot->ops.creset              = NULL;
> +	slot->ops.creset              = npu2_creset;
>  
>  	return slot;
>  }
> diff --git a/include/npu2.h b/include/npu2.h
> index dae152a6..c1f39616 100644
> --- a/include/npu2.h
> +++ b/include/npu2.h
> @@ -162,5 +162,6 @@ int64_t npu2_dev_procedure(void *dev, struct pci_cfg_reg_filter *pcrf,
>  void npu2_dev_procedure_reset(struct npu2_dev *dev);
>  void npu2_set_link_flag(struct npu2_dev *ndev, uint8_t flag);
>  void npu2_clear_link_flag(struct npu2_dev *ndev, uint8_t flag);
> +uint32_t reset_ntl(struct npu2_dev *ndev);
>  extern int nv_zcal_nominal;
>  #endif /* __NPU2_H */
> 




More information about the Skiboot mailing list