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