summaryrefslogtreecommitdiff
path: root/chip/it83xx/espi.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/it83xx/espi.c')
-rw-r--r--chip/it83xx/espi.c186
1 files changed, 75 insertions, 111 deletions
diff --git a/chip/it83xx/espi.c b/chip/it83xx/espi.c
index bef877449e..bf52b87404 100644
--- a/chip/it83xx/espi.c
+++ b/chip/it83xx/espi.c
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Chromium OS Authors. All rights reserved.
+/* Copyright 2017 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -18,151 +18,119 @@
#include "util.h"
/* Console output macros */
-#define CPRINTS(format, args...) cprints(CC_LPC, format, ## args)
+#define CPRINTS(format, args...) cprints(CC_LPC, format, ##args)
struct vw_channel_t {
- uint8_t index; /* VW index of signal */
- uint8_t level_mask; /* level bit of signal */
- uint8_t valid_mask; /* valid bit of signal */
+ uint8_t index; /* VW index of signal */
+ uint8_t level_mask; /* level bit of signal */
+ uint8_t valid_mask; /* valid bit of signal */
};
/* VW settings after the controller enables the VW channel. */
static const struct vw_channel_t en_vw_setting[] = {
- /* EC sends SUS_ACK# = 1 VW to PCH. That does not apply to GLK SoC. */
+/* EC sends SUS_ACK# = 1 VW to PCH. That does not apply to GLK SoC. */
#ifndef CONFIG_CHIPSET_GEMINILAKE
- {ESPI_SYSTEM_EVENT_VW_IDX_40,
- VW_LEVEL_FIELD(0),
- VW_VALID_FIELD(VW_IDX_40_SUS_ACK)},
+ { ESPI_SYSTEM_EVENT_VW_IDX_40, VW_LEVEL_FIELD(0),
+ VW_VALID_FIELD(VW_IDX_40_SUS_ACK) },
#endif
};
/* VW settings after the controller enables the OOB channel. */
static const struct vw_channel_t en_oob_setting[] = {
- {ESPI_SYSTEM_EVENT_VW_IDX_4,
- VW_LEVEL_FIELD(0),
- VW_VALID_FIELD(VW_IDX_4_OOB_RST_ACK)},
+ { ESPI_SYSTEM_EVENT_VW_IDX_4, VW_LEVEL_FIELD(0),
+ VW_VALID_FIELD(VW_IDX_4_OOB_RST_ACK) },
};
/* VW settings after the controller enables the flash channel. */
static const struct vw_channel_t en_flash_setting[] = {
- {ESPI_SYSTEM_EVENT_VW_IDX_5,
- VW_LEVEL_FIELD(VW_IDX_5_BTLD_STATUS_DONE),
- VW_VALID_FIELD(VW_IDX_5_BTLD_STATUS_DONE)},
+ { ESPI_SYSTEM_EVENT_VW_IDX_5, VW_LEVEL_FIELD(VW_IDX_5_BTLD_STATUS_DONE),
+ VW_VALID_FIELD(VW_IDX_5_BTLD_STATUS_DONE) },
};
/* VW settings at host startup */
static const struct vw_channel_t vw_host_startup_setting[] = {
- {ESPI_SYSTEM_EVENT_VW_IDX_6,
- VW_LEVEL_FIELD(VW_IDX_6_SCI | VW_IDX_6_SMI |
- VW_IDX_6_RCIN | VW_IDX_6_HOST_RST_ACK),
- VW_VALID_FIELD(VW_IDX_6_SCI | VW_IDX_6_SMI |
- VW_IDX_6_RCIN | VW_IDX_6_HOST_RST_ACK)},
+ { ESPI_SYSTEM_EVENT_VW_IDX_6,
+ VW_LEVEL_FIELD(VW_IDX_6_SCI | VW_IDX_6_SMI | VW_IDX_6_RCIN |
+ VW_IDX_6_HOST_RST_ACK),
+ VW_VALID_FIELD(VW_IDX_6_SCI | VW_IDX_6_SMI | VW_IDX_6_RCIN |
+ VW_IDX_6_HOST_RST_ACK) },
};
#define VW_CHAN(name, idx, level, valid) \
- [(name - VW_SIGNAL_START)] = {idx, level, valid}
+ [(name - VW_SIGNAL_START)] = { idx, level, valid }
/* VW signals used in eSPI (NOTE: must match order of enum espi_vw_signal). */
static const struct vw_channel_t vw_channel_list[] = {
/* index 02h: controller to peripheral. */
- VW_CHAN(VW_SLP_S3_L,
- ESPI_SYSTEM_EVENT_VW_IDX_2,
+ VW_CHAN(VW_SLP_S3_L, ESPI_SYSTEM_EVENT_VW_IDX_2,
VW_LEVEL_FIELD(VW_IDX_2_SLP_S3),
VW_VALID_FIELD(VW_IDX_2_SLP_S3)),
- VW_CHAN(VW_SLP_S4_L,
- ESPI_SYSTEM_EVENT_VW_IDX_2,
+ VW_CHAN(VW_SLP_S4_L, ESPI_SYSTEM_EVENT_VW_IDX_2,
VW_LEVEL_FIELD(VW_IDX_2_SLP_S4),
VW_VALID_FIELD(VW_IDX_2_SLP_S4)),
- VW_CHAN(VW_SLP_S5_L,
- ESPI_SYSTEM_EVENT_VW_IDX_2,
+ VW_CHAN(VW_SLP_S5_L, ESPI_SYSTEM_EVENT_VW_IDX_2,
VW_LEVEL_FIELD(VW_IDX_2_SLP_S5),
VW_VALID_FIELD(VW_IDX_2_SLP_S5)),
/* index 03h: controller to peripheral. */
- VW_CHAN(VW_SUS_STAT_L,
- ESPI_SYSTEM_EVENT_VW_IDX_3,
+ VW_CHAN(VW_SUS_STAT_L, ESPI_SYSTEM_EVENT_VW_IDX_3,
VW_LEVEL_FIELD(VW_IDX_3_SUS_STAT),
VW_VALID_FIELD(VW_IDX_3_SUS_STAT)),
- VW_CHAN(VW_PLTRST_L,
- ESPI_SYSTEM_EVENT_VW_IDX_3,
+ VW_CHAN(VW_PLTRST_L, ESPI_SYSTEM_EVENT_VW_IDX_3,
VW_LEVEL_FIELD(VW_IDX_3_PLTRST),
VW_VALID_FIELD(VW_IDX_3_PLTRST)),
- VW_CHAN(VW_OOB_RST_WARN,
- ESPI_SYSTEM_EVENT_VW_IDX_3,
+ VW_CHAN(VW_OOB_RST_WARN, ESPI_SYSTEM_EVENT_VW_IDX_3,
VW_LEVEL_FIELD(VW_IDX_3_OOB_RST_WARN),
VW_VALID_FIELD(VW_IDX_3_OOB_RST_WARN)),
/* index 04h: peripheral to controller. */
- VW_CHAN(VW_OOB_RST_ACK,
- ESPI_SYSTEM_EVENT_VW_IDX_4,
+ VW_CHAN(VW_OOB_RST_ACK, ESPI_SYSTEM_EVENT_VW_IDX_4,
VW_LEVEL_FIELD(VW_IDX_4_OOB_RST_ACK),
VW_VALID_FIELD(VW_IDX_4_OOB_RST_ACK)),
- VW_CHAN(VW_WAKE_L,
- ESPI_SYSTEM_EVENT_VW_IDX_4,
- VW_LEVEL_FIELD(VW_IDX_4_WAKE),
- VW_VALID_FIELD(VW_IDX_4_WAKE)),
- VW_CHAN(VW_PME_L,
- ESPI_SYSTEM_EVENT_VW_IDX_4,
- VW_LEVEL_FIELD(VW_IDX_4_PME),
- VW_VALID_FIELD(VW_IDX_4_PME)),
+ VW_CHAN(VW_WAKE_L, ESPI_SYSTEM_EVENT_VW_IDX_4,
+ VW_LEVEL_FIELD(VW_IDX_4_WAKE), VW_VALID_FIELD(VW_IDX_4_WAKE)),
+ VW_CHAN(VW_PME_L, ESPI_SYSTEM_EVENT_VW_IDX_4,
+ VW_LEVEL_FIELD(VW_IDX_4_PME), VW_VALID_FIELD(VW_IDX_4_PME)),
/* index 05h: peripheral to controller. */
- VW_CHAN(VW_ERROR_FATAL,
- ESPI_SYSTEM_EVENT_VW_IDX_5,
- VW_LEVEL_FIELD(VW_IDX_5_FATAL),
- VW_VALID_FIELD(VW_IDX_5_FATAL)),
- VW_CHAN(VW_ERROR_NON_FATAL,
- ESPI_SYSTEM_EVENT_VW_IDX_5,
+ VW_CHAN(VW_ERROR_FATAL, ESPI_SYSTEM_EVENT_VW_IDX_5,
+ VW_LEVEL_FIELD(VW_IDX_5_FATAL), VW_VALID_FIELD(VW_IDX_5_FATAL)),
+ VW_CHAN(VW_ERROR_NON_FATAL, ESPI_SYSTEM_EVENT_VW_IDX_5,
VW_LEVEL_FIELD(VW_IDX_5_NON_FATAL),
VW_VALID_FIELD(VW_IDX_5_NON_FATAL)),
- VW_CHAN(VW_PERIPHERAL_BTLD_STATUS_DONE,
- ESPI_SYSTEM_EVENT_VW_IDX_5,
+ VW_CHAN(VW_PERIPHERAL_BTLD_STATUS_DONE, ESPI_SYSTEM_EVENT_VW_IDX_5,
VW_LEVEL_FIELD(VW_IDX_5_BTLD_STATUS_DONE),
VW_VALID_FIELD(VW_IDX_5_BTLD_STATUS_DONE)),
/* index 06h: peripheral to controller. */
- VW_CHAN(VW_SCI_L,
- ESPI_SYSTEM_EVENT_VW_IDX_6,
- VW_LEVEL_FIELD(VW_IDX_6_SCI),
- VW_VALID_FIELD(VW_IDX_6_SCI)),
- VW_CHAN(VW_SMI_L,
- ESPI_SYSTEM_EVENT_VW_IDX_6,
- VW_LEVEL_FIELD(VW_IDX_6_SMI),
- VW_VALID_FIELD(VW_IDX_6_SMI)),
- VW_CHAN(VW_RCIN_L,
- ESPI_SYSTEM_EVENT_VW_IDX_6,
- VW_LEVEL_FIELD(VW_IDX_6_RCIN),
- VW_VALID_FIELD(VW_IDX_6_RCIN)),
- VW_CHAN(VW_HOST_RST_ACK,
- ESPI_SYSTEM_EVENT_VW_IDX_6,
+ VW_CHAN(VW_SCI_L, ESPI_SYSTEM_EVENT_VW_IDX_6,
+ VW_LEVEL_FIELD(VW_IDX_6_SCI), VW_VALID_FIELD(VW_IDX_6_SCI)),
+ VW_CHAN(VW_SMI_L, ESPI_SYSTEM_EVENT_VW_IDX_6,
+ VW_LEVEL_FIELD(VW_IDX_6_SMI), VW_VALID_FIELD(VW_IDX_6_SMI)),
+ VW_CHAN(VW_RCIN_L, ESPI_SYSTEM_EVENT_VW_IDX_6,
+ VW_LEVEL_FIELD(VW_IDX_6_RCIN), VW_VALID_FIELD(VW_IDX_6_RCIN)),
+ VW_CHAN(VW_HOST_RST_ACK, ESPI_SYSTEM_EVENT_VW_IDX_6,
VW_LEVEL_FIELD(VW_IDX_6_HOST_RST_ACK),
VW_VALID_FIELD(VW_IDX_6_HOST_RST_ACK)),
/* index 07h: controller to peripheral. */
- VW_CHAN(VW_HOST_RST_WARN,
- ESPI_SYSTEM_EVENT_VW_IDX_7,
+ VW_CHAN(VW_HOST_RST_WARN, ESPI_SYSTEM_EVENT_VW_IDX_7,
VW_LEVEL_FIELD(VW_IDX_7_HOST_RST_WARN),
VW_VALID_FIELD(VW_IDX_7_HOST_RST_WARN)),
/* index 40h: peripheral to controller. */
- VW_CHAN(VW_SUS_ACK,
- ESPI_SYSTEM_EVENT_VW_IDX_40,
+ VW_CHAN(VW_SUS_ACK, ESPI_SYSTEM_EVENT_VW_IDX_40,
VW_LEVEL_FIELD(VW_IDX_40_SUS_ACK),
VW_VALID_FIELD(VW_IDX_40_SUS_ACK)),
/* index 41h: controller to peripheral. */
- VW_CHAN(VW_SUS_WARN_L,
- ESPI_SYSTEM_EVENT_VW_IDX_41,
+ VW_CHAN(VW_SUS_WARN_L, ESPI_SYSTEM_EVENT_VW_IDX_41,
VW_LEVEL_FIELD(VW_IDX_41_SUS_WARN),
VW_VALID_FIELD(VW_IDX_41_SUS_WARN)),
- VW_CHAN(VW_SUS_PWRDN_ACK_L,
- ESPI_SYSTEM_EVENT_VW_IDX_41,
+ VW_CHAN(VW_SUS_PWRDN_ACK_L, ESPI_SYSTEM_EVENT_VW_IDX_41,
VW_LEVEL_FIELD(VW_IDX_41_SUS_PWRDN_ACK),
VW_VALID_FIELD(VW_IDX_41_SUS_PWRDN_ACK)),
- VW_CHAN(VW_SLP_A_L,
- ESPI_SYSTEM_EVENT_VW_IDX_41,
+ VW_CHAN(VW_SLP_A_L, ESPI_SYSTEM_EVENT_VW_IDX_41,
VW_LEVEL_FIELD(VW_IDX_41_SLP_A),
VW_VALID_FIELD(VW_IDX_41_SLP_A)),
/* index 42h: controller to peripheral. */
- VW_CHAN(VW_SLP_LAN,
- ESPI_SYSTEM_EVENT_VW_IDX_42,
+ VW_CHAN(VW_SLP_LAN, ESPI_SYSTEM_EVENT_VW_IDX_42,
VW_LEVEL_FIELD(VW_IDX_42_SLP_LAN),
VW_VALID_FIELD(VW_IDX_42_SLP_LAN)),
- VW_CHAN(VW_SLP_WLAN,
- ESPI_SYSTEM_EVENT_VW_IDX_42,
+ VW_CHAN(VW_SLP_WLAN, ESPI_SYSTEM_EVENT_VW_IDX_42,
VW_LEVEL_FIELD(VW_IDX_42_SLP_WLAN),
VW_VALID_FIELD(VW_IDX_42_SLP_WLAN)),
};
@@ -221,11 +189,11 @@ int espi_vw_get_wire(enum espi_vw_signal signal)
/* Not valid */
if (!(IT83XX_ESPI_VWIDX(vw_channel_list[i].index) &
- vw_channel_list[i].valid_mask))
+ vw_channel_list[i].valid_mask))
return 0;
return !!(IT83XX_ESPI_VWIDX(vw_channel_list[i].index) &
- vw_channel_list[i].level_mask);
+ vw_channel_list[i].level_mask);
}
/**
@@ -265,7 +233,7 @@ int espi_vw_disable_wire_int(enum espi_vw_signal signal)
/* Configure virtual wire outputs */
static void espi_configure_vw(const struct vw_channel_t *settings,
- size_t entries)
+ size_t entries)
{
size_t i;
@@ -277,13 +245,13 @@ static void espi_configure_vw(const struct vw_channel_t *settings,
static void espi_vw_host_startup(void)
{
espi_configure_vw(vw_host_startup_setting,
- ARRAY_SIZE(vw_host_startup_setting));
+ ARRAY_SIZE(vw_host_startup_setting));
}
static void espi_vw_no_isr(uint8_t flag_changed, uint8_t vw_evt)
{
CPRINTS("espi VW interrupt event is ignored! (bit%d at VWCTRL1)",
- vw_evt);
+ vw_evt);
}
#ifndef CONFIG_CHIPSET_GEMINILAKE
@@ -298,7 +266,7 @@ static void espi_vw_idx7_isr(uint8_t flag_changed, uint8_t vw_evt)
{
if (flag_changed & VW_LEVEL_FIELD(VW_IDX_7_HOST_RST_WARN))
espi_vw_set_wire(VW_HOST_RST_ACK,
- espi_vw_get_wire(VW_HOST_RST_WARN));
+ espi_vw_get_wire(VW_HOST_RST_WARN));
}
#ifdef CONFIG_CHIPSET_RESET_HOOK
@@ -329,7 +297,7 @@ static void espi_vw_idx3_isr(uint8_t flag_changed, uint8_t vw_evt)
if (flag_changed & VW_LEVEL_FIELD(VW_IDX_3_OOB_RST_WARN))
espi_vw_set_wire(VW_OOB_RST_ACK,
- espi_vw_get_wire(VW_OOB_RST_WARN));
+ espi_vw_get_wire(VW_OOB_RST_WARN));
}
static void espi_vw_idx2_isr(uint8_t flag_changed, uint8_t vw_evt)
@@ -353,25 +321,25 @@ struct vw_interrupt_t {
*/
#ifdef CONFIG_CHIPSET_GEMINILAKE
static const struct vw_interrupt_t vw_isr_list[] = {
- [0] = {espi_vw_idx2_isr, ESPI_SYSTEM_EVENT_VW_IDX_2},
- [1] = {espi_vw_idx3_isr, ESPI_SYSTEM_EVENT_VW_IDX_3},
- [2] = {espi_vw_idx7_isr, ESPI_SYSTEM_EVENT_VW_IDX_7},
- [3] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_41},
- [4] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_42},
- [5] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_43},
- [6] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_44},
- [7] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_47},
+ [0] = { espi_vw_idx2_isr, ESPI_SYSTEM_EVENT_VW_IDX_2 },
+ [1] = { espi_vw_idx3_isr, ESPI_SYSTEM_EVENT_VW_IDX_3 },
+ [2] = { espi_vw_idx7_isr, ESPI_SYSTEM_EVENT_VW_IDX_7 },
+ [3] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_41 },
+ [4] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_42 },
+ [5] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_43 },
+ [6] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_44 },
+ [7] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_47 },
};
#else
static const struct vw_interrupt_t vw_isr_list[] = {
- [0] = {espi_vw_idx2_isr, ESPI_SYSTEM_EVENT_VW_IDX_2},
- [1] = {espi_vw_idx3_isr, ESPI_SYSTEM_EVENT_VW_IDX_3},
- [2] = {espi_vw_idx7_isr, ESPI_SYSTEM_EVENT_VW_IDX_7},
- [3] = {espi_vw_idx41_isr, ESPI_SYSTEM_EVENT_VW_IDX_41},
- [4] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_42},
- [5] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_43},
- [6] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_44},
- [7] = {espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_47},
+ [0] = { espi_vw_idx2_isr, ESPI_SYSTEM_EVENT_VW_IDX_2 },
+ [1] = { espi_vw_idx3_isr, ESPI_SYSTEM_EVENT_VW_IDX_3 },
+ [2] = { espi_vw_idx7_isr, ESPI_SYSTEM_EVENT_VW_IDX_7 },
+ [3] = { espi_vw_idx41_isr, ESPI_SYSTEM_EVENT_VW_IDX_41 },
+ [4] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_42 },
+ [5] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_43 },
+ [6] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_44 },
+ [7] = { espi_vw_no_isr, ESPI_SYSTEM_EVENT_VW_IDX_47 },
};
#endif
@@ -490,7 +458,7 @@ static void espi_enable_reset(void)
#endif
IT83XX_GPIO_GCR = (IT83XX_GPIO_GCR & ~0x6) |
- (config << IT83XX_GPIO_GCR_LPC_RST_POS);
+ (config << IT83XX_GPIO_GCR_LPC_RST_POS);
/* enable interrupt of EC's espi_reset pin */
gpio_clear_pending_interrupt(GPIO_ESPI_RESET_L);
@@ -537,14 +505,10 @@ static void espi_no_isr(uint8_t evt)
* IT83XX_ESPI_ESGCTRL0 register.
*/
static void (*espi_isr[])(uint8_t evt) = {
- [0] = espi_no_isr,
- [1] = espi_vw_en_asserted,
- [2] = espi_oob_en_asserted,
- [3] = espi_flash_en_asserted,
- [4] = espi_no_isr,
- [5] = espi_no_isr,
- [6] = espi_no_isr,
- [7] = espi_no_isr,
+ [0] = espi_no_isr, [1] = espi_vw_en_asserted,
+ [2] = espi_oob_en_asserted, [3] = espi_flash_en_asserted,
+ [4] = espi_no_isr, [5] = espi_no_isr,
+ [6] = espi_no_isr, [7] = espi_no_isr,
};
void espi_interrupt(void)