1 /* 2 * Copyright 2024 Microchip Technology Inc. and its subsidiaries. 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #ifndef _MEC_ESPI_CORE_H 7 #define _MEC_ESPI_CORE_H 8 9 #include <stdbool.h> 10 #include <stddef.h> 11 #include <stdint.h> 12 13 /* Interfaces to any C modules */ 14 #ifdef __cplusplus 15 extern "C" 16 { 17 #endif 18 19 /* forward declarations */ 20 struct mec_espi_io_regs; 21 struct mec_espi_mem_regs; 22 struct mec_espi_vw_regs; 23 24 /* ---- eSPI configuration ---- */ 25 #define MEC_ESPI_CFG_PERIPH_CHAN_SUP_POS 0 26 #define MEC_ESPI_CFG_VW_CHAN_SUP_POS 1 27 #define MEC_ESPI_CFG_OOB_CHAN_SUP_POS 2 28 #define MEC_ESPI_CFG_FLASH_CHAN_SUP_POS 3 29 30 #define MEC_ESPI_CFG_IO_MODE_SUPP_POS 4 31 #define MEC_ESPI_CFG_IO_MODE_SUPP_MSK0 0x3u 32 #define MEC_ESPI_CFG_IO_MODE_SUPP_MSK \ 33 ((MEC_ESPI_CFG_IO_MODE_SUPP_MSK0) << (MEC_ESPI_CFG_IO_MODE_SUPP_POS)) 34 #define MEC_ESPI_CFG_ALERT_OD_SUPP_POS 6 35 #define MEC_ESPI_CFG_PLTRST_EXT_POS 7 36 37 #define MEC_ESPI_CFG_MAX_SUPP_FREQ_POS 8 38 #define MEC_ESPI_CFG_MAX_SUPP_FREQ_MSK0 0x7u 39 #define MEC_ESPI_CFG_MAX_SUPP_FREQ_MSK \ 40 ((MEC_ESPI_CFG_MAX_SUPP_FREQ_MSK0) << (MEC_ESPI_CFG_MAX_SUPP_FREQ_POS)) 41 42 #define MEC_ESPI_CFG_PC_MAX_PLD_SZ_POS 12 43 #define MEC_ESPI_CFG_PC_MAX_PLD_SZ_MSK0 0x7u 44 #define MEC_ESPI_CFG_PC_MAX_PLD_SZ_MSK \ 45 ((MEC_ESPI_CFG_PC_MAX_PLD_SZ_MSK0) << (MEC_ESPI_CFG_PC_MAX_PLD_SZ_POS)) 46 47 #define MEC_ESPI_CFG_OOB_MAX_PLD_SZ_POS 15 48 #define MEC_ESPI_CFG_OOB_MAX_PLD_SZ_MSK0 0x7u 49 #define MEC_ESPI_CFG_OOB_MAX_PLD_SZ_MSK \ 50 ((MEC_ESPI_CFG_OOB_MAX_PLD_SZ_MSK0) << (MEC_ESPI_CFG_OOB_MAX_PLD_SZ_POS)) 51 52 #define MEC_ESPI_CFG_VW_CNT_MAX_POS 18 53 #define MEC_ESPI_CFG_VW_CNT_MAX_MSK0 0x3fu 54 #define MEC_ESPI_CFG_VW_CNT_MAX_MSK \ 55 ((MEC_ESPI_CFG_VW_CNT_MAX_MSK0) << (MEC_ESPI_CFG_VW_CNT_MAX_POS)) 56 57 #define MEC_ESPI_CFG_FLASH_MAX_PLD_SZ_POS 24 58 #define MEC_ESPI_CFG_FLASH_MAX_PLD_SZ_MSK0 0x7u 59 #define MEC_ESPI_CFG_FLASH_MAX_PLD_SZ_MSK \ 60 ((MEC_ESPI_CFG_FLASH_MAX_PLD_SZ_MSK0) << (MEC_ESPI_CFG_FLASH_MAX_PLD_SZ_POS)) 61 #define MEC_ESPI_CFG_FLASH_SHARED_CAF_POS 27 62 #define MEC_ESPI_CFG_FLASH_SHARED_TAF_POS 28 63 #define MEC_ESPI_CFG_FLASH_SHARED_MODE_POS 27 64 #define MEC_ESPI_CFG_FLASH_SHARED_MODE_MSK0 0x3u 65 #define MEC_ESPI_CFG_FLASH_SHARED_MODE_MSK \ 66 ((MEC_ESPI_CFG_FLASH_SHARED_MODE_MSK0) << (MEC_ESPI_CFG_FLASH_SHARED_MODE_POS)) 67 #define MEC_ESPI_CAP_FLASH_SHARED_MAX_RD_REQ_SZ_POS 29 68 #define MEC_ESPI_CAP_FLASH_SHARED_MAX_RD_REQ_SZ_MSK0 0x7u 69 #define MEC_ESPI_CAP_FLASH_SHARED_MAX_RD_REQ_SZ_MSK \ 70 ((MEC_ESPI_CAP_FLASH_SHARED_MAX_RD_REQ_SZ_MSK0) \ 71 << (MEC_ESPI_CAP_FLASH_SHARED_MAX_RD_REQ_SZ_POS)) 72 73 #define MEC_ESPI_RESET_CHG_POS 0 74 #define MEC_ESPI_RESET_STATE_POS 1 75 76 #define MEC_ESPI_RESET_CHG 0x01 77 #define MEC_ESPI_RESET_HI 0x02 78 79 /* Each channel has an API returning a bitmap containing current state 80 * of the channel enable set by the eSPI Host and if the channel enable 81 * changed. 82 */ 83 #define MEC_ESPI_CHAN_ENABLED_POS 0 84 #define MEC_ESPI_CHAN_EN_CHG_POS 1 85 86 #define MEC_ESPI_CHAN_ENABLED 0x01 87 #define MEC_ESPI_CHAN_EN_CHG 0x02 88 89 #define MEC_ESPI_SIRQ_SLOT_DIS 0xffu 90 91 enum mec_espi_max_freq { 92 MEC_ESPI_MAX_SUPP_FREQ_20M = 0, 93 MEC_ESPI_MAX_SUPP_FREQ_25M, 94 MEC_ESPI_MAX_SUPP_FREQ_33M, 95 MEC_ESPI_MAX_SUPP_FREQ_50M, 96 MEC_ESPI_MAX_SUPP_FREQ_66M, 97 }; 98 99 enum mec_espi_io_mode { 100 MEC_ESPI_IO_MODE_1 = 0, 101 MEC_ESPI_IO_MODE_1_2, 102 MEC_ESPI_IO_MODE_1_4, 103 MEC_ESPI_IO_MODE_1_2_4, 104 }; 105 106 enum mec_espi_alert_io_mode { 107 MEC_ESPI_ALERT_IOM_NO_OD = 0, 108 MEC_ESPI_ALERT_IOM_OD, 109 }; 110 111 /* NOTE: OOB maximum payload size has same bit field encoding but actual size 112 * is 9 bytes larger to accomodate MCTP prefix. 113 */ 114 enum mec_espi_chan_max_pld_sz { 115 MEC_ESPI_CHAN_MAX_PLD_64B = 1, 116 }; 117 118 enum mec_espi_fc_sharing { 119 MEC_ESPI_FC_SHARING_MAF = 0, 120 MEC_ESPI_FC_SHARING_MAF_ALT, 121 MEC_ESPI_FC_SHARING_TAF, 122 MEC_ESPI_FC_SHARING_MAF_TAF, 123 }; 124 125 enum mec_espi_vw_max_count { 126 MEC_ESPI_VW_MAX_COUNT_MIN = 7, 127 MEC_ESPI_VW_MAX_COUNT_MAX = 0x3f, 128 }; 129 130 enum mec_espi_cap_id { 131 MEC_ESPI_CAP_ID_GLOBAL = 0, 132 MEC_ESPI_CAP_ID_PC, 133 MEC_ESPI_CAP_ID_VW, 134 MEC_ESPI_CAP_ID_OOB, 135 MEC_ESPI_CAP_ID_FC, 136 MEC_ESPI_CAP_ID_MAX, 137 }; 138 139 /* Set/Get Global capability position and values */ 140 #define MEC_ESPI_CAP_GL_SUPP_PC_POS 0 141 #define MEC_ESPI_CAP_GL_SUPP_VW_POS 1 142 #define MEC_ESPI_CAP_GL_SUPP_OOB_POS 2 143 #define MEC_ESPI_CAP_GL_SUPP_FLASH_POS 3 144 #define MEC_ESPI_CAP_GL_MAX_FREQ_POS 4 145 #define MEC_ESPI_CAP_GL_MAX_FREQ_MSK0 0x7u 146 #define MEC_ESPI_CAP_GL_MAX_FREQ_MSK \ 147 ((MEC_ESPI_CAP_GL_MAX_FREQ_MSK0) << (MEC_ESPI_CAP_GL_MAX_FREQ_POS)) 148 #define MEC_ESPI_CAP_GL_IOM_POS 8 149 #define MEC_ESPI_CAP_GL_IOM_MSK0 0x3u 150 #define MEC_ESPI_CAP_GL_IOM_MSK ((MEC_ESPI_CAP_GL_IOM_MSK0) << (MEC_ESPI_CAP_GL_IOM_POS)) 151 #define MEC_ESPI_CAP_GL_SUPP_ALERT_OD_POS 12 152 #define MEC_ESPI_CAP_GL_PLTRST_EXT_POS 13 153 154 /* Set/Get Peripheral Channel capability position and values */ 155 #define MEC_ESPI_CAP_PC_MAX_PLD_SIZE_POS 0 156 #define MEC_ESPI_CAP_PC_MAX_PLD_SIZE_MSK0 0x7u 157 #define MEC_ESPI_CAP_PC_MAX_PLD_SIZE_MSK \ 158 ((MEC_ESPI_CAP_PC_MAX_PLD_SIZE_MSK0) << (MEC_ESPI_CAP_PC_MAX_PLD_SIZE_POS)) 159 160 #define MEC_ESPI_CAP_PC_MAX_PLD_SZ_64 (1u << (MEC_ESPI_CAP_PC_MAX_PLD_SIZE_POS)) 161 #define MEC_ESPI_CAP_PC_MAX_PLD_SZ_128 (2u << (MEC_ESPI_CAP_PC_MAX_PLD_SIZE_POS)) 162 #define MEC_ESPI_CAP_PC_MAX_PLD_SZ_256 (3u << (MEC_ESPI_CAP_PC_MAX_PLD_SIZE_POS)) 163 #define MEC_ESPI_CAP_PC_MAX_PLD_SZ_DFLT MEC_ESPI_CAP_PC_MAX_PLD_SZ_64 164 165 /* Set/Get Virtual Wire Channel capability position and values */ 166 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_POS 0 167 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_MSK0 0x3fu 168 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_MSK ((MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_MSK0) << (MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_POS)) 169 170 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_8 0x7u 171 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_64 0x3fu 172 #define MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_DFLT MEC_ESPI_CAP_VW_MAX_VW_GRP_CNT_64 173 174 /* Set/Get OOB Channel capability position and values */ 175 #define MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_POS 0 176 #define MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_MSK0 0x7u 177 #define MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_MSK \ 178 ((MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_MSK0) << (MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_POS)) 179 180 #define MEC_ESPI_CAP_OOB_MAX_PLD_SZ_73 (1u << (MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_POS)) 181 #define MEC_ESPI_CAP_OOB_MAX_PLD_SZ_137 (2u << (MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_POS)) 182 #define MEC_ESPI_CAP_OOB_MAX_PLD_SZ_265 (3u << (MEC_ESPI_CAP_OOB_MAX_PLD_SIZE_POS)) 183 #define MEC_ESPI_CAP_OOB_MAX_PLD_SZ_DFLT MEC_ESPI_CAP_OOB_MAX_PLD_SZ_73 184 185 /* Set/Get Flash Channel capability position and values */ 186 #define MEC_ESPI_CAP_FC_MAX_PLD_SIZE_POS 0 187 #define MEC_ESPI_CAP_FC_MAX_PLD_SIZE_MSK0 0x7u 188 #define MEC_ESPI_CAP_FC_MAX_PLD_SIZE_MSK \ 189 ((MEC_ESPI_CAP_FC_MAX_PLD_SIZE_MSK0) << (MEC_ESPI_CAP_FC_MAX_PLD_SIZE_POS)) 190 #define MEC_ESPI_CAP_FC_SHDM_POS 4 191 #define MEC_ESPI_CAP_FC_SHDM_MSK0 0x3u 192 #define MEC_ESPI_CAP_FC_SHDM_MSK ((MEC_ESPI_CAP_FC_SHDM_MSK0) << (MEC_ESPI_CAP_FC_SHDM_POS)) 193 #define MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_POS 8 194 #define MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_MSK0 0x7u 195 #define MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_MSK \ 196 ((MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_MSK0) << (MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_POS)) 197 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_POS 16 198 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_MSK0 0xffu 199 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_MSK \ 200 ((MEC_ESPI_CAP_FC_TAF_ERBSZ_MSK0) << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 201 202 #define MEC_ESPI_CAP_FC_MAX_PLD_SZ_64 (1u << (MEC_ESPI_CAP_FC_MAX_PLD_SIZE_POS)) 203 #define MEC_ESPI_CAP_FC_MAX_PLD_SZ_128 (2u << (MEC_ESPI_CAP_FC_MAX_PLD_SIZE_POS)) 204 #define MEC_ESPI_CAP_FC_MAX_PLD_SZ_256 (3u << (MEC_ESPI_CAP_FC_MAX_PLD_SIZE_POS)) 205 #define MEC_ESPI_CAP_FC_MAX_PLD_SZ_DFLT MEC_ESPI_CAP_FC_MAX_PLD_SZ_64 206 207 #define MEC_ESPI_CAP_FC_SHDM_CAF (0u << (MEC_ESPI_CAP_FC_SHDM_POS)) 208 #define MEC_ESPI_CAP_FC_SHDM_CAF_ALT (1u << (MEC_ESPI_CAP_FC_SHDM_POS)) 209 #define MEC_ESPI_CAP_FC_SHDM_TAF (2u << (MEC_ESPI_CAP_FC_SHDM_POS)) 210 #define MEC_ESPI_CAP_FC_SHDM_CAF_TAF (3u << (MEC_ESPI_CAP_FC_SHDM_POS)) 211 212 #define MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_64 (1u << (MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_POS)) 213 #define MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_DFLT MEC_ESPI_CAP_FC_TAF_MAX_RDREQ_SIZE_64 214 215 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_1K (1u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 216 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_2K (2u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 217 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_4K (4u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 218 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_8K (8u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 219 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_16K (0x10u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 220 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_32K (0x20u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 221 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_64K (0x40u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 222 #define MEC_ESPI_CAP_FC_TAF_ERBSZ_128K (0x80u << (MEC_ESPI_CAP_FC_TAF_ERBSZ_POS)) 223 224 enum mec_espi_global_cap { 225 MEC_ESPI_CAP_MAX_FREQ = 0, 226 MEC_ESPI_CAP_IO_MODE, 227 MEC_ESPI_CAP_ALERT_OD, 228 MEC_ESPI_CAP_PERIPH_CHAN, 229 MEC_ESPI_CAP_PC_MAX_PLD_SIZE, 230 MEC_ESPI_CAP_VWIRE_CHAN, 231 MEC_ESPI_CAP_MAX_VW_COUNT, 232 MEC_ESPI_CAP_OOB_CHAN, 233 MEC_ESPI_CAP_OOB_MAX_PLD_SIZE, 234 MEC_ESPI_CAP_FLASH_CHAN, 235 MEC_ESPI_CAP_FC_MAX_PLD_SIZE, 236 MEC_ESPI_CAP_FC_SHARING, 237 MEC_ESPI_CAP_FC_MAX_RD_REQ_SIZE, 238 MEC_ESPI_CAP_MAX, 239 }; 240 241 #define MEC_ESPI_CFG_FLAG_PC_GIRQ_EN_POS 0 242 #define MEC_ESPI_CFG_FLAG_BM1_GIRQ_EN_POS 1 243 #define MEC_ESPI_CFG_FLAG_BM2_GIRQ_EN_POS 2 244 #define MEC_ESPI_CFG_FLAG_LTR_GIRQ_EN_POS 3 245 #define MEC_ESPI_CFG_FLAG_OOB_UP_GIRQ_EN_POS 4 246 #define MEC_ESPI_CFG_FLAG_OOB_DN_GIRQ_EN_POS 5 247 #define MEC_ESPI_CFG_FLAG_FC_GIRQ_EN_POS 6 248 #define MEC_ESPI_CFG_FLAG_ERST_GIRQ_EN_POS 7 249 #define MEC_ESPI_CFG_FLAG_VW_CT_GIRQ_EN_POS 8 250 #define MEC_ESPI_CFG_FLAG_VW_CHEN_GIRQ_EN_POS 9 251 252 struct mec_espi_config { 253 struct mec_espi_io_regs *iobase; 254 struct mec_espi_mem_regs *mbase; 255 struct mec_espi_vw_regs *vwbase; 256 uint32_t capabilities; 257 uint32_t cfg_flags; 258 }; 259 260 /* Configure eSPI controller hardware capabilities read by the Host eSPI controller 261 * soon after the Host de-asserts ESPI_RESET#. 262 * NOTE eSPI is only fully reset by a full chip reset or power cycle. 263 * The external ESPI_RESET# signal when asserted does hold portions of the logic 264 * in reset state. Please refer to the Microchip eSPI block document. 265 * This routine should be called while the Host is holding ESPI_RESET# asserted active. 266 */ 267 int mec_hal_espi_init(struct mec_espi_config *cfg); 268 269 int mec_hal_espi_capability_set(struct mec_espi_io_regs *iobase, 270 enum mec_espi_global_cap cap, uint32_t cfg); 271 272 int mec_hal_espi_capability_get(struct mec_espi_io_regs *iobase, 273 enum mec_espi_global_cap cap, uint32_t *cfg); 274 275 int mec_hal_espi_cap_set(struct mec_espi_io_regs *iobase, enum mec_espi_cap_id id, uint32_t cfg); 276 uint32_t mec_hal_espi_cap_get(struct mec_espi_io_regs *iobase, enum mec_espi_cap_id id); 277 278 void mec_hal_espi_reset_change_clr(struct mec_espi_io_regs *iobase); 279 void mec_hal_espi_reset_change_intr_en(struct mec_espi_io_regs *iobase, uint8_t enable); 280 void mec_hal_espi_reset_girq_ctrl(uint8_t enable); 281 void mec_hal_espi_reset_girq_status_clr(void); 282 uint32_t mec_hal_espi_reset_girq_status(void); 283 uint32_t mec_hal_espi_reset_girq_result(void); 284 285 /* Return bits indicating ESPI_RESET# has changed and its current state */ 286 uint32_t mec_hal_espi_reset_state(struct mec_espi_io_regs *iobase); 287 288 /* Enable eSPI controller after all static configuration has been performed. 289 * MEC eSPI activate must be set before the Host de-asserts ESPI_RESET#. 290 */ 291 void mec_hal_espi_activate(struct mec_espi_io_regs *iobase, uint8_t enable); 292 int mec_hal_espi_is_activated(struct mec_espi_io_regs *iobase); 293 294 #ifdef __cplusplus 295 } 296 #endif 297 298 #endif /* #ifndef _MEC_ESPI_CORE_H */ 299