[Skiboot] [PATCH v2 8/8] core/pci: Mark broken PDC on slots without surprise hotplug capability

Gavin Shan gwshan at linux.vnet.ibm.com
Mon Feb 20 10:57:52 AEDT 2017


We has to support surprise hotplug on PCI slots that don't support
it on hardware. So we're fully utilizing the PCIe link state change
event to detect the events (hot-remove and hot-add). The PDC (Presence
Detection Change) event isn't reliable for the purpose. For example,
PEX8718 on superMicro's machines.

This adds another PCI slot property "ibm,slot-broken-pdc" in the
device-tree, to indicate the PDC isn't reliable on those (software
claimed) surprise pluggable slots.

Reported-by: Hank Chang <hankmax0000 at gmail.com>
Signed-off-by: Gavin Shan <gwhsan at linux.vnet.ibm.com>
Tested-by: Willie Liauw <williel at supermicro.com.tw>
---
 core/pci-slot.c    |  3 +++
 core/pcie-slot.c   | 12 ++++++++++--
 doc/pci-slot.rst   | 22 ++++++++++++----------
 include/pci-slot.h |  1 +
 4 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/core/pci-slot.c b/core/pci-slot.c
index 075b34c..c703fe9 100644
--- a/core/pci-slot.c
+++ b/core/pci-slot.c
@@ -121,6 +121,9 @@ void pci_slot_add_dt_properties(struct pci_slot *slot,
 	dt_add_property_cells(np, "ibm,slot-pluggable", slot->pluggable);
 	dt_add_property_cells(np, "ibm,slot-surprise-pluggable",
 			      slot->surprise_pluggable);
+	if (pci_slot_has_flags(slot, PCI_SLOT_FLAG_BROKEN_PDC))
+		dt_add_property_cells(np, "ibm,slot-broken-pdc", 1);
+
 	dt_add_property_cells(np, "ibm,slot-power-ctl", slot->power_ctl);
 	dt_add_property_cells(np, "ibm,slot-power-led-ctlled",
 			      slot->power_led_ctl);
diff --git a/core/pcie-slot.c b/core/pcie-slot.c
index e92aa8d..64f0da6 100644
--- a/core/pcie-slot.c
+++ b/core/pcie-slot.c
@@ -490,11 +490,19 @@ struct pci_slot *pcie_slot_create(struct phb *phb, struct pci_device *pd)
 	 * relies on presence or link state change events. In order for the
 	 * link state change event to be properly raised during surprise hot
 	 * add/remove, the power supply to the slot should be always on.
+	 *
+	 * For PCI slots that don't claim surprise hotplug capability explicitly.
+	 * Its PDC (Presence Detection Change) isn't reliable. To mark that as
+	 * broken on them.
 	 */
-	if ((slot->slot_cap & PCICAP_EXP_SLOTCAP_HPLUG_SURP) ||
-	    (slot->link_cap & PCICAP_EXP_LCAP_DL_ACT_REP))
+	if (slot->slot_cap & PCICAP_EXP_SLOTCAP_HPLUG_SURP) {
+		slot->surprise_pluggable = 1;
+	} else if (slot->link_cap & PCICAP_EXP_LCAP_DL_ACT_REP) {
 		slot->surprise_pluggable = 1;
 
+		pci_slot_add_flags(slot, PCI_SLOT_FLAG_BROKEN_PDC);
+	}
+
 	/* Standard slot operations */
 	slot->ops.get_presence_state  = pcie_slot_get_presence_state;
 	slot->ops.get_link_state      = pcie_slot_get_link_state;
diff --git a/doc/pci-slot.rst b/doc/pci-slot.rst
index a095737..fd3fd7d 100644
--- a/doc/pci-slot.rst
+++ b/doc/pci-slot.rst
@@ -60,16 +60,18 @@ node for a root port, a PCIE switch port, or a PCIE to PCIx bridge. If the
 individual platforms (e.g. Firenze and Apollo) have VPD for the PCI slot, they
 should extract the PCI slot properties from VPD and export them accordingly.
 
-====================== ==========
-Property               Definition
-====================== ==========
-ibm,reset-by-firmware  Boolean indicating whether the slot reset should be done in firmware
-ibm,slot-pluggable     Boolean indicating whether the slot is pluggable
-ibm,slot-power-ctl     Boolean indicating whether the slot has power control
-ibm,slot-wired-lanes   The number of hardware lanes that are wired
-ibm,slot-pwr-led-ctl   Presence of slot power led, and controlling entity
-ibm,slot-attn-led-ctl  Presence of slot ATTN led, and controlling entity
-====================== ==========
+=========================== ==========
+Property                    Definition
+=========================== ==========
+ibm,reset-by-firmware       Boolean indicating whether the slot reset should be done in firmware
+ibm,slot-pluggable          Boolean indicating whether the slot is pluggable
+ibm,slot-surprise-pluggable Boolean indicating whether the slot supports surprise hotplug
+ibm,slot-broken-pdc         Boolean indicating whether PDC (Presence Detection Change) is broken
+ibm,slot-power-ctl          Boolean indicating whether the slot has power control
+ibm,slot-wired-lanes        The number of hardware lanes that are wired
+ibm,slot-pwr-led-ctl        Presence of slot power led, and controlling entity
+ibm,slot-attn-led-ctl       Presence of slot ATTN led, and controlling entity
+=========================== ==========
 
 PCI Hotplug
 -----------
diff --git a/include/pci-slot.h b/include/pci-slot.h
index 7f16ddd..4ebe043 100644
--- a/include/pci-slot.h
+++ b/include/pci-slot.h
@@ -147,6 +147,7 @@ struct pci_slot {
 	uint32_t		flags;
 #define PCI_SLOT_FLAG_BOOTUP		0x1
 #define PCI_SLOT_FLAG_FORCE_POWERON	0x2
+#define PCI_SLOT_FLAG_BROKEN_PDC	0x4
 
 	struct phb		*phb;
 	struct pci_device	*pd;
-- 
2.7.4



More information about the Skiboot mailing list