Skip to content

Commit

Permalink
Merge pull request #196 from sifive/disable-register
Browse files Browse the repository at this point in the history
Always clear feature disable register
  • Loading branch information
bsousi5 authored Oct 23, 2019
2 parents 61737c0 + d7bf4fc commit 7fea3d1
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 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
5 changes: 1 addition & 4 deletions src/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,8 @@ _enter:
* the boot process. */
la t0, early_trap_vector
csrw mtvec, t0
/* enable chicken bit if core is bullet series*/
la t0, __metal_chicken_bit
beqz t0, 1f
/* Always clear the feature disable register for all cores series*/
csrwi 0x7C1, 0
1:

/* There may be pre-initialization routines inside the MBI code that run in
* C, so here we set up a C environment. First we set up a stack pointer,
Expand Down

0 comments on commit 7fea3d1

Please sign in to comment.