diff options
author | Frederic Barrat <fbarrat@linux.ibm.com> | 2019-10-09 21:38:07 +0200 |
---|---|---|
committer | Vasant Hegde <hegdevasant@linux.vnet.ibm.com> | 2020-03-11 10:59:15 +0530 |
commit | 349512d4cbe10f7c33b8ad84c1dd5f028a6f1946 (patch) | |
tree | fc4ba94320e44be19061b7780b47a536295e214d | |
parent | 53003fd908c672fef45279b6e02b85a2959aefa3 (diff) | |
download | skiboot-349512d4cbe10f7c33b8ad84c1dd5f028a6f1946.zip skiboot-349512d4cbe10f7c33b8ad84c1dd5f028a6f1946.tar.gz skiboot-349512d4cbe10f7c33b8ad84c1dd5f028a6f1946.tar.bz2 |
npu2-opencapi: Detect PHY reset errors
[ Upstream commit dbc70aea3a2eec5d8d3c092c2397b2997e35ba60 ]
PHY reset can fail! Though past problems are now fixed, let's handle
any future failure.
Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
Reviewed-by: Christophe Lombard <clombard@linux.vnet.ibm.com>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r-- | hw/npu2-hw-procedures.c | 13 | ||||
-rw-r--r-- | hw/npu2-opencapi.c | 7 | ||||
-rw-r--r-- | include/npu2.h | 2 |
3 files changed, 17 insertions, 5 deletions
diff --git a/hw/npu2-hw-procedures.c b/hw/npu2-hw-procedures.c index a0c53a8..1f82b11 100644 --- a/hw/npu2-hw-procedures.c +++ b/hw/npu2-hw-procedures.c @@ -1045,10 +1045,17 @@ void npu2_opencapi_phy_init(struct npu2_dev *dev) } } -void npu2_opencapi_phy_reset(struct npu2_dev *dev) +int npu2_opencapi_phy_reset(struct npu2_dev *dev) { - run_procedure(dev, 4); /* procedure_phy_reset */ - run_procedure(dev, 6); /* procedure_phy_rx_dccal */ + int rc; + + rc = run_procedure(dev, 4); /* procedure_phy_reset */ + if (rc != PROCEDURE_COMPLETE) + return -1; + rc = run_procedure(dev, 6); /* procedure_phy_rx_dccal */ + if (rc != PROCEDURE_COMPLETE) + return -1; + return 0; } void npu2_opencapi_phy_prbs31(struct npu2_dev *dev) diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c index f159c01..8598dca 100644 --- a/hw/npu2-opencapi.c +++ b/hw/npu2-opencapi.c @@ -1221,6 +1221,7 @@ static int64_t npu2_opencapi_freset(struct pci_slot *slot) struct npu2_dev *dev = phb_to_npu2_dev_ocapi(slot->phb); uint32_t chip_id = dev->npu->chip_id; uint8_t presence = 1; + int rc; switch (slot->state) { case OCAPI_SLOT_NORMAL: @@ -1250,7 +1251,11 @@ static int64_t npu2_opencapi_freset(struct pci_slot *slot) return pci_slot_set_sm_timeout(slot, msecs_to_tb(5)); case OCAPI_SLOT_FRESET_ASSERT_DELAY: - npu2_opencapi_phy_reset(dev); + rc = npu2_opencapi_phy_reset(dev); + if (rc) { + OCAPIERR(dev, "FRESET: couldn't reset PHY state\n"); + return OPAL_HARDWARE; + } deassert_odl_reset(chip_id, dev->brick_index); deassert_adapter_reset(dev); pci_slot_set_state(slot, diff --git a/include/npu2.h b/include/npu2.h index 6b1063d..6171cd3 100644 --- a/include/npu2.h +++ b/include/npu2.h @@ -234,7 +234,7 @@ 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_init(struct npu2_dev *dev); -void npu2_opencapi_phy_reset(struct npu2_dev *dev); +int 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, |