drivers/ipmi: Retry ipmi_get_device_id in ipmi_kcs_init
Add retry up to 10 seconds maximal in ipmi_get_device_id. Without this retry, on OCP Craterlake with BMC version v2022.28.1, there's a chance that ipmi_get_device_id failed then ipmi device won't be enabled. Change-Id: I2b972c905fb0f8223570212432a4a10bd715f3f7 Signed-off-by: Yiwei Tang <tangyiwei.2022@bytedance.com> Signed-off-by: Johnny Lin <johnny_lin@wiwynn.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/69310 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Jonathan Zhang <jonzhang@fb.com>
This commit is contained in:
parent
9c4ae9131c
commit
f38992e608
|
@ -28,6 +28,8 @@
|
||||||
#include "ipmi_supermicro_oem.h"
|
#include "ipmi_supermicro_oem.h"
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
#define IPMI_GET_DID_RETRY_MS 10000
|
||||||
|
|
||||||
/* 4 bit encoding */
|
/* 4 bit encoding */
|
||||||
static u8 ipmi_revision_major = 0x1;
|
static u8 ipmi_revision_major = 0x1;
|
||||||
static u8 ipmi_revision_minor = 0x0;
|
static u8 ipmi_revision_minor = 0x0;
|
||||||
|
@ -112,11 +114,19 @@ static void ipmi_kcs_init(struct device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ipmi_process_self_test_result(dev))
|
if (ipmi_process_self_test_result(dev)) {
|
||||||
/* Don't write tables if communication failed */
|
/* Don't write tables if communication failed */
|
||||||
dev->enabled = 0;
|
dev->enabled = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wait_ms(IPMI_GET_DID_RETRY_MS, !ipmi_get_device_id(dev, &rsp))) {
|
||||||
|
printk(BIOS_ERR, "IPMI: BMC does not respond to get device id even "
|
||||||
|
"after %d ms.\n", IPMI_GET_DID_RETRY_MS);
|
||||||
|
dev->enabled = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ipmi_get_device_id(dev, &rsp)) {
|
|
||||||
/* Queried the IPMI revision from BMC */
|
/* Queried the IPMI revision from BMC */
|
||||||
ipmi_revision_minor = IPMI_IPMI_VERSION_MINOR(rsp.ipmi_version);
|
ipmi_revision_minor = IPMI_IPMI_VERSION_MINOR(rsp.ipmi_version);
|
||||||
ipmi_revision_major = IPMI_IPMI_VERSION_MAJOR(rsp.ipmi_version);
|
ipmi_revision_major = IPMI_IPMI_VERSION_MAJOR(rsp.ipmi_version);
|
||||||
|
@ -124,23 +134,14 @@ static void ipmi_kcs_init(struct device *dev)
|
||||||
bmc_revision_major = rsp.fw_rev1;
|
bmc_revision_major = rsp.fw_rev1;
|
||||||
bmc_revision_minor = rsp.fw_rev2;
|
bmc_revision_minor = rsp.fw_rev2;
|
||||||
|
|
||||||
memcpy(&man_id, rsp.manufacturer_id,
|
memcpy(&man_id, rsp.manufacturer_id, sizeof(rsp.manufacturer_id));
|
||||||
sizeof(rsp.manufacturer_id));
|
|
||||||
|
|
||||||
memcpy(&prod_id, rsp.product_id, sizeof(rsp.product_id));
|
memcpy(&prod_id, rsp.product_id, sizeof(rsp.product_id));
|
||||||
|
|
||||||
printk(BIOS_INFO, "IPMI: Found man_id 0x%06x, prod_id 0x%04x\n",
|
printk(BIOS_INFO, "IPMI: Found man_id 0x%06x, prod_id 0x%04x\n", man_id, prod_id);
|
||||||
man_id, prod_id);
|
|
||||||
|
|
||||||
printk(BIOS_INFO, "IPMI: Version %01x.%01x\n",
|
printk(BIOS_INFO, "IPMI: Version %01x.%01x\n", ipmi_revision_major,
|
||||||
ipmi_revision_major, ipmi_revision_minor);
|
ipmi_revision_minor);
|
||||||
} else {
|
|
||||||
/* Don't write tables if communication failed */
|
|
||||||
dev->enabled = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dev->enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (CONFIG(DRIVERS_IPMI_SUPERMICRO_OEM))
|
if (CONFIG(DRIVERS_IPMI_SUPERMICRO_OEM))
|
||||||
supermicro_ipmi_oem(dev->path.pnp.port);
|
supermicro_ipmi_oem(dev->path.pnp.port);
|
||||||
|
|
Loading…
Reference in New Issue