OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [include/] [l4/] [generic/] [irq.h] - Rev 2

Compare with Previous | Blame | View Log

/*
 * Generic irq handling definitions.
 *
 * Copyright (C) 2010 B Labs Ltd.
 */
#ifndef __GENERIC_IRQ_H__
#define __GENERIC_IRQ_H__
 
#include <l4/lib/string.h>
#include <l4/lib/wait.h>
#include <l4/lib/printk.h>
#include INC_PLAT(irq.h)
#include INC_ARCH(types.h)
 
/* Represents none or spurious irq */
#define IRQ_NIL				0xFFFFFFFF /* -1 */
#define IRQ_SPURIOUS			0xFFFFFFFE /* -2 */
 
/* Successful irq handling state */
#define IRQ_HANDLED				0
 
typedef void (*irq_op_t)(l4id_t irq);
struct irq_chip_ops {
	void (*init)();
	l4id_t (*read_irq)(void *data);
	irq_op_t ack_and_mask;
	irq_op_t unmask;
	void (*set_cpu)(l4id_t irq, unsigned int cpumask);
};
 
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 */
	void *data;		/* Anything that a of interest to a driver */
	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;
 
	/* Waitqueue head for this irq */
	struct waitqueue_head wqh_irq;
 
	/* 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);
}
 
static inline void irq_set_cpu(int irq_index, unsigned int cpumask)
{
	struct irq_desc *this_irq = irq_desc_array + irq_index;
	struct irq_chip *this_chip = this_irq->chip;
 
	this_chip->ops.set_cpu(irq_index - this_chip->start, cpumask);
}
 
int irq_register(struct ktcb *task, int notify_slot, l4id_t irq_index);
int irq_thread_notify(struct irq_desc *desc);
 
void do_irq(void);
void irq_controllers_init(void);
 
#endif /* __GENERIC_IRQ_H__ */
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.