[Skiboot] [PATCH] hw/phb4: Rework phb4_get_presence_state()

Gavin Shan gwshan at linux.vnet.ibm.com
Wed May 24 12:30:23 AEST 2017


There are two issues in current implementation: It should return errcode
visibile to Linux, which has prefix OPAL_*. The code isn't very obvious.

This returns OPAL_HARDWARE when the PHB is broken. Otherwise, OPAL_SUCCESS
is always returned. In the mean while, It refactors the code to make it
obvious: OPAL_PCI_SLOT_PRESENT is returned when the presence signal (low active)
or PCIe link is active. Otherwise, OPAL_PCI_SLOT_EMPTY is returned.

Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
 hw/phb4.c | 32 +++++++++++---------------------
 1 file changed, 11 insertions(+), 21 deletions(-)

diff --git a/hw/phb4.c b/hw/phb4.c
index 318d934..17685e7 100644
--- a/hw/phb4.c
+++ b/hw/phb4.c
@@ -1844,36 +1844,26 @@ static int64_t phb4_get_presence_state(struct pci_slot *slot, uint8_t *val)
 	if (p->state == PHB4_STATE_BROKEN)
 		return OPAL_HARDWARE;
 
-	/* Read hotplug status */
+	/* Check hotplug status */
 	hps = in_be64(p->regs + PHB_PCIE_HOTPLUG_STATUS);
-
-	/* Read link status */
-	dtctl = in_be64(p->regs + PHB_PCIE_DLP_TRAIN_CTL);
-
-	PHBDBG(p, "hp_status=0x%016llx, dlp_train_ctl=0x%016llx\n",
-	       hps, dtctl);
-
-	*val = OPAL_PCI_SLOT_PRESENT;
-	/* Check presence detect */
-	if (hps & PHB_PCIE_HPSTAT_PRESENCE) {
-		/* If it says not present but link is up, then we assume
+	if (!(hps & PHB_PCIE_HPSTAT_PRESENCE)) {
+		*val = OPAL_PCI_SLOT_PRESENT;
+	} else {
+		/*
+		 * If it says not present but link is up, then we assume
 		 * we are on a broken simulation environment and still
 		 * return a valid presence. Otherwise, not present.
 		 */
+		dtctl = in_be64(p->regs + PHB_PCIE_DLP_TRAIN_CTL);
 		if (dtctl & PHB_PCIE_DLP_TL_LINKACT) {
 			PHBERR(p, "Presence detect 0 but link set !\n");
-			return OPAL_SHPC_DEV_PRESENT;
+			*val = OPAL_PCI_SLOT_PRESENT;
+		} else {
+			*val = OPAL_PCI_SLOT_EMPTY;
 		}
-		*val = OPAL_PCI_SLOT_EMPTY;
-		return OPAL_SHPC_DEV_NOT_PRESENT;
 	}
 
-	/*
-	 * Anything else, we assume device present, the link state
-	 * machine will perform an early bail out if no electrical
-	 * signaling is established after a second.
-	 */
-	return OPAL_SHPC_DEV_PRESENT;
+	return OPAL_SUCCESS;
 }
 
 static int64_t phb4_get_link_state(struct pci_slot *slot, uint8_t *val)
-- 
2.7.4



More information about the Skiboot mailing list