summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)