]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/x86/include/mptable.h
Update to bmake-20171028
[FreeBSD/FreeBSD.git] / sys / x86 / include / mptable.h
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     CBUS = 1,
34     CBUSII = 2,
35     EISA = 3,
36     ISA = 6,
37     MCA = 9,
38     PCI = 13,
39     XPRESS = 18,
40     MAX_BUSTYPE = 18,
41     UNKNOWN_BUSTYPE = 0xff
42 };
43
44 /* MP Floating Pointer Structure */
45 typedef struct MPFPS {
46         uint8_t signature[4];
47         uint32_t pap;
48         uint8_t length;
49         uint8_t spec_rev;
50         uint8_t checksum;
51         uint8_t config_type;
52         uint8_t mpfb2;
53         uint8_t mpfb3;
54         uint8_t mpfb4;
55         uint8_t mpfb5;
56 } __packed *mpfps_t;
57
58 #define MPFB2_IMCR_PRESENT      0x80
59 #define MPFB2_MUL_CLK_SRCS      0x40
60
61 /* MP Configuration Table Header */
62 typedef struct MPCTH {
63         uint8_t signature[4];
64         uint16_t base_table_length;
65         uint8_t spec_rev;
66         uint8_t checksum;
67         uint8_t oem_id[8];
68         uint8_t product_id[12];
69         uint32_t oem_table_pointer;
70         uint16_t oem_table_size;
71         uint16_t entry_count;
72         uint32_t apic_address;
73         uint16_t extended_table_length;
74         uint8_t extended_table_checksum;
75         uint8_t reserved;
76 } __packed *mpcth_t;
77
78 /* Base table entries */
79
80 #define MPCT_ENTRY_PROCESSOR    0
81 #define MPCT_ENTRY_BUS          1
82 #define MPCT_ENTRY_IOAPIC       2
83 #define MPCT_ENTRY_INT          3
84 #define MPCT_ENTRY_LOCAL_INT    4
85
86 typedef struct PROCENTRY {
87         uint8_t type;
88         uint8_t apic_id;
89         uint8_t apic_version;
90         uint8_t cpu_flags;
91         uint32_t cpu_signature;
92         uint32_t feature_flags;
93         uint32_t reserved1;
94         uint32_t reserved2;
95 } __packed *proc_entry_ptr;
96
97 #define PROCENTRY_FLAG_EN       0x01
98 #define PROCENTRY_FLAG_BP       0x02
99
100 typedef struct BUSENTRY {
101         uint8_t type;
102         uint8_t bus_id;
103         uint8_t bus_type[6];
104 } __packed *bus_entry_ptr;
105
106 typedef struct IOAPICENTRY {
107         uint8_t type;
108         uint8_t apic_id;
109         uint8_t apic_version;
110         uint8_t apic_flags;
111         uint32_t apic_address;
112 } __packed *io_apic_entry_ptr;
113
114 #define IOAPICENTRY_FLAG_EN     0x01
115
116 typedef struct INTENTRY {
117         uint8_t type;
118         uint8_t int_type;
119         uint16_t int_flags;
120         uint8_t src_bus_id;
121         uint8_t src_bus_irq;
122         uint8_t dst_apic_id;
123         uint8_t dst_apic_int;
124 } __packed *int_entry_ptr;
125
126 #define INTENTRY_TYPE_INT       0
127 #define INTENTRY_TYPE_NMI       1
128 #define INTENTRY_TYPE_SMI       2
129 #define INTENTRY_TYPE_EXTINT    3
130
131 #define INTENTRY_FLAGS_POLARITY                 0x3
132 #define INTENTRY_FLAGS_POLARITY_CONFORM         0x0
133 #define INTENTRY_FLAGS_POLARITY_ACTIVEHI        0x1
134 #define INTENTRY_FLAGS_POLARITY_ACTIVELO        0x3
135 #define INTENTRY_FLAGS_TRIGGER                  0xc
136 #define INTENTRY_FLAGS_TRIGGER_CONFORM          0x0
137 #define INTENTRY_FLAGS_TRIGGER_EDGE             0x4
138 #define INTENTRY_FLAGS_TRIGGER_LEVEL            0xc
139
140 /* Extended table entries */
141
142 typedef struct EXTENTRY {
143         uint8_t type;
144         uint8_t length;
145 } __packed *ext_entry_ptr;
146
147 #define MPCT_EXTENTRY_SAS       0x80
148 #define MPCT_EXTENTRY_BHD       0x81
149 #define MPCT_EXTENTRY_CBASM     0x82
150
151 typedef struct SASENTRY {
152         uint8_t type;
153         uint8_t length;
154         uint8_t bus_id;
155         uint8_t address_type;
156         uint64_t address_base;
157         uint64_t address_length;
158 } __packed *sas_entry_ptr;
159
160 #define SASENTRY_TYPE_IO        0
161 #define SASENTRY_TYPE_MEMORY    1
162 #define SASENTRY_TYPE_PREFETCH  2
163
164 typedef struct BHDENTRY {
165         uint8_t type;
166         uint8_t length;
167         uint8_t bus_id;
168         uint8_t bus_info;
169         uint8_t parent_bus;
170         uint8_t reserved[3];
171 } __packed *bhd_entry_ptr;
172
173 #define BHDENTRY_INFO_SUBTRACTIVE_DECODE        0x1
174
175 typedef struct CBASMENTRY {
176         uint8_t type;
177         uint8_t length;
178         uint8_t bus_id;
179         uint8_t address_mod;
180         uint32_t predefined_range;
181 } __packed *cbasm_entry_ptr;
182
183 #define CBASMENTRY_ADDRESS_MOD_ADD              0x0
184 #define CBASMENTRY_ADDRESS_MOD_SUBTRACT         0x1
185
186 #define CBASMENTRY_RANGE_ISA_IO         0
187 #define CBASMENTRY_RANGE_VGA_IO         1
188
189 #ifdef _KERNEL
190 struct mptable_hostb_softc {
191 #ifdef NEW_PCIB
192         struct pcib_host_resources sc_host_res;
193         int             sc_decodes_vga_io;
194         int             sc_decodes_isa_io;
195 #endif
196 };
197
198 #ifdef NEW_PCIB
199 void    mptable_pci_host_res_init(device_t pcib);
200 #endif
201 int     mptable_pci_probe_table(int bus);
202 int     mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
203 #endif
204 #endif /* !__MACHINE_MPTABLE_H__ */