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
31enum 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 */
42typedef 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 */
59typedef 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
83typedef struct PROCENTRY {
84	u_char  type;
85	u_char  apic_id;
86	u_char  apic_version;
87	u_char  cpu_flags;
88	u_int32_t cpu_signature;
89	u_int32_t feature_flags;
90	u_int32_t reserved1;
91	u_int32_t reserved2;
92}      *proc_entry_ptr;
93
94#define PROCENTRY_FLAG_EN	0x01
95#define PROCENTRY_FLAG_BP	0x02
96
97typedef struct BUSENTRY {
98	u_char  type;
99	u_char  bus_id;
100	char    bus_type[6];
101}      *bus_entry_ptr;
102
103typedef 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
113typedef 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
139typedef	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
148typedef 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
161typedef 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
172typedef 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 */
187typedef struct BASETABLE_ENTRY {
188	u_char  type;
189	u_char  length;
190	char    name[16];
191}       basetable_entry;
192
193#ifdef _KERNEL
194struct 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
203void	mptable_pci_host_res_init(device_t pcib);
204#endif
205int	mptable_pci_probe_table(int bus);
206int	mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
207#endif
208#endif /* !__MACHINE_MPTABLE_H__ */
209