Files
codezero/include/l4/generic/irq.h
Bahadir Balban 59af5d3794 Made changes to map devices dynamically upon irq registration.
All will be reverted since mapping devices statically is much simpler.
2009-12-11 19:02:10 +02:00

84 lines
1.9 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 *task;
/* Notification slot for this irq */
int task_notify_slot;
/* Device virtual address */
unsigned long device_virtual;
/* Device capability */
struct capability *devcap;
/* 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);
}
void irq_generic_map_device(struct irq_desc *desc);
int irq_register(struct ktcb *task, int notify_slot, l4id_t irq_index);
void do_irq(void);
void irq_controllers_init(void);
#endif /* __GENERIC_IRQ_H__ */