summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Chu <Tim.Chu@quantatw.com>2020-10-06 01:40:53 -0700
committerPatrick Georgi <pgeorgi@google.com>2020-10-26 06:46:17 +0000
commit278ad21fa9dfb2abe8b5bcfab820c0e08e0c02e7 (patch)
tree6ed57b4898d4db61d2475bf982051ad1e0bf5030
parentcbcd8a02fc8d5c251ef61a681d6e6cfa0c9a8965 (diff)
src/drivers/ipmi: Add function to get BMC revision
Provide a way to get BMC revision. Tested=On OCP Delta Lake, function can get BMC revision well. Signed-off-by: Tim Chu <Tim.Chu@quantatw.com> Change-Id: Iaaa4e8bf181a38452b53c83a762c7b648e95e643 Reviewed-on: https://review.coreboot.org/c/coreboot/+/46070 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Jonathan Zhang <jonzhang@fb.com> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
-rw-r--r--src/drivers/ipmi/ipmi_kcs.h2
-rw-r--r--src/drivers/ipmi/ipmi_kcs_ops.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/src/drivers/ipmi/ipmi_kcs.h b/src/drivers/ipmi/ipmi_kcs.h
index 501e5dd8c6..33ddd5f016 100644
--- a/src/drivers/ipmi/ipmi_kcs.h
+++ b/src/drivers/ipmi/ipmi_kcs.h
@@ -33,6 +33,8 @@ extern int ipmi_kcs_message(int port, int netfn, int lun, int cmd,
* returns CB_SUCCESS on success and CB_ERR if an error occurred. */
enum cb_err ipmi_kcs_premem_init(const u16 port, const u16 device);
+void ipmi_bmc_version(uint8_t *ipmi_bmc_major_revision, uint8_t *ipmi_bmc_minor_revision);
+
struct ipmi_rsp {
uint8_t lun;
uint8_t cmd;
diff --git a/src/drivers/ipmi/ipmi_kcs_ops.c b/src/drivers/ipmi/ipmi_kcs_ops.c
index dd8f34c148..362f17ac2b 100644
--- a/src/drivers/ipmi/ipmi_kcs_ops.c
+++ b/src/drivers/ipmi/ipmi_kcs_ops.c
@@ -29,6 +29,9 @@
static u8 ipmi_revision_major = 0x1;
static u8 ipmi_revision_minor = 0x0;
+static u8 bmc_revision_major = 0x0;
+static u8 bmc_revision_minor = 0x0;
+
static int ipmi_get_device_id(struct device *dev, struct ipmi_devid_rsp *rsp)
{
int ret;
@@ -145,6 +148,9 @@ static void ipmi_kcs_init(struct device *dev)
ipmi_revision_minor = IPMI_IPMI_VERSION_MINOR(rsp.ipmi_version);
ipmi_revision_major = IPMI_IPMI_VERSION_MAJOR(rsp.ipmi_version);
+ bmc_revision_major = rsp.fw_rev1;
+ bmc_revision_minor = rsp.fw_rev2;
+
memcpy(&man_id, rsp.manufacturer_id,
sizeof(rsp.manufacturer_id));
@@ -273,6 +279,18 @@ static void ipmi_ssdt(const struct device *dev)
}
#endif
+void ipmi_bmc_version(uint8_t *ipmi_bmc_major_revision, uint8_t *ipmi_bmc_minor_revision)
+{
+ if (!bmc_revision_major || !bmc_revision_minor) {
+ printk(BIOS_ERR, "IPMI: BMC revision missing\n");
+ *ipmi_bmc_major_revision = 0;
+ *ipmi_bmc_minor_revision = 0;
+ } else {
+ *ipmi_bmc_major_revision = bmc_revision_major;
+ *ipmi_bmc_minor_revision = bmc_revision_minor;
+ }
+}
+
#if CONFIG(GENERATE_SMBIOS_TABLES)
static int ipmi_smbios_data(struct device *dev, int *handle,
unsigned long *current)