[PATCH v1 17/30] discover: Move generic ipmi routines to ipmi

Geoff Levand geoff at infradead.org
Wed Jul 25 08:15:42 AEST 2018


From: Ge Song <ge.song at hxt-semitech.com>

Signed-off-by: Ge Song <ge.song at hxt-semitech.com>
[Split from a larger patch]
Signed-off-by: Geoff Levand <geoff at infradead.org>
---
 discover/ipmi.c             | 123 ++++++++++++++++++++++++++++++++++++++++
 discover/ipmi.h             |   4 ++
 discover/platform-powerpc.c | 133 ++------------------------------------------
 3 files changed, 131 insertions(+), 129 deletions(-)

diff --git a/discover/ipmi.c b/discover/ipmi.c
index f94dab7..840fdee 100644
--- a/discover/ipmi.c
+++ b/discover/ipmi.c
@@ -320,3 +320,126 @@ int parse_ipmi_interface_override(struct config *config, uint8_t *buf,
 
 	return 0;
 }
+
+void ipmi_get_bmc_mac(struct ipmi *ipmi, uint8_t *buf)
+{
+	uint16_t resp_len = 8;
+	uint8_t resp[8];
+	uint8_t req[] = { 0x1, 0x5, 0x0, 0x0 };
+	int i, rc;
+
+	rc = ipmi_transaction(ipmi, IPMI_NETFN_TRANSPORT,
+			IPMI_CMD_TRANSPORT_GET_LAN_PARAMS,
+			req, sizeof(req),
+			resp, &resp_len,
+			ipmi_timeout);
+
+	pb_debug_fn("BMC MAC resp [%d][%d]:\n", rc, resp_len);
+
+	if (rc == 0 && resp_len > 0) {
+		for (i = 2; i < resp_len; i++) {
+		        pb_debug(" %x", resp[i]);
+			buf[i - 2] = resp[i];
+		}
+		pb_debug("\n");
+	}
+
+}
+
+/*
+ * Retrieve info from the "Get Device ID" IPMI commands.
+ * See Chapter 20.1 in the IPMIv2 specification.
+ */
+void ipmi_get_bmc_versions(struct ipmi *ipmi, struct system_info *info)
+{
+	uint16_t resp_len = 16;
+	uint8_t resp[16], bcd;
+	int i, rc;
+
+	/* Retrieve info from current side */
+	rc = ipmi_transaction(ipmi, IPMI_NETFN_APP,
+			IPMI_CMD_APP_GET_DEVICE_ID,
+			NULL, 0,
+			resp, &resp_len,
+			ipmi_timeout);
+
+	pb_debug_fn("BMC version resp [%d][%d]:\n", rc, resp_len);
+	if (resp_len > 0) {
+		for (i = 0; i < resp_len; i++) {
+		        pb_debug(" %x", resp[i]);
+		}
+		pb_debug("\n");
+	}
+
+	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
+		info->bmc_current = talloc_array(info, char *, 4);
+		info->n_bmc_current = 4;
+
+		info->bmc_current[0] = talloc_asprintf(info, "Device ID: 0x%x",
+						resp[1]);
+		info->bmc_current[1] = talloc_asprintf(info, "Device Rev: 0x%x",
+						resp[2]);
+		bcd = resp[4] & 0x0f;
+		bcd += 10 * (resp[4] >> 4);
+		/* rev1.rev2.aux_revision */
+		info->bmc_current[2] = talloc_asprintf(info,
+				"Firmware version: %u.%02u",
+				resp[3], bcd);
+		if (resp_len == 16) {
+			info->bmc_current[2] = talloc_asprintf_append(
+					info->bmc_current[2],
+					".%02x%02x%02x%02x",
+					resp[12], resp[13], resp[14], resp[15]);
+		}
+		bcd = resp[5] & 0x0f;
+		bcd += 10 * (resp[5] >> 4);
+		info->bmc_current[3] = talloc_asprintf(info, "IPMI version: %u",
+						bcd);
+	} else
+		pb_debug_fn("Failed to retrieve Device ID from IPMI\n");
+
+	/* Retrieve info from golden side */
+	memset(resp, 0, sizeof(resp));
+	resp_len = 16;
+	rc = ipmi_transaction(ipmi, IPMI_NETFN_AMI,
+			IPMI_CMD_APP_GET_DEVICE_ID_GOLDEN,
+			NULL, 0,
+			resp, &resp_len,
+			ipmi_timeout);
+
+	pb_debug_fn("BMC golden resp [%d][%d]:\n", rc, resp_len);
+	if (resp_len > 0) {
+		for (i = 0; i < resp_len; i++) {
+		        pb_debug(" %x", resp[i]);
+		}
+		pb_debug("\n");
+	}
+
+	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
+		info->bmc_golden = talloc_array(info, char *, 4);
+		info->n_bmc_golden = 4;
+
+		info->bmc_golden[0] = talloc_asprintf(info, "Device ID: 0x%x",
+						resp[1]);
+		info->bmc_golden[1] = talloc_asprintf(info, "Device Rev: 0x%x",
+						resp[2]);
+		bcd = resp[4] & 0x0f;
+		bcd += 10 * (resp[4] >> 4);
+		/* rev1.rev2.aux_revision */
+		info->bmc_golden[2] = talloc_asprintf(info,
+				"Firmware version: %u.%02u",
+				resp[3], bcd);
+		if (resp_len == 16) {
+			info->bmc_golden[2] = talloc_asprintf_append(
+					info->bmc_golden[2],
+					".%02x%02x%02x%02x",
+					resp[12], resp[13], resp[14], resp[15]);
+		}
+		bcd = resp[5] & 0x0f;
+		bcd += 10 * (resp[5] >> 4);
+		info->bmc_golden[3] = talloc_asprintf(info, "IPMI version: %u",
+						bcd);
+	} else
+		pb_debug_fn("Failed to retrieve Golden Device ID from IPMI\n");
+}
+
diff --git a/discover/ipmi.h b/discover/ipmi.h
index af8df35..c8ccb46 100644
--- a/discover/ipmi.h
+++ b/discover/ipmi.h
@@ -29,6 +29,8 @@ enum ipmi_sensor_ids {
 
 struct ipmi;
 
+static const int ipmi_timeout = 10000; /* milliseconds. */
+
 bool ipmi_present(void);
 bool ipmi_bootdev_is_valid(int x);
 struct ipmi *ipmi_open(void *ctx);
@@ -40,6 +42,8 @@ int ipmi_transaction(struct ipmi *ipmi, uint8_t netfn, uint8_t cmd,
 
 int parse_ipmi_interface_override(struct config *config, uint8_t *buf,
 				uint16_t len);
+void ipmi_get_bmc_mac(struct ipmi *ipmi, uint8_t *buf);
+void ipmi_get_bmc_versions(struct ipmi *ipmi, struct system_info *info);
 
 
 #endif /* _IPMI_H */
diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 2ee376d..d7bd949 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -26,7 +26,6 @@
 static const char *partition = "common";
 static const char *sysparams_dir = "/sys/firmware/opal/sysparams/";
 static const char *devtree_dir = "/proc/device-tree/";
-static const int ipmi_timeout = 10000; /* milliseconds. */
 
 struct param {
 	char			*name;
@@ -986,130 +985,6 @@ static int set_ipmi_os_boot_sensor(struct platform_powerpc *platform)
 	return 0;
 }
 
-static void get_ipmi_bmc_mac(struct platform *p, uint8_t *buf)
-{
-	struct platform_powerpc *platform = p->platform_data;
-	uint16_t resp_len = 8;
-	uint8_t resp[8];
-	uint8_t req[] = { 0x1, 0x5, 0x0, 0x0 };
-	int i, rc;
-
-	rc = ipmi_transaction(platform->ipmi, IPMI_NETFN_TRANSPORT,
-			IPMI_CMD_TRANSPORT_GET_LAN_PARAMS,
-			req, sizeof(req),
-			resp, &resp_len,
-			ipmi_timeout);
-
-	pb_debug("BMC MAC resp [%d][%d]:\n", rc, resp_len);
-
-	if (rc == 0 && resp_len > 0) {
-		for (i = 2; i < resp_len; i++) {
-		        pb_debug(" %x", resp[i]);
-			buf[i - 2] = resp[i];
-		}
-		pb_debug("\n");
-	}
-
-}
-
-/*
- * Retrieve info from the "Get Device ID" IPMI commands.
- * See Chapter 20.1 in the IPMIv2 specification.
- */
-static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
-{
-	struct platform_powerpc *platform = p->platform_data;
-	uint16_t resp_len = 16;
-	uint8_t resp[16], bcd;
-	int i, rc;
-
-	/* Retrieve info from current side */
-	rc = ipmi_transaction(platform->ipmi, IPMI_NETFN_APP,
-			IPMI_CMD_APP_GET_DEVICE_ID,
-			NULL, 0,
-			resp, &resp_len,
-			ipmi_timeout);
-
-	pb_debug("BMC version resp [%d][%d]:\n", rc, resp_len);
-	if (resp_len > 0) {
-		for (i = 0; i < resp_len; i++) {
-		        pb_debug(" %x", resp[i]);
-		}
-		pb_debug("\n");
-	}
-
-	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
-		info->bmc_current = talloc_array(info, char *, 4);
-		info->n_bmc_current = 4;
-
-		info->bmc_current[0] = talloc_asprintf(info, "Device ID: 0x%x",
-						resp[1]);
-		info->bmc_current[1] = talloc_asprintf(info, "Device Rev: 0x%x",
-						resp[2]);
-		bcd = resp[4] & 0x0f;
-		bcd += 10 * (resp[4] >> 4);
-		/* rev1.rev2.aux_revision */
-		info->bmc_current[2] = talloc_asprintf(info,
-				"Firmware version: %u.%02u",
-				resp[3], bcd);
-		if (resp_len == 16) {
-			info->bmc_current[2] = talloc_asprintf_append(
-					info->bmc_current[2],
-					".%02x%02x%02x%02x",
-					resp[12], resp[13], resp[14], resp[15]);
-		}
-		bcd = resp[5] & 0x0f;
-		bcd += 10 * (resp[5] >> 4);
-		info->bmc_current[3] = talloc_asprintf(info, "IPMI version: %u",
-						bcd);
-	} else
-		pb_log("Failed to retrieve Device ID from IPMI\n");
-
-	/* Retrieve info from golden side */
-	memset(resp, 0, sizeof(resp));
-	resp_len = 16;
-	rc = ipmi_transaction(platform->ipmi, IPMI_NETFN_AMI,
-			IPMI_CMD_APP_GET_DEVICE_ID_GOLDEN,
-			NULL, 0,
-			resp, &resp_len,
-			ipmi_timeout);
-
-	pb_debug("BMC golden resp [%d][%d]:\n", rc, resp_len);
-	if (resp_len > 0) {
-		for (i = 0; i < resp_len; i++) {
-		        pb_debug(" %x", resp[i]);
-		}
-		pb_debug("\n");
-	}
-
-	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
-		info->bmc_golden = talloc_array(info, char *, 4);
-		info->n_bmc_golden = 4;
-
-		info->bmc_golden[0] = talloc_asprintf(info, "Device ID: 0x%x",
-						resp[1]);
-		info->bmc_golden[1] = talloc_asprintf(info, "Device Rev: 0x%x",
-						resp[2]);
-		bcd = resp[4] & 0x0f;
-		bcd += 10 * (resp[4] >> 4);
-		/* rev1.rev2.aux_revision */
-		info->bmc_golden[2] = talloc_asprintf(info,
-				"Firmware version: %u.%02u",
-				resp[3], bcd);
-		if (resp_len == 16) {
-			info->bmc_golden[2] = talloc_asprintf_append(
-					info->bmc_golden[2],
-					".%02x%02x%02x%02x",
-					resp[12], resp[13], resp[14], resp[15]);
-		}
-		bcd = resp[5] & 0x0f;
-		bcd += 10 * (resp[5] >> 4);
-		info->bmc_golden[3] = talloc_asprintf(info, "IPMI version: %u",
-						bcd);
-	} else
-		pb_log("Failed to retrieve Golden Device ID from IPMI\n");
-}
-
 static void get_ipmi_network_override(struct platform_powerpc *platform,
 			struct config *config)
 {
@@ -1320,11 +1195,11 @@ static int get_sysinfo(struct platform *p, struct system_info *sysinfo)
 	talloc_free(filename);
 
 	sysinfo->bmc_mac = talloc_zero_size(sysinfo, HWADDR_SIZE);
-	if (platform->ipmi)
-		get_ipmi_bmc_mac(p, sysinfo->bmc_mac);
 
-	if (platform->ipmi)
-		get_ipmi_bmc_versions(p, sysinfo);
+	if (platform->ipmi) {
+		ipmi_get_bmc_mac(platform->ipmi, sysinfo->bmc_mac);
+		ipmi_get_bmc_versions(platform->ipmi, sysinfo);
+	}
 
 	if (platform->get_platform_versions)
 		platform->get_platform_versions(sysinfo);
-- 
2.14.1




More information about the Petitboot mailing list