[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