From b7acae8fb5137f76494ca32c7786e6f4630195b2 Mon Sep 17 00:00:00 2001 From: Dino Li Date: Wed, 1 Sep 2021 14:14:23 +0800 Subject: it83xx/nds32: Ensure EXT_IER has been disabled before enabling CPU interrupt This CL read (load operation) an EC's extended interrupt enable register one time after configured. The load operation will ensure chip-level's interrupt has been disabled before enabling CPU interrupt. This CL will also assert failure if EC get interrupt number 0 in ISR. BRANCH=dedede BUG=b:197308582 TEST=No system reboot on storo during the drop test. Change-Id: I593d78626d1e3bb92e5316d1ff78f0ee54711741 Signed-off-by: Dino Li Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3124483 Reviewed-by: Aseda Aboagye Commit-Queue: Aseda Aboagye --- chip/it83xx/gpio.c | 3 +++ chip/it83xx/irq.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'chip') diff --git a/chip/it83xx/gpio.c b/chip/it83xx/gpio.c index f15adb431a..e6043267fd 100644 --- a/chip/it83xx/gpio.c +++ b/chip/it83xx/gpio.c @@ -871,6 +871,9 @@ static void __gpio_irq(void) /* Determine interrupt number. */ int irq = intc_get_ec_int(); + /* assert failure if interrupt number is zero */ + ASSERT(irq); + #ifdef HAS_TASK_KEYSCAN if (irq == IT83XX_IRQ_WKINTC) { keyboard_raw_interrupt(); diff --git a/chip/it83xx/irq.c b/chip/it83xx/irq.c index 308fa5b2e7..fb01309721 100644 --- a/chip/it83xx/irq.c +++ b/chip/it83xx/irq.c @@ -134,8 +134,16 @@ void chip_disable_irq(int irq) } /* SOC's interrupts use CPU HW interrupt 2 ~ 15 */ - if (IS_ENABLED(CHIP_CORE_NDS32)) + if (IS_ENABLED(CHIP_CORE_NDS32)) { + volatile uint8_t _ext_ier __unused; + IT83XX_INTC_REG(IT83XX_INTC_EXT_IER_OFF(group)) &= ~BIT(bit); + /* + * This load operation will guarantee the above modification of + * EC's register can be seen by any following instructions. + */ + _ext_ier = IT83XX_INTC_REG(IT83XX_INTC_EXT_IER_OFF(group)); + } } void chip_clear_pending_irq(int irq) -- cgit v1.2.1