From b0c196d4b9ebda211741c9869a1869003545a841 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 29 Dec 2020 09:58:50 -0700 Subject: [PATCH] ec/it*: Add ESPI definitions --- src/ec/it5570e/espi.c | 61 +++++++++++++++ src/ec/it5570e/include/ec/espi.h | 123 +++++++++++++++++++++++++++++++ src/ec/it5570e/signature.c | 14 ++++ src/ec/it8587e/include/ec/espi.h | 9 +++ 4 files changed, 207 insertions(+) create mode 100644 src/ec/it5570e/espi.c create mode 100644 src/ec/it5570e/include/ec/espi.h create mode 100644 src/ec/it8587e/include/ec/espi.h diff --git a/src/ec/it5570e/espi.c b/src/ec/it5570e/espi.c new file mode 100644 index 0000000..8c982c8 --- /dev/null +++ b/src/ec/it5570e/espi.c @@ -0,0 +1,61 @@ +#include +#include + +// Not all wires are defined or implemented +// Index 2 - AP to EC +struct VirtualWire __code VW_SLP_S3_N = VIRTUAL_WIRE(2, 0); +struct VirtualWire __code VW_SLP_S4_N = VIRTUAL_WIRE(2, 1); +struct VirtualWire __code VW_SLP_S5_N = VIRTUAL_WIRE(2, 2); +// Index 3 - AP to EC +struct VirtualWire __code VW_SUS_STAT_N = VIRTUAL_WIRE(3, 0); +struct VirtualWire __code VW_PLTRST_N = VIRTUAL_WIRE(3, 1); +struct VirtualWire __code VW_OOB_RST_WARN = VIRTUAL_WIRE(3, 2); +// Index 4 - EC to AP +struct VirtualWire __code VW_OOB_RST_ACK = VIRTUAL_WIRE(4, 0); +struct VirtualWire __code VW_WAKE_N = VIRTUAL_WIRE(4, 2); +struct VirtualWire __code VW_PME_N = VIRTUAL_WIRE(4, 3); +// Index 5 - EC to AP +struct VirtualWire __code VW_BOOT_LOAD_DONE = VIRTUAL_WIRE(5, 0); +struct VirtualWire __code VW_ERROR_FATAL = VIRTUAL_WIRE(5, 1); +struct VirtualWire __code VW_ERROR_NONFATAL = VIRTUAL_WIRE(5, 2); +struct VirtualWire __code VW_BOOT_LOAD_STATUS = VIRTUAL_WIRE(5, 3); +// Index 6 - EC to AP +struct VirtualWire __code VW_SCI_N = VIRTUAL_WIRE(6, 0); +struct VirtualWire __code VW_SMI_N = VIRTUAL_WIRE(6, 1); +struct VirtualWire __code VW_RCIN_N = VIRTUAL_WIRE(6, 2); +struct VirtualWire __code VW_HOST_RST_ACK = VIRTUAL_WIRE(6, 3); +// Index 7 - AP to EC +struct VirtualWire __code VW_HOST_RST_WARN = VIRTUAL_WIRE(7, 0); +// Index 40 - EC to AP (platform specific) +struct VirtualWire __code VW_SUS_ACK_N = VIRTUAL_WIRE(40, 0); +// Index 41 - AP to EC (platform specific) +struct VirtualWire __code VW_SUS_WARN_N = VIRTUAL_WIRE(41, 0); +struct VirtualWire __code VW_SUS_PWRDN_ACK = VIRTUAL_WIRE(41, 1); + +enum VirtualWireState vw_get(struct VirtualWire * vw) __critical { + uint8_t index = *vw->index; + switch ((index >> vw->shift) & VWS_HIGH) { + case VWS_LOW: + return VWS_LOW; + case VWS_HIGH: + return VWS_HIGH; + default: + return VWS_INVALID; + } +} + +void vw_set(struct VirtualWire * vw, enum VirtualWireState state) __critical { + uint8_t index = *vw->index; + index &= ~(VWS_HIGH << vw->shift); + switch (state) { + case VWS_LOW: + index |= VWS_LOW << vw->shift; + break; + case VWS_HIGH: + index |= VWS_HIGH << vw->shift; + break; + default: + break; + } + *vw->index = index; +} diff --git a/src/ec/it5570e/include/ec/espi.h b/src/ec/it5570e/include/ec/espi.h new file mode 100644 index 0000000..909f231 --- /dev/null +++ b/src/ec/it5570e/include/ec/espi.h @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: GPL-3.0-only + +#ifndef _EC_ESPI_H +#define _EC_ESPI_H +#include + +#ifndef EC_ESPI +#define EC_ESPI 0 +#endif // EC_ESPI + +struct VirtualWire { + volatile uint8_t __xdata * index; + uint8_t shift; +}; + +#define VIRTUAL_WIRE(INDEX, SHIFT) { \ + .index = &VWIDX ## INDEX, \ + .shift = SHIFT, \ +} + +enum VirtualWireState { + VWS_INVALID = 0x00, + VWS_LOW = 0x10, + VWS_HIGH = 0x11, +}; + +enum VirtualWireState vw_get(struct VirtualWire * vw) __critical; + +void vw_set(struct VirtualWire * vw, enum VirtualWireState state) __critical; + +// Not all wires are defined or implemented +// Index 2 - AP to EC +extern struct VirtualWire __code VW_SLP_S3_N; +extern struct VirtualWire __code VW_SLP_S4_N; +extern struct VirtualWire __code VW_SLP_S5_N; +// Index 3 - AP to EC +extern struct VirtualWire __code VW_SUS_STAT_N; +extern struct VirtualWire __code VW_PLTRST_N; +extern struct VirtualWire __code VW_OOB_RST_WARN; +// Index 4 - EC to AP +extern struct VirtualWire __code VW_OOB_RST_ACK; +extern struct VirtualWire __code VW_WAKE_N; +extern struct VirtualWire __code VW_PME_N; +// Index 5 - EC to AP +extern struct VirtualWire __code VW_BOOT_LOAD_DONE; +extern struct VirtualWire __code VW_ERROR_FATAL; +extern struct VirtualWire __code VW_ERROR_NONFATAL; +extern struct VirtualWire __code VW_BOOT_LOAD_STATUS; +// Index 6 - EC to AP +extern struct VirtualWire __code VW_SCI_N; +extern struct VirtualWire __code VW_SMI_N; +extern struct VirtualWire __code VW_RCIN_N; +extern struct VirtualWire __code VW_HOST_RST_ACK; +// Index 7 - AP to EC +extern struct VirtualWire __code VW_HOST_RST_WARN; +// Index 40 - EC to AP (platform specific) +extern struct VirtualWire __code VW_SUS_ACK_N; +// Index 41 - AP to EC (platform specific) +extern struct VirtualWire __code VW_SUS_WARN_N; +extern struct VirtualWire __code VW_SUS_PWRDN_ACK; + +// General capabilities and configurations +volatile uint8_t __xdata __at(0x3107) ESGCAC0; +volatile uint8_t __xdata __at(0x3106) ESGCAC1; +volatile uint8_t __xdata __at(0x3105) ESGCAC2; +volatile uint8_t __xdata __at(0x3104) ESGCAC3; + +// Channel 0 capabilities and configurations +volatile uint8_t __xdata __at(0x310B) ESC0CAC0; +volatile uint8_t __xdata __at(0x310A) ESC0CAC1; +volatile uint8_t __xdata __at(0x3109) ESC0CAC2; +volatile uint8_t __xdata __at(0x3108) ESC0CAC3; + +// Channel 1 capabilities and configurations +volatile uint8_t __xdata __at(0x310F) ESC1CAC0; +volatile uint8_t __xdata __at(0x310E) ESC1CAC1; +volatile uint8_t __xdata __at(0x310D) ESC1CAC2; +volatile uint8_t __xdata __at(0x310C) ESC1CAC3; + +// Channel 2 capabilities and configurations +volatile uint8_t __xdata __at(0x3113) ESC2CAC0; +volatile uint8_t __xdata __at(0x3112) ESC2CAC1; +volatile uint8_t __xdata __at(0x3111) ESC2CAC2; +volatile uint8_t __xdata __at(0x3110) ESC2CAC3; + +// Channel 3 capabilities and configurations +volatile uint8_t __xdata __at(0x3117) ESC3CAC0; +volatile uint8_t __xdata __at(0x3116) ESC3CAC1; +volatile uint8_t __xdata __at(0x3115) ESC3CAC2; +volatile uint8_t __xdata __at(0x3114) ESC3CAC3; + +// eSPI PC control +volatile uint8_t __xdata __at(0x3190) ESPCTRL0; + +// eSPI general control +volatile uint8_t __xdata __at(0x31A0) ESGCTRL0; +volatile uint8_t __xdata __at(0x31A1) ESGCTRL1; +volatile uint8_t __xdata __at(0x31A2) ESGCTRL2; +volatile uint8_t __xdata __at(0x31A3) ESGCTRL3; + +// Virtual wires +volatile uint8_t __xdata __at(0x3200) VWIDX0; +volatile uint8_t __xdata __at(0x3202) VWIDX2; +volatile uint8_t __xdata __at(0x3203) VWIDX3; +volatile uint8_t __xdata __at(0x3204) VWIDX4; +volatile uint8_t __xdata __at(0x3205) VWIDX5; +volatile uint8_t __xdata __at(0x3206) VWIDX6; +volatile uint8_t __xdata __at(0x3207) VWIDX7; + +// Virtual wires at 0x40 +volatile uint8_t __xdata __at(0x3240) VWIDX40; +volatile uint8_t __xdata __at(0x3241) VWIDX41; +volatile uint8_t __xdata __at(0x3242) VWIDX42; + +// Virtual wire control +volatile uint8_t __xdata __at(0x3290) VWCTRL0; +volatile uint8_t __xdata __at(0x3291) VWCTRL1; +volatile uint8_t __xdata __at(0x3292) VWCTRL2; +volatile uint8_t __xdata __at(0x3293) VWCTRL3; +volatile uint8_t __xdata __at(0x3295) VWCTRL5; +volatile uint8_t __xdata __at(0x3296) VWCTRL6; + +#endif // _EC_ESPI_H diff --git a/src/ec/it5570e/signature.c b/src/ec/it5570e/signature.c index 274d311..7b9bcf3 100644 --- a/src/ec/it5570e/signature.c +++ b/src/ec/it5570e/signature.c @@ -1,5 +1,18 @@ // SPDX-License-Identifier: GPL-3.0-only +#include + +#if EC_ESPI +// eSPI signature (byte 7 = 0xA4) +static __code char __at(0x40) SIGNATURE[32] = { + 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA4, 0x95, + 0x85, 0x12, 0x5A, 0x5A, 0xAA, 0x00, 0x55, 0x55, + + 0x49, 0x54, 0x45, 0x20, 0x54, 0x65, 0x63, 0x68, + 0x2E, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x20 +}; +#else // EC_ESPI +// LPC signature (byte 7 = 0xA5) static __code char __at(0x40) SIGNATURE[32] = { 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x94, 0x85, 0x12, 0x5A, 0x5A, 0xAA, 0x00, 0x55, 0x55, @@ -7,3 +20,4 @@ static __code char __at(0x40) SIGNATURE[32] = { 0x49, 0x54, 0x45, 0x20, 0x54, 0x65, 0x63, 0x68, 0x2E, 0x20, 0x49, 0x6E, 0x63, 0x2E, 0x20, 0x20 }; +#endif // EC_ESPI diff --git a/src/ec/it8587e/include/ec/espi.h b/src/ec/it8587e/include/ec/espi.h new file mode 100644 index 0000000..859eb1e --- /dev/null +++ b/src/ec/it8587e/include/ec/espi.h @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0-only + +#ifndef _EC_ESPI_H +#define _EC_ESPI_H + +// eSPI not supported on IT8587E +#define EC_ESPI 0 + +#endif // _EC_ESPI_H