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:
parent
4a8e58fd93
commit
5e8709f89e
|
@ -46,3 +46,28 @@ enum cb_err ipmi_get_pcie_config(uint8_t *pcie_config)
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -5,15 +5,18 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#define IPMI_NETFN_OEM 0x30
|
||||
#define IPMI_OEM_SET_PPIN 0x77
|
||||
#define IPMI_OEM_GET_PCIE_CONFIG 0xf4
|
||||
#define IPMI_NETFN_OEM 0x30
|
||||
#define IPMI_OEM_SET_PPIN 0x77
|
||||
#define IPMI_OEM_GET_PCIE_CONFIG 0xf4
|
||||
#define IPMI_OEM_GET_BOARD_ID 0x37
|
||||
|
||||
#define PCIE_CONFIG_UNKNOWN 0x0
|
||||
#define PCIE_CONFIG_A 0x1
|
||||
#define PCIE_CONFIG_B 0x2
|
||||
#define PCIE_CONFIG_C 0x3
|
||||
#define PCIE_CONFIG_D 0x4
|
||||
enum config_type {
|
||||
PCIE_CONFIG_UNKNOWN = 0x0,
|
||||
PCIE_CONFIG_A = 0x1,
|
||||
PCIE_CONFIG_B = 0x2,
|
||||
PCIE_CONFIG_C = 0x3,
|
||||
PCIE_CONFIG_D = 0x4,
|
||||
};
|
||||
|
||||
struct ppin_req {
|
||||
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_get_pcie_config(uint8_t *config);
|
||||
enum cb_err ipmi_get_slot_id(uint8_t *slot_id);
|
||||
#endif
|
||||
|
|
|
@ -4,10 +4,32 @@
|
|||
#include <drivers/ipmi/ipmi_ops.h>
|
||||
#include <drivers/ocp/dmi/ocp_dmi.h>
|
||||
#include <soc/ramstage.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ipmi.h"
|
||||
|
||||
#define SLOT_ID_LEN 2
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue