blob: eeb88b26f24f64d838605d17b17467dd7fa399da [file] [log] [blame]
/* Copyright 2018 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */
#include <string.h>
#include <metal/interrupt.h>
#include <metal/machine.h>
struct metal_interrupt* metal_interrupt_get_controller (metal_intr_cntrl_type cntrl,
int id)
{
switch (cntrl) {
case METAL_CPU_CONTROLLER:
break;
case METAL_CLINT_CONTROLLER:
#ifdef __METAL_DT_RISCV_CLINT0_HANDLE
return __METAL_DT_RISCV_CLINT0_HANDLE;
#endif
break;
case METAL_CLIC_CONTROLLER:
#ifdef __METAL_DT_SIFIVE_CLIC0_HANDLE
return __METAL_DT_SIFIVE_CLIC0_HANDLE;
#endif
break;
case METAL_PLIC_CONTROLLER:
#ifdef __METAL_DT_RISCV_PLIC0_HANDLE
return __METAL_DT_RISCV_PLIC0_HANDLE;
#endif
break;
}
return NULL;
}
extern __inline__ void metal_interrupt_init(struct metal_interrupt *controller);
extern __inline__ int metal_interrupt_set_vector_mode(struct metal_interrupt *controller,
metal_vector_mode mode);
extern __inline__ metal_vector_mode metal_interrupt_get_vector_mode(struct metal_interrupt *controller);
extern __inline__ int metal_interrupt_set_privilege(struct metal_interrupt *controller,
metal_intr_priv_mode mode);
extern __inline__ metal_intr_priv_mode metal_interrupt_get_privilege(struct metal_interrupt *controller);
extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller,
unsigned int level);
extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
extern __inline__ int metal_interrupt_clear(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_set(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_register_handler(struct metal_interrupt *controller,
int id,
metal_interrupt_handler_t handler,
void *priv);
extern __inline__ int metal_interrupt_register_vector_handler(struct metal_interrupt *controller,
int id,
metal_interrupt_vector_handler_t handler,
void *priv_data);
extern __inline__ int metal_interrupt_enable(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_disable(struct metal_interrupt *controller, int id);
extern __inline__ unsigned int metal_interrupt_get_threshold(struct metal_interrupt *controller);
extern __inline__ int metal_interrupt_set_threshold(struct metal_interrupt *controller, unsigned int threshold);
extern __inline__ unsigned int metal_interrupt_get_priority(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_set_priority(struct metal_interrupt *controller, int id, unsigned int priority);
extern __inline__ int metal_interrupt_vector_enable(struct metal_interrupt *controller, int id);
extern __inline__ int metal_interrupt_vector_disable(struct metal_interrupt *controller, int id);
extern __inline__ int _metal_interrupt_command_request(struct metal_interrupt *controller,
int cmd, void *data);