mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 10:53:16 +01:00
Need to add irqctrl capabilities and irq bits to device memory caps. Also need to initialize irq field of devmem caps.
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
/*
|
|
* Generic irq handling definitions.
|
|
*
|
|
* Copyright (C) 2007 Bahadir Balban
|
|
*/
|
|
#ifndef __GENERIC_IRQ_H__
|
|
#define __GENERIC_IRQ_H__
|
|
|
|
#include <l4/lib/string.h>
|
|
#include INC_PLAT(irq.h)
|
|
#include INC_ARCH(types.h)
|
|
|
|
/* Represents none or spurious irq */
|
|
#define IRQ_NIL 0xFFFFFFFF
|
|
|
|
/* Successful irq handling state */
|
|
#define IRQ_HANDLED 0
|
|
|
|
typedef void (*irq_op_t)(l4id_t irq);
|
|
struct irq_chip_ops {
|
|
void (*init)(void);
|
|
l4id_t (*read_irq)(void);
|
|
irq_op_t ack_and_mask;
|
|
irq_op_t unmask;
|
|
};
|
|
|
|
struct irq_chip {
|
|
char name[32];
|
|
int level; /* Cascading level */
|
|
int cascade; /* The irq that lower chip uses on this chip */
|
|
int start; /* The global irq offset for this chip */
|
|
int end; /* End of this chip's irqs */
|
|
struct irq_chip_ops ops;
|
|
};
|
|
|
|
struct irq_desc;
|
|
typedef int (*irq_handler_t)(struct irq_desc *irq_desc);
|
|
struct irq_desc {
|
|
char name[8];
|
|
struct irq_chip *chip;
|
|
|
|
/* Thread registered for this irq */
|
|
struct ktcb *irq_thread;
|
|
|
|
/* Notification slot for this irq */
|
|
int task_notify_slot;
|
|
|
|
/* NOTE: This could be a list for multiple handlers for shared irqs */
|
|
irq_handler_t handler;
|
|
};
|
|
|
|
extern struct irq_desc irq_desc_array[];
|
|
extern struct irq_chip irq_chip_array[];
|
|
|
|
static inline void irq_enable(int irq_index)
|
|
{
|
|
struct irq_desc *this_irq = irq_desc_array + irq_index;
|
|
struct irq_chip *this_chip = this_irq->chip;
|
|
|
|
this_chip->ops.unmask(irq_index - this_chip->start);
|
|
}
|
|
|
|
static inline void irq_disable(int irq_index)
|
|
{
|
|
struct irq_desc *this_irq = irq_desc_array + irq_index;
|
|
struct irq_chip *this_chip = this_irq->chip;
|
|
|
|
this_chip->ops.ack_and_mask(irq_index - this_chip->start);
|
|
}
|
|
|
|
int irq_register(struct ktcb *task, int notify_slot,
|
|
l4id_t irq_index, irq_handler_t handler);
|
|
|
|
void do_irq(void);
|
|
void irq_controllers_init(void);
|
|
|
|
#endif /* __GENERIC_IRQ_H__ */
|