summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDino Li <Dino.Li@ite.com.tw>2020-09-21 11:13:33 +0800
committerCommit Bot <commit-bot@chromium.org>2020-09-24 09:16:58 +0000
commit0542741e0e8727ae53bce47a1fd4459735056b53 (patch)
tree9763cda3eda742134912a49105aaf492622c24ee
parent1c3c2140f333f4a169f047fad8a780d0b71c2e5d (diff)
downloadchrome-ec-0542741e0e8727ae53bce47a1fd4459735056b53.tar.gz
it83xx: read_clear_int_mask() read and clear interrupt bit.
This change pulled the operation of interrupt disable into read_clear_int_mask(). Because riscv core supports instruction csrrc to atomic read and clear bit in CSR register. With this change, we won't need to separate operations of reading and clearing interrupt bit on riscv core. BUG=none BRANCH=none TEST=read_clear_int_mask() is able to disable interrupt and return saved interrupt bit on both nds32 and riscv cores. Signed-off-by: Dino Li <Dino.Li@ite.com.tw> Change-Id: I871aab747b950b7948cdeb7911fcf8c09d55df5d Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2419739 Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--chip/it83xx/ec2i.c10
-rw-r--r--chip/it83xx/gpio.c5
-rw-r--r--chip/it83xx/hwtimer.c3
-rw-r--r--chip/it83xx/lpc.c4
-rw-r--r--chip/mt8192_scp/ipi.c6
-rw-r--r--core/nds32/atomic.h20
-rw-r--r--core/nds32/task.c21
-rw-r--r--core/riscv-rv32i/task.c16
-rw-r--r--include/task.h8
9 files changed, 46 insertions, 47 deletions
diff --git a/chip/it83xx/ec2i.c b/chip/it83xx/ec2i.c
index fe657438c4..be02a8f813 100644
--- a/chip/it83xx/ec2i.c
+++ b/chip/it83xx/ec2i.c
@@ -245,10 +245,9 @@ static enum ec2i_message ec2i_read_pnpcfg(enum ec2i_access sel)
enum ec2i_message ec2i_read(enum host_pnpcfg_index index)
{
enum ec2i_message ret = EC2I_READ_ERROR;
- uint32_t int_mask = get_int_mask();
-
/* critical section with interrupts off */
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
/* Set index */
if (ec2i_write_pnpcfg(EC2I_ACCESS_INDEX, index) == EC2I_WRITE_SUCCESS)
/* read data port */
@@ -263,10 +262,9 @@ enum ec2i_message ec2i_read(enum host_pnpcfg_index index)
enum ec2i_message ec2i_write(enum host_pnpcfg_index index, uint8_t data)
{
enum ec2i_message ret = EC2I_WRITE_ERROR;
- uint32_t int_mask = get_int_mask();
-
/* critical section with interrupts off */
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
/* Set index */
if (ec2i_write_pnpcfg(EC2I_ACCESS_INDEX, index) == EC2I_WRITE_SUCCESS)
/* Set data */
diff --git a/chip/it83xx/gpio.c b/chip/it83xx/gpio.c
index 49c3dea103..3dd6d16268 100644
--- a/chip/it83xx/gpio.c
+++ b/chip/it83xx/gpio.c
@@ -442,10 +442,9 @@ test_mockable int gpio_get_level(enum gpio_signal signal)
void gpio_set_level(enum gpio_signal signal, int value)
{
- uint32_t int_mask = get_int_mask();
-
/* critical section with interrupts off */
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
if (value)
IT83XX_GPIO_DATA(gpio_list[signal].port) |=
gpio_list[signal].mask;
diff --git a/chip/it83xx/hwtimer.c b/chip/it83xx/hwtimer.c
index 1fc90ebe67..291751a1cb 100644
--- a/chip/it83xx/hwtimer.c
+++ b/chip/it83xx/hwtimer.c
@@ -228,10 +228,9 @@ DECLARE_IRQ(CPU_INT_GROUP_3, __hw_clock_source_irq, 1);
#define CYCLES_125NS (125*(PLL_CLOCK/SECOND) / 1000)
uint32_t __ram_code ext_observation_reg_read(enum ext_timer_sel ext_timer)
{
- uint32_t prev_mask = get_int_mask();
+ uint32_t prev_mask = read_clear_int_mask();
uint32_t val;
- interrupt_disable();
asm volatile(
/* read observation register for the first time */
"lwi %0,[%1]\n\t"
diff --git a/chip/it83xx/lpc.c b/chip/it83xx/lpc.c
index 0431019101..ae66181430 100644
--- a/chip/it83xx/lpc.c
+++ b/chip/it83xx/lpc.c
@@ -337,8 +337,8 @@ void lpc_keyboard_put_char(uint8_t chr, int send_irq)
void lpc_keyboard_clear_buffer(void)
{
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
/* bit6, write-1 clear OBF */
IT83XX_KBC_KBHICR |= BIT(6);
IT83XX_KBC_KBHICR &= ~BIT(6);
diff --git a/chip/mt8192_scp/ipi.c b/chip/mt8192_scp/ipi.c
index 83d9fa8ebb..4081e47075 100644
--- a/chip/mt8192_scp/ipi.c
+++ b/chip/mt8192_scp/ipi.c
@@ -30,10 +30,8 @@ static uint32_t disable_irq_count, saved_int_mask;
void ipi_disable_irq(void)
{
- if (atomic_inc(&disable_irq_count, 1) == 0) {
- saved_int_mask = get_int_mask();
- interrupt_disable();
- }
+ if (atomic_inc(&disable_irq_count, 1) == 0)
+ saved_int_mask = read_clear_int_mask();
}
void ipi_enable_irq(void)
diff --git a/core/nds32/atomic.h b/core/nds32/atomic.h
index 8928fe3373..792093d598 100644
--- a/core/nds32/atomic.h
+++ b/core/nds32/atomic.h
@@ -14,32 +14,32 @@
static inline void atomic_clear(uint32_t volatile *addr, uint32_t bits)
{
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
*addr &= ~bits;
set_int_mask(int_mask);
}
static inline void atomic_or(uint32_t volatile *addr, uint32_t bits)
{
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
*addr |= bits;
set_int_mask(int_mask);
}
static inline void atomic_add(uint32_t volatile *addr, uint32_t value)
{
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
*addr += value;
set_int_mask(int_mask);
}
static inline void atomic_sub(uint32_t volatile *addr, uint32_t value)
{
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
*addr -= value;
set_int_mask(int_mask);
}
@@ -47,8 +47,8 @@ static inline void atomic_sub(uint32_t volatile *addr, uint32_t value)
static inline uint32_t atomic_read_clear(uint32_t volatile *addr)
{
uint32_t val;
- uint32_t int_mask = get_int_mask();
- interrupt_disable();
+ uint32_t int_mask = read_clear_int_mask();
+
val = *addr;
*addr = 0;
set_int_mask(int_mask);
diff --git a/core/nds32/task.c b/core/nds32/task.c
index f034c53f48..21bd8d5edd 100644
--- a/core/nds32/task.c
+++ b/core/nds32/task.c
@@ -473,11 +473,18 @@ uint32_t __ram_code task_wait_event_mask(uint32_t event_mask, int timeout_us)
return events & event_mask;
}
-uint32_t __ram_code get_int_mask(void)
+uint32_t __ram_code read_clear_int_mask(void)
{
- uint32_t ret;
- asm volatile ("mfsr %0, $INT_MASK" : "=r"(ret));
- return ret;
+ uint32_t int_mask, int_dis = BIT(30);
+
+ asm volatile(
+ "mfsr %0, $INT_MASK\n\t"
+ "mtsr %1, $INT_MASK\n\t"
+ "dsb\n\t"
+ : "=&r"(int_mask)
+ : "r"(int_dis));
+
+ return int_mask;
}
void __ram_code set_int_mask(uint32_t val)
@@ -526,18 +533,16 @@ void task_disable_task(task_id_t tskid)
void __ram_code task_enable_irq(int irq)
{
- uint32_t int_mask = get_int_mask();
+ uint32_t int_mask = read_clear_int_mask();
- interrupt_disable();
chip_enable_irq(irq);
set_int_mask(int_mask);
}
void __ram_code task_disable_irq(int irq)
{
- uint32_t int_mask = get_int_mask();
+ uint32_t int_mask = read_clear_int_mask();
- interrupt_disable();
chip_disable_irq(irq);
set_int_mask(int_mask);
}
diff --git a/core/riscv-rv32i/task.c b/core/riscv-rv32i/task.c
index 1182aaac82..3ad78994bd 100644
--- a/core/riscv-rv32i/task.c
+++ b/core/riscv-rv32i/task.c
@@ -468,12 +468,14 @@ uint32_t __ram_code task_wait_event_mask(uint32_t event_mask, int timeout_us)
return events & event_mask;
}
-uint32_t __ram_code get_int_mask(void)
+uint32_t __ram_code read_clear_int_mask(void)
{
- uint32_t ret;
+ uint32_t mie, meie = BIT(11);
- asm volatile ("csrr %0, mie" : "=r"(ret));
- return ret;
+ /* Read and clear MEIE bit of MIE register. */
+ asm volatile ("csrrc %0, mie, %1" : "=r"(mie) : "r"(meie));
+
+ return mie;
}
void __ram_code set_int_mask(uint32_t val)
@@ -504,18 +506,16 @@ void task_disable_task(task_id_t tskid)
void __ram_code task_enable_irq(int irq)
{
- uint32_t int_mask = get_int_mask();
+ uint32_t int_mask = read_clear_int_mask();
- interrupt_disable();
chip_enable_irq(irq);
set_int_mask(int_mask);
}
void __ram_code task_disable_irq(int irq)
{
- uint32_t int_mask = get_int_mask();
+ uint32_t int_mask = read_clear_int_mask();
- interrupt_disable();
chip_disable_irq(irq);
set_int_mask(int_mask);
}
diff --git a/include/task.h b/include/task.h
index a0db186eb4..0b244a2a18 100644
--- a/include/task.h
+++ b/include/task.h
@@ -90,11 +90,11 @@ int in_interrupt_context(void);
int in_soft_interrupt_context(void);
/**
- * Return current interrupt mask. Meaning is chip-specific and
- * should not be examined; just pass it to set_int_mask() to
- * restore a previous interrupt state after interrupt_disable().
+ * Return current interrupt mask with disabling interrupt. Meaning is
+ * chip-specific and should not be examined; just pass it to set_int_mask() to
+ * restore a previous interrupt state after interrupt disable.
*/
-uint32_t get_int_mask(void);
+uint32_t read_clear_int_mask(void);
/**
* Set interrupt mask. As with interrupt_disable(), use with care.