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:
wanghao11 2022-07-25 10:08:43 +08:00 committed by Felix Held
parent 9c4ae9131c
commit f38992e608
1 changed files with 25 additions and 24 deletions

View File

@ -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);