xref: /openbsd-src/sys/arch/i386/include/i82489var.h (revision 7d16a9c5ca0f5208449d89f02ede196445c0c1d6)
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