[Skiboot] [PATCH 3/3] npu2/hw-procedures: Fix parallel zcal for opencapi
Frederic Barrat
fbarrat at linux.ibm.com
Tue Mar 19 05:02:31 AEDT 2019
Le 18/03/2019 à 01:57, Andrew Donnellan a écrit :
> 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?
Yes, and I keep forgetting :-(
This patch doesn't apply on v6.1. I'll backport it later this week.
Fred
>
> 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,
>>
>
More information about the Skiboot
mailing list