aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/ipmi/ipmi_kcs.c
diff options
context:
space:
mode:
authorJohnny Lin <johnny_lin@wiwynn.com>2020-09-04 17:05:58 +0800
committerPatrick Georgi <pgeorgi@google.com>2020-09-09 13:39:36 +0000
commitd04c06b472495bce49af0e171c333de26e8fd86a (patch)
treee26aafabff2829637677a153f3e45f77f6ddf65b /src/drivers/ipmi/ipmi_kcs.c
parent44097e21cc3dcb81690de68bbcda2b194ac427fe (diff)
drivers/ipmi: Add CONFIG_IPMI_KCS_TIMEOUT_MS for IPMI KCS timeout value
With the current timeout of 1000 cycles of 100 microsecond would see timeout occurs on OCP Delta Lake if the log level is set to values smaller than 8. Because the prink(BIOS_SPEW, ..) in ipmi_kcs_status() creates delay and avoid the problem, but after setting the log level to 4 we see some timeout occurs. The unit is millisecond and the default value is set to 5000 according to IPMI spec v2.0 rev 1.1 Sec. 9.15, a five-second timeout or greater is recommended. Tested=On OCP Delta Lake, with log level 4 cannot observe timeout occurs. Change-Id: I42ede1d9200bb5d0dbb455d2ff66e2816f10e86b Signed-off-by: Johnny Lin <johnny_lin@wiwynn.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/45103 Reviewed-by: Patrick Georgi <pgeorgi@google.com> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/drivers/ipmi/ipmi_kcs.c')
-rw-r--r--src/drivers/ipmi/ipmi_kcs.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/src/drivers/ipmi/ipmi_kcs.c b/src/drivers/ipmi/ipmi_kcs.c
index 1d6b71cee9..f8c64c68e9 100644
--- a/src/drivers/ipmi/ipmi_kcs.c
+++ b/src/drivers/ipmi/ipmi_kcs.c
@@ -3,7 +3,7 @@
#include <console/console.h>
#include <device/device.h>
#include <arch/io.h>
-#include <delay.h>
+#include <timer.h>
#include "ipmi_kcs.h"
#define IPMI_KCS_STATE(_x) ((_x) >> 6)
@@ -35,27 +35,22 @@ static unsigned char ipmi_kcs_status(int port)
static int wait_ibf_timeout(int port)
{
- int timeout = 1000;
- do {
- if (!(ipmi_kcs_status(port) & IPMI_KCS_IBF))
- return 0;
- udelay(100);
- } while (timeout--);
- printk(BIOS_ERR, "wait_ibf timeout!\n");
- return timeout;
+ if (!wait_ms(CONFIG_IPMI_KCS_TIMEOUT_MS, !(ipmi_kcs_status(port) & IPMI_KCS_IBF))) {
+ printk(BIOS_ERR, "wait_ibf timeout!\n");
+ return 1;
+ } else {
+ return 0;
+ }
}
static int wait_obf_timeout(int port)
{
- int timeout = 1000;
- do {
- if ((ipmi_kcs_status(port) & IPMI_KCS_OBF))
- return 0;
- udelay(100);
- } while (timeout--);
-
- printk(BIOS_ERR, "wait_obf timeout!\n");
- return timeout;
+ if (!wait_ms(CONFIG_IPMI_KCS_TIMEOUT_MS, (ipmi_kcs_status(port) & IPMI_KCS_OBF))) {
+ printk(BIOS_ERR, "wait_obf timeout!\n");
+ return 1;
+ } else {
+ return 0;
+ }
}