soc/intel/common: Add support to clear GPI IS & IE registers
Add support to reset the GPI Interrupt Status & Enable registers so that the system does not experience any interrupt storm from a GPI when it comes out of one of the sleep states. BUG=b:130593883 BRANCH=None TEST=Ensure that the Interrupt status & enable registers are reset during the boot up. Ensure that the system boots fine to ChromeOS. Change-Id: I99f36d88cbab8bb75f12ab1a4d06437f837841cb Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/32447 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
parent
c126084bc5
commit
3391a31cf9
|
@ -62,6 +62,10 @@
|
||||||
((group) * sizeof(uint32_t)))
|
((group) * sizeof(uint32_t)))
|
||||||
#define GPI_SMI_EN_OFFSET(comm, group) ((comm)->gpi_smi_en_reg_0 + \
|
#define GPI_SMI_EN_OFFSET(comm, group) ((comm)->gpi_smi_en_reg_0 + \
|
||||||
((group) * sizeof(uint32_t)))
|
((group) * sizeof(uint32_t)))
|
||||||
|
#define GPI_IS_OFFSET(comm, group) ((comm)->gpi_int_sts_reg_0 + \
|
||||||
|
((group) * sizeof(uint32_t)))
|
||||||
|
#define GPI_IE_OFFSET(comm, group) ((comm)->gpi_int_en_reg_0 + \
|
||||||
|
((group) * sizeof(uint32_t)))
|
||||||
|
|
||||||
static inline size_t relative_pad_in_comm(const struct pad_community *comm,
|
static inline size_t relative_pad_in_comm(const struct pad_community *comm,
|
||||||
gpio_t gpio)
|
gpio_t gpio)
|
||||||
|
@ -582,3 +586,26 @@ uint32_t __weak soc_gpio_pad_config_fixup(const struct pad_config *cfg,
|
||||||
{
|
{
|
||||||
return reg_val;
|
return reg_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gpi_clear_int_cfg(void)
|
||||||
|
{
|
||||||
|
int i, group, num_groups;
|
||||||
|
uint32_t sts_value;
|
||||||
|
size_t gpio_communities;
|
||||||
|
const struct pad_community *comm;
|
||||||
|
|
||||||
|
comm = soc_gpio_get_community(&gpio_communities);
|
||||||
|
for (i = 0; i < gpio_communities; i++, comm++) {
|
||||||
|
num_groups = comm->num_gpi_regs;
|
||||||
|
for (group = 0; group < num_groups; group++) {
|
||||||
|
/* Clear the enable register */
|
||||||
|
pcr_write32(comm->port, GPI_IE_OFFSET(comm, group), 0);
|
||||||
|
|
||||||
|
/* Read and clear the set status register bits*/
|
||||||
|
sts_value = pcr_read32(comm->port,
|
||||||
|
GPI_IS_OFFSET(comm, group));
|
||||||
|
pcr_write32(comm->port,
|
||||||
|
GPI_IS_OFFSET(comm, group), sts_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -209,5 +209,11 @@ uint8_t gpio_get_pad_portid(const gpio_t pad);
|
||||||
uint32_t soc_gpio_pad_config_fixup(const struct pad_config *cfg,
|
uint32_t soc_gpio_pad_config_fixup(const struct pad_config *cfg,
|
||||||
int dw_reg, uint32_t reg_val);
|
int dw_reg, uint32_t reg_val);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function to reset/clear the GPI Interrupt Enable & Status registers for
|
||||||
|
* all GPIO pad communities.
|
||||||
|
*/
|
||||||
|
void gpi_clear_int_cfg(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* _SOC_INTELBLOCKS_GPIO_H_ */
|
#endif /* _SOC_INTELBLOCKS_GPIO_H_ */
|
||||||
|
|
Loading…
Reference in New Issue