source: mainline/kernel/generic/include/ddi/irq.h@ 57e76cb

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 57e76cb was 8d2760f, checked in by Jakub Jermar <jakub@…>, 17 years ago

Add additional members to the irq_t structure so that an interrupt-driven driver
does not need to know how to clear the level interrupt. The z8530 was modified
in this way and is much more generic. The ns16550 driver has also been modified,
but awaits testing. The sparc64 interrupt mapping and dispatch code is now using
the new info and calls the clear-interrupt-routine itself.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Copyright (c) 2006 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup genericddi
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_IRQ_H_
36#define KERN_IRQ_H_
37
38typedef enum {
39 CMD_MEM_READ_1 = 0,
40 CMD_MEM_READ_2,
41 CMD_MEM_READ_4,
42 CMD_MEM_READ_8,
43 CMD_MEM_WRITE_1,
44 CMD_MEM_WRITE_2,
45 CMD_MEM_WRITE_4,
46 CMD_MEM_WRITE_8,
47 CMD_PORT_READ_1,
48 CMD_PORT_WRITE_1,
49 CMD_IA64_GETCHAR,
50 CMD_PPC32_GETCHAR,
51 CMD_LAST
52} irq_cmd_type;
53
54typedef struct {
55 irq_cmd_type cmd;
56 void *addr;
57 unsigned long long value;
58 int dstarg;
59} irq_cmd_t;
60
61typedef struct {
62 unsigned int cmdcount;
63 irq_cmd_t *cmds;
64} irq_code_t;
65
66#ifdef KERNEL
67
68#include <arch/types.h>
69#include <adt/list.h>
70#include <synch/spinlock.h>
71#include <proc/task.h>
72
73typedef enum {
74 IRQ_DECLINE, /**< Decline to service. */
75 IRQ_ACCEPT /**< Accept to service. */
76} irq_ownership_t;
77
78typedef enum {
79 IRQ_TRIGGER_LEVEL = 1,
80 IRQ_TRIGGER_EDGE
81} irq_trigger_t;
82
83struct irq;
84typedef void (* irq_handler_t)(struct irq *irq, void *arg, ...);
85
86/** Type for function used to clear the interrupt. */
87typedef void (* cir_t)(void *arg, inr_t inr);
88
89/** IPC notification config structure.
90 *
91 * Primarily, this structure is encapsulated in the irq_t structure.
92 * It is protected by irq_t::lock.
93 */
94typedef struct {
95 /** When false, notifications are not sent. */
96 bool notify;
97 /** Answerbox for notifications. */
98 answerbox_t *answerbox;
99 /** Method to be used for the notification. */
100 unative_t method;
101 /** Top-half pseudocode. */
102 irq_code_t *code;
103 /** Counter. */
104 count_t counter;
105 /**
106 * Link between IRQs that are notifying the same answerbox. The list is
107 * protected by the answerbox irq_lock.
108 */
109 link_t link;
110} ipc_notif_cfg_t;
111
112/** Structure representing one device IRQ.
113 *
114 * If one device has multiple interrupts, there will be multiple irq_t
115 * instantions with the same devno.
116 */
117typedef struct irq {
118 /** Hash table link. */
119 link_t link;
120
121 /** Lock protecting everything in this structure
122 * except the link member. When both the IRQ
123 * hash table lock and this lock are to be acquired,
124 * this lock must not be taken first.
125 */
126 SPINLOCK_DECLARE(lock);
127
128 /** Send EOI before processing the interrupt.
129 * This is essential for timer interrupt which
130 * has to be acknowledged before doing preemption
131 * to make sure another timer interrupt will
132 * be eventually generated.
133 */
134 bool preack;
135
136 /** Unique device number. -1 if not yet assigned. */
137 devno_t devno;
138
139 /** Actual IRQ number. -1 if not yet assigned. */
140 inr_t inr;
141 /** Trigger level of the IRQ. */
142 irq_trigger_t trigger;
143 /** Claim ownership of the IRQ. */
144 irq_ownership_t (* claim)(void);
145 /** Handler for this IRQ and device. */
146 irq_handler_t handler;
147 /** Argument for the handler. */
148 void *arg;
149
150 /** Clear interrupt routine. */
151 cir_t cir;
152 /** First argument to the clear interrupt routine. */
153 void *cir_arg;
154
155 /** Notification configuration structure. */
156 ipc_notif_cfg_t notif_cfg;
157} irq_t;
158
159extern void irq_init(count_t inrs, count_t chains);
160extern void irq_initialize(irq_t *irq);
161extern void irq_register(irq_t *irq);
162extern irq_t *irq_dispatch_and_lock(inr_t inr);
163extern irq_t *irq_find_and_lock(inr_t inr, devno_t devno);
164
165#endif
166
167#endif
168
169/** @}
170 */
Note: See TracBrowser for help on using the repository browser.