1*7d16a9c5Sjsg /* $OpenBSD: i82489var.h,v 1.16 2024/07/07 03:03:09 jsg Exp $ */
2012ea299Sniklas /* $NetBSD: i82489var.h,v 1.1.2.2 2000/02/21 18:46:14 sommerfeld Exp $ */
3012ea299Sniklas
4012ea299Sniklas /*-
5012ea299Sniklas * Copyright (c) 1998 The NetBSD Foundation, Inc.
6012ea299Sniklas * All rights reserved.
7012ea299Sniklas *
8012ea299Sniklas * This code is derived from software contributed to The NetBSD Foundation
9012ea299Sniklas * by Frank van der Linden.
10012ea299Sniklas *
11012ea299Sniklas * Redistribution and use in source and binary forms, with or without
12012ea299Sniklas * modification, are permitted provided that the following conditions
13012ea299Sniklas * are met:
14012ea299Sniklas * 1. Redistributions of source code must retain the above copyright
15012ea299Sniklas * notice, this list of conditions and the following disclaimer.
16012ea299Sniklas * 2. Redistributions in binary form must reproduce the above copyright
17012ea299Sniklas * notice, this list of conditions and the following disclaimer in the
18012ea299Sniklas * documentation and/or other materials provided with the distribution.
19012ea299Sniklas *
20012ea299Sniklas * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21012ea299Sniklas * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22012ea299Sniklas * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23012ea299Sniklas * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24012ea299Sniklas * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25012ea299Sniklas * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26012ea299Sniklas * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27012ea299Sniklas * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28012ea299Sniklas * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29012ea299Sniklas * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30012ea299Sniklas * POSSIBILITY OF SUCH DAMAGE.
31012ea299Sniklas */
32012ea299Sniklas
332fa72412Spirofti #ifndef _MACHINE_I82489VAR_H_
342fa72412Spirofti #define _MACHINE_I82489VAR_H_
35012ea299Sniklas
36012ea299Sniklas static __inline__ u_int32_t i82489_readreg(int);
37012ea299Sniklas static __inline__ void i82489_writereg(int, u_int32_t);
38012ea299Sniklas
39012ea299Sniklas #ifdef _KERNEL
40012ea299Sniklas extern volatile u_int32_t local_apic[];
41012ea299Sniklas #endif
42012ea299Sniklas
43012ea299Sniklas static __inline__ u_int32_t
i82489_readreg(int reg)44ab0f4f32Sjsg i82489_readreg(int reg)
45012ea299Sniklas {
46012ea299Sniklas return *((volatile u_int32_t *)(((volatile u_int8_t *)local_apic)
47012ea299Sniklas + reg));
48012ea299Sniklas }
49012ea299Sniklas
50012ea299Sniklas static __inline__ void
i82489_writereg(int reg,u_int32_t val)51ab0f4f32Sjsg i82489_writereg(int reg, u_int32_t val)
52012ea299Sniklas {
53012ea299Sniklas *((volatile u_int32_t *)(((volatile u_int8_t *)local_apic) + reg)) =
54012ea299Sniklas val;
559cbe68bdSmickey /*
569cbe68bdSmickey * intel xeon errata p53:
5736fd90dcSjsg * write to a lapic register sometimes may appear to have not occurred
589cbe68bdSmickey * workaround:
599cbe68bdSmickey * follow write with a read [from id register]
609cbe68bdSmickey */
619cbe68bdSmickey val = *((volatile u_int32_t *)(((volatile u_int8_t *)local_apic) +
629cbe68bdSmickey LAPIC_ID));
63012ea299Sniklas }
64012ea299Sniklas
65012ea299Sniklas /*
66012ea299Sniklas * "spurious interrupt vector"; vector used by interrupt which was
67012ea299Sniklas * aborted because the CPU masked it after it happened but before it
68012ea299Sniklas * was delivered.. "Oh, sorry, i caught you at a bad time".
69012ea299Sniklas * Low-order 4 bits must be all ones.
70012ea299Sniklas */
71012ea299Sniklas extern void Xintrspurious(void);
72012ea299Sniklas #define LAPIC_SPURIOUS_VECTOR 0xef
73012ea299Sniklas
74012ea299Sniklas /*
75012ea299Sniklas * Vector used for inter-processor interrupts.
76012ea299Sniklas */
77012ea299Sniklas extern void Xintripi(void);
78012ea299Sniklas #define LAPIC_IPI_VECTOR IPL_IPI
79012ea299Sniklas
80012ea299Sniklas /*
81012ea299Sniklas * Vector used for local apic timer interrupts.
82012ea299Sniklas */
83012ea299Sniklas
84012ea299Sniklas extern void Xintrltimer(void);
85012ea299Sniklas #define LAPIC_TIMER_VECTOR IPL_CLOCK
86012ea299Sniklas
87012ea299Sniklas /*
88012ea299Sniklas * Vectors to be used for self-soft-interrupts.
89012ea299Sniklas */
90012ea299Sniklas
91012ea299Sniklas #define LAPIC_SOFTCLOCK_VECTOR IPL_SOFTCLOCK
92012ea299Sniklas #define LAPIC_SOFTNET_VECTOR IPL_SOFTNET
93012ea299Sniklas #define LAPIC_SOFTTTY_VECTOR IPL_SOFTTTY
947a83af50Sart
957a83af50Sart /*
967a83af50Sart * Special IPI vectors. We can use IDT 0xf0 - 0xff for this.
977a83af50Sart */
987a83af50Sart #define LAPIC_IPI_OFFSET 0xf0
990330a9d2Skettenis #define LAPIC_IPI_INVLTLB (LAPIC_IPI_OFFSET + 0)
1000330a9d2Skettenis #define LAPIC_IPI_INVLPG (LAPIC_IPI_OFFSET + 1)
1010330a9d2Skettenis #define LAPIC_IPI_INVLRANGE (LAPIC_IPI_OFFSET + 2)
102efc6a361Sart #define LAPIC_IPI_RELOADCR3 (LAPIC_IPI_OFFSET + 3)
103f4754affSart
104f4754affSart extern void Xintripi_invltlb(void);
105f4754affSart extern void Xintripi_invlpg(void);
106f4754affSart extern void Xintripi_invlrange(void);
107efc6a361Sart extern void Xintripi_reloadcr3(void);
108012ea299Sniklas
109012ea299Sniklas extern void Xintrsoftclock(void);
110012ea299Sniklas extern void Xintrsoftnet(void);
111012ea299Sniklas extern void Xintrsofttty(void);
112012ea299Sniklas
113012ea299Sniklas extern void (*apichandler[])(void);
114012ea299Sniklas
115012ea299Sniklas struct cpu_info;
116012ea299Sniklas
117012ea299Sniklas extern void lapic_boot_init(paddr_t);
11894ce6677Sderaadt extern void lapic_startclock(void);
119012ea299Sniklas extern void lapic_initclocks(void);
120012ea299Sniklas extern void lapic_set_lvt(void);
121012ea299Sniklas extern void lapic_set_softvectors(void);
122012ea299Sniklas extern void lapic_enable(void);
12370012c90Skettenis extern void lapic_disable(void);
124012ea299Sniklas extern void lapic_calibrate_timer(struct cpu_info *);
125012ea299Sniklas
1260bd81beeSweingart #define lapic_cpu_number() (i82489_readreg(LAPIC_ID)>>LAPIC_ID_SHIFT)
1270bd81beeSweingart
128012ea299Sniklas #endif
129