[Skiboot] [PATCH 3/3] npu2/hw-procedures: Fix parallel zcal for opencapi

Andrew Donnellan andrew.donnellan at au1.ibm.com
Mon Mar 18 11:57:11 AEDT 2019


On 16/3/19 3:44 am, Frederic Barrat wrote:
> For opencapi, we currently do impedance calibration when initializing
> the PHY for the device, which could run in parallel if we were rich
> and had multiple opencapi devices. But if 2 devices are on the same
> obus, the 2 calibration sequences could overlap, which likely yields
> bad results and is useless anyway since it only needs to be done once
> per obus.
> 
> This patch splits the opencapi PHY reset in 2 parts:
> - a 'init' part called serially at boot. That's when zcal is done. If
>    we have 2 devices on the same socket, the zcal won't be redone,
>    since we're called serially and we'll see it has already be done for
>    the obus
> - a 'reset' part called during fundamental reset as a prereq for link
>    training. It does the PHY setup for a set of lanes and the dccal.
> 
> The PHY team confirmed there's no dependency between zcal and the
> other reset steps and it can be moved earlier.
> 
> Signed-off-by: Frederic Barrat <fbarrat at linux.ibm.com>

Does this need to go to stable?

Reviewed-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

> ---
>   hw/npu2-hw-procedures.c | 7 +++++--
>   hw/npu2-opencapi.c      | 5 +++--
>   include/npu2.h          | 3 ++-
>   3 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/npu2-hw-procedures.c b/hw/npu2-hw-procedures.c
> index 2f330957..b671b8ac 100644
> --- a/hw/npu2-hw-procedures.c
> +++ b/hw/npu2-hw-procedures.c
> @@ -1017,17 +1017,20 @@ void npu2_opencapi_bump_ui_lane(struct npu2_dev *dev)
>   	}
>   }
>   
> -void npu2_opencapi_phy_setup(struct npu2_dev *dev)
> +void npu2_opencapi_phy_init(struct npu2_dev *dev)
>   {
> +	run_procedure(dev, 5); /* procedure_phy_tx_zcal */
>   	/*
>   	 * This is only required for OpenCAPI - Hostboot tries to set this
>   	 * on systems where it can tell a link is OpenCAPI, but for
>   	 * Witherspoon it needs to be done in skiboot after device detection.
>   	 */
>   	phy_write(dev, &NPU2_PHY_RX_RC_ENABLE_AUTO_RECAL, 0x1);
> +}
>   
> +void npu2_opencapi_phy_reset(struct npu2_dev *dev)
> +{
>   	run_procedure(dev, 4); /* procedure_phy_reset */
> -	run_procedure(dev, 5); /* procedure_phy_tx_zcal */
>   	run_procedure(dev, 6); /* procedure_phy_rx_dccal */
>   }
>   
> diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c
> index b2740f38..090223e2 100644
> --- a/hw/npu2-opencapi.c
> +++ b/hw/npu2-opencapi.c
> @@ -1194,7 +1194,7 @@ static int64_t npu2_opencapi_freset(struct pci_slot *slot)
>   		}
>   		dev->train_need_fence = true;
>   		slot->link_retries = OCAPI_LINK_TRAINING_RETRIES;
> -		npu2_opencapi_phy_setup(dev);
> +		npu2_opencapi_phy_reset(dev);
>   		/* fall-through */
>   	case OCAPI_SLOT_FRESET_INIT:
>   		assert_odl_reset(chip_id, dev->brick_index);
> @@ -1603,7 +1603,7 @@ static int setup_irq(struct npu2 *p)
>   
>   static void setup_debug_training_state(struct npu2_dev *dev)
>   {
> -	npu2_opencapi_phy_setup(dev);
> +	npu2_opencapi_phy_reset(dev);
>   
>   	switch (npu2_ocapi_training_state) {
>   	case NPU2_TRAIN_PRBS31:
> @@ -1675,6 +1675,7 @@ static void setup_device(struct npu2_dev *dev)
>   	/* Procedure 13.1.3.9 - AFU Config BARs */
>   	setup_afu_config_bars(dev->npu->chip_id, dev->npu->xscom_base, dev);
>   	setup_perf_counters(dev);
> +	npu2_opencapi_phy_init(dev);
>   
>   	set_fence_control(dev->npu->chip_id, dev->npu->xscom_base, dev->brick_index, 0b00);
>   
> diff --git a/include/npu2.h b/include/npu2.h
> index b62d1748..a2bcc450 100644
> --- a/include/npu2.h
> +++ b/include/npu2.h
> @@ -224,7 +224,8 @@ 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;
> -void npu2_opencapi_phy_setup(struct npu2_dev *dev);
> +void npu2_opencapi_phy_init(struct npu2_dev *dev);
> +void npu2_opencapi_phy_reset(struct npu2_dev *dev);
>   void npu2_opencapi_phy_prbs31(struct npu2_dev *dev);
>   void npu2_opencapi_bump_ui_lane(struct npu2_dev *dev);
>   int64_t npu2_freeze_status(struct phb *phb __unused,
> 

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Skiboot mailing list