source: mainline/kernel/arch/sparc64/src/trap/interrupt.c@ 7ba7c6d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 7ba7c6d was 0b414b5, checked in by Jakub Jermar <jakub@…>, 19 years ago

Extend the OFW device tree node with a void pointer. The boot loader is
supposed to reset all pointers in all nodes. The kernel uses the pointer
to recognize that a particular device has already been visited and initialized.

Read interrupt mapping from the OFW device tree for FHC devices (z8530) and
EBUS devices (ns16550). In case of FHC devices, remove hardwired values from
the code and use only values read from the tree. FHC initialization is started
when a FHC device wants to map its interrupt. In case of EBUS devices, map
the interrupt to INO. Interrupt enabling in the interrupt controller for that
specific interrupt is not implemented yet.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (C) 2005 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 sparc64interrupt
30 * @{
31 */
32/** @file
33 */
34
35#include <arch/interrupt.h>
36#include <arch/trap/interrupt.h>
37#include <interrupt.h>
38#include <arch/drivers/fhc.h>
39#include <arch/drivers/kbd.h>
40#include <typedefs.h>
41#include <arch/types.h>
42#include <debug.h>
43#include <ipc/sysipc.h>
44#include <arch/asm.h>
45#include <arch/barrier.h>
46#include <print.h>
47#include <genarch/kbd/z8530.h>
48#include <arch.h>
49#include <mm/tlb.h>
50#include <config.h>
51
52/** Register Interrupt Level Handler.
53 *
54 * @param n Interrupt Level (1 - 15).
55 * @param name Short descriptive string.
56 * @param f Handler.
57 */
58void interrupt_register(int n, const char *name, iroutine f)
59{
60 ASSERT(n >= IVT_FIRST && n <= IVT_ITEMS);
61
62 exc_register(n - 1, name, f);
63}
64
65/* Reregister irq to be IPC-ready */
66void irq_ipc_bind_arch(unative_t irq)
67{
68#ifdef CONFIG_Z8530
69 if (kbd_type == KBD_Z8530)
70 z8530_belongs_to_kernel = false;
71#endif
72}
73
74void interrupt(int n, istate_t *istate)
75{
76 uint64_t intrcv;
77 uint64_t data0;
78
79 intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0);
80 data0 = asi_u64_read(ASI_UDB_INTR_R, ASI_UDB_INTR_R_DATA_0);
81
82 switch (data0) {
83#ifdef CONFIG_Z8530
84 case Z8530_INTRCV_DATA0:
85 if (kbd_type != KBD_Z8530)
86 break;
87 /*
88 * So far, we know we got this interrupt through the FHC.
89 * Since we don't have enough information about the FHC and
90 * because the interrupt looks like level sensitive,
91 * we cannot handle it by scheduling one of the level
92 * interrupt traps. Call the interrupt handler directly.
93 */
94
95 if (z8530_belongs_to_kernel)
96 z8530_interrupt();
97 else
98 ipc_irq_send_notif(0);
99 fhc_clear_interrupt(central_fhc, data0);
100 break;
101
102#endif
103 default:
104 if (data0 > config.base) {
105 /*
106 * This is a cross-call.
107 * data0 contains address of kernel function.
108 * We call the function only after we verify
109 * it is on of the supported ones.
110 */
111#ifdef CONFIG_SMP
112 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) {
113 tlb_shootdown_ipi_recv();
114 break;
115 }
116#endif
117 }
118
119 printf("cpu%d: spurious interrupt (intrcv=%#llx, data0=%#llx)\n", CPU->id, intrcv, data0);
120 break;
121 }
122
123 membar();
124 asi_u64_write(ASI_INTR_RECEIVE, 0, 0);
125}
126
127/** @}
128 */
Note: See TracBrowser for help on using the repository browser.