soc/amd/common/lpc/espi_util: use enum cb_err type for return values
Use enum cb_err as return type of all functions that aren't exposed outside of this compilation unit. The checks if a function has returned a failure are replaced with checks if the return value isn't CB_SUCCESS which is equivalent if only those two values are used, but also detects a failure if any unexpected value would be returned. Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: If8c703f62babac31948d0878e91bd31b31bebc01 Reviewed-on: https://review.coreboot.org/c/coreboot/+/60207 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org> Reviewed-by: Marshall Dawson <marshalldawson3rd@gmail.com>
This commit is contained in:
parent
9e830540ec
commit
4b4114f709
|
@ -426,7 +426,7 @@ struct espi_cmd {
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* Wait up to ESPI_CMD_TIMEOUT_US for hardware to clear DNCMD_STATUS bit. */
|
/* Wait up to ESPI_CMD_TIMEOUT_US for hardware to clear DNCMD_STATUS bit. */
|
||||||
static int espi_wait_ready(void)
|
static enum cb_err espi_wait_ready(void)
|
||||||
{
|
{
|
||||||
struct stopwatch sw;
|
struct stopwatch sw;
|
||||||
union espi_txhdr0 hdr0;
|
union espi_txhdr0 hdr0;
|
||||||
|
@ -435,10 +435,10 @@ static int espi_wait_ready(void)
|
||||||
do {
|
do {
|
||||||
hdr0.val = espi_read32(ESPI_DN_TX_HDR0);
|
hdr0.val = espi_read32(ESPI_DN_TX_HDR0);
|
||||||
if (!hdr0.cmd_sts)
|
if (!hdr0.cmd_sts)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
} while (!stopwatch_expired(&sw));
|
} while (!stopwatch_expired(&sw));
|
||||||
|
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear interrupt status register */
|
/* Clear interrupt status register */
|
||||||
|
@ -453,7 +453,7 @@ static void espi_clear_status(void)
|
||||||
* Wait up to ESPI_CMD_TIMEOUT_US for interrupt status register to update after sending a
|
* Wait up to ESPI_CMD_TIMEOUT_US for interrupt status register to update after sending a
|
||||||
* command.
|
* command.
|
||||||
*/
|
*/
|
||||||
static int espi_poll_status(uint32_t *status)
|
static enum cb_err espi_poll_status(uint32_t *status)
|
||||||
{
|
{
|
||||||
struct stopwatch sw;
|
struct stopwatch sw;
|
||||||
|
|
||||||
|
@ -461,12 +461,12 @@ static int espi_poll_status(uint32_t *status)
|
||||||
do {
|
do {
|
||||||
*status = espi_read32(ESPI_SLAVE0_INT_STS);
|
*status = espi_read32(ESPI_SLAVE0_INT_STS);
|
||||||
if (*status)
|
if (*status)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
} while (!stopwatch_expired(&sw));
|
} while (!stopwatch_expired(&sw));
|
||||||
|
|
||||||
printk(BIOS_ERR, "Error: eSPI timed out waiting for status update.\n");
|
printk(BIOS_ERR, "Error: eSPI timed out waiting for status update.\n");
|
||||||
|
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint32_t status)
|
static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint32_t status)
|
||||||
|
@ -476,7 +476,7 @@ static void espi_show_failure(const struct espi_cmd *cmd, const char *str, uint3
|
||||||
printk(BIOS_ERR, "%s (Status = 0x%x)\n", str, status);
|
printk(BIOS_ERR, "%s (Status = 0x%x)\n", str, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_send_command(const struct espi_cmd *cmd)
|
static enum cb_err espi_send_command(const struct espi_cmd *cmd)
|
||||||
{
|
{
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
|
@ -484,9 +484,9 @@ static int espi_send_command(const struct espi_cmd *cmd)
|
||||||
printk(BIOS_DEBUG, "eSPI cmd0-cmd2: %08x %08x %08x data: %08x.\n",
|
printk(BIOS_DEBUG, "eSPI cmd0-cmd2: %08x %08x %08x data: %08x.\n",
|
||||||
cmd->hdr0.val, cmd->hdr1.val, cmd->hdr2.val, cmd->data.val);
|
cmd->hdr0.val, cmd->hdr1.val, cmd->hdr2.val, cmd->data.val);
|
||||||
|
|
||||||
if (espi_wait_ready() == -1) {
|
if (espi_wait_ready() != CB_SUCCESS) {
|
||||||
espi_show_failure(cmd, "Error: eSPI was not ready to accept a command", 0);
|
espi_show_failure(cmd, "Error: eSPI was not ready to accept a command", 0);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
espi_clear_status();
|
espi_clear_status();
|
||||||
|
@ -498,36 +498,36 @@ static int espi_send_command(const struct espi_cmd *cmd)
|
||||||
/* Dword 0 must be last as this write triggers the transaction */
|
/* Dword 0 must be last as this write triggers the transaction */
|
||||||
espi_write32(ESPI_DN_TX_HDR0, cmd->hdr0.val);
|
espi_write32(ESPI_DN_TX_HDR0, cmd->hdr0.val);
|
||||||
|
|
||||||
if (espi_wait_ready() == -1) {
|
if (espi_wait_ready() != CB_SUCCESS) {
|
||||||
espi_show_failure(cmd,
|
espi_show_failure(cmd,
|
||||||
"Error: eSPI timed out waiting for command to complete", 0);
|
"Error: eSPI timed out waiting for command to complete", 0);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_poll_status(&status) == -1) {
|
if (espi_poll_status(&status) != CB_SUCCESS) {
|
||||||
espi_show_failure(cmd, "Error: eSPI poll status failed", 0);
|
espi_show_failure(cmd, "Error: eSPI poll status failed", 0);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If command did not complete downstream, return error. */
|
/* If command did not complete downstream, return error. */
|
||||||
if (!(status & ESPI_STATUS_DNCMD_COMPLETE)) {
|
if (!(status & ESPI_STATUS_DNCMD_COMPLETE)) {
|
||||||
espi_show_failure(cmd, "Error: eSPI downstream command completion failure",
|
espi_show_failure(cmd, "Error: eSPI downstream command completion failure",
|
||||||
status);
|
status);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & ~(ESPI_STATUS_DNCMD_COMPLETE | cmd->expected_status_codes)) {
|
if (status & ~(ESPI_STATUS_DNCMD_COMPLETE | cmd->expected_status_codes)) {
|
||||||
espi_show_failure(cmd, "Error: unexpected eSPI status register bits set",
|
espi_show_failure(cmd, "Error: unexpected eSPI status register bits set",
|
||||||
status);
|
status);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
espi_write32(ESPI_SLAVE0_INT_STS, status);
|
espi_write32(ESPI_SLAVE0_INT_STS, status);
|
||||||
|
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_send_reset(void)
|
static enum cb_err espi_send_reset(void)
|
||||||
{
|
{
|
||||||
struct espi_cmd cmd = {
|
struct espi_cmd cmd = {
|
||||||
.hdr0 = {
|
.hdr0 = {
|
||||||
|
@ -566,7 +566,7 @@ static int espi_send_reset(void)
|
||||||
return espi_send_command(&cmd);
|
return espi_send_command(&cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
|
static enum cb_err espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
|
||||||
{
|
{
|
||||||
struct espi_cmd cmd = {
|
struct espi_cmd cmd = {
|
||||||
.hdr0 = {
|
.hdr0 = {
|
||||||
|
@ -582,7 +582,7 @@ static int espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!mb_cfg->vw_ch_en)
|
if (!mb_cfg->vw_ch_en)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
|
|
||||||
return espi_send_command(&cmd);
|
return espi_send_command(&cmd);
|
||||||
}
|
}
|
||||||
|
@ -594,7 +594,7 @@ static int espi_send_pltrst(const struct espi_config *mb_cfg, bool assert)
|
||||||
#define ESPI_CONFIGURATION_HDATA0(a) (((a) >> 8) & 0xff)
|
#define ESPI_CONFIGURATION_HDATA0(a) (((a) >> 8) & 0xff)
|
||||||
#define ESPI_CONFIGURATION_HDATA1(a) ((a) & 0xff)
|
#define ESPI_CONFIGURATION_HDATA1(a) ((a) & 0xff)
|
||||||
|
|
||||||
static int espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
|
static enum cb_err espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
|
||||||
{
|
{
|
||||||
struct espi_cmd cmd = {
|
struct espi_cmd cmd = {
|
||||||
.hdr0 = {
|
.hdr0 = {
|
||||||
|
@ -607,8 +607,8 @@ static int espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
|
||||||
|
|
||||||
*config = 0;
|
*config = 0;
|
||||||
|
|
||||||
if (espi_send_command(&cmd))
|
if (espi_send_command(&cmd) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
*config = espi_read32(ESPI_DN_TX_HDR1);
|
*config = espi_read32(ESPI_DN_TX_HDR1);
|
||||||
|
|
||||||
|
@ -616,10 +616,10 @@ static int espi_get_configuration(uint16_t slave_reg_addr, uint32_t *config)
|
||||||
printk(BIOS_DEBUG, "Get configuration for slave register(0x%x): 0x%x\n",
|
printk(BIOS_DEBUG, "Get configuration for slave register(0x%x): 0x%x\n",
|
||||||
slave_reg_addr, *config);
|
slave_reg_addr, *config);
|
||||||
|
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
|
static enum cb_err espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
|
||||||
{
|
{
|
||||||
struct espi_cmd cmd = {
|
struct espi_cmd cmd = {
|
||||||
.hdr0 = {
|
.hdr0 = {
|
||||||
|
@ -636,13 +636,13 @@ static int espi_set_configuration(uint16_t slave_reg_addr, uint32_t config)
|
||||||
return espi_send_command(&cmd);
|
return espi_send_command(&cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_get_general_configuration(uint32_t *config)
|
static enum cb_err espi_get_general_configuration(uint32_t *config)
|
||||||
{
|
{
|
||||||
if (espi_get_configuration(ESPI_SLAVE_GENERAL_CFG, config) == -1)
|
if (espi_get_configuration(ESPI_SLAVE_GENERAL_CFG, config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
espi_show_slave_general_configuration(*config);
|
espi_show_slave_general_configuration(*config);
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void espi_set_io_mode_config(enum espi_io_mode mb_io_mode, uint32_t slave_caps,
|
static void espi_set_io_mode_config(enum espi_io_mode mb_io_mode, uint32_t slave_caps,
|
||||||
|
@ -737,7 +737,8 @@ static void espi_set_alert_pin_config(enum espi_alert_pin alert_pin, uint32_t sl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_set_general_configuration(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
static enum cb_err espi_set_general_configuration(const struct espi_config *mb_cfg,
|
||||||
|
uint32_t slave_caps)
|
||||||
{
|
{
|
||||||
uint32_t slave_config = 0;
|
uint32_t slave_config = 0;
|
||||||
uint32_t ctrlr_config = 0;
|
uint32_t ctrlr_config = 0;
|
||||||
|
@ -757,14 +758,14 @@ static int espi_set_general_configuration(const struct espi_config *mb_cfg, uint
|
||||||
|
|
||||||
espi_show_slave_general_configuration(slave_config);
|
espi_show_slave_general_configuration(slave_config);
|
||||||
|
|
||||||
if (espi_set_configuration(ESPI_SLAVE_GENERAL_CFG, slave_config) == -1)
|
if (espi_set_configuration(ESPI_SLAVE_GENERAL_CFG, slave_config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
espi_write32(ESPI_SLAVE0_CONFIG, ctrlr_config);
|
espi_write32(ESPI_SLAVE0_CONFIG, ctrlr_config);
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_wait_channel_ready(uint16_t slave_reg_addr)
|
static enum cb_err espi_wait_channel_ready(uint16_t slave_reg_addr)
|
||||||
{
|
{
|
||||||
struct stopwatch sw;
|
struct stopwatch sw;
|
||||||
uint32_t config;
|
uint32_t config;
|
||||||
|
@ -773,12 +774,12 @@ static int espi_wait_channel_ready(uint16_t slave_reg_addr)
|
||||||
do {
|
do {
|
||||||
espi_get_configuration(slave_reg_addr, &config);
|
espi_get_configuration(slave_reg_addr, &config);
|
||||||
if (espi_slave_is_channel_ready(config))
|
if (espi_slave_is_channel_ready(config))
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
} while (!stopwatch_expired(&sw));
|
} while (!stopwatch_expired(&sw));
|
||||||
|
|
||||||
printk(BIOS_ERR, "Error: Channel is not ready after %d usec (slave addr: 0x%x)\n",
|
printk(BIOS_ERR, "Error: Channel is not ready after %d usec (slave addr: 0x%x)\n",
|
||||||
ESPI_CH_READY_TIMEOUT_US, slave_reg_addr);
|
ESPI_CH_READY_TIMEOUT_US, slave_reg_addr);
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -791,23 +792,24 @@ static void espi_enable_ctrlr_channel(uint32_t channel_en)
|
||||||
espi_write32(ESPI_SLAVE0_CONFIG, reg);
|
espi_write32(ESPI_SLAVE0_CONFIG, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_set_channel_configuration(uint32_t slave_config, uint32_t slave_reg_addr,
|
static enum cb_err espi_set_channel_configuration(uint32_t slave_config,
|
||||||
uint32_t ctrlr_enable)
|
uint32_t slave_reg_addr,
|
||||||
|
uint32_t ctrlr_enable)
|
||||||
{
|
{
|
||||||
if (espi_set_configuration(slave_reg_addr, slave_config) == -1)
|
if (espi_set_configuration(slave_reg_addr, slave_config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
if (!(slave_config & ESPI_SLAVE_CHANNEL_ENABLE))
|
if (!(slave_config & ESPI_SLAVE_CHANNEL_ENABLE))
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
|
|
||||||
if (espi_wait_channel_ready(slave_reg_addr) == -1)
|
if (espi_wait_channel_ready(slave_reg_addr) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
espi_enable_ctrlr_channel(ctrlr_enable);
|
espi_enable_ctrlr_channel(ctrlr_enable);
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
static enum cb_err espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
||||||
{
|
{
|
||||||
uint32_t slave_vw_caps;
|
uint32_t slave_vw_caps;
|
||||||
uint32_t ctrlr_vw_caps;
|
uint32_t ctrlr_vw_caps;
|
||||||
|
@ -817,15 +819,15 @@ static int espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slav
|
||||||
uint32_t slave_config;
|
uint32_t slave_config;
|
||||||
|
|
||||||
if (!mb_cfg->vw_ch_en)
|
if (!mb_cfg->vw_ch_en)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
|
|
||||||
if (!espi_slave_supports_vw_channel(slave_caps)) {
|
if (!espi_slave_supports_vw_channel(slave_caps)) {
|
||||||
printk(BIOS_ERR, "Error: eSPI slave doesn't support VW channel!\n");
|
printk(BIOS_ERR, "Error: eSPI slave doesn't support VW channel!\n");
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_get_configuration(ESPI_SLAVE_VW_CFG, &slave_vw_caps) == -1)
|
if (espi_get_configuration(ESPI_SLAVE_VW_CFG, &slave_vw_caps) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
ctrlr_vw_caps = espi_read32(ESPI_MASTER_CAP);
|
ctrlr_vw_caps = espi_read32(ESPI_MASTER_CAP);
|
||||||
ctrlr_vw_count_supp = (ctrlr_vw_caps & ESPI_VW_MAX_SIZE_MASK) >> ESPI_VW_MAX_SIZE_SHIFT;
|
ctrlr_vw_count_supp = (ctrlr_vw_caps & ESPI_VW_MAX_SIZE_MASK) >> ESPI_VW_MAX_SIZE_SHIFT;
|
||||||
|
@ -837,15 +839,16 @@ static int espi_setup_vw_channel(const struct espi_config *mb_cfg, uint32_t slav
|
||||||
return espi_set_channel_configuration(slave_config, ESPI_SLAVE_VW_CFG, ESPI_VW_CH_EN);
|
return espi_set_channel_configuration(slave_config, ESPI_SLAVE_VW_CFG, ESPI_VW_CH_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_setup_periph_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
static enum cb_err espi_setup_periph_channel(const struct espi_config *mb_cfg,
|
||||||
|
uint32_t slave_caps)
|
||||||
{
|
{
|
||||||
uint32_t slave_config;
|
uint32_t slave_config;
|
||||||
/* Peripheral channel requires BME bit to be set when enabling the channel. */
|
/* Peripheral channel requires BME bit to be set when enabling the channel. */
|
||||||
const uint32_t slave_en_mask =
|
const uint32_t slave_en_mask =
|
||||||
ESPI_SLAVE_CHANNEL_ENABLE | ESPI_SLAVE_PERIPH_BUS_MASTER_ENABLE;
|
ESPI_SLAVE_CHANNEL_ENABLE | ESPI_SLAVE_PERIPH_BUS_MASTER_ENABLE;
|
||||||
|
|
||||||
if (espi_get_configuration(ESPI_SLAVE_PERIPH_CFG, &slave_config) == -1)
|
if (espi_get_configuration(ESPI_SLAVE_PERIPH_CFG, &slave_config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Peripheral channel is the only one which is enabled on reset. So, if the mainboard
|
* Peripheral channel is the only one which is enabled on reset. So, if the mainboard
|
||||||
|
@ -855,7 +858,7 @@ static int espi_setup_periph_channel(const struct espi_config *mb_cfg, uint32_t
|
||||||
if (mb_cfg->periph_ch_en) {
|
if (mb_cfg->periph_ch_en) {
|
||||||
if (!espi_slave_supports_periph_channel(slave_caps)) {
|
if (!espi_slave_supports_periph_channel(slave_caps)) {
|
||||||
printk(BIOS_ERR, "Error: eSPI slave doesn't support periph channel!\n");
|
printk(BIOS_ERR, "Error: eSPI slave doesn't support periph channel!\n");
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
slave_config |= slave_en_mask;
|
slave_config |= slave_en_mask;
|
||||||
} else {
|
} else {
|
||||||
|
@ -868,20 +871,20 @@ static int espi_setup_periph_channel(const struct espi_config *mb_cfg, uint32_t
|
||||||
ESPI_PERIPH_CH_EN);
|
ESPI_PERIPH_CH_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
static enum cb_err espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
||||||
{
|
{
|
||||||
uint32_t slave_config;
|
uint32_t slave_config;
|
||||||
|
|
||||||
if (!mb_cfg->oob_ch_en)
|
if (!mb_cfg->oob_ch_en)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
|
|
||||||
if (!espi_slave_supports_oob_channel(slave_caps)) {
|
if (!espi_slave_supports_oob_channel(slave_caps)) {
|
||||||
printk(BIOS_ERR, "Error: eSPI slave doesn't support OOB channel!\n");
|
printk(BIOS_ERR, "Error: eSPI slave doesn't support OOB channel!\n");
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_get_configuration(ESPI_SLAVE_OOB_CFG, &slave_config) == -1)
|
if (espi_get_configuration(ESPI_SLAVE_OOB_CFG, &slave_config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
|
slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
|
||||||
|
|
||||||
|
@ -889,20 +892,21 @@ static int espi_setup_oob_channel(const struct espi_config *mb_cfg, uint32_t sla
|
||||||
ESPI_OOB_CH_EN);
|
ESPI_OOB_CH_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int espi_setup_flash_channel(const struct espi_config *mb_cfg, uint32_t slave_caps)
|
static enum cb_err espi_setup_flash_channel(const struct espi_config *mb_cfg,
|
||||||
|
uint32_t slave_caps)
|
||||||
{
|
{
|
||||||
uint32_t slave_config;
|
uint32_t slave_config;
|
||||||
|
|
||||||
if (!mb_cfg->flash_ch_en)
|
if (!mb_cfg->flash_ch_en)
|
||||||
return 0;
|
return CB_SUCCESS;
|
||||||
|
|
||||||
if (!espi_slave_supports_flash_channel(slave_caps)) {
|
if (!espi_slave_supports_flash_channel(slave_caps)) {
|
||||||
printk(BIOS_ERR, "Error: eSPI slave doesn't support flash channel!\n");
|
printk(BIOS_ERR, "Error: eSPI slave doesn't support flash channel!\n");
|
||||||
return -1;
|
return CB_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_get_configuration(ESPI_SLAVE_FLASH_CFG, &slave_config) == -1)
|
if (espi_get_configuration(ESPI_SLAVE_FLASH_CFG, &slave_config) != CB_SUCCESS)
|
||||||
return -1;
|
return CB_ERR;
|
||||||
|
|
||||||
slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
|
slave_config |= ESPI_SLAVE_CHANNEL_ENABLE;
|
||||||
|
|
||||||
|
@ -968,7 +972,7 @@ int espi_setup(void)
|
||||||
* Send in-band reset
|
* Send in-band reset
|
||||||
* The resets affects both host and slave devices, so set initial config again.
|
* The resets affects both host and slave devices, so set initial config again.
|
||||||
*/
|
*/
|
||||||
if (espi_send_reset() == -1) {
|
if (espi_send_reset() != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: In-band reset failed!\n");
|
printk(BIOS_ERR, "Error: In-band reset failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -978,7 +982,7 @@ int espi_setup(void)
|
||||||
* Boot sequence: Step 3
|
* Boot sequence: Step 3
|
||||||
* Get configuration of slave device.
|
* Get configuration of slave device.
|
||||||
*/
|
*/
|
||||||
if (espi_get_general_configuration(&slave_caps) == -1) {
|
if (espi_get_general_configuration(&slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Slave GET_CONFIGURATION failed!\n");
|
printk(BIOS_ERR, "Error: Slave GET_CONFIGURATION failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -988,7 +992,7 @@ int espi_setup(void)
|
||||||
* Step 4: Write slave device general config
|
* Step 4: Write slave device general config
|
||||||
* Step 5: Set host slave config
|
* Step 5: Set host slave config
|
||||||
*/
|
*/
|
||||||
if (espi_set_general_configuration(cfg, slave_caps) == -1) {
|
if (espi_set_general_configuration(cfg, slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Slave SET_CONFIGURATION failed!\n");
|
printk(BIOS_ERR, "Error: Slave SET_CONFIGURATION failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1004,34 +1008,34 @@ int espi_setup(void)
|
||||||
* Channel setup
|
* Channel setup
|
||||||
*/
|
*/
|
||||||
/* Set up VW first so we can deassert PLTRST#. */
|
/* Set up VW first so we can deassert PLTRST#. */
|
||||||
if (espi_setup_vw_channel(cfg, slave_caps) == -1) {
|
if (espi_setup_vw_channel(cfg, slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Setup VW channel failed!\n");
|
printk(BIOS_ERR, "Error: Setup VW channel failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Assert PLTRST# if VW channel is enabled by mainboard. */
|
/* Assert PLTRST# if VW channel is enabled by mainboard. */
|
||||||
if (espi_send_pltrst(cfg, true) == -1) {
|
if (espi_send_pltrst(cfg, true) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: PLTRST# assertion failed!\n");
|
printk(BIOS_ERR, "Error: PLTRST# assertion failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* De-assert PLTRST# if VW channel is enabled by mainboard. */
|
/* De-assert PLTRST# if VW channel is enabled by mainboard. */
|
||||||
if (espi_send_pltrst(cfg, false) == -1) {
|
if (espi_send_pltrst(cfg, false) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: PLTRST# deassertion failed!\n");
|
printk(BIOS_ERR, "Error: PLTRST# deassertion failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_setup_periph_channel(cfg, slave_caps) == -1) {
|
if (espi_setup_periph_channel(cfg, slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Setup Periph channel failed!\n");
|
printk(BIOS_ERR, "Error: Setup Periph channel failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_setup_oob_channel(cfg, slave_caps) == -1) {
|
if (espi_setup_oob_channel(cfg, slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Setup OOB channel failed!\n");
|
printk(BIOS_ERR, "Error: Setup OOB channel failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (espi_setup_flash_channel(cfg, slave_caps) == -1) {
|
if (espi_setup_flash_channel(cfg, slave_caps) != CB_SUCCESS) {
|
||||||
printk(BIOS_ERR, "Error: Setup Flash channel failed!\n");
|
printk(BIOS_ERR, "Error: Setup Flash channel failed!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue