1 /* $NetBSD: pq3pci.c,v 1.21 2015/10/02 05:22:51 msaitoh Exp $ */ 2 /*- 3 * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to The NetBSD Foundation 7 * by Raytheon BBN Technologies Corp and Defense Advanced Research Projects 8 * Agency and which was developed by Matt Thomas of 3am Software Foundry. 9 * 10 * This material is based upon work supported by the Defense Advanced Research 11 * Projects Agency and Space and Naval Warfare Systems Center, Pacific, under 12 * Contract No. N66001-09-C-2073. 13 * Approved for Public Release, Distribution Unlimited 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 1. Redistributions of source code must retain the above copyright 19 * notice, this list of conditions and the following disclaimer. 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in the 22 * documentation and/or other materials provided with the distribution. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 25 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 27 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 28 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37 #define PCI_PRIVATE 38 #define GLOBAL_PRIVATE 39 #define __INTR_PRIVATE 40 41 #include "opt_mpc85xx.h" 42 #include "opt_pci.h" 43 #include "locators.h" 44 45 #include <sys/cdefs.h> 46 47 __KERNEL_RCSID(0, "$NetBSD: pq3pci.c,v 1.21 2015/10/02 05:22:51 msaitoh Exp $"); 48 49 #include <sys/param.h> 50 #include <sys/device.h> 51 #include <sys/cpu.h> 52 #include <sys/intr.h> 53 #include <sys/bus.h> 54 #include <sys/extent.h> 55 #include <sys/bitops.h> 56 #include <sys/kmem.h> 57 #include <sys/malloc.h> /* for extent */ 58 59 #include <dev/pci/pcireg.h> 60 #include <dev/pci/pcivar.h> 61 #include <dev/pci/pciconf.h> 62 #include <dev/pci/pcidevs.h> 63 64 #include <powerpc/booke/cpuvar.h> 65 #include <powerpc/booke/spr.h> 66 #include <powerpc/booke/e500var.h> 67 #include <powerpc/booke/e500reg.h> 68 #include <powerpc/booke/openpicreg.h> 69 70 #define PORDEVSR_MPC8536_TRUTH_ENCODE(inst, field, value, result) \ 71 TRUTH_ENCODE(SVR_MPC8536v1, inst, PORDEVSR_##field, \ 72 __SHIFTIN(field##_##MPC8536##_##value, PORDEVSR_##field), result) 73 #define PORDEVSR_MPC8544_TRUTH_ENCODE(inst, field, value, result) \ 74 TRUTH_ENCODE(SVR_MPC8544v1, inst, PORDEVSR_##field, \ 75 __SHIFTIN(field##_##MPC8544##_##value, PORDEVSR_##field), result) 76 #define PORDEVSR_MPC8548_TRUTH_ENCODE(inst, field, value, result) \ 77 TRUTH_ENCODE(SVR_MPC8548v1, inst, PORDEVSR_##field, \ 78 __SHIFTIN(field##_##MPC8548##_##value, PORDEVSR_##field), result) 79 #define PORDEVSR_MPC8555_TRUTH_ENCODE(inst, field, value, result) \ 80 TRUTH_ENCODE(SVR_MPC8555v1, inst, PORDEVSR_##field, \ 81 __SHIFTIN(field##_##MPC8555##_##value, PORDEVSR_##field), result) 82 #define PORDEVSR_MPC8572_TRUTH_ENCODE(inst, field, value, result) \ 83 TRUTH_ENCODE(SVR_MPC8572v1, inst, PORDEVSR_##field, \ 84 __SHIFTIN(field##_##MPC8572##_##value, PORDEVSR_##field), result) 85 #define PORDEVSR_P20x0_TRUTH_ENCODE(inst, field, value, result) \ 86 TRUTH_ENCODE(SVR_P2020v2, inst, PORDEVSR_##field, \ 87 __SHIFTIN(field##_##P20x0##_##value, PORDEVSR_##field), result), \ 88 TRUTH_ENCODE(SVR_P2010v2, inst, PORDEVSR_##field, \ 89 __SHIFTIN(field##_##P20x0##_##value, PORDEVSR_##field), result) 90 #define PORDEVSR_P1025_TRUTH_ENCODE(inst, field, value, result) \ 91 TRUTH_ENCODE(SVR_P1025v1, inst, PORDEVSR_##field, \ 92 __SHIFTIN(field##_##P20x0##_##value, PORDEVSR_##field), result), \ 93 TRUTH_ENCODE(SVR_P1016v1, inst, PORDEVSR_##field, \ 94 __SHIFTIN(field##_##P20x0##_##value, PORDEVSR_##field), result) 95 #define PORDEVSR_P1023_TRUTH_ENCODE(inst, field, value, result) \ 96 TRUTH_ENCODE(SVR_P1023v1, inst, PORDEVSR_##field, \ 97 __SHIFTIN(field##_##value, PORDEVSR_##field), result), \ 98 TRUTH_ENCODE(SVR_P1017v1, inst, PORDEVSR_##field, \ 99 __SHIFTIN(field##_##value, PORDEVSR_##field), result) 100 101 #define PORDEVSR_TRUTH_ENCODE(svr, inst, field, value, result) \ 102 TRUTH_ENCODE(svr, inst, PORDEVSR_##field, \ 103 __SHIFTIN(field##_##value, PORDEVSR_##field), result) 104 105 const struct e500_truthtab pq3pci_pcie_lanes[] = { 106 #ifdef MPC8548 107 PORDEVSR_MPC8548_TRUTH_ENCODE(0, IOSEL, SRIO2500_PCIE1_X4, 4), 108 PORDEVSR_MPC8548_TRUTH_ENCODE(0, IOSEL, SRIO1250_PCIE1_X4, 4), 109 PORDEVSR_MPC8548_TRUTH_ENCODE(0, IOSEL, PCIE1_X8, 8), 110 #endif 111 112 #ifdef MPC8544 113 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE1_ON, 4), 114 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE1_SGMII_ON, 4), 115 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE12_ON, 4), 116 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE12_SGMII_ON, 4), 117 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE123_ON, 4), 118 PORDEVSR_MPC8544_TRUTH_ENCODE(1, IOSEL, PCIE123_SGMII_ON, 4), 119 120 PORDEVSR_MPC8544_TRUTH_ENCODE(2, IOSEL, PCIE12_ON, 4), 121 PORDEVSR_MPC8544_TRUTH_ENCODE(2, IOSEL, PCIE12_SGMII_ON, 4), 122 PORDEVSR_MPC8544_TRUTH_ENCODE(2, IOSEL, PCIE123_ON, 4), 123 PORDEVSR_MPC8544_TRUTH_ENCODE(2, IOSEL, PCIE123_SGMII_ON, 4), 124 125 PORDEVSR_MPC8544_TRUTH_ENCODE(3, IOSEL, PCIE123_ON, 1), 126 PORDEVSR_MPC8544_TRUTH_ENCODE(3, IOSEL, PCIE123_SGMII_ON, 1), 127 #endif 128 129 #ifdef MPC8536 130 PORDEVSR_MPC8536_TRUTH_ENCODE(1, IOSEL, PCIE1_X4, 4), 131 PORDEVSR_MPC8536_TRUTH_ENCODE(1, IOSEL, PCIE1_X8, 8), 132 PORDEVSR_MPC8536_TRUTH_ENCODE(1, IOSEL, PCIE12_X4, 4), 133 PORDEVSR_MPC8536_TRUTH_ENCODE(1, IOSEL, PCIE1_X4_PCI23_X2, 4), 134 135 PORDEVSR_MPC8536_TRUTH_ENCODE(2, IOSEL, PCIE12_X4, 4), 136 PORDEVSR_MPC8536_TRUTH_ENCODE(2, IOSEL, PCIE1_X4_PCI23_X2, 2), 137 138 PORDEVSR_MPC8536_TRUTH_ENCODE(3, IOSEL, PCIE1_X4_PCI23_X2, 2), 139 #endif 140 141 #ifdef MPC8572 142 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, SRIO2500_PCIE1_X4, 4), 143 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, SRIO1250_PCIE1_X4, 4), 144 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, PCIE1_X4, 4), 145 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, PCIE12_X4, 4), 146 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, PCIE1_X4_23_X2, 4), 147 PORDEVSR_MPC8572_TRUTH_ENCODE(1, IOSEL, PCIE1_X8, 8), 148 149 PORDEVSR_MPC8572_TRUTH_ENCODE(2, IOSEL, PCIE12_X4, 4), 150 PORDEVSR_MPC8572_TRUTH_ENCODE(2, IOSEL, PCIE1_X4_23_X2, 2), 151 152 PORDEVSR_MPC8572_TRUTH_ENCODE(3, IOSEL, PCIE1_X4_23_X2, 2), 153 #endif 154 155 #ifdef P2020 156 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE1_X1, 1), 157 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE12_X1_3_X2, 1), 158 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE13_X2, 2), 159 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE1_X4, 4), 160 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE1_X1_SRIO2500_1X, 1), 161 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE12_X1_SGMII23, 1), 162 PORDEVSR_P20x0_TRUTH_ENCODE(1, IOSEL, PCIE1_X2_SGMII23, 2), 163 164 PORDEVSR_P20x0_TRUTH_ENCODE(2, IOSEL, PCIE12_X1_3_X2, 1), 165 PORDEVSR_P20x0_TRUTH_ENCODE(2, IOSEL, PCIE12_X1_SGMII23, 1), 166 167 PORDEVSR_P20x0_TRUTH_ENCODE(3, IOSEL, PCIE12_X1_3_X2, 2), 168 PORDEVSR_P20x0_TRUTH_ENCODE(3, IOSEL, PCIE13_X2, 2), 169 #endif 170 171 #ifdef P1025 172 PORDEVSR_P1025_TRUTH_ENCODE(1, IOSEL, PCIE1_X1, 1), 173 PORDEVSR_P1025_TRUTH_ENCODE(1, IOSEL, PCIE1_X4, 4), 174 PORDEVSR_P1025_TRUTH_ENCODE(1, IOSEL, PCIE12_X1_SGMII23, 1), 175 PORDEVSR_P1025_TRUTH_ENCODE(1, IOSEL, PCIE1_X2_SGMII23, 2), 176 177 PORDEVSR_P1025_TRUTH_ENCODE(2, IOSEL, PCIE12_X1_SGMII23, 1), 178 #endif 179 180 #ifdef P1023 181 PORDEVSR_P1023_TRUTH_ENCODE(1, IOSEL_P1023, PCIE12_X1, 1), 182 PORDEVSR_P1023_TRUTH_ENCODE(1, IOSEL_P1023, PCIE123_X1, 1), 183 PORDEVSR_P1023_TRUTH_ENCODE(1, IOSEL_P1023, PCIE123_X1_SGMII2, 1), 184 PORDEVSR_P1023_TRUTH_ENCODE(1, IOSEL_P1023, PCIE12_X1_SGMII12, 1), 185 186 PORDEVSR_P1023_TRUTH_ENCODE(2, IOSEL_P1023, PCIE12_X1, 1), 187 PORDEVSR_P1023_TRUTH_ENCODE(2, IOSEL_P1023, PCIE123_X1, 1), 188 PORDEVSR_P1023_TRUTH_ENCODE(2, IOSEL_P1023, PCIE123_X1_SGMII2, 1), 189 PORDEVSR_P1023_TRUTH_ENCODE(2, IOSEL_P1023, PCIE12_X1_SGMII12, 1), 190 191 PORDEVSR_P1023_TRUTH_ENCODE(3, IOSEL_P1023, PCIE123_X1, 1), 192 PORDEVSR_P1023_TRUTH_ENCODE(3, IOSEL_P1023, PCIE123_X1_SGMII2, 1), 193 #endif 194 }; 195 196 static const struct e500_truthtab pq3pci_pci_pcix[] = { 197 #ifdef MPC8548 198 PORDEVSR_TRUTH_ENCODE(SVR_MPC8548v1, 1, PCI1, PCIX, 1), 199 #endif 200 }; 201 202 static const struct e500_truthtab pq3pci_pci_pci32[] = { 203 #ifdef MPC8548 204 PORDEVSR_TRUTH_ENCODE(SVR_MPC8548v1, 1, PCI32, FALSE, 64), 205 PORDEVSR_TRUTH_ENCODE(SVR_MPC8548v1, 1, PCI32, TRUE, 32), 206 #endif 207 208 #ifdef MPC8555 209 PORDEVSR_TRUTH_ENCODE(SVR_MPC8555v1, 0, PCI32, FALSE, 64), 210 PORDEVSR_TRUTH_ENCODE(SVR_MPC8555v1, 0, PCI32, TRUE, 32), 211 #endif 212 }; 213 214 struct pq3pci_bst { 215 struct powerpc_bus_space bs_tag; 216 uint8_t bs_numwin; 217 bus_addr_t bs_base[3]; 218 bus_addr_t bs_offset[3]; 219 bus_addr_t bs_limit[3]; 220 char bs_name[16]; 221 char bs_ex_storage[EXTENT_FIXED_STORAGE_SIZE(8)] __aligned(8); 222 }; 223 224 typedef enum { IH_NONE, IH_INTX, IH_MSI, IH_MSIX } pq3pci_intr_class_t; 225 226 struct pq3pci_genihand { 227 pq3pci_intr_class_t ih_class; 228 int (*ih_func)(void *); 229 void *ih_arg; 230 struct pq3pci_softc *ih_sc; 231 }; 232 233 struct pq3pci_intrhand { 234 struct pq3pci_genihand pih_ih; 235 SIMPLEQ_ENTRY(pq3pci_intrhand) pih_link; 236 int pih_ipl; 237 struct pq3pci_intrsource *pih_source; 238 uint64_t pih_count; 239 }; 240 241 struct pq3pci_callhand { 242 struct pq3pci_genihand pch_ih; 243 struct callout pch_callout; 244 int pch_ipl; 245 }; 246 247 #define PIH_MAKE(irq, ist, nmsi) (((nmsi) << 20) | ((irq) << 8) | (ist)) 248 #define PIH_IST(pih) (((pih) >> 0) & 0xff) 249 #define PIH_IRQ(pih) (((pih) >> 8) & 0xfff) 250 #define PIH_NMSI(pih) (((pih) >> 20) & 0xff) 251 252 struct pq3pci_intrsource { 253 SIMPLEQ_ENTRY(pq3pci_intrsource) pis_link; 254 SIMPLEQ_HEAD(,pq3pci_intrhand) pis_ihands; 255 struct evcnt pis_ev; 256 struct evcnt pis_ev_spurious; 257 kmutex_t *pis_lock; 258 pci_intr_handle_t pis_handle; 259 void *pis_ih; 260 }; 261 262 struct pq3pci_msihand { 263 struct pq3pci_genihand msih_ih; 264 struct pq3pci_msigroup *msih_group; 265 struct evcnt msih_ev; 266 struct evcnt msih_ev_spurious; 267 pcitag_t msih_tag; 268 int msih_msioff; 269 }; 270 271 struct pq3pci_msigroup { 272 kmutex_t *msig_lock; 273 void *msig_ih; 274 uint32_t msig_free_mask; 275 int msig_ipl; 276 u_int msig_group; 277 bus_size_t msig_msir; 278 struct pq3pci_msihand msig_ihands[32]; 279 }; 280 281 struct pq3pci_softc { 282 device_t sc_dev; 283 bus_space_tag_t sc_bst; 284 bus_space_handle_t sc_bsh; 285 void *sc_ih; 286 bool sc_pcie; 287 struct genppc_pci_chipset sc_pc; 288 struct pq3pci_bst sc_pci_io_bst; 289 struct pq3pci_bst sc_pci_mem_bst; 290 u_int sc_pba_flags; 291 kmutex_t *sc_conf_lock; 292 kmutex_t *sc_intr_lock; 293 struct evcnt sc_ev_spurious; 294 prop_dictionary_t sc_intrmap; 295 uint32_t sc_intrmask; 296 }; 297 298 static int pq3pci_cpunode_match(device_t, cfdata_t, void *aux); 299 static void pq3pci_cpunode_attach(device_t, device_t, void *aux); 300 static pci_chipset_tag_t pq3pci_pci_chipset_init(struct pq3pci_softc *); 301 302 static SIMPLEQ_HEAD(,pq3pci_intrsource) pq3pci_intrsources 303 = SIMPLEQ_HEAD_INITIALIZER(pq3pci_intrsources); 304 static struct pq3pci_msigroup *pq3pci_msigroups[8]; 305 306 static struct pq3pci_intrsource * 307 pq3pci_intr_source_lookup(struct pq3pci_softc *, pci_intr_handle_t); 308 309 static const char msi_intr_names[8][32][8] = { 310 { 311 "msi 0", "msi 1", "msi 2", "msi 3", 312 "msi 4", "msi 5", "msi 6", "msi 7", 313 "msi 8", "msi 9", "msi 10", "msi 11", 314 "msi 12", "msi 13", "msi 14", "msi 15", 315 "msi 16", "msi 17", "msi 18", "msi 19", 316 "msi 20", "msi 21", "msi 22", "msi 23", 317 "msi 24", "msi 25", "msi 26", "msi 27", 318 "msi 28", "msi 29", "msi 30", "msi 31", 319 }, { 320 "msi 32", "msi 33", "msi 34", "msi 35", 321 "msi 36", "msi 37", "msi 38", "msi 39", 322 "msi 40", "msi 41", "msi 42", "msi 43", 323 "msi 44", "msi 45", "msi 46", "msi 47", 324 "msi 48", "msi 49", "msi 50", "msi 51", 325 "msi 52", "msi 53", "msi 54", "msi 55", 326 "msi 56", "msi 57", "msi 58", "msi 59", 327 "msi 60", "msi 61", "msi 62", "msi 63", 328 }, { 329 "msi 64", "msi 65", "msi 66", "msi 67", 330 "msi 68", "msi 69", "msi 70", "msi 71", 331 "msi 72", "msi 73", "msi 74", "msi 75", 332 "msi 76", "msi 77", "msi 78", "msi 79", 333 "msi 80", "msi 81", "msi 82", "msi 83", 334 "msi 84", "msi 85", "msi 86", "msi 87", 335 "msi 88", "msi 89", "msi 90", "msi 91", 336 "msi 92", "msi 93", "msi 94", "msi 95", 337 }, { 338 "msi 96", "msi 97", "msi 98", "msi 99", 339 "msi 100", "msi 101", "msi 102", "msi 103", 340 "msi 104", "msi 105", "msi 106", "msi 107", 341 "msi 108", "msi 109", "msi 110", "msi 111", 342 "msi 112", "msi 113", "msi 114", "msi 115", 343 "msi 116", "msi 117", "msi 118", "msi 119", 344 "msi 120", "msi 121", "msi 122", "msi 123", 345 "msi 124", "msi 125", "msi 126", "msi 127", 346 }, { 347 "msi 128", "msi 129", "msi 130", "msi 131", 348 "msi 132", "msi 133", "msi 134", "msi 135", 349 "msi 136", "msi 137", "msi 138", "msi 139", 350 "msi 140", "msi 141", "msi 142", "msi 143", 351 "msi 144", "msi 145", "msi 146", "msi 147", 352 "msi 148", "msi 149", "msi 150", "msi 151", 353 "msi 152", "msi 153", "msi 154", "msi 155", 354 "msi 156", "msi 157", "msi 158", "msi 159", 355 }, { 356 "msi 160", "msi 161", "msi 162", "msi 163", 357 "msi 164", "msi 165", "msi 166", "msi 167", 358 "msi 168", "msi 169", "msi 170", "msi 171", 359 "msi 172", "msi 173", "msi 174", "msi 175", 360 "msi 176", "msi 177", "msi 178", "msi 179", 361 "msi 180", "msi 181", "msi 182", "msi 183", 362 "msi 184", "msi 185", "msi 186", "msi 187", 363 "msi 188", "msi 189", "msi 190", "msi 191", 364 }, { 365 "msi 192", "msi 193", "msi 194", "msi 195", 366 "msi 196", "msi 197", "msi 198", "msi 199", 367 "msi 200", "msi 201", "msi 202", "msi 203", 368 "msi 204", "msi 205", "msi 206", "msi 207", 369 "msi 208", "msi 209", "msi 210", "msi 211", 370 "msi 212", "msi 213", "msi 214", "msi 215", 371 "msi 216", "msi 217", "msi 218", "msi 219", 372 "msi 220", "msi 221", "msi 222", "msi 223", 373 }, { 374 "msi 224", "msi 225", "msi 226", "msi 227", 375 "msi 228", "msi 229", "msi 230", "msi 231", 376 "msi 232", "msi 233", "msi 234", "msi 235", 377 "msi 236", "msi 237", "msi 238", "msi 239", 378 "msi 240", "msi 241", "msi 242", "msi 243", 379 "msi 244", "msi 245", "msi 246", "msi 247", 380 "msi 248", "msi 249", "msi 250", "msi 251", 381 "msi 252", "msi 253", "msi 254", "msi 255", 382 }, 383 }; 384 385 CFATTACH_DECL_NEW(pq3pci_cpunode, sizeof(struct pq3pci_softc), 386 pq3pci_cpunode_match, pq3pci_cpunode_attach, NULL, NULL); 387 388 CFATTACH_DECL_NEW(pq3pcie_cpunode, sizeof(struct pq3pci_softc), 389 pq3pci_cpunode_match, pq3pci_cpunode_attach, NULL, NULL); 390 391 int 392 pq3pci_cpunode_match(device_t parent, cfdata_t cf, void *aux) 393 { 394 395 if (!e500_cpunode_submatch(parent, cf, cf->cf_name + 3, aux)) 396 return 0; 397 398 return 1; 399 } 400 401 struct pq3pci_owin { 402 uint32_t potar; 403 uint32_t potear; 404 uint32_t powbar; 405 uint32_t powar; 406 }; 407 408 static void 409 pq3pci_owin_record(struct pq3pci_softc *sc, u_int winnum, 410 const struct pq3pci_owin *owin) 411 { 412 const bool io_win = (owin->powar & PEXOWAR_RTT) == PEXOWAR_RTT_IO; 413 struct pq3pci_bst *bs = io_win ? &sc->sc_pci_io_bst : &sc->sc_pci_mem_bst; 414 const uint64_t pci_base = ((uint64_t)owin->potar << 12) 415 | ((uint64_t)owin->potear << (32+12)); 416 const uint64_t local_base = (uint64_t)owin->powbar << 12; 417 const u_int win_size_log2 = PEXIWAR_IWS_GET(owin->powar) + 1; 418 u_int slot; 419 420 bs->bs_tag.pbs_flags = _BUS_SPACE_LITTLE_ENDIAN 421 | (io_win ? _BUS_SPACE_IO_TYPE : _BUS_SPACE_MEM_TYPE); 422 423 for (slot = 0; slot < bs->bs_numwin; slot++) { 424 if (pci_base < bs->bs_base[slot]) { 425 for (size_t j = slot; j < bs->bs_numwin; j++) { 426 bs->bs_base[j+1] = bs->bs_base[j]; 427 bs->bs_offset[j+1] = bs->bs_offset[j]; 428 bs->bs_limit[j+1] = bs->bs_limit[j]; 429 } 430 break; 431 } 432 } 433 bs->bs_base[slot] = pci_base; 434 bs->bs_offset[slot] = local_base - pci_base; 435 bs->bs_limit[slot] = pci_base + (1ULL << win_size_log2); 436 bs->bs_numwin++; 437 438 #if 0 439 const char units[] = " KMGTP"; 440 aprint_normal_dev(sc->sc_dev, 441 "outbound window %u: potar=%#x, potear=%#x, powbar=%x, powar=%#x\n", 442 winnum, owin->potar, owin->potear, owin->powbar, owin->powar); 443 aprint_normal_dev(sc->sc_dev, 444 "outbound window %u: maps %u%cB of PCI %s space @ %#"PRIx64" onto local addresses @ %#"PRIx64".\n", 445 winnum, 1 << (win_size_log2 % 10), units[win_size_log2 / 10], 446 (owin->powar & PEXOWAR_RTT) == PEXOWAR_RTT_IO ? "I/O" : "memory", 447 local_base, pci_base); 448 #endif 449 } 450 451 static bool 452 pq3pci_owin_init(struct pq3pci_softc *sc, struct pq3pci_bst *bs, bool io_win) 453 { 454 if (bs->bs_numwin == 0) 455 return true; 456 457 bs->bs_tag.pbs_base = bs->bs_base[0]; 458 bs->bs_tag.pbs_offset = bs->bs_offset[0]; 459 bs->bs_tag.pbs_limit = bs->bs_limit[bs->bs_numwin - 1]; 460 461 snprintf(bs->bs_name, sizeof(bs->bs_name), "%s-%s", 462 device_xname(sc->sc_dev), io_win ? "io" : "mem"); 463 464 #if 0 465 printf("%s: %s: base=%#x offset=%#x limit=%#x\n", __func__, bs->bs_name, 466 bs->bs_tag.pbs_base, bs->bs_tag.pbs_offset, bs->bs_tag.pbs_limit); 467 #endif 468 469 int error = bus_space_init(&bs->bs_tag, bs->bs_name, 470 bs->bs_ex_storage, sizeof(bs->bs_ex_storage)); 471 if (error) { 472 aprint_error(": failed to create %s bus space: %d\n", 473 bs->bs_name, error); 474 return false; 475 } 476 for (size_t slot = 1; slot < bs->bs_numwin; slot++) { 477 if (bs->bs_limit[slot - 1] < bs->bs_base[slot]) { 478 error = extent_alloc_region(bs->bs_tag.pbs_extent, 479 bs->bs_limit[slot - 1], 480 bs->bs_base[slot] - bs->bs_limit[slot - 1], 481 EX_WAITOK); 482 if (error) { 483 aprint_error(": failed to hole in %s bus space: %d\n", 484 bs->bs_name, error); 485 return false; 486 } 487 } 488 } 489 aprint_debug_dev(sc->sc_dev, "bus space %s created\n", bs->bs_name); 490 sc->sc_pba_flags |= 491 io_win ? PCI_FLAGS_IO_OKAY : PCI_FLAGS_MEM_OKAY; 492 return true; 493 } 494 495 struct pq3pci_iwin { 496 uint32_t pitar; 497 uint32_t piwbar; 498 uint32_t piwbear; 499 uint32_t piwar; 500 }; 501 502 static bool 503 pq3pci_iwin_setup(struct pq3pci_softc *sc, u_int winnum, 504 const struct pq3pci_iwin *iwin) 505 { 506 const uint64_t pci_base = ((uint64_t)iwin->piwbar << 12) 507 | ((uint64_t)iwin->piwbear << (32+12)); 508 const uint64_t local_base = (uint64_t)iwin->pitar << 12; 509 const u_int win_size_log2 = PEXIWAR_IWS_GET(iwin->piwar) + 1; 510 #if DEBUG > 1 511 const char units[] = " KMGTP"; 512 aprint_normal_dev(sc->sc_dev, 513 "inbound window %u: pitar=%#x, piwbar=%x, piwbear=%#x, piwar=%#x\n", 514 winnum, iwin->pitar, iwin->piwbar, iwin->piwbear, iwin->piwar); 515 aprint_normal_dev(sc->sc_dev, 516 "inbound window %u: maps %u%cB of PCI address space @ %#"PRIx64" to local memory @ %#"PRIx64".\n", 517 winnum, 1 << (win_size_log2 % 10), units[win_size_log2 / 10], 518 pci_base, local_base); 519 #endif /* DEBUG */ 520 /* 521 * Let's make sure this window is usable. 522 */ 523 if (pci_base != 0) { 524 aprint_error(": invalid inbound window: " 525 "PCI base (%#"PRIx64" != 0\n", pci_base); 526 return false; 527 } 528 if (local_base != 0) { 529 aprint_error(": invalid inbound window: " 530 "local base (%#"PRIx64" != 0\n", local_base); 531 return false; 532 } 533 if ((iwin->piwar & PEXIWAR_RTT) != PEXIWAR_RTT_MEM_SNOOP) { 534 aprint_error(": invalid inbound window: " 535 "unsupported read transaction type (%#"PRIxMAX")\n", 536 iwin->piwar & PEXIWAR_RTT); 537 return false; 538 } 539 if ((iwin->piwar & PEXIWAR_WTT) != PEXIWAR_WTT_MEM_SNOOP) { 540 aprint_error(": invalid inbound window: " 541 "unsupported write transaction type (%#"PRIxMAX")\n", 542 iwin->piwar & PEXIWAR_WTT); 543 return false; 544 } 545 if ((iwin->piwar & PEXIWAR_TRGT) != PEXIWAR_TRGT_LOCALMEM) { 546 aprint_error(": invalid inbound window: " 547 "unsupported target (%#"PRIxMAX")\n", 548 iwin->piwar & PEXIWAR_TRGT); 549 return false; 550 } 551 if (board_info_get_number("mem-size") > (1ULL << win_size_log2)) { 552 aprint_error(": invalid inbound window: " 553 "doesn't map all of memory (%#"PRIx64" < %#"PRIx64")\n", 554 1ULL << win_size_log2, board_info_get_number("mem-size")); 555 return false; 556 } 557 return true; 558 } 559 560 static void 561 pq3pci_pch_callout(void *v) 562 { 563 struct pq3pci_callhand * const pch = v; 564 565 int s = splraise(pch->pch_ipl); 566 (*pch->pch_ih.ih_func)(pch->pch_ih.ih_arg); 567 splx(s); 568 callout_schedule(&pch->pch_callout, 1); 569 } 570 571 static int 572 pq3pci_msi_spurious_intr(void *v) 573 { 574 (void) v; 575 576 return 0; 577 } 578 579 static int 580 pq3pci_msi_intr(void *v) 581 { 582 struct pq3pci_msigroup * const msig = v; 583 584 mutex_spin_enter(msig->msig_lock); 585 KASSERT(curcpu()->ci_cpl == msig->msig_ipl); 586 //KASSERT(curcpu()->ci_idepth == 0); 587 uint32_t matches = 0; 588 for (int rv = 0;;) { 589 uint32_t group = cpu_read_4(msig->msig_msir); 590 if (group == 0) { 591 mutex_spin_exit(msig->msig_lock); 592 return rv; 593 } 594 595 const bool working_msi_p = 596 msig->msig_group != 0 || (group & 1) == 0; 597 if (working_msi_p) { 598 /* 599 * if MSIs are working, just clear the free MSIs. 600 */ 601 KASSERTMSG((group & msig->msig_free_mask) == 0, 602 "%s: group#%u: unexpected MSIs (%#x)", 603 __func__, msig->msig_group, 604 group & msig->msig_free_mask); 605 group &= ~msig->msig_free_mask; 606 } else { 607 /* 608 * If MSIs are broken, we don't really what MSIs 609 * have happened. 610 */ 611 for (struct pq3pci_msihand *msih = msig->msig_ihands + 31; 612 group != 0; 613 msih--) { 614 const u_int n = __builtin_clz(group); 615 msih -= n; 616 group <<= n + 1; 617 msih->msih_ev.ev_count++; 618 } 619 group = ~msig->msig_free_mask; 620 } 621 uint32_t this_msi = __BIT(31); 622 for (struct pq3pci_msihand *msih = msig->msig_ihands + 31; 623 group != 0; 624 msih--) { 625 KASSERT(msig->msig_ihands <= msih); 626 KASSERT(msih < &msig->msig_ihands[32]); 627 const u_int n = __builtin_clz(group); 628 msih -= n; 629 group <<= n + 1; 630 msih->msih_ev.ev_count += working_msi_p; 631 if ((*msih->msih_ih.ih_func)(msih->msih_ih.ih_arg)) { 632 rv = 1; 633 msih->msih_ev.ev_count += !working_msi_p; 634 matches |= this_msi; 635 } else if ((matches & this_msi) == 0) { 636 msih->msih_ev_spurious.ev_count += working_msi_p; 637 } 638 this_msi >>= n + 1; 639 } 640 } 641 } 642 643 static int 644 pq3pci_onchip_intr(void *v) 645 { 646 panic(__func__); 647 } 648 649 static int 650 pq3pci_pis_intr(void *v) 651 { 652 struct pq3pci_intrsource * const pis = v; 653 struct pq3pci_intrhand *pih; 654 int rv = 0; 655 656 mutex_spin_enter(pis->pis_lock); 657 pis->pis_ev.ev_count++; 658 SIMPLEQ_FOREACH(pih, &pis->pis_ihands, pih_link) { 659 struct pq3pci_softc * const sc = pih->pih_ih.ih_sc; 660 int s = splraise(pih->pih_ipl); 661 pih->pih_count++; 662 rv = (*pih->pih_ih.ih_func)(pih->pih_ih.ih_arg); 663 splx(s); 664 #if 0 665 printf("%s %d:%s %"PRIu64": %p(%p) %"PRIu64": %d\n", __func__, 666 curcpu()->ci_idepth, 667 pis->pis_ev.ev_group, pis->pis_ev.ev_count, 668 pih->pih_ih.ih_func, pih->pih_ih.ih_arg, pih->pih_count, rv); 669 #endif 670 if (rv != 0) { 671 bus_space_read_4(sc->sc_bst, sc->sc_bsh, PCI_INT_ACK); 672 break; 673 } 674 pih->pih_count--; 675 } 676 if (rv == 0) 677 pis->pis_ev_spurious.ev_count++; 678 mutex_spin_exit(pis->pis_lock); 679 return rv; 680 } 681 682 static void 683 pq3pci_intr_source_setup(struct pq3pci_softc *sc, 684 struct pq3pci_intrsource *pis, pci_intr_handle_t handle) 685 { 686 char buf[PCI_INTRSTR_LEN]; 687 SIMPLEQ_INIT(&pis->pis_ihands); 688 pis->pis_handle = handle; 689 pis->pis_ih = intr_establish(PIH_IRQ(handle), IPL_VM, PIH_IST(handle), 690 pq3pci_pis_intr, pis); 691 pis->pis_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_VM); 692 const char * const intrstr 693 = intr_string(PIH_IRQ(handle), PIH_IST(handle), buf, sizeof(buf)); 694 evcnt_attach_dynamic(&pis->pis_ev, EVCNT_TYPE_INTR, 695 NULL, intrstr, "intr"); 696 evcnt_attach_dynamic(&pis->pis_ev_spurious, EVCNT_TYPE_INTR, 697 &pis->pis_ev, intrstr, "spurious intr"); 698 SIMPLEQ_INSERT_TAIL(&pq3pci_intrsources, pis, pis_link); 699 } 700 701 static bool 702 pq3pci_intrmap_setup(struct pq3pci_softc *sc, 703 const struct cpunode_locators *cnl) 704 { 705 char prop_name[32]; 706 snprintf(prop_name, sizeof(prop_name), "%s%u-interrupt-map", 707 cnl->cnl_name, cnl->cnl_instance); 708 sc->sc_intrmap = board_info_get_object(prop_name); 709 if (sc->sc_intrmap == NULL) { 710 aprint_error(": missing %s board property", prop_name); 711 return false; 712 } 713 714 KASSERT(prop_object_type(sc->sc_intrmap) == PROP_TYPE_DICTIONARY); 715 prop_number_t pn = prop_dictionary_get(sc->sc_intrmap, "interrupt-mask"); 716 KASSERT(pn != NULL); 717 718 sc->sc_intrmask = prop_number_unsigned_integer_value(pn); 719 720 sc->sc_ih = intr_establish(cnl->cnl_intrs[0], IPL_VM, IST_ONCHIP, 721 pq3pci_onchip_intr, sc); 722 if (sc->sc_ih == NULL) 723 panic("%s: failed to establish interrupt %d\n", 724 device_xname(sc->sc_dev), cnl->cnl_intrs[0]); 725 726 return true; 727 } 728 729 void 730 pq3pci_cpunode_attach(device_t parent, device_t self, void *aux) 731 { 732 struct cpunode_softc * const psc = device_private(parent); 733 struct pq3pci_softc * const sc = device_private(self); 734 struct cpunode_attach_args * const cna = aux; 735 struct cpunode_locators * const cnl = &cna->cna_locs; 736 char buf[32]; 737 738 sc->sc_dev = self; 739 sc->sc_bst = cna->cna_memt; 740 psc->sc_children |= cna->cna_childmask; 741 sc->sc_pcie = strcmp(cnl->cnl_name, "pcie") == 0; 742 743 const uint32_t pordevsr = cpu_read_4(GLOBAL_BASE + PORDEVSR); 744 if (sc->sc_pcie) { 745 u_int lanes = e500_truth_decode(cnl->cnl_instance, pordevsr, 746 pq3pci_pcie_lanes, __arraycount(pq3pci_pcie_lanes), 0); 747 if (lanes == 0) { 748 aprint_normal(": disabled\n"); 749 return; 750 } 751 snprintf(buf, sizeof(buf), "PCI-Express x%u", lanes); 752 } else { 753 bool pcix_p = e500_truth_decode(cnl->cnl_instance, pordevsr, 754 pq3pci_pci_pcix, __arraycount(pq3pci_pci_pcix), 0); 755 u_int width = e500_truth_decode(cnl->cnl_instance, pordevsr, 756 pq3pci_pci_pci32, __arraycount(pq3pci_pci_pci32), 32); 757 snprintf(buf, sizeof(buf), "%u-bit PCI%s", 758 width, (pcix_p ? "X" : "")); 759 } 760 761 if (!pq3pci_intrmap_setup(sc, cnl)) 762 return; 763 764 evcnt_attach_dynamic(&sc->sc_ev_spurious, EVCNT_TYPE_INTR, NULL, 765 device_xname(self), "spurious intr"); 766 767 int error = bus_space_map(sc->sc_bst, cnl->cnl_addr, cnl->cnl_size, 0, 768 &sc->sc_bsh); 769 if (error) { 770 aprint_error(": failed to map registers: %d\n", error); 771 return; 772 } 773 774 u_int valid_owins = 0; 775 for (u_int i = 1, off = PEXOTAR1 - PEXOTAR0; 776 i < 4; i++, off += PEXOTAR1 - PEXOTAR0) { 777 struct pq3pci_owin owin; 778 owin.potar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 779 PEXOTAR0 + off); 780 owin.potear = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 781 PEXOTEAR0 + off); 782 owin.powbar = 0; 783 if (i > 0) { 784 /* Doesn't exist for outbound window 0 */ 785 owin.powbar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 786 PEXOWBAR1 - (PEXOTAR1 - PEXOTAR0) + off); 787 } 788 owin.powar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 789 PEXOWAR0 + off); 790 #if 0 791 aprint_normal_dev(self, 792 "owin[%u]: potar=%#x potear=%#x powbar=%#x powar=%#x\n", 793 i, owin.potar, owin.potear, owin.powbar, owin.powar); 794 #endif 795 if (owin.powar & PEXOWAR_EN) { 796 valid_owins++; 797 pq3pci_owin_record(sc, i, &owin); 798 } 799 } 800 if (!pq3pci_owin_init(sc, &sc->sc_pci_io_bst, true) 801 || !pq3pci_owin_init(sc, &sc->sc_pci_mem_bst, false)) { 802 return; 803 } 804 #ifndef PCI_NETBSD_CONFIGURE 805 if (valid_owins == 0) { 806 aprint_normal(": %s controller%s\n", buf, 807 " (disabled)"); 808 return; 809 } 810 #endif 811 812 u_int valid_iwins = 0; 813 for (u_int i = 0, off = 0; i < 3; i++, off += PEXITAR2 - PEXITAR1) { 814 struct pq3pci_iwin iwin; 815 iwin.pitar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 816 PEXITAR1 + off); 817 iwin.piwbar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 818 PEXIWBAR1 + off); 819 if (i > 0) { 820 /* Doesn't exist */ 821 iwin.piwbear = bus_space_read_4(sc->sc_bst, 822 sc->sc_bsh, 823 PEXIWBEAR2 - (PEXITAR2 - PEXITAR1) + off); 824 } else { 825 iwin.piwbear = 0; 826 } 827 iwin.piwar = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 828 PEXIWAR1 + off); 829 #if 0 830 aprint_normal_dev(self, 831 "iwin[%u]: pitar=%#x piwbar=%#x piwbear=%#x piwar=%#x\n", 832 i, iwin.pitar, iwin.piwbar, iwin.piwbear, iwin.piwar); 833 #endif 834 if (iwin.piwar & PEXIWAR_EN) { 835 valid_iwins++; 836 if (!pq3pci_iwin_setup(sc, i, &iwin)) 837 return; 838 } 839 } 840 841 sc->sc_conf_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_VM); 842 843 pci_chipset_tag_t pc = pq3pci_pci_chipset_init(sc); 844 845 #ifndef PCI_NETBSD_CONFIGURE 846 if (valid_iwins == 0) { 847 aprint_normal(": %s controller%s\n", buf, 848 " (disabled)"); 849 return; 850 } 851 #else 852 if (sc->sc_pcie && pci_conf_read(pc, 0, PEX_LTSSM) < LTSSM_L0) { 853 aprint_normal(": %s controller%s\n", buf, 854 " (offline)"); 855 return; 856 } 857 if (!sc->sc_pcie && (pci_conf_read(pc, 0, PCI_PBFR) & PBFR_PAH)) { 858 aprint_normal(": %s controller%s\n", buf, 859 " (agent mode)"); 860 return; 861 } 862 if (valid_iwins == 0) { 863 struct pq3pci_iwin iwin = { 864 .pitar = 0, 865 .piwbar = 0, 866 .piwbear = 0, 867 .piwar = PEXIWAR_EN|PEXIWAR_PF|PEXIWAR_TRGT_LOCALMEM 868 |PEXIWAR_RTT_MEM_SNOOP|PEXIWAR_WTT_MEM_SNOOP 869 |__SHIFTIN(30-__builtin_clz(pmemsize),PEXIWAR_IWS), 870 }; 871 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXITAR2, iwin.pitar); 872 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXIWBAR2, iwin.piwbar); 873 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXIWBEAR2, iwin.piwbear); 874 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXIWAR2, iwin.piwar); 875 876 if (!pq3pci_iwin_setup(sc, 2, &iwin)) { 877 aprint_error(": error creating inbound window\n"); 878 return; 879 } 880 881 } 882 883 if (valid_owins == 0) { 884 u_long membase, iobase; 885 error = extent_alloc(pcimem_ex, PCI_MEMSIZE, PCI_MEMSIZE, 886 PCI_MEMSIZE, EX_WAITOK, &membase); 887 if (error) { 888 aprint_error( 889 ": error allocating address space for %s: %d\n", 890 "PCI memory", error); 891 return; 892 } 893 struct pq3pci_owin owin1 = { 894 .potar = membase >> 12, 895 .potear = 0, 896 .powbar = membase >> 12, 897 .powar = PEXOWAR_EN|PEXOWAR_TC0 898 |PEXOWAR_RTT_MEM|PEXOWAR_WTT_MEM 899 |__SHIFTIN(ilog2(PCI_MEMSIZE)-1,PEXOWAR_OWS), 900 }; 901 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOTAR1, owin1.potar); 902 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOTEAR1, owin1.potear); 903 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOWBAR1, owin1.powbar); 904 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOWAR1, owin1.powar); 905 pq3pci_owin_record(sc, 1, &owin1); 906 if (!pq3pci_owin_init(sc, &sc->sc_pci_mem_bst, false)) { 907 return; 908 } 909 910 error = extent_alloc(pciio_ex, PCI_IOSIZE, PCI_IOSIZE, 911 PCI_IOSIZE, EX_WAITOK, &iobase); 912 if (error) { 913 aprint_error( 914 ": error allocating address space for %s: %d\n", 915 "PCI I/O space", error); 916 return; 917 } 918 struct pq3pci_owin owin2 = { 919 .potar = 0, 920 .potear = 0, 921 .powbar = iobase >> 12, 922 .powar = PEXOWAR_EN|PEXOWAR_TC0 923 |PEXOWAR_RTT_IO|PEXOWAR_WTT_IO 924 |__SHIFTIN(ilog2(PCI_IOSIZE)-1,PEXOWAR_OWS), 925 }; 926 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOTAR2, owin2.potar); 927 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOTEAR2, owin2.potear); 928 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOWBAR2, owin2.powbar); 929 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEXOWAR2, owin2.powar); 930 pq3pci_owin_record(sc, 2, &owin1); 931 if (!pq3pci_owin_init(sc, &sc->sc_pci_io_bst, true)) { 932 return; 933 } 934 935 struct extent *ioext = extent_create("pciio", 0, PCI_IOSIZE, 936 NULL, 0, EX_NOWAIT); 937 struct extent *memext = extent_create("pcimem", membase, 938 membase + PCI_MEMSIZE, NULL, 0, EX_NOWAIT); 939 940 error = pci_configure_bus(pc, ioext, memext, NULL, 0, 941 curcpu()->ci_ci.dcache_line_size); 942 943 extent_destroy(ioext); 944 extent_destroy(memext); 945 946 if (error) { 947 aprint_normal(": configuration failed\n"); 948 return; 949 } 950 } 951 #endif 952 953 aprint_normal(": %s controller%s\n", buf, ""); 954 955 struct pcibus_attach_args pba; 956 memset(&pba, 0, sizeof(pba)); 957 958 pba.pba_flags = sc->sc_pba_flags | PCI_FLAGS_MSI_OKAY 959 | PCI_FLAGS_MSIX_OKAY; 960 if (pba.pba_flags & PCI_FLAGS_IO_OKAY) 961 pba.pba_iot = pc->pc_iot; 962 if (pba.pba_flags & PCI_FLAGS_MEM_OKAY) 963 pba.pba_memt = pc->pc_memt; 964 pba.pba_dmat = cna->cna_dmat; 965 pba.pba_pc = pc; 966 pba.pba_bus = 0; 967 968 /* 969 * Program BAR0 so that MSIs can work. 970 */ 971 pci_conf_write(pc, 0, PCI_BAR0, sc->sc_bst->pbs_offset); 972 pcireg_t cmdsts = pci_conf_read(pc, 0, PCI_COMMAND_STATUS_REG); 973 cmdsts |= PCI_COMMAND_INTERRUPT_DISABLE; 974 pci_conf_write(pc, 0, PCI_COMMAND_STATUS_REG, cmdsts); 975 976 #if 0 977 /* 978 * 979 */ 980 pq3pci_intr_source_lookup(sc, PIH_MAKE(0, IST_LEVEL, 0)); 981 #endif 982 #if 0 983 if (sc->sc_pcie) 984 pci_conf_print(pc, 0, NULL); 985 #endif 986 987 config_found_ia(self, "pcibus", &pba, pcibusprint); 988 } 989 990 static void 991 pq3pci_attach_hook(device_t parent, device_t self, 992 struct pcibus_attach_args *pba) 993 { 994 /* do nothing */ 995 } 996 997 static int 998 pq3pci_bus_maxdevs(void *v, int busno) 999 { 1000 struct pq3pci_softc * const sc = v; 1001 return sc->sc_pcie && busno < 2 ? 1 : 32; 1002 } 1003 1004 static void 1005 pq3pci_decompose_tag(void *v, pcitag_t tag, int *bus, int *dev, int *func) 1006 { 1007 if (bus) 1008 *bus = (tag >> 16) & 0xff; 1009 if (dev) 1010 *dev = (tag >> 11) & 0x1f; 1011 if (func) 1012 *func = (tag >> 8) & 0x07; 1013 } 1014 1015 static pcitag_t 1016 pq3pci_make_tag(void *v, int bus, int dev, int func) 1017 { 1018 return (bus << 16) | (dev << 11) | (func << 8); 1019 } 1020 1021 #if 0 1022 static inline pcitag_t 1023 pq3pci_config_addr_read(pci_chipset_tag_t pc) 1024 { 1025 pcitag_t v; 1026 __asm volatile("lwz\t%0, 0(%1)" : "=r"(v) : "b"(pc->pc_addr)); 1027 __asm volatile("mbar\n\tmsync"); 1028 return v; 1029 } 1030 #endif 1031 1032 static inline void 1033 pq3pci_config_addr_write(pci_chipset_tag_t pc, pcitag_t v) 1034 { 1035 __asm volatile("stw\t%0, 0(%1)" :: "r"(v), "b"(pc->pc_addr)); 1036 __asm volatile("mbar\n\tmsync"); 1037 } 1038 1039 static inline pcireg_t 1040 pq3pci_config_data_read(pci_chipset_tag_t pc) 1041 { 1042 pcireg_t v; 1043 __asm volatile("lwbrx\t%0, 0, %1" : "=r"(v) : "b"(pc->pc_data)); 1044 __asm volatile("mbar\n\tmsync"); 1045 return v; 1046 } 1047 1048 static inline void 1049 pq3pci_config_data_write(pci_chipset_tag_t pc, pcireg_t v) 1050 { 1051 __asm volatile("stwbrx\t%0, 0, %1" :: "r"(v), "r"(pc->pc_data)); 1052 __asm volatile("mbar\n\tmsync"); 1053 } 1054 1055 static pcireg_t 1056 pq3pci_conf_read(void *v, pcitag_t tag, int reg) 1057 { 1058 struct pq3pci_softc * const sc = v; 1059 struct genppc_pci_chipset * const pc = &sc->sc_pc; 1060 1061 if (reg < 0) 1062 return 0xffffffff; 1063 if (reg >= PCI_CONF_SIZE) { 1064 if (!sc->sc_pcie || reg >= PCI_EXTCONF_SIZE) 1065 return 0xffffffff; 1066 reg = (reg & 0xff) | ((reg & 0xf00) << 16); 1067 } 1068 if (sc->sc_pcie && ((tag >> 16) & 0xff) != 0) { 1069 // pcireg_t slot_status = pci_conf_read(pc, 0, 0x64); 1070 // printf("%s: tag 0x0 slot status: %#x\n",__func__, slot_status); 1071 // if ((slot_status & __BIT(6+16)) == 0) 1072 // printf(" addr=%#llx ", tag | reg | PEX_CONFIG_ADDR_EN); 1073 // return 0xffffffff; 1074 } 1075 1076 mutex_spin_enter(sc->sc_conf_lock); 1077 1078 pq3pci_config_addr_write(pc, tag | reg | PEX_CONFIG_ADDR_EN); 1079 pcireg_t rv = pq3pci_config_data_read(pc); 1080 1081 mutex_spin_exit(sc->sc_conf_lock); 1082 1083 #if 0 1084 uint32_t err = bus_space_read_4(sc->sc_bst, sc->sc_bsh, PEX_ERR_DR); 1085 if (err & PEXERRDR_ICCA) { 1086 aprint_error_dev(sc->sc_dev, "%s: tag %#x reg %#x icca: %#x\n", 1087 __func__, tag, reg, pq3pci_config_addr_read(pc)); 1088 bus_space_write_4(sc->sc_bst, sc->sc_bsh, PEX_ERR_DR, 1089 PEXERRDR_ICCA); 1090 } 1091 #endif 1092 return rv; 1093 } 1094 1095 static void 1096 pq3pci_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data) 1097 { 1098 struct pq3pci_softc * const sc = v; 1099 struct genppc_pci_chipset * const pc = &sc->sc_pc; 1100 1101 if (reg < 0) 1102 return; 1103 if (reg >= PCI_CONF_SIZE) { 1104 if (!sc->sc_pcie || reg >= PCI_EXTCONF_SIZE) 1105 return; 1106 reg = (reg & 0xff) | ((reg & 0xf00) << 16); 1107 } 1108 1109 mutex_spin_enter(sc->sc_conf_lock); 1110 1111 #if 0 1112 aprint_error_dev(sc->sc_dev, "%s: tag %#x reg %#x data %#x\n", 1113 __func__, tag, reg, data); 1114 #endif 1115 pq3pci_config_addr_write(pc, tag | reg | PEX_CONFIG_ADDR_EN); 1116 pq3pci_config_data_write(pc, data); 1117 1118 mutex_spin_exit(sc->sc_conf_lock); 1119 } 1120 1121 static int 1122 pq3pci_conf_hook(void *v, int bus, int dev, int func, pcireg_t id) 1123 { 1124 struct pq3pci_softc * const sc = v; 1125 if (sc->sc_pcie && bus != 0) { 1126 pcireg_t slot_status = pci_conf_read(&sc->sc_pc, 0, 0x64); 1127 if ((slot_status & __BIT(6+16)) == 0) 1128 return 0; 1129 } 1130 if (!sc->sc_pcie && bus == 0 && dev == 0) { 1131 return PCI_CONF_DEFAULT ^ (PCI_CONF_MAP_IO|PCI_CONF_MAP_MEM|PCI_CONF_MAP_ROM); 1132 } 1133 return PCI_CONF_DEFAULT; 1134 } 1135 1136 static void 1137 pq3pci_msi_group_setup(struct pq3pci_msigroup *msig, u_int group, int ipl) 1138 { 1139 const char (*intr_names)[8] = msi_intr_names[group]; 1140 1141 KASSERT(ipl == IPL_VM); 1142 1143 pq3pci_msigroups[group] = msig; 1144 msig->msig_group = group; 1145 msig->msig_free_mask = ~0 << (group == 0); 1146 msig->msig_ipl = ipl; 1147 msig->msig_lock = mutex_obj_alloc(MUTEX_DEFAULT, ipl); 1148 msig->msig_ih = intr_establish(msig->msig_group, ipl, IST_MSIGROUP, 1149 pq3pci_msi_intr, msig); 1150 msig->msig_msir = OPENPIC_BASE + OPENPIC_MSIR(msig->msig_group); 1151 for (u_int i = 0; i < __arraycount(msig->msig_ihands); i++) { 1152 struct pq3pci_msihand * const msih = msig->msig_ihands + i; 1153 msih->msih_ih.ih_class = IH_MSI; 1154 msih->msih_ih.ih_func = pq3pci_msi_spurious_intr; 1155 msih->msih_ih.ih_arg = msih; 1156 msih->msih_group = msig; 1157 evcnt_attach_dynamic(&msih->msih_ev, EVCNT_TYPE_INTR, 1158 NULL, intr_names[i], "intr"); 1159 evcnt_attach_dynamic(&msih->msih_ev_spurious, EVCNT_TYPE_INTR, 1160 &msih->msih_ev, intr_names[i], "spurious intr"); 1161 } 1162 } 1163 1164 static pci_intr_handle_t 1165 pq3pci_msi_alloc(int ipl, u_int rmsi) 1166 { 1167 size_t freegroup = 0; 1168 size_t maplen = __arraycount(pq3pci_msigroups); 1169 KASSERT(rmsi <= 5); 1170 uint32_t bitmap[maplen]; 1171 1172 for (u_int i = 0; i < maplen; i++) { 1173 struct pq3pci_msigroup * const msig = pq3pci_msigroups[i]; 1174 if (msig == NULL) { 1175 bitmap[i] = 0; 1176 if (freegroup == 0) 1177 freegroup = i + 1; 1178 continue; 1179 } 1180 /* 1181 * If this msigroup has the wrong IPL or there's nothing 1182 * free, try the next one. 1183 */ 1184 if (msig->msig_ipl != ipl || msig->msig_free_mask == 0) { 1185 bitmap[i] = 0; 1186 continue; 1187 } 1188 1189 bitmap[i] = msig->msig_free_mask; 1190 } 1191 for (u_int i = 0; i < maplen; i++) { 1192 uint32_t mapbits = bitmap[i]; 1193 u_int n = ffs(mapbits); 1194 if (n--) { 1195 return PIH_MAKE(i * 32 + n, IST_MSI, 0); 1196 } 1197 } 1198 1199 if (freegroup-- == 0) 1200 return 0; 1201 1202 struct pq3pci_msigroup * const msig = 1203 kmem_zalloc(sizeof(*msig), KM_SLEEP); 1204 KASSERT(msig != NULL); 1205 pq3pci_msi_group_setup(msig, freegroup, ipl); 1206 u_int n = ffs(msig->msig_free_mask) - 1; 1207 return PIH_MAKE(freegroup * 32 + n, IST_MSI, 0); 1208 } 1209 1210 static struct pq3pci_msihand * 1211 pq3pci_msi_lookup(pci_intr_handle_t handle) 1212 { 1213 const int irq = PIH_IRQ(handle); 1214 KASSERT(irq < 256); 1215 struct pq3pci_msigroup * const msig = pq3pci_msigroups[irq / 32]; 1216 KASSERT(msig != NULL); 1217 return &msig->msig_ihands[irq & 31]; 1218 } 1219 1220 static struct pq3pci_msihand * 1221 pq3pci_msi_claim(pci_intr_handle_t handle) 1222 { 1223 const int irq = PIH_IRQ(handle); 1224 uint32_t irq_mask = __BIT(irq & 31); 1225 KASSERT(irq < 256); 1226 struct pq3pci_msigroup * const msig = pq3pci_msigroups[irq / 32]; 1227 KASSERT(msig != NULL); 1228 struct pq3pci_msihand * const msih = &msig->msig_ihands[irq & 31]; 1229 mutex_spin_enter(msig->msig_lock); 1230 KASSERT(msig->msig_free_mask & irq_mask); 1231 msig->msig_free_mask ^= irq_mask; 1232 mutex_spin_exit(msig->msig_lock); 1233 return msih; 1234 } 1235 1236 static struct pq3pci_intrsource * 1237 pq3pci_intr_source_lookup(struct pq3pci_softc *sc, pci_intr_handle_t handle) 1238 { 1239 struct pq3pci_intrsource *pis; 1240 SIMPLEQ_FOREACH(pis, &pq3pci_intrsources, pis_link) { 1241 if (pis->pis_handle == handle) 1242 return pis; 1243 } 1244 pis = kmem_zalloc(sizeof(*pis), KM_SLEEP); 1245 pq3pci_intr_source_setup(sc, pis, handle); 1246 return pis; 1247 } 1248 1249 static pci_intr_handle_t 1250 pq3pci_intr_handle_lookup(struct pq3pci_softc *sc, 1251 const struct pci_attach_args *pa) 1252 { 1253 prop_dictionary_t entry; 1254 1255 if (sc->sc_pcie) do { 1256 pcireg_t msictl; 1257 int msioff; 1258 if (!pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_MSI, 1259 &msioff, &msictl)) 1260 break; 1261 msictl = pci_conf_read(pa->pa_pc, pa->pa_tag, msioff); 1262 msictl &= ~PCI_MSI_CTL_MSI_ENABLE; 1263 msictl &= ~PCI_MSI_CTL_MME_MASK; 1264 int rmsi = __SHIFTOUT(msictl, PCI_MSI_CTL_MMC_MASK); 1265 pci_conf_write(pa->pa_pc, pa->pa_tag, msioff, msictl); 1266 pci_intr_handle_t handle = pq3pci_msi_alloc(IPL_VM, rmsi); 1267 struct pq3pci_msihand * const msih = pq3pci_msi_lookup(handle); 1268 msih->msih_tag = pa->pa_tag; 1269 msih->msih_msioff = msioff; 1270 return handle; 1271 } while (false); 1272 1273 1274 if (sc->sc_intrmask == 0) { 1275 entry = prop_dictionary_get(sc->sc_intrmap, "000000"); 1276 } else { 1277 char prop_name[8]; 1278 u_int intrinc = __LOWEST_SET_BIT(sc->sc_intrmask); 1279 pcitag_t tag = (pa->pa_intrpin - PCI_INTERRUPT_PIN_A) * intrinc; 1280 1281 snprintf(prop_name, sizeof(prop_name), "%06x", 1282 tag & sc->sc_intrmask); 1283 1284 #if 0 1285 printf("%s: %#x %#x %u (%u) -> %#x & %#x -> %#x <%s>\n", 1286 __func__, pa->pa_tag, pa->pa_intrtag, pa->pa_intrpin, pa->pa_rawintrpin, 1287 tag, sc->sc_intrmask, tag & sc->sc_intrmask, prop_name); 1288 #endif 1289 1290 entry = prop_dictionary_get(sc->sc_intrmap, prop_name); 1291 } 1292 KASSERT(entry != NULL); 1293 KASSERT(prop_object_type(entry) == PROP_TYPE_DICTIONARY); 1294 1295 prop_number_t pn_irq = prop_dictionary_get(entry, "interrupt"); 1296 KASSERT(pn_irq != NULL); 1297 KASSERT(prop_object_type(pn_irq) == PROP_TYPE_NUMBER); 1298 int irq = prop_number_unsigned_integer_value(pn_irq); 1299 prop_number_t pn_ist = prop_dictionary_get(entry, "type"); 1300 KASSERT(pn_ist != NULL); 1301 KASSERT(prop_object_type(pn_ist) == PROP_TYPE_NUMBER); 1302 int ist = prop_number_unsigned_integer_value(pn_ist); 1303 1304 return PIH_MAKE(irq, ist, 0); 1305 } 1306 1307 static int 1308 pq3pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *handlep) 1309 { 1310 struct pq3pci_softc * const sc = pa->pa_pc->pc_intr_v; 1311 1312 if (pa->pa_intrpin == PCI_INTERRUPT_PIN_NONE) 1313 return ENOENT; 1314 1315 *handlep = pq3pci_intr_handle_lookup(sc, pa); 1316 1317 return 0; 1318 } 1319 1320 static const char * 1321 pq3pci_intr_string(void *v, pci_intr_handle_t handle, char *buf, size_t len) 1322 { 1323 if (PIH_IST(handle) == IST_MSI) { 1324 const char (*intr_names)[8] = msi_intr_names[0]; 1325 strlcpy(buf, intr_names[PIH_IRQ(handle)], len); 1326 return buf; 1327 } 1328 1329 return intr_string(PIH_IRQ(handle), PIH_IST(handle), buf, len); 1330 } 1331 1332 static const struct evcnt * 1333 pq3pci_intr_evcnt(void *v, pci_intr_handle_t handle) 1334 { 1335 struct pq3pci_softc * const sc = v; 1336 struct pq3pci_intrsource * const pis = 1337 pq3pci_intr_source_lookup(sc, handle); 1338 1339 KASSERT(pis != NULL); 1340 1341 return &pis->pis_ev; 1342 } 1343 1344 static void * 1345 pq3pci_intr_establish(void *v, pci_intr_handle_t handle, int ipl, 1346 int (*func)(void *), void *arg) 1347 { 1348 struct pq3pci_softc * const sc = v; 1349 1350 if (0) { 1351 struct pq3pci_callhand * const pch = 1352 kmem_zalloc(sizeof(*pch), KM_SLEEP); 1353 KASSERT(pch); 1354 pch->pch_ih.ih_arg = arg; 1355 pch->pch_ih.ih_func = func; 1356 pch->pch_ih.ih_sc = sc; 1357 pch->pch_ipl = ipl; 1358 1359 callout_init(&pch->pch_callout, 0); 1360 callout_reset(&pch->pch_callout, 1, pq3pci_pch_callout, pch); 1361 1362 return pch; 1363 } 1364 1365 const int ist = PIH_IST(handle); 1366 1367 if (ist == IST_MSI) { 1368 pci_chipset_tag_t pc = &sc->sc_pc; 1369 struct pq3pci_msihand * const msih = pq3pci_msi_claim(handle); 1370 pcireg_t cmdsts, msictl; 1371 1372 if (msih == NULL) 1373 return NULL; 1374 1375 struct pq3pci_msigroup * const msig = msih->msih_group; 1376 const pcitag_t tag = msih->msih_tag; 1377 1378 mutex_spin_enter(msig->msig_lock); 1379 msih->msih_ih.ih_class = IH_MSI; 1380 msih->msih_ih.ih_arg = arg; 1381 msih->msih_ih.ih_func = func; 1382 msih->msih_ih.ih_sc = sc; 1383 1384 int off = msih->msih_msioff; 1385 msictl = pci_conf_read(pc, tag, off); 1386 1387 /* 1388 * The PCSRBAR has already been setup as a 1:1 BAR so we point 1389 * MSIs at the MSII register in the OpenPIC. 1390 */ 1391 off += 4; 1392 pci_conf_write(pc, tag, off, 1393 sc->sc_bst->pbs_offset + OPENPIC_BASE + OPENPIC_MSIIR); 1394 1395 /* 1396 * Upper address is going to be 0. 1397 */ 1398 if (msictl & PCI_MSI_CTL_64BIT_ADDR) { 1399 off += 4; 1400 pci_conf_write(pc, tag, off, 0); 1401 } 1402 1403 /* 1404 * Set the magic value. Since PCI writes this to the least 1405 * significant byte of AD[31:0], let's hope the bridge byte 1406 * swaps to so it's the most significant bytes or nothing is 1407 * going to happen. 1408 */ 1409 off += 4; 1410 pci_conf_write(pc, tag, off, PIH_IRQ(handle)); 1411 1412 /* 1413 * Should the driver do this? How would it know to do it? 1414 */ 1415 if (msictl & PCI_MSI_CTL_PERVEC_MASK) { 1416 off += 4; 1417 pci_conf_write(pc, tag, off, 0); 1418 } 1419 1420 /* 1421 * Let's make sure he won't raise any INTx. Technically 1422 * setting MSI enable will prevent that as well but might 1423 * as well be as safe as possible. 1424 */ 1425 cmdsts = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG); 1426 cmdsts |= PCI_COMMAND_INTERRUPT_DISABLE; 1427 pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, cmdsts); 1428 1429 #if 1 1430 /* 1431 * Now we can enable the MSI 1432 */ 1433 msictl |= PCI_MSI_CTL_MSI_ENABLE; 1434 pci_conf_write(pc, tag, msih->msih_msioff, msictl); 1435 #endif 1436 1437 mutex_spin_exit(msig->msig_lock); 1438 1439 #if 0 1440 struct pq3pci_callhand * const pch = 1441 kmem_zalloc(sizeof(*pch), KM_SLEEP); 1442 KASSERT(pch); 1443 1444 pch->pch_ih.ih_arg = msig; 1445 pch->pch_ih.ih_func = pq3pci_msi_intr; 1446 #if 1 1447 pch->pch_ih.ih_arg = arg; 1448 pch->pch_ih.ih_func = func; 1449 #endif 1450 pch->pch_ih.ih_sc = sc; 1451 pch->pch_ipl = ipl; 1452 1453 callout_init(&pch->pch_callout, 0); 1454 callout_reset(&pch->pch_callout, 1, pq3pci_pch_callout, pch); 1455 1456 #if 1 1457 return pch; 1458 #endif 1459 #endif 1460 1461 return msih; 1462 } else { 1463 struct pq3pci_intrsource * const pis = 1464 pq3pci_intr_source_lookup(sc, handle); 1465 KASSERT(pis != NULL); 1466 1467 struct pq3pci_intrhand * const pih = 1468 kmem_zalloc(sizeof(*pih), KM_SLEEP); 1469 1470 if (pih == NULL) 1471 return NULL; 1472 1473 pih->pih_ih.ih_class = IH_INTX; 1474 pih->pih_ih.ih_func = func; 1475 pih->pih_ih.ih_arg = arg; 1476 pih->pih_ih.ih_sc = sc; 1477 pih->pih_ipl = ipl; 1478 pih->pih_source = pis; 1479 1480 mutex_spin_enter(pis->pis_lock); 1481 SIMPLEQ_INSERT_TAIL(&pis->pis_ihands, pih, pih_link); 1482 mutex_spin_exit(pis->pis_lock); 1483 1484 return pih; 1485 } 1486 } 1487 1488 static void 1489 pq3pci_intr_disestablish(void *v, void *ih) 1490 { 1491 struct pq3pci_genihand * const gih = ih; 1492 1493 if (gih->ih_class == IH_INTX) { 1494 struct pq3pci_intrhand * const pih = ih; 1495 struct pq3pci_intrsource * const pis = pih->pih_source; 1496 1497 mutex_spin_enter(pis->pis_lock); 1498 SIMPLEQ_REMOVE(&pis->pis_ihands, pih, pq3pci_intrhand, pih_link); 1499 mutex_spin_exit(pis->pis_lock); 1500 1501 kmem_free(pih, sizeof(*pih)); 1502 return; 1503 } 1504 struct pq3pci_msihand * const msih = ih; 1505 struct pq3pci_msigroup * const msig = msih->msih_group; 1506 struct genppc_pci_chipset * const pc = &msih->msih_ih.ih_sc->sc_pc; 1507 const pcitag_t tag = msih->msih_tag; 1508 1509 mutex_spin_enter(msig->msig_lock); 1510 1511 /* 1512 * disable the MSI 1513 */ 1514 pcireg_t msictl = pci_conf_read(pc, tag, msih->msih_msioff); 1515 msictl &= ~PCI_MSI_CTL_MSI_ENABLE; 1516 pci_conf_write(pc, tag, msih->msih_msioff, msictl); 1517 1518 msih->msih_ih.ih_func = pq3pci_msi_spurious_intr; 1519 msih->msih_ih.ih_arg = msig; 1520 msih->msih_ih.ih_sc = NULL; 1521 msih->msih_tag = 0; 1522 msih->msih_msioff = 0; 1523 mutex_spin_exit(msig->msig_lock); 1524 } 1525 1526 static void 1527 pq3pci_conf_interrupt(void *v, int bus, int dev, int pin, int swiz, int *iline) 1528 { 1529 } 1530 1531 static pci_chipset_tag_t 1532 pq3pci_pci_chipset_init(struct pq3pci_softc *sc) 1533 { 1534 struct genppc_pci_chipset * const pc = &sc->sc_pc; 1535 1536 pc->pc_conf_v = sc; 1537 pc->pc_attach_hook = pq3pci_attach_hook; 1538 pc->pc_bus_maxdevs = pq3pci_bus_maxdevs; 1539 pc->pc_make_tag = pq3pci_make_tag; 1540 pc->pc_conf_read = pq3pci_conf_read; 1541 pc->pc_conf_write = pq3pci_conf_write; 1542 #ifdef PCI_NETBSD_CONFIGURE 1543 pc->pc_conf_hook = pq3pci_conf_hook; 1544 #endif 1545 1546 pc->pc_intr_v = sc; 1547 pc->pc_intr_map = pq3pci_intr_map; 1548 pc->pc_intr_string = pq3pci_intr_string; 1549 pc->pc_intr_evcnt = pq3pci_intr_evcnt; 1550 pc->pc_intr_establish = pq3pci_intr_establish; 1551 pc->pc_intr_disestablish = pq3pci_intr_disestablish; 1552 pc->pc_conf_interrupt = pq3pci_conf_interrupt; 1553 1554 pc->pc_msi_v = sc; 1555 genppc_pci_chipset_msi_init(pc); 1556 #if 0 1557 pc->pc_msi_request = pq3pci_msi_request; 1558 pc->pc_msi_available = pq3pci_msi_available; 1559 pc->pc_msi_type = pq3pci_msi_type; 1560 pc->pc_msi_string = pq3pci_msi_string; 1561 pc->pc_msi_evcnt = genppc_pci_msi_evcnt; 1562 pc->pc_msi_establish = pq3pci_msi_establish; 1563 pc->pc_msix_establish = pq3pci_msix_establish; 1564 pc->pc_msi_disestablish = pq3pci_msi_disestablish; 1565 pc->pc_msi_release = pq3pci_msi_release; 1566 pc->pc_msi_free = pq3pci_msi_free; 1567 #endif 1568 1569 pc->pc_decompose_tag = pq3pci_decompose_tag; 1570 pc->pc_conf_hook = pq3pci_conf_hook; 1571 1572 /* 1573 * This is a horrible kludge but it makes life easier. 1574 */ 1575 pc->pc_addr = (void *)(sc->sc_bsh + PEX_CONFIG_ADDR); 1576 pc->pc_data = (void *)(sc->sc_bsh + PEX_CONFIG_DATA); 1577 pc->pc_bus = 0; 1578 pc->pc_memt = &sc->sc_pci_mem_bst.bs_tag; 1579 pc->pc_iot = &sc->sc_pci_io_bst.bs_tag; 1580 1581 SIMPLEQ_INIT(&pc->pc_pbi); 1582 1583 return pc; 1584 } 1585