diff options
author | Frederic Barrat <fbarrat@linux.ibm.com> | 2019-03-15 17:44:40 +0100 |
---|---|---|
committer | Stewart Smith <stewart@linux.ibm.com> | 2019-03-20 14:27:08 +1100 |
commit | 14a78d5c2e857fc52bd367584e0da4bd39a21ff8 (patch) | |
tree | 60ed60452348a95084c3110501ef0960d7e5a4c7 /hw/npu2-opencapi.c | |
parent | 11c5faa66aa09dc6ecbfd3d6682351c709f5c668 (diff) | |
download | skiboot-14a78d5c2e857fc52bd367584e0da4bd39a21ff8.zip skiboot-14a78d5c2e857fc52bd367584e0da4bd39a21ff8.tar.gz skiboot-14a78d5c2e857fc52bd367584e0da4bd39a21ff8.tar.bz2 |
npu2/hw-procedures: Fix parallel zcal for opencapi
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@linux.ibm.com>
Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'hw/npu2-opencapi.c')
-rw-r--r-- | hw/npu2-opencapi.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c index b2740f3..090223e 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); |