master
  1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  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
 28#ifndef __MACHINE_MPTABLE_H__
 29#define	__MACHINE_MPTABLE_H__
 30
 31enum 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 */
 45typedef 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 */
 62typedef 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
 86typedef 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
100typedef struct BUSENTRY {
101	uint8_t	type;
102	uint8_t	bus_id;
103	uint8_t	bus_type[6];
104} __packed *bus_entry_ptr;
105
106typedef 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
116typedef 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
142typedef	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
151typedef 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
164typedef 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
175typedef 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
190struct 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
199void	mptable_pci_host_res_init(device_t pcib);
200#endif
201int	mptable_pci_probe_table(int bus);
202int	mptable_pci_route_interrupt(device_t pcib, device_t dev, int pin);
203#endif
204#endif /* !__MACHINE_MPTABLE_H__ */