#ifndef _ALPHA_INTR_H_
#define _ALPHA_INTR_H_
#include <sys/evcnt.h>
#include <machine/alpha_cpu.h>
#define SCB_IOVECBASE 0x0800
#define SCB_VECSIZE 0x0010
#define SCB_SIZE 0x2000
#define SCB_VECTOIDX(x) ((x) >> 4)
#define SCB_IDXTOVEC(x) ((x) << 4)
#define SCB_NIOVECS SCB_VECTOIDX(SCB_SIZE - SCB_IOVECBASE)
struct scbvec {
void (*scb_func)(void *, u_long);
void *scb_arg;
};
#define IPL_NONE ALPHA_PSL_IPL_0
#define IPL_SOFTCLOCK ALPHA_PSL_IPL_SOFT_LO
#define IPL_SOFTBIO ALPHA_PSL_IPL_SOFT_LO
#ifdef __HAVE_FAST_SOFTINTS
#define IPL_SOFTNET ALPHA_PSL_IPL_SOFT_HI
#define IPL_SOFTSERIAL ALPHA_PSL_IPL_SOFT_HI
#else
#define IPL_SOFTNET ALPHA_PSL_IPL_SOFT_LO
#define IPL_SOFTSERIAL ALPHA_PSL_IPL_SOFT_LO
#endif
#define IPL_VM ALPHA_PSL_IPL_IO_HI
#define IPL_SCHED ALPHA_PSL_IPL_CLOCK
#define IPL_HIGH ALPHA_PSL_IPL_HIGH
#define SOFTINT_CLOCK_MASK __BIT(SOFTINT_CLOCK)
#define SOFTINT_BIO_MASK __BIT(SOFTINT_BIO)
#define SOFTINT_NET_MASK __BIT(SOFTINT_NET)
#define SOFTINT_SERIAL_MASK __BIT(SOFTINT_SERIAL)
#define ALPHA_IPL1_SOFTINTS (SOFTINT_CLOCK_MASK | SOFTINT_BIO_MASK)
#define ALPHA_IPL2_SOFTINTS (SOFTINT_NET_MASK | SOFTINT_SERIAL_MASK)
#define ALPHA_ALL_SOFTINTS (ALPHA_IPL1_SOFTINTS | ALPHA_IPL2_SOFTINTS)
typedef int ipl_t;
typedef struct {
uint8_t _psl;
} ipl_cookie_t;
static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
return (ipl_cookie_t){._psl = (uint8_t)ipl};
}
#define IST_UNUSABLE -1
#define IST_NONE 0
#define IST_PULSE 1
#define IST_EDGE 2
#define IST_LEVEL 3
#ifdef _KERNEL
void spllower(int);
#define splx(s) spllower(s)
#define spl0() spllower(ALPHA_PSL_IPL_0)
static __inline int
_splraise(int s)
{
int cur = (int)alpha_pal_rdps();
return (s > cur ? (int)alpha_pal_swpipl(s) : cur);
}
#define splraiseipl(icookie) _splraise((icookie)._psl)
#include <sys/spl.h>
void alpha_softint_dispatch(int);
void alpha_softint_switchto(struct lwp *, int, struct lwp *);
#define ALPHA_IPI_HALT (1UL << 0)
#define ALPHA_IPI_PRIMARY_CC (1UL << 1)
#define ALPHA_IPI_SHOOTDOWN (1UL << 2)
#define ALPHA_IPI_AST (1UL << 3)
#define ALPHA_IPI_PAUSE (1UL << 4)
#define ALPHA_IPI_XCALL (1UL << 5)
#define ALPHA_IPI_GENERIC (1UL << 6)
#define ALPHA_NIPIS 7
struct cpu_info;
struct trapframe;
void alpha_ipi_init(struct cpu_info *);
void alpha_ipi_process(struct cpu_info *, struct trapframe *);
void alpha_send_ipi(unsigned long, unsigned long);
void alpha_broadcast_ipi(unsigned long);
void alpha_multicast_ipi(unsigned long, unsigned long);
#define ALPHA_INTR_MPSAFE 0x01
struct alpha_shared_intrhand {
TAILQ_ENTRY(alpha_shared_intrhand)
ih_q;
struct alpha_shared_intr *ih_intrhead;
int (*ih_fn)(void *);
void *ih_arg;
int (*ih_real_fn)(void *);
void *ih_real_arg;
int ih_level;
int ih_type;
unsigned int ih_num;
};
struct alpha_shared_intr {
TAILQ_HEAD(,alpha_shared_intrhand)
intr_q;
struct evcnt intr_evcnt;
char *intr_string;
void *intr_private;
struct cpu_info *intr_cpu;
int intr_sharetype;
int intr_dfltsharetype;
int intr_nstrays;
int intr_maxstrays;
};
#define ALPHA_SHARED_INTR_DISABLE(asi, num) \
((asi)[num].intr_maxstrays != 0 && \
(asi)[num].intr_nstrays == (asi)[num].intr_maxstrays)
struct alpha_shared_intr *alpha_shared_intr_alloc(unsigned int);
int alpha_shared_intr_dispatch(struct alpha_shared_intr *,
unsigned int);
struct alpha_shared_intrhand *
alpha_shared_intr_alloc_intrhand(struct alpha_shared_intr *,
unsigned int, int, int, int, int (*)(void *), void *,
const char *);
void alpha_shared_intr_free_intrhand(struct alpha_shared_intrhand *);
bool alpha_shared_intr_link(struct alpha_shared_intr *,
struct alpha_shared_intrhand *, const char *);
void alpha_shared_intr_unlink(struct alpha_shared_intr *,
struct alpha_shared_intrhand *, const char *);
int alpha_shared_intr_get_sharetype(struct alpha_shared_intr *,
unsigned int);
int alpha_shared_intr_isactive(struct alpha_shared_intr *,
unsigned int);
int alpha_shared_intr_firstactive(struct alpha_shared_intr *,
unsigned int);
void alpha_shared_intr_set_dfltsharetype(struct alpha_shared_intr *,
unsigned int, int);
void alpha_shared_intr_set_maxstrays(struct alpha_shared_intr *,
unsigned int, int);
void alpha_shared_intr_reset_strays(struct alpha_shared_intr *,
unsigned int);
void alpha_shared_intr_stray(struct alpha_shared_intr *, unsigned int,
const char *);
void alpha_shared_intr_set_private(struct alpha_shared_intr *,
unsigned int, void *);
void *alpha_shared_intr_get_private(struct alpha_shared_intr *,
unsigned int);
void alpha_shared_intr_set_cpu(struct alpha_shared_intr *,
unsigned int, struct cpu_info *ci);
struct cpu_info *
alpha_shared_intr_get_cpu(struct alpha_shared_intr *,
unsigned int);
void alpha_shared_intr_set_string(struct alpha_shared_intr *,
unsigned int, char *);
const char *alpha_shared_intr_string(struct alpha_shared_intr *,
unsigned int);
struct evcnt *alpha_shared_intr_evcnt(struct alpha_shared_intr *,
unsigned int);
extern struct scbvec scb_iovectab[];
extern void (*alpha_intr_redistribute)(void);
void scb_init(void);
void scb_set(u_long, void (*)(void *, u_long), void *);
u_long scb_alloc(void (*)(void *, u_long), void *);
void scb_free(u_long);
#define SCB_ALLOC_FAILED ((u_long) -1)
#endif
#endif