mb/ocp/deltalake: Update SMBIOS type 2 Location In Chassis from BMC

There are 4 slots in YV3, Location In Chassis should be 1~4.

Tested=on OCP Delta Lake, dmidecode -t 2 verified the string is correct.

Change-Id: I3b65ecc6f6421d85d1cb890c522be4787362a01b
Signed-off-by: Johnny Lin <johnny_lin@wiwynn.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/42277
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Jonathan Zhang <jonzhang@fb.com>
Reviewed-by: Christian Walter <christian.walter@9elements.com>
This commit is contained in:
Johnny Lin 2020-06-11 15:25:37 +08:00 committed by Philipp Deppenwiese
parent 4a8e58fd93
commit 5e8709f89e
3 changed files with 59 additions and 8 deletions

View File

@ -46,3 +46,28 @@ enum cb_err ipmi_get_pcie_config(uint8_t *pcie_config)
return CB_SUCCESS; return CB_SUCCESS;
} }
enum cb_err ipmi_get_slot_id(uint8_t *slot_id)
{
int ret;
struct ipmi_config_rsp {
struct ipmi_rsp resp;
uint8_t board_sku_id;
uint8_t board_rev_id;
uint8_t slot_id;
uint8_t slot_config_id;
} __packed;
struct ipmi_config_rsp rsp;
ret = ipmi_kcs_message(CONFIG_BMC_KCS_BASE, 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;
}
*slot_id = rsp.slot_id;
return CB_SUCCESS;
}

View File

@ -5,15 +5,18 @@
#include <stdint.h> #include <stdint.h>
#define IPMI_NETFN_OEM 0x30 #define IPMI_NETFN_OEM 0x30
#define IPMI_OEM_SET_PPIN 0x77 #define IPMI_OEM_SET_PPIN 0x77
#define IPMI_OEM_GET_PCIE_CONFIG 0xf4 #define IPMI_OEM_GET_PCIE_CONFIG 0xf4
#define IPMI_OEM_GET_BOARD_ID 0x37
#define PCIE_CONFIG_UNKNOWN 0x0 enum config_type {
#define PCIE_CONFIG_A 0x1 PCIE_CONFIG_UNKNOWN = 0x0,
#define PCIE_CONFIG_B 0x2 PCIE_CONFIG_A = 0x1,
#define PCIE_CONFIG_C 0x3 PCIE_CONFIG_B = 0x2,
#define PCIE_CONFIG_D 0x4 PCIE_CONFIG_C = 0x3,
PCIE_CONFIG_D = 0x4,
};
struct ppin_req { struct ppin_req {
uint32_t cpu0_lo; uint32_t cpu0_lo;
@ -24,4 +27,5 @@ struct ppin_req {
enum cb_err ipmi_set_ppin(struct ppin_req *req); enum cb_err ipmi_set_ppin(struct ppin_req *req);
enum cb_err ipmi_get_pcie_config(uint8_t *config); enum cb_err ipmi_get_pcie_config(uint8_t *config);
enum cb_err ipmi_get_slot_id(uint8_t *slot_id);
#endif #endif

View File

@ -4,10 +4,32 @@
#include <drivers/ipmi/ipmi_ops.h> #include <drivers/ipmi/ipmi_ops.h>
#include <drivers/ocp/dmi/ocp_dmi.h> #include <drivers/ocp/dmi/ocp_dmi.h>
#include <soc/ramstage.h> #include <soc/ramstage.h>
#include <stdio.h>
#include "ipmi.h" #include "ipmi.h"
#define SLOT_ID_LEN 2
extern struct fru_info_str fru_strings; extern struct fru_info_str fru_strings;
static char slot_id_str[SLOT_ID_LEN];
/* Override SMBIOS 2 Location In Chassis from BMC */
const char *smbios_mainboard_location_in_chassis(void)
{
uint8_t slot_id = 0;
if (ipmi_get_slot_id(&slot_id) != CB_SUCCESS) {
printk(BIOS_ERR, "IPMI get slot_id failed\n");
return "";
}
/* Sanity check, slot_id can only be 1~4 since there are 4 slots in YV3 */
if (slot_id < PCIE_CONFIG_A || slot_id > PCIE_CONFIG_D) {
printk(BIOS_ERR, "slot_id %d is not between 1~4\n", slot_id);
return "";
}
snprintf(slot_id_str, SLOT_ID_LEN, "%d", slot_id);
return slot_id_str;
}
static void dl_oem_smbios_strings(struct device *dev, struct smbios_type11 *t) static void dl_oem_smbios_strings(struct device *dev, struct smbios_type11 *t)
{ {