• Remi Pommarel's avatar
    PCI: aardvark: Use LTSSM state to build link training flag · 364b3f1f
    Remi Pommarel authored
    Aardvark's PCI_EXP_LNKSTA_LT flag in its link status register is not
    implemented and does not reflect the actual link training state (the
    flag is always set to 0). In order to support link re-training feature
    this flag has to be emulated. The Link Training and Status State
    Machine (LTSSM) flag in Aardvark LMI config register could be used as
    a link training indicator. Indeed if the LTSSM is in L0 or upper state
    then link training has completed (see [1]).
    
    Unfortunately because after asking a link retraining it takes a while
    for the LTSSM state to become less than 0x10 (due to L0s to recovery
    state transition delays), LTSSM can still be in L0 while link training
    has not finished yet. So this waits for link to be in recovery or lesser
    state before returning after asking for a link retrain.
    
    [1] "PCI Express Base Specification", REV. 4.0
        PCI Express, February 19 2014, Table 4-14
    
    Fixes: 8a3ebd8d ("PCI: aardvark: Implement emulated root PCI bridge config space")
    Tested-by: default avatarMarc Zyngier <maz@kernel.org>
    Signed-off-by: default avatarRemi Pommarel <repk@triplefau.lt>
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reviewed-by: default avatarAndrew Murray <andrew.murray@arm.com>
    Acked-by: default avatarThomas Petazzoni <thomas.petazzoni@bootlin.com>
    364b3f1f
pci-aardvark.c 29.2 KB