[Skiboot] [RESEND][PATCH 2/2] platforms/ibm-fsp: Use power_ctl bit when determining slot reset method

Suraj Jitindar Singh sjitindarsingh at gmail.com
Thu Jul 28 19:17:32 AEST 2016


Previously the power_ctl bit provided by the VPD was unused, now that we
are correctly assigning it we can use it when determining the slot reset
method.

The power_ctl bit is used to represent if power management is available.
If power_ctl is set to true, then the I2C based external power management
functionality will be populated on the PCI slot. Otherwise we will try to
use the inband PERST as the fundamental reset, as before.

While we are here we introduce a helper function to isolate the logic
initialisation for the I2C based external power management, to improve
readibility.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh at gmail.com>
Acked-by: Gavin Shan <gwshan at linux.vnet.ibm.com>

---

Change Log:

V1 -> V2:
	- Rewrite commit message

---
 platforms/ibm-fsp/firenze-pci.c | 45 ++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/platforms/ibm-fsp/firenze-pci.c b/platforms/ibm-fsp/firenze-pci.c
index b4a0e5a..4cc0284 100644
--- a/platforms/ibm-fsp/firenze-pci.c
+++ b/platforms/ibm-fsp/firenze-pci.c
@@ -832,27 +832,12 @@ static void firenze_pci_slot_fixup(struct pci_slot *slot,
 	}
 }
 
-static void firenze_pci_slot_init(struct pci_slot *slot)
+static void firenze_pci_setup_power_mgt(struct pci_slot *slot,
+					struct firenze_pci_slot *plat_slot,
+					struct firenze_pci_slot_info *info)
 {
-	struct lxvpd_pci_slot *s = slot->data;
-	struct firenze_pci_slot *plat_slot = slot->data;
-	struct firenze_pci_slot_info *info = NULL;
-	uint32_t vdid;
 	uint8_t buddy;
-	int i;
-
-	/* Search for PCI slot info */
-	for (i = 0; i < ARRAY_SIZE(firenze_pci_slots); i++) {
-		if (firenze_pci_slots[i].index == s->slot_index &&
-		    !strcmp(firenze_pci_slots[i].label, s->label)) {
-			info = &firenze_pci_slots[i];
-			break;
-		}
-	}
-	if (!info)
-		return;
 
-	/* Search I2C bus for external power mgt */
 	buddy = info->buddy;
 	plat_slot->i2c_bus = firenze_pci_find_i2c_bus(info->chip_id,
 						      info->master_id,
@@ -891,6 +876,30 @@ static void firenze_pci_slot_init(struct pci_slot *slot)
 			plat_slot->i2c_bus = NULL;
 		}
 	}
+}
+
+static void firenze_pci_slot_init(struct pci_slot *slot)
+{
+	struct lxvpd_pci_slot *s = slot->data;
+	struct firenze_pci_slot *plat_slot = slot->data;
+	struct firenze_pci_slot_info *info = NULL;
+	uint32_t vdid;
+	int i;
+
+	/* Search for PCI slot info */
+	for (i = 0; i < ARRAY_SIZE(firenze_pci_slots); i++) {
+		if (firenze_pci_slots[i].index == s->slot_index &&
+		    !strcmp(firenze_pci_slots[i].label, s->label)) {
+			info = &firenze_pci_slots[i];
+			break;
+		}
+	}
+	if (!info)
+		return;
+
+	/* Search I2C bus for external power mgt */
+	if (slot->power_ctl)
+		firenze_pci_setup_power_mgt(slot, plat_slot, info);
 
 	/*
 	 * If the slot has external power logic, to override the
-- 
2.5.5



More information about the Skiboot mailing list