[Skiboot] [PATCH v2 09/16] npu2-opencapi: Rework link training timeout

Frederic Barrat fbarrat at linux.ibm.com
Thu Oct 10 06:38:04 AEDT 2019


Opencapi link state should be polled for up to 3 seconds. Current code
assumes a tight retry loop during fundamental reset at boot, which is
not going to be true on link retraining. So update the timeout
detection code to use a timebase instead of a simple retry count which
could be way too long.

Reviewed-by: Christophe Lombard <clombard at linux.vnet.ibm.com>
Reviewed-by: Andrew Donnellan <ajd at linux.ibm.com>
Signed-off-by: Frederic Barrat <fbarrat at linux.ibm.com>
---
 hw/npu2-opencapi.c | 9 +++++----
 include/npu2.h     | 2 ++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c
index 504c9208..f7be9f09 100644
--- a/hw/npu2-opencapi.c
+++ b/hw/npu2-opencapi.c
@@ -1127,13 +1127,13 @@ static int64_t npu2_opencapi_poll_link(struct pci_slot *slot)
 		reg = get_odl_status(chip_id, dev->brick_index);
 		if (GETFIELD(OB_ODL_STATUS_TRAINING_STATE_MACHINE, reg) ==
 			OCAPI_LINK_STATE_TRAINED) {
-			OCAPIINF(dev, "link trained in %lld ms\n",
-				OCAPI_LINK_TRAINING_TIMEOUT - slot->retries);
+			OCAPIINF(dev, "link trained in %ld ms\n",
+				 tb_to_msecs(mftb() - dev->train_start));
 			check_trained_link(dev, reg);
 			pci_slot_set_state(slot, OCAPI_SLOT_LINK_TRAINED);
 			return pci_slot_set_sm_timeout(slot, msecs_to_tb(1));
 		}
-		if (slot->retries-- == 0)
+		if (tb_compare(mftb(), dev->train_timeout) == TB_AAFTERB)
 			return npu2_opencapi_retry_state(slot, reg);
 
 		return pci_slot_set_sm_timeout(slot, msecs_to_tb(1));
@@ -1239,7 +1239,8 @@ static int64_t npu2_opencapi_freset(struct pci_slot *slot)
 		/* Bump lanes - this improves training reliability */
 		npu2_opencapi_bump_ui_lane(dev);
 		start_training(chip_id, dev);
-		slot->retries = OCAPI_LINK_TRAINING_TIMEOUT;
+		dev->train_start = mftb();
+		dev->train_timeout = dev->train_start + msecs_to_tb(OCAPI_LINK_TRAINING_TIMEOUT);
 		pci_slot_set_state(slot, OCAPI_SLOT_LINK_START);
 		return slot->ops.poll_link(slot);
 
diff --git a/include/npu2.h b/include/npu2.h
index aac7e7a5..d2316dc1 100644
--- a/include/npu2.h
+++ b/include/npu2.h
@@ -147,6 +147,8 @@ struct npu2_dev {
 	uint64_t		linux_pe;
 	bool			train_need_fence;
 	bool			train_fenced;
+	unsigned long		train_start;
+	unsigned long		train_timeout;
 };
 
 struct npu2 {
-- 
2.21.0



More information about the Skiboot mailing list