Skip to content

Commit

Permalink
Disable all plic and clic interrupts on init
Browse files Browse the repository at this point in the history
  • Loading branch information
bsousi5 committed Oct 21, 2019
1 parent 0ba2ed2 commit d7bf4fc
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
12 changes: 8 additions & 4 deletions src/drivers/riscv_plic0.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

#ifdef METAL_RISCV_PLIC0

#define PLIC0_MAX_INTERRUPTS 1024

#include <metal/drivers/riscv_plic0.h>
#include <metal/interrupt.h>
#include <metal/io.h>
Expand Down Expand Up @@ -136,12 +138,14 @@ void __metal_driver_riscv_plic0_init(struct metal_interrupt *controller) {
/* Initialize ist parent controller, aka cpu_intc. */
intc->vtable->interrupt_init(intc);

for (int i = 0; i < num_interrupts; i++) {
for (int i = 0; i < PLIC0_MAX_INTERRUPTS; i++) {
__metal_plic0_enable(plic, parent, i, METAL_DISABLE);
__metal_driver_riscv_plic0_set_priority(controller, i, 0);
plic->metal_exint_table[i] = NULL;
plic->metal_exdata_table[i].sub_int = NULL;
plic->metal_exdata_table[i].exint_data = NULL;
if (i < num_interrupts) {
plic->metal_exint_table[i] = NULL;
plic->metal_exdata_table[i].sub_int = NULL;
plic->metal_exdata_table[i].exint_data = NULL;
}
}

__metal_plic0_set_threshold(controller, parent, 0);
Expand Down
16 changes: 11 additions & 5 deletions src/drivers/sifive_clic0.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include <metal/shutdown.h>
#include <stdint.h>

#define CLIC0_MAX_INTERRUPTS 4096

typedef enum metal_clic_vector_ {
METAL_CLIC_NONVECTOR = 0,
METAL_CLIC_VECTORED = 1
Expand Down Expand Up @@ -496,11 +498,15 @@ void __metal_driver_sifive_clic0_init(struct metal_interrupt *controller) {
num_subinterrupts =
__metal_driver_sifive_clic0_num_subinterrupts(controller);
clic->metal_mtvt_table[0] = &__metal_clic0_handler;
for (int i = 1; i < num_subinterrupts; i++) {
clic->metal_mtvt_table[i] = NULL;
clic->metal_exint_table[i].handler = NULL;
clic->metal_exint_table[i].sub_int = NULL;
clic->metal_exint_table[i].exint_data = NULL;
__metal_clic0_interrupt_disable(clic, 0);
__metal_clic0_interrupt_set_level(clic, 0, level);
for (int i = 1; i < CLIC0_MAX_INTERRUPTS; i++) {
if (i < num_subinterrupts) {
clic->metal_mtvt_table[i] = NULL;
clic->metal_exint_table[i].handler = NULL;
clic->metal_exint_table[i].sub_int = NULL;
clic->metal_exint_table[i].exint_data = NULL;
}
__metal_clic0_interrupt_disable(clic, i);
__metal_clic0_interrupt_set_level(clic, i, level);
}
Expand Down

0 comments on commit d7bf4fc

Please sign in to comment.