Jonathan Zhang has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/68779 )
Change subject: drivers/ipmi/ocp: add functions to get board configuration ......................................................................
drivers/ipmi/ocp: add functions to get board configuration
Add IPMI OEM command to get board configuration. Add function to get blade index in the sled.
Signed-off-by: Jingle Hsu jingle_hsu@wiwynn.com Signed-off-by: Jonathan Zhang jonzhang@meta.com
Change-Id: I85ec7ba68d580c13e368e7d656dba47ea043d33e --- M src/drivers/ipmi/ocp/Makefile.inc M src/drivers/ipmi/ocp/ipmi_ocp.h M src/drivers/ipmi/ocp/ipmi_sel.c 3 files changed, 52 insertions(+), 1 deletion(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/79/68779/1
diff --git a/src/drivers/ipmi/ocp/Makefile.inc b/src/drivers/ipmi/ocp/Makefile.inc index fc56364..2b492e1 100644 --- a/src/drivers/ipmi/ocp/Makefile.inc +++ b/src/drivers/ipmi/ocp/Makefile.inc @@ -1,4 +1,4 @@ -ramstage-$(CONFIG_IPMI_OCP) += ipmi_ocp.c +ramstage-$(CONFIG_IPMI_OCP) += ipmi_ocp.c ipmi_sel.c ifeq ($(CONFIG_IPMI_OCP),y) romstage-$(CONFIG_IPMI_KCS_ROMSTAGE) += ipmi_ocp_romstage.c smm-$(CONFIG_IPMI_BMC_SEL) += ipmi_sel.c diff --git a/src/drivers/ipmi/ocp/ipmi_ocp.h b/src/drivers/ipmi/ocp/ipmi_ocp.h index a51c53d..534ddea 100644 --- a/src/drivers/ipmi/ocp/ipmi_ocp.h +++ b/src/drivers/ipmi/ocp/ipmi_ocp.h @@ -11,6 +11,7 @@ #define IPMI_BMC_SET_POST_START 0x73 #define IPMI_OEM_SET_BIOS_BOOT_ORDER 0x52 #define IPMI_OEM_GET_BIOS_BOOT_ORDER 0x53 +#define IPMI_OEM_GET_BOARD_ID 0x37
#define CMOS_BIT (1 << 1) #define VALID_BIT (1 << 7) @@ -175,4 +176,7 @@ uint8_t prmry_id); void ipmi_send_sel_pcie_dev_fail(uint16_t sts_reg, uint16_t src_id, enum fail_type code); void ipmi_send_sel_iio_err(uint8_t iio_stack_num, uint8_t err_id); + +enum cb_err ipmi_get_board_config(const int port, struct ipmi_config_rsp *config); +uint8_t get_blade_id(void); #endif diff --git a/src/drivers/ipmi/ocp/ipmi_sel.c b/src/drivers/ipmi/ocp/ipmi_sel.c index e75df24..74066ed 100644 --- a/src/drivers/ipmi/ocp/ipmi_sel.c +++ b/src/drivers/ipmi/ocp/ipmi_sel.c @@ -81,3 +81,35 @@ printk(BIOS_DEBUG, "\terror_code = %x, src_id = %x\n", ubslp.type, ubslp.failure_details2); } + +enum cb_err ipmi_get_board_config(const int port, struct ipmi_config_rsp *config) +{ + int ret; + struct ipmi_oem_rsp { + struct ipmi_rsp resp; + struct ipmi_config_rsp data; + } __packed; + + struct ipmi_oem_rsp rsp; + + ret = ipmi_kcs_message(port, IPMI_NETFN_OEM, 0x0, IPMI_OEM_GET_BOARD_ID, NULL, 0, + (unsigned char *)&rsp, sizeof(rsp)); + if (ret < sizeof(struct ipmi_rsp) || rsp.resp.completion_code) { + printk(BIOS_ERR, "IPMI: %s command failed (ret=%d resp=0x%x)\n", + __func__, ret, rsp.resp.completion_code); + return CB_ERR; + } + *config = rsp.data; + return CB_SUCCESS; +} + +__weak uint8_t get_blade_id(void) +{ + struct ipmi_config_rsp rsp = {.slot_id = UINT8_MAX}; + + if (CONFIG(IPMI_KCS) && CONFIG_BMC_KCS_BASE) { + if (ipmi_get_board_config(CONFIG_BMC_KCS_BASE, &rsp) != CB_SUCCESS) + return UINT8_MAX; + } + return rsp.slot_id; +}