[Skiboot] [PATCH 3/3] phb4: Delay training till after PERST is deasserted
Michael Neuling
mikey at neuling.org
Fri Jun 29 16:32:21 AEST 2018
This helps some cards train on the second PERST (ie fast-reboot). The
reason is not clear why but it helps, so YOLO!
Signed-off-by: Michael Neuling <mikey at neuling.org>
---
hw/phb4.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/hw/phb4.c b/hw/phb4.c
index d9a729369b..67927c4bf4 100644
--- a/hw/phb4.c
+++ b/hw/phb4.c
@@ -2784,6 +2784,7 @@ static int64_t phb4_freset(struct pci_slot *slot)
struct phb4 *p = phb_to_phb4(slot->phb);
uint8_t presence = 1;
uint64_t reg;
+ uint16_t reg16;
switch(slot->state) {
case PHB4_SLOT_NORMAL:
@@ -2802,6 +2803,12 @@ static int64_t phb4_freset(struct pci_slot *slot)
phb4_prepare_link_change(slot, false);
/* fall through */
case PHB4_SLOT_FRESET_START:
+ phb4_pcicfg_read16(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL,
+ ®16);
+ reg16 |= PCICAP_EXP_LCTL_LINK_DIS;
+ phb4_pcicfg_write16(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL,
+ reg16);
+
if (!p->skip_perst) {
PHBDBG(p, "FRESET: Assert\n");
reg = in_be64(p->regs + PHB_PCIE_CRESET);
@@ -2839,6 +2846,13 @@ static int64_t phb4_freset(struct pci_slot *slot)
/* Move on to link poll right away */
return pci_slot_set_sm_timeout(slot, 1);
case PHB4_SLOT_FRESET_DEASSERT_DELAY:
+ PHBDBG(p, "FRESET: Starting training\n");
+ phb4_pcicfg_read16(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL,
+ ®16);
+ reg16 &= ~(PCICAP_EXP_LCTL_LINK_DIS);
+ phb4_pcicfg_write16(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL,
+ reg16);
+
phb4_training_trace(p);
pci_slot_set_state(slot, PHB4_SLOT_LINK_START);
--
2.17.1
More information about the Skiboot
mailing list