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