xref: /freebsd/sys/x86/include/mptable.h (revision 70e0bbedef95258a4dadc996d641a9bebd3f107d)
1 /*-
2  * Copyright (c) 1996, by Steve Passe
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  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. The name of the developer may NOT be used to endorse or promote products
11  *    derived from this software without specific prior written permission.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27 
28 #ifndef __MACHINE_MPTABLE_H__
29 #define	__MACHINE_MPTABLE_H__
30 
31 enum busTypes {
32     NOBUS = 0,
33     EISA = 3,
34     ISA = 6,
35     MCA = 9,
36     PCI = 13,
37     MAX_BUSTYPE = 18,
38     UNKNOWN_BUSTYPE = 0xff
39 };
40 
41 /* MP Floating Pointer Structure */
42 typedef struct MPFPS {
43 	char    signature[4];
44 	u_int32_t pap;
45 	u_char  length;
46 	u_char  spec_rev;
47 	u_char  checksum;
48 	u_char  config_type;
49 	u_char  mpfb2;
50 	u_char  mpfb3;
51 	u_char  mpfb4;
52 	u_char  mpfb5;
53 }      *mpfps_t;
54 
55 #define	MPFB2_IMCR_PRESENT	0x80
56 #define	MPFB2_MUL_CLK_SRCS	0x40
57 
58 /* MP Configuration Table Header */
59 typedef struct MPCTH {
60 	char    signature[4];
61 	u_short base_table_length;
62 	u_char  spec_rev;
63 	u_char  checksum;
64 	u_char  oem_id[8];
65 	u_char  product_id[12];
66 	u_int32_t oem_table_pointer;
67 	u_short oem_table_size;
68 	u_short entry_count;
69 	u_int32_t apic_address;
70 	u_short extended_table_length;
71 	u_char  extended_table_checksum;
72 	u_char  reserved;
73 }      *mpcth_t;
74 
75 /* Base table entries */
76 
77 #define	MPCT_ENTRY_PROCESSOR	0
78 #define	MPCT_ENTRY_BUS		1
79 #define	MPCT_ENTRY_IOAPIC	2
80 #define	MPCT_ENTRY_INT		3
81 #define	MPCT_ENTRY_LOCAL_INT	4
82 
83 typedef struct PROCENTRY {
84 	u_char  type;
85 	u_char  apic_id;
86 	u_char  apic_version;
87 	u_char  cpu_flags;
88 	u_long  cpu_signature;
89 	u_long  feature_flags;
90 	u_long  reserved1;
91 	u_long  reserved2;
92 }      *proc_entry_ptr;
93 
94 #define PROCENTRY_FLAG_EN	0x01
95 #define PROCENTRY_FLAG_BP	0x02
96 
97 typedef struct BUSENTRY {
98 	u_char  type;
99 	u_char  bus_id;
100 	char    bus_type[6];
101 }      *bus_entry_ptr;
102 
103 typedef struct IOAPICENTRY {
104 	u_char  type;
105 	u_char  apic_id;
106 	u_char  apic_version;
107 	u_char  apic_flags;
108 	u_int32_t apic_address;
109 }      *io_apic_entry_ptr;
110 
111 #define IOAPICENTRY_FLAG_EN	0x01
112 
113 typedef struct INTENTRY {
114 	u_char  type;
115 	u_char  int_type;
116 	u_short int_flags;
117 	u_char  src_bus_id;
118 	u_char  src_bus_irq;
119 	u_char  dst_apic_id;
120 	u_char  dst_apic_int;
121 }      *int_entry_ptr;
122 
123 #define	INTENTRY_TYPE_INT  	0
124 #define	INTENTRY_TYPE_NMI	1
125 #define	INTENTRY_TYPE_SMI	2
126 #define	INTENTRY_TYPE_EXTINT	3
127 
128 #define	INTENTRY_FLAGS_POLARITY			0x3
129 #define	INTENTRY_FLAGS_POLARITY_CONFORM		0x0
130 #define	INTENTRY_FLAGS_POLARITY_ACTIVEHI	0x1
131 #define	INTENTRY_FLAGS_POLARITY_ACTIVELO	0x3
132 #define	INTENTRY_FLAGS_TRIGGER			0xc
133 #define	INTENTRY_FLAGS_TRIGGER_CONFORM		0x0
134 #define	INTENTRY_FLAGS_TRIGGER_EDGE		0x4
135 #define	INTENTRY_FLAGS_TRIGGER_LEVEL		0xc
136 
137 /* Extended table entries */
138 
139 typedef	struct EXTENTRY {
140 	u_char	type;
141 	u_char	length;
142 }      *ext_entry_ptr;
143 
144 #define	MPCT_EXTENTRY_SAS	0x80
145 #define	MPCT_EXTENTRY_BHD	0x81
146 #define	MPCT_EXTENTRY_CBASM	0x82
147 
148 typedef struct SASENTRY {
149 	u_char	type;
150 	u_char	length;
151 	u_char	bus_id;
152 	u_char	address_type;
153 	uint64_t address_base;
154 	uint64_t address_length;
155 } __attribute__((__packed__)) *sas_entry_ptr;
156 
157 #define	SASENTRY_TYPE_IO	0
158 #define	SASENTRY_TYPE_MEMORY	1
159 #define	SASENTRY_TYPE_PREFETCH	2
160 
161 typedef struct BHDENTRY {
162 	u_char	type;
163 	u_char	length;
164 	u_char	bus_id;
165 	u_char	bus_info;
166 	u_char	parent_bus;
167 	u_char	reserved[3];
168 }      *bhd_entry_ptr;
169 
170 #define	BHDENTRY_INFO_SUBTRACTIVE_DECODE	0x1
171 
172 typedef struct CBASMENTRY {
173 	u_char	type;
174 	u_char	length;
175 	u_char	bus_id;
176 	u_char	address_mod;
177 	u_int	predefined_range;
178 }      *cbasm_entry_ptr;
179 
180 #define	CBASMENTRY_ADDRESS_MOD_ADD		0x0
181 #define	CBASMENTRY_ADDRESS_MOD_SUBTRACT		0x1
182 
183 #define	CBASMENTRY_RANGE_ISA_IO		0
184 #define	CBASMENTRY_RANGE_VGA_IO		1
185 
186 /* descriptions of MP table entries */
187 typedef struct BASETABLE_ENTRY {
188 	u_char  type;
189 	u_char  length;
190 	char    name[16];
191 }       basetable_entry;
192 
193 #ifdef _KERNEL
194 struct mptable_hostb_softc {
195 #ifdef NEW_PCIB
196 	struct pcib_host_resources sc_host_res;
197 	int		sc_decodes_vga_io;
198 	int		sc_decodes_isa_io;
199 #endif
200 };
201 
202 #ifdef NEW_PCIB
203 void	mptable_pci_host_res_init(device_t pcib);
204 #endif
205 int	mptable_pci_probe_table(int bus);
206 int	mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
207 #endif
208 #endif /* !__MACHINE_MPTABLE_H__ */
209