source: mainline/kernel/genarch/include/drivers/amdm37x_irc/amdm37x_irc.h@ b51b1cd

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b51b1cd was b56481c, checked in by Jan Vesely <jano.vesely@…>, 14 years ago

amdm37x,irc: Masked means irq won't fire…

  • Property mode set to 100644
File size: 6.4 KB
Line 
1/*
2 * Copyright (c) 2012 Jan Vesely
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/** @addtogroup genarch
29 * @{
30 */
31/**
32 * @file
33 * @brief Texas Instruments AM/DM37x MPU on-chip interrupt controller driver.
34 */
35
36#ifndef KERN_AMDM37x_IRQC_H_
37#define KERN_AMDM37x_IRQC_H_
38
39/* AMDM37x TRM p. 1079 */
40#define AMDM37x_IRC_BASE_ADDRESS 0x48200000
41#define AMDM37x_IRC_SIZE 4096
42
43#define AMDM37x_IRC_IRQ_COUNT 96
44
45#include <typedefs.h>
46
47typedef struct {
48 const ioport32_t revision; /**< Revision */
49#define AMDM37x_IRC_REV_MASK (0xff)
50
51 uint8_t padd0_[12];
52
53 ioport32_t sysconfig; /**< SYS config */
54#define AMDM37x_IRC_SYSCONFIG_AUTOIDLE_FLAG (1 << 0)
55#define AMDM37x_IRC_SYSCONFIG_SOFTRESET_FLAG (1 << 1)
56
57 const ioport32_t sysstatus; /**< SYS status */
58#define AMDM37x_IRC_SYSSTATUS_RESET_DONE_FLAG (1 << 0)
59
60 uint8_t padd1_[40];
61
62 const ioport32_t sir_irq; /**< Currently active irq number */
63#define AMDM37x_IRC_SIR_IRQ_ACTIVEIRQ_MASK (0x7f)
64#define AMDM37x_IRC_SIR_IRQ_SPURIOUSIRQFLAG_MASK (0xfffffff8)
65
66 const ioport32_t sir_fiq;
67#define AMDM37x_IRC_SIR_FIQ_ACTIVEIRQ_MASK (0x7f)
68#define AMDM37x_IRC_SIR_FIQ_SPURIOUSIRQFLAG_MASK (0xfffffff8)
69
70 ioport32_t control; /**< New interrupt agreement. */
71#define AMDM37x_IRC_CONTROL_NEWIRQAGR_FLAG (1 << 0)
72#define AMDM37x_IRC_CONTROL_NEWFIQAGR_FLAG (1 << 1)
73
74 ioport32_t protection; /**< Protect other registers. */
75#define AMDM37x_IRC_PROTECTION_PROETCTION_FLAG (1 << 0)
76
77 ioport32_t idle; /**< Idle and autogating */
78#define AMDM37x_IRC_IDLE_FUNCIDLE_FLAG (1 << 0)
79#define AMDM37x_IRC_IDLE_TURBO_FLAG (1 << 1)
80
81 uint8_t padd2_[12];
82
83 ioport32_t irq_priority; /**< Active IRQ priority */
84#define AMDM37x_IRC_IRQ_PRIORITY_IRQPRIORITY_MASK (0x7f)
85#define AMDM37x_IRC_IRQ_PRIORITY_SPURIOUSIRQFLAG_MASK (0xfffffff8)
86
87 ioport32_t fiq_priority; /**< Active FIQ priority */
88#define AMDM37x_IRC_FIQ_PRIORITY_FIQPRIORITY_MASK (0x7f)
89#define AMDM37x_IRC_FIQ_PRIORITY_SPURIOUSFIQFLAG_MASK (0xfffffff8)
90
91 ioport32_t threshold; /**< Priority threshold */
92#define AMDM37x_IRC_THRESHOLD_PRIORITYTHRESHOLD_MASK (0xff)
93#define AMDM37x_IRC_THRESHOLD_PRIORITYTHRESHOLD_ENABLED (0x00)
94#define AMDM37x_IRC_THRESHOLD_PRIORITYTHRESHOLD_DISABLED (0xff)
95
96 uint8_t padd3__[20];
97
98 struct {
99 const ioport32_t itr; /**< Interrupt input status before masking */
100 ioport32_t mir; /**< Interrupt mask */
101 ioport32_t mir_clear; /**< Clear mir mask bits */
102 ioport32_t mir_set; /**< Set mir mask bits */
103 ioport32_t isr_set; /**< Set software interrupt bits */
104 ioport32_t isr_clear; /**< Clear software interrupt bits */
105 const ioport32_t pending_irq; /**< IRQ status after masking */
106 const ioport32_t pending_fiq; /**< FIQ status after masking */
107 } interrupts[3];
108
109 uint8_t padd4_[32];
110
111 ioport32_t ilr[96]; /**< FIQ/IRQ steering */
112#define AMDM37x_IRC_ILR_FIQNIRQ (1 << 0)
113#define AMDM37x_IRC_ILR_PRIORITY_MASK (0x3f)
114#define AMDM37x_IRC_ILR_PRIORITY_SHIFT (2)
115
116} amdm37x_irc_regs_t;
117
118static inline void amdm37x_irc_dump(amdm37x_irc_regs_t *regs)
119{
120#define DUMP_REG(name) \
121 printf("%s %p(%x).\n", #name, &regs->name, regs->name);
122
123 DUMP_REG(revision);
124 DUMP_REG(sysconfig);
125 DUMP_REG(sysstatus);
126 DUMP_REG(sir_irq);
127 DUMP_REG(sir_fiq);
128 DUMP_REG(control);
129 DUMP_REG(protection);
130 DUMP_REG(idle);
131 DUMP_REG(irq_priority);
132 DUMP_REG(fiq_priority);
133 DUMP_REG(threshold);
134
135 for (int i = 0; i < 3; ++i) {
136 DUMP_REG(interrupts[i].itr);
137 DUMP_REG(interrupts[i].mir);
138 DUMP_REG(interrupts[i].isr_set);
139 DUMP_REG(interrupts[i].pending_irq);
140 DUMP_REG(interrupts[i].pending_fiq);
141 }
142 for (int i = 0; i < AMDM37x_IRC_IRQ_COUNT; ++i) {
143 DUMP_REG(ilr[i]);
144 }
145
146#undef DUMP_REG
147}
148
149
150static inline void amdm37x_irc_init(amdm37x_irc_regs_t *regs)
151{
152 /* AMDM37x TRM sec 12.5.1 p. 2425 */
153 /* Program system config register */
154 //TODO enable this when you know the meaning
155 //regs->sysconfig |= AMDM37x_IRC_SYSCONFIG_AUTOIDLE_FLAG;
156
157 /* Program idle register */
158 //TODO enable this when you know the meaning
159 //regs->sysconfig |= AMDM37x_IRC_IDLE_TURBO_FLAG;
160
161 /* Program ilr[m] assign priority, decide fiq */
162 for (unsigned i = 0; i < AMDM37x_IRC_IRQ_COUNT; ++i) {
163 regs->ilr[i] = 0; /* highest prio(default) route to irq */
164 }
165
166 /* Disable all interrupts */
167 regs->interrupts[0].mir_set = 0xffffffff;
168 regs->interrupts[1].mir_set = 0xffffffff;
169 regs->interrupts[2].mir_set = 0xffffffff;
170}
171
172static inline unsigned amdm37x_irc_inum_get(amdm37x_irc_regs_t *regs)
173{
174 return regs->sir_irq & AMDM37x_IRC_SIR_IRQ_ACTIVEIRQ_MASK;
175}
176
177static inline void amdm37x_irc_irq_ack(amdm37x_irc_regs_t *regs)
178{
179 regs->control = AMDM37x_IRC_CONTROL_NEWIRQAGR_FLAG;
180}
181
182static inline void amdm37x_irc_fiq_ack(amdm37x_irc_regs_t *regs)
183{
184 regs->control = AMDM37x_IRC_CONTROL_NEWFIQAGR_FLAG;
185}
186
187static inline void amdm37x_irc_enable(amdm37x_irc_regs_t *regs, unsigned inum)
188{
189 ASSERT(inum < AMDM37x_IRC_IRQ_COUNT);
190 const unsigned set = inum / 32;
191 const unsigned pos = inum % 32;
192 regs->interrupts[set].mir_clear = (1 << pos);
193}
194
195static inline void amdm37x_irc_disable(amdm37x_irc_regs_t *regs, unsigned inum)
196{
197 ASSERT(inum < AMDM37x_IRC_IRQ_COUNT);
198 const unsigned set = inum / 32;
199 const unsigned pos = inum % 32;
200 regs->interrupts[set].mir_set = (1 << pos);
201}
202
203#endif
204
205/**
206 * @}
207 */
Note: See TracBrowser for help on using the repository browser.