mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-12-22 06:12:02 +00:00
Hifive Premier P550[1] is a Mini-DTX form factor board with EIC7700X. It has a STM32F407VET6 onboard MCU acting as the BMC, controlling ATX power on/off while providing remote management features. The EIC7700X SoC/SoM communicates with the BMC via UART2, using ESWIN's protocol. The messages transmitted are fixed sizes (267 bytes), and depending on the type, can be directional or bi-directional. The shutdown and cold reboot requests are directional messages from SoC to BMC (NOTIFY type) with CMD_POWER_OFF or CMD_RESTART. The payload of shutdown/cold reboot requests should be empty and are ignored by the BMC at the moment. A HFP (Hifive Premier) specific reset device is registered in addition to the SoC reset device. For shutdown and cold reboot, the board-level reset takes precedence. The definitions of the SoC <-> BMC message protocol is taken from ESWIN's repo [2]. The only file used from that repo is `hf_common.h` It's disjunctively dual licensed as (GPL-2.0-only OR BSD-2-Clause), hence, compatible with the license of OpenSBI. It's heavily modified and renamed as platform/generic/include/eswin/hfp.h. The author and copyright in the original file are retained. Validated shutdown/cold reboot working on Hifive Premier P550. [1] https://www.sifive.com/boards/hifive-premier-p550#documentation [2] https://github.com/eswincomputing/hifive-premier-p550-mcu-patches.git Signed-off-by: Bo Gan <ganboing@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20251218104243.562667-8-ganboing@gmail.com Signed-off-by: Anup Patel <anup@brainfault.org>
65 lines
1.4 KiB
C
65 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
|
/*
|
|
* Copyright (c) 2024 Beijing ESWIN Computing Technology Co., Ltd.
|
|
*
|
|
* Authors:
|
|
* Lin Min <linmin@eswincomputing.com>
|
|
* Bo Gan <ganboing@gmail.com>
|
|
*
|
|
* Adapted from Core/Inc/hf_common.h from ESWIN's Hifive Premier P550
|
|
* onboard BMC (MCU) source repo:
|
|
* https://github.com/eswincomputing/hifive-premier-p550-mcu-patches.git
|
|
*
|
|
*/
|
|
|
|
#ifndef __ESWIN_HFP_H__
|
|
#define __ESWIN_HFP_H__
|
|
|
|
#include <sbi/sbi_types.h>
|
|
|
|
enum hfp_bmc_msg {
|
|
HFP_MSG_REQUEST = 1,
|
|
HFP_MSG_REPLY,
|
|
HFP_MSG_NOTIFY,
|
|
};
|
|
|
|
enum hfp_bmc_cmd {
|
|
HFP_CMD_POWER_OFF = 1,
|
|
HFP_CMD_REBOOT,
|
|
HFP_CMD_READ_BOARD_INFO,
|
|
HFP_CMD_CONTROL_LED,
|
|
HFP_CMD_PVT_INFO,
|
|
HFP_CMD_BOARD_STATUS,
|
|
HFP_CMD_POWER_INFO,
|
|
HFP_CMD_RESTART, // cold reboot with power off/on
|
|
};
|
|
|
|
#define MAGIC_HEADER 0xA55AAA55
|
|
#define MAGIC_TAIL 0xBDBABDBA
|
|
|
|
struct hfp_bmc_message {
|
|
uint32_t header_magic;
|
|
uint32_t task_id;
|
|
uint8_t type;
|
|
uint8_t cmd;
|
|
uint8_t result;
|
|
uint8_t data_len;
|
|
uint8_t data[250];
|
|
uint8_t checksum;
|
|
uint32_t tail_magic;
|
|
} __packed;
|
|
|
|
static inline void hfp_bmc_checksum_msg(struct hfp_bmc_message *msg)
|
|
{
|
|
msg->checksum = 0;
|
|
msg->checksum ^= msg->type;
|
|
msg->checksum ^= msg->cmd;
|
|
msg->checksum ^= msg->data_len;
|
|
for (uint8_t i = 0; i != msg->data_len; i++)
|
|
msg->checksum ^= msg->data[i];
|
|
}
|
|
|
|
extern const struct eic770x_board_override hfp_override;
|
|
|
|
#endif
|