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