1 1.38 thorpej /* $NetBSD: pci_machdep.c,v 1.38 2023/12/20 15:29:06 thorpej Exp $ */ 2 1.1 briggs 3 1.1 briggs /* 4 1.1 briggs * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 5 1.1 briggs * Copyright (c) 1994 Charles M. Hannum. All rights reserved. 6 1.1 briggs * 7 1.1 briggs * Redistribution and use in source and binary forms, with or without 8 1.1 briggs * modification, are permitted provided that the following conditions 9 1.1 briggs * are met: 10 1.1 briggs * 1. Redistributions of source code must retain the above copyright 11 1.1 briggs * notice, this list of conditions and the following disclaimer. 12 1.1 briggs * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 briggs * notice, this list of conditions and the following disclaimer in the 14 1.1 briggs * documentation and/or other materials provided with the distribution. 15 1.1 briggs * 3. All advertising materials mentioning features or use of this software 16 1.1 briggs * must display the following acknowledgement: 17 1.1 briggs * This product includes software developed by Charles M. Hannum. 18 1.1 briggs * 4. The name of the author may not be used to endorse or promote products 19 1.1 briggs * derived from this software without specific prior written permission. 20 1.1 briggs * 21 1.1 briggs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 briggs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 briggs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 briggs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 briggs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 briggs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 briggs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 briggs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 briggs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 briggs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 briggs */ 32 1.1 briggs 33 1.1 briggs /* 34 1.1 briggs * Machine-specific functions for PCI autoconfiguration. 35 1.1 briggs * 36 1.1 briggs * On PCs, there are two methods of generating PCI configuration cycles. 37 1.1 briggs * We try to detect the appropriate mechanism for this machine and set 38 1.1 briggs * up a few function pointers to access the correct method directly. 39 1.1 briggs * 40 1.1 briggs * The configuration method can be hard-coded in the config file by 41 1.1 briggs * using `options PCI_CONF_MODE=N', where `N' is the configuration mode 42 1.1 briggs * as defined section 3.6.4.1, `Generating Configuration Cycles'. 43 1.1 briggs */ 44 1.11 lukem 45 1.11 lukem #include <sys/cdefs.h> 46 1.38 thorpej __KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.38 2023/12/20 15:29:06 thorpej Exp $"); 47 1.17 nisimura 48 1.17 nisimura #include "opt_pci.h" 49 1.1 briggs 50 1.1 briggs #include <sys/types.h> 51 1.1 briggs #include <sys/param.h> 52 1.1 briggs #include <sys/device.h> 53 1.1 briggs #include <sys/errno.h> 54 1.1 briggs #include <sys/extent.h> 55 1.35 nonaka #include <sys/kmem.h> 56 1.1 briggs #include <sys/queue.h> 57 1.1 briggs #include <sys/systm.h> 58 1.1 briggs #include <sys/time.h> 59 1.1 briggs 60 1.4 briggs #define _POWERPC_BUS_DMA_PRIVATE 61 1.29 dyoung #include <sys/bus.h> 62 1.13 garbled #include <machine/intr.h> 63 1.1 briggs #include <machine/pio.h> 64 1.1 briggs 65 1.1 briggs #include <dev/isa/isavar.h> 66 1.1 briggs #include <dev/pci/pcivar.h> 67 1.1 briggs #include <dev/pci/pcireg.h> 68 1.1 briggs #include <dev/pci/pciconf.h> 69 1.13 garbled #include <dev/pci/pcidevs.h> 70 1.1 briggs 71 1.4 briggs struct powerpc_bus_dma_tag pci_bus_dma_tag = { 72 1.1 briggs 0, /* _bounce_thresh */ 73 1.1 briggs _bus_dmamap_create, 74 1.1 briggs _bus_dmamap_destroy, 75 1.1 briggs _bus_dmamap_load, 76 1.1 briggs _bus_dmamap_load_mbuf, 77 1.1 briggs _bus_dmamap_load_uio, 78 1.1 briggs _bus_dmamap_load_raw, 79 1.1 briggs _bus_dmamap_unload, 80 1.1 briggs NULL, /* _dmamap_sync */ 81 1.1 briggs _bus_dmamem_alloc, 82 1.1 briggs _bus_dmamem_free, 83 1.1 briggs _bus_dmamem_map, 84 1.1 briggs _bus_dmamem_unmap, 85 1.1 briggs _bus_dmamem_mmap, 86 1.1 briggs }; 87 1.1 briggs 88 1.18 phx /*#define EPIC_DEBUGIRQ*/ 89 1.13 garbled 90 1.13 garbled static int brdtype; 91 1.13 garbled #define BRD_SANDPOINTX2 2 92 1.13 garbled #define BRD_SANDPOINTX3 3 93 1.13 garbled #define BRD_ENCOREPP1 10 94 1.13 garbled #define BRD_KUROBOX 100 95 1.25 phx #define BRD_QNAPTS 101 96 1.13 garbled #define BRD_SYNOLOGY 102 97 1.21 nisimura #define BRD_STORCENTER 103 98 1.22 nisimura #define BRD_DLINKDSM 104 99 1.23 nisimura #define BRD_NH230NAS 105 100 1.13 garbled #define BRD_UNKNOWN -1 101 1.13 garbled 102 1.1 briggs #define PCI_CONFIG_ENABLE 0x80000000UL 103 1.1 briggs 104 1.1 briggs void 105 1.28 matt pci_attach_hook(device_t parent, device_t self, struct pcibus_attach_args *pba) 106 1.1 briggs { 107 1.13 garbled pcitag_t tag; 108 1.22 nisimura pcireg_t dev11, dev22, dev15, dev13, dev16; 109 1.13 garbled 110 1.13 garbled tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0); 111 1.13 garbled dev11 = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG); 112 1.13 garbled if (PCI_CLASS(dev11) == PCI_CLASS_BRIDGE) { 113 1.13 garbled /* WinBond/Symphony Lab 83C553 at dev 11 */ 114 1.13 garbled /* 115 1.13 garbled * XXX distinguish SP3 from SP2 by fiddling ISA GPIO #7/6. 116 1.13 garbled * XXX SP3 #7 output values loopback to #6 input. 117 1.13 garbled */ 118 1.13 garbled brdtype = BRD_SANDPOINTX3; 119 1.13 garbled return; 120 1.13 garbled } 121 1.13 garbled tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 22, 0); 122 1.13 garbled dev22 = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG); 123 1.13 garbled if (PCI_CLASS(dev22) == PCI_CLASS_BRIDGE) { 124 1.13 garbled /* VIA 82C686B at dev 22 */ 125 1.13 garbled brdtype = BRD_ENCOREPP1; 126 1.13 garbled return; 127 1.13 garbled } 128 1.13 garbled tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0); 129 1.13 garbled dev11 = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG); 130 1.13 garbled if (PCI_CLASS(dev11) == PCI_CLASS_NETWORK) { 131 1.13 garbled /* tlp (ADMtek AN985) or re (RealTek 8169S) at dev 11 */ 132 1.13 garbled brdtype = BRD_KUROBOX; 133 1.13 garbled return; 134 1.13 garbled } 135 1.13 garbled tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 15, 0); 136 1.13 garbled dev15 = pci_conf_read(pba->pba_pc, tag, PCI_ID_REG); 137 1.13 garbled if (PCI_VENDOR(dev15) == PCI_VENDOR_MARVELL) { 138 1.13 garbled /* Marvell GbE at dev 15 */ 139 1.13 garbled brdtype = BRD_SYNOLOGY; 140 1.13 garbled return; 141 1.13 garbled } 142 1.21 nisimura tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 13, 0); 143 1.21 nisimura dev13 = pci_conf_read(pba->pba_pc, tag, PCI_ID_REG); 144 1.21 nisimura if (PCI_VENDOR(dev13) == PCI_VENDOR_VIATECH) { 145 1.21 nisimura /* VIA 6410 PCIIDE at dev 13 */ 146 1.21 nisimura brdtype = BRD_STORCENTER; 147 1.21 nisimura return; 148 1.21 nisimura } 149 1.22 nisimura tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 16, 0); 150 1.22 nisimura dev16 = pci_conf_read(pba->pba_pc, tag, PCI_ID_REG); 151 1.22 nisimura if (PCI_VENDOR(dev16) == PCI_VENDOR_ACARD) { 152 1.22 nisimura /* ACARD ATP865 at dev 16 */ 153 1.22 nisimura brdtype = BRD_DLINKDSM; 154 1.22 nisimura return; 155 1.22 nisimura } 156 1.23 nisimura if (PCI_VENDOR(dev16) == PCI_VENDOR_ITE 157 1.23 nisimura || PCI_VENDOR(dev16) == PCI_VENDOR_CMDTECH) { 158 1.23 nisimura brdtype = BRD_NH230NAS; 159 1.23 nisimura return; 160 1.23 nisimura } 161 1.27 phx if (PCI_VENDOR(dev15) == PCI_VENDOR_INTEL 162 1.27 phx || PCI_VENDOR(dev15) == PCI_VENDOR_REALTEK) { 163 1.27 phx /* Intel or Realtek GbE at dev 15 */ 164 1.27 phx brdtype = BRD_QNAPTS; 165 1.27 phx return; 166 1.27 phx } 167 1.22 nisimura 168 1.13 garbled brdtype = BRD_UNKNOWN; 169 1.1 briggs } 170 1.1 briggs 171 1.1 briggs int 172 1.14 nisimura pci_bus_maxdevs(pci_chipset_tag_t pc, int busno) 173 1.1 briggs { 174 1.1 briggs 175 1.14 nisimura return 32; 176 1.1 briggs } 177 1.1 briggs 178 1.1 briggs pcitag_t 179 1.14 nisimura pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function) 180 1.1 briggs { 181 1.1 briggs pcitag_t tag; 182 1.1 briggs 183 1.1 briggs if (bus >= 256 || device >= 32 || function >= 8) 184 1.1 briggs panic("pci_make_tag: bad request"); 185 1.1 briggs 186 1.1 briggs tag = PCI_CONFIG_ENABLE | 187 1.1 briggs (bus << 16) | (device << 11) | (function << 8); 188 1.1 briggs return tag; 189 1.1 briggs } 190 1.1 briggs 191 1.1 briggs void 192 1.14 nisimura pci_decompose_tag(pci_chipset_tag_t pc, pcitag_t tag, 193 1.14 nisimura int *bp, int *dp, int *fp) 194 1.1 briggs { 195 1.1 briggs 196 1.1 briggs if (bp != NULL) 197 1.1 briggs *bp = (tag >> 16) & 0xff; 198 1.1 briggs if (dp != NULL) 199 1.1 briggs *dp = (tag >> 11) & 0x1f; 200 1.1 briggs if (fp != NULL) 201 1.1 briggs *fp = (tag >> 8) & 0x7; 202 1.1 briggs return; 203 1.1 briggs } 204 1.1 briggs 205 1.1 briggs /* 206 1.1 briggs * The Kahlua documentation says that "reg" should be left-shifted by two 207 1.1 briggs * and be in bits 2-7. Apparently not. It doesn't work that way, and the 208 1.1 briggs * DINK32 ROM doesn't do it that way (I peeked at 0xfec00000 after running 209 1.1 briggs * the DINK32 "pcf" command). 210 1.1 briggs */ 211 1.1 briggs pcireg_t 212 1.14 nisimura pci_conf_read(pci_chipset_tag_t pc, pcitag_t tag, int reg) 213 1.1 briggs { 214 1.1 briggs pcireg_t data; 215 1.1 briggs 216 1.34 msaitoh if ((unsigned int)reg >= PCI_CONF_SIZE) 217 1.34 msaitoh return (pcireg_t) -1; 218 1.34 msaitoh 219 1.14 nisimura out32rb(SANDPOINT_PCI_CONFIG_ADDR, tag | reg); 220 1.1 briggs data = in32rb(SANDPOINT_PCI_CONFIG_DATA); 221 1.1 briggs out32rb(SANDPOINT_PCI_CONFIG_ADDR, 0); 222 1.1 briggs return data; 223 1.1 briggs } 224 1.1 briggs 225 1.1 briggs void 226 1.14 nisimura pci_conf_write(pci_chipset_tag_t pc, pcitag_t tag, int reg, pcireg_t data) 227 1.1 briggs { 228 1.14 nisimura 229 1.34 msaitoh if ((unsigned int)reg >= PCI_CONF_SIZE) 230 1.34 msaitoh return; 231 1.34 msaitoh 232 1.14 nisimura out32rb(SANDPOINT_PCI_CONFIG_ADDR, tag | reg); 233 1.1 briggs out32rb(SANDPOINT_PCI_CONFIG_DATA, data); 234 1.1 briggs out32rb(SANDPOINT_PCI_CONFIG_ADDR, 0); 235 1.1 briggs } 236 1.1 briggs 237 1.1 briggs int 238 1.26 dyoung pci_intr_map(const struct pci_attach_args *pa, pci_intr_handle_t *ihp) 239 1.1 briggs { 240 1.1 briggs int pin = pa->pa_intrpin; 241 1.1 briggs int line = pa->pa_intrline; 242 1.1 briggs 243 1.13 garbled /* No IRQ used. */ 244 1.13 garbled if (pin == 0) 245 1.1 briggs goto bad; 246 1.1 briggs if (pin > 4) { 247 1.13 garbled aprint_error("pci_intr_map: bad interrupt pin %d\n", pin); 248 1.1 briggs goto bad; 249 1.1 briggs } 250 1.1 briggs 251 1.1 briggs /* 252 1.1 briggs * Section 6.2.4, `Miscellaneous Functions', says that 255 means 253 1.1 briggs * `unknown' or `no connection' on a PC. We assume that a device with 254 1.1 briggs * `no connection' either doesn't have an interrupt (in which case the 255 1.1 briggs * pin number should be 0, and would have been noticed above), or 256 1.1 briggs * wasn't configured by the BIOS (in which case we punt, since there's 257 1.1 briggs * no real way we can know how the interrupt lines are mapped in the 258 1.1 briggs * hardware). 259 1.1 briggs * 260 1.1 briggs * XXX 261 1.1 briggs * Since IRQ 0 is only used by the clock, and we can't actually be sure 262 1.1 briggs * that the BIOS did its job, we also recognize that as meaning that 263 1.1 briggs * the BIOS has not configured the device. 264 1.1 briggs */ 265 1.1 briggs if (line == 255) { 266 1.13 garbled aprint_error("pci_intr_map: no mapping for pin %c\n", 267 1.13 garbled '@' + pin); 268 1.1 briggs goto bad; 269 1.8 briggs } 270 1.13 garbled #ifdef EPIC_DEBUGIRQ 271 1.18 phx printf("line %d, pin %c", line, pin + '@'); 272 1.13 garbled #endif 273 1.13 garbled switch (brdtype) { 274 1.13 garbled /* Sandpoint has 4 PCI slots in a weird order. 275 1.13 garbled * From next to MPMC mezzanine card toward the board edge, 276 1.13 garbled * 64bit slot PCI AD14 277 1.13 garbled * 64bit slot PCI AD13 278 1.13 garbled * 32bit slot PCI AD16 279 1.13 garbled * 32bit slot PCI AD15 280 1.13 garbled * Don't believe identifying labels printed on PCB and 281 1.13 garbled * documents confusing as well since Moto names the slots 282 1.13 garbled * as number 1 origin. 283 1.13 garbled */ 284 1.13 garbled case BRD_SANDPOINTX3: 285 1.13 garbled /* 286 1.13 garbled * Sandpoint X3 brd uses EPIC serial mode IRQ. 287 1.13 garbled * - i8259 PIC interrupt to EPIC IRQ0. 288 1.13 garbled * - WinBond IDE PCI C/D to EPIC IRQ8/9. 289 1.15 nisimura * - PCI AD13 pin A to EPIC IRQ2. 290 1.15 nisimura * - PCI AD14 pin A to EPIC IRQ3. 291 1.15 nisimura * - PCI AD15 pin A to EPIC IRQ4. 292 1.15 nisimura * - PCI AD16 pin A to EPIC IRQ5. 293 1.13 garbled */ 294 1.13 garbled if (line == 11 295 1.13 garbled && pa->pa_function == 1 && pa->pa_bus == 0) { 296 1.13 garbled /* X3 wires 83c553 pin C,D to EPIC IRQ8,9 */ 297 1.13 garbled *ihp = 8; /* pin C only, indeed */ 298 1.8 briggs break; 299 1.13 garbled } 300 1.13 garbled if (line < 13 || line > 16) { 301 1.13 garbled aprint_error("pci_intr_map: bad interrupt line %d,%c\n", 302 1.8 briggs line, pin + '@'); 303 1.8 briggs goto bad; 304 1.13 garbled } 305 1.15 nisimura line -= 13; /* B/C/D is not available */ 306 1.15 nisimura *ihp = 2 + line; 307 1.13 garbled break; 308 1.13 garbled case BRD_SANDPOINTX2: 309 1.13 garbled /* 310 1.13 garbled * Sandpoint X2 brd uses EPIC direct mode IRQ. 311 1.13 garbled * - i8259 PIC interrupt EPIC IRQ2. 312 1.13 garbled * - PCI AD13 pin A,B,C,D to EPIC IRQ0,1,2,3. 313 1.13 garbled * - PCI AD14 pin A,B,C,D to EPIC IRQ1,2,3,0. 314 1.13 garbled * - PCI AD15 pin A,B,C,D to EPIC IRQ2,3,0,1. 315 1.13 garbled * - PCI AD16 pin A,B,C,D to EPIC IRQ3,0,1,2. 316 1.13 garbled * - PCI AD12 is wired to PMPC device itself. 317 1.13 garbled */ 318 1.13 garbled if (line == 11 319 1.13 garbled && pa->pa_function == 1 && pa->pa_bus == 0) { 320 1.13 garbled /* 83C553 PCI IDE comes thru EPIC IRQ2 */ 321 1.13 garbled *ihp = 2; 322 1.8 briggs break; 323 1.8 briggs } 324 1.1 briggs if (line < 13 || line > 16) { 325 1.13 garbled aprint_error("pci_intr_map: bad interrupt line %d,%c\n", 326 1.8 briggs line, pin + '@'); 327 1.1 briggs goto bad; 328 1.1 briggs } 329 1.13 garbled line -= 13; pin -= 1; 330 1.13 garbled *ihp = (line + pin) & 03; 331 1.13 garbled break; 332 1.13 garbled case BRD_ENCOREPP1: 333 1.13 garbled /* 334 1.15 nisimura * Ampro EnCorePP1 brd uses EPIC direct mode IRQ. 335 1.15 nisimura * PDF says VIA 686B SB i8259 interrupt goes through EPC IRQ0, 336 1.15 nisimura * while PCI pin A-D are tied with EPIC IRQ1-4. 337 1.15 nisimura * 338 1.15 nisimura * It mentions i82559 is at AD24, however, found at AD25 instead. 339 1.15 nisimura * Heuristics show that i82559 responds to EPIC 2 (!). Then we 340 1.15 nisimura * decided to return EPIC 2 here since i82559 is the only one PCI 341 1.15 nisimura * device ENCPP1 can have; 342 1.13 garbled */ 343 1.15 nisimura if (pa->pa_device != 25) 344 1.15 nisimura goto bad; /* eeh !? */ 345 1.15 nisimura *ihp = 2; 346 1.13 garbled break; 347 1.13 garbled case BRD_KUROBOX: 348 1.30 phx /* map line 11,12,13,14 to EPIC IRQ 0,1,4,3 */ 349 1.13 garbled *ihp = (line == 13) ? 4 : line - 11; 350 1.13 garbled break; 351 1.25 phx case BRD_QNAPTS: 352 1.19 phx /* map line 13-16 to EPIC IRQ0-3 */ 353 1.19 phx *ihp = line - 13; 354 1.13 garbled break; 355 1.13 garbled case BRD_SYNOLOGY: 356 1.30 phx /* map line 12,13-15 to EPIC IRQ 4,0-2 */ 357 1.13 garbled *ihp = (line == 12) ? 4 : line - 13; 358 1.13 garbled break; 359 1.22 nisimura case BRD_DLINKDSM: 360 1.30 phx /* map line 13,14A,14B,14C,15,16 to EPIC IRQ 0,1,1,2,3,4 */ 361 1.22 nisimura *ihp = (line < 15) ? line - 13 : line - 12; 362 1.24 phx if (line == 14 && pin == 3) 363 1.24 phx *ihp += 1; /* USB pin C (EHCI) uses next IRQ */ 364 1.22 nisimura break; 365 1.23 nisimura case BRD_NH230NAS: 366 1.23 nisimura /* map line 13,14,15,16 to EPIC IRQ0,3,1,2 */ 367 1.23 nisimura *ihp = (line == 16) ? 2 : 368 1.23 nisimura (line == 15) ? 1 : 369 1.23 nisimura (line == 14) ? 3 : 0; 370 1.23 nisimura break; 371 1.21 nisimura case BRD_STORCENTER: 372 1.30 phx /* map line 13,14A,14B,14C,15 to EPIC IRQ 1,2,3,4,0 */ 373 1.31 phx *ihp = (line == 15) ? 0 : 374 1.31 phx (line == 13) ? 1 : 1 + pin; 375 1.30 phx break; 376 1.13 garbled default: 377 1.30 phx /* simply map line 12-15 to EPIC IRQ0-3 */ 378 1.13 garbled *ihp = line - 12; 379 1.31 phx #if defined(DIAGNOSTIC) || defined(DEBUG) 380 1.31 phx printf("pci_intr_map: line %d, pin %c for unknown board" 381 1.31 phx " mapped to irq %d\n", line, pin + '@', *ihp); 382 1.31 phx #endif 383 1.13 garbled break; 384 1.13 garbled } 385 1.13 garbled #ifdef EPIC_DEBUGIRQ 386 1.18 phx printf(" = EPIC %d\n", *ihp); 387 1.6 briggs #endif 388 1.1 briggs return 0; 389 1.13 garbled bad: 390 1.1 briggs *ihp = -1; 391 1.1 briggs return 1; 392 1.1 briggs } 393 1.1 briggs 394 1.1 briggs const char * 395 1.33 christos pci_intr_string(pci_chipset_tag_t pc, pci_intr_handle_t ih, char *buf, 396 1.33 christos size_t len) 397 1.1 briggs { 398 1.14 nisimura if (ih < 0 || ih >= OPENPIC_ICU) 399 1.10 provos panic("pci_intr_string: bogus handle 0x%x", ih); 400 1.1 briggs 401 1.33 christos snprintf(buf, len, "irq %d", ih + I8259_ICU); 402 1.33 christos return buf; 403 1.1 briggs 404 1.1 briggs } 405 1.1 briggs 406 1.1 briggs const struct evcnt * 407 1.35 nonaka pci_intr_evcnt(pci_chipset_tag_t pc, pci_intr_handle_t ih) 408 1.1 briggs { 409 1.1 briggs 410 1.1 briggs /* XXX for now, no evcnt parent reported */ 411 1.1 briggs return NULL; 412 1.1 briggs } 413 1.1 briggs 414 1.16 ad int 415 1.16 ad pci_intr_setattr(pci_chipset_tag_t pc, pci_intr_handle_t *ih, 416 1.16 ad int attr, uint64_t data) 417 1.16 ad { 418 1.16 ad 419 1.16 ad switch (attr) { 420 1.16 ad case PCI_INTR_MPSAFE: 421 1.16 ad return 0; 422 1.16 ad default: 423 1.16 ad return ENODEV; 424 1.16 ad } 425 1.16 ad } 426 1.16 ad 427 1.1 briggs void * 428 1.35 nonaka pci_intr_establish(pci_chipset_tag_t pc, pci_intr_handle_t ih, int level, 429 1.14 nisimura int (*func)(void *), void *arg) 430 1.1 briggs { 431 1.35 nonaka 432 1.35 nonaka return pci_intr_establish_xname(pc, ih, level, func, arg, NULL); 433 1.35 nonaka } 434 1.35 nonaka 435 1.35 nonaka void * 436 1.35 nonaka pci_intr_establish_xname(pci_chipset_tag_t pc, pci_intr_handle_t ih, int level, 437 1.35 nonaka int (*func)(void *), void *arg, const char *xname) 438 1.35 nonaka { 439 1.31 phx int type; 440 1.31 phx 441 1.31 phx if (brdtype == BRD_STORCENTER && ih == 1) { 442 1.31 phx /* 443 1.31 phx * XXX This is a workaround for the VT6410 IDE controller! 444 1.31 phx * Apparently its interrupt cannot be disabled and remains 445 1.31 phx * asserted during the whole device probing procedure, 446 1.31 phx * causing an interrupt storm. 447 1.31 phx * Using an edge-trigger fixes that and triggers the 448 1.31 phx * interrupt only once during probing. 449 1.31 phx */ 450 1.35 nonaka type = IST_EDGE; 451 1.31 phx } else 452 1.31 phx type = IST_LEVEL; 453 1.35 nonaka 454 1.1 briggs /* 455 1.1 briggs * ih is the value assigned in pci_intr_map(), above. 456 1.13 garbled * It's the EPIC IRQ #. 457 1.1 briggs */ 458 1.35 nonaka return intr_establish_xname(ih + I8259_ICU, type, level, func, arg, 459 1.35 nonaka xname); 460 1.1 briggs } 461 1.1 briggs 462 1.1 briggs void 463 1.35 nonaka pci_intr_disestablish(pci_chipset_tag_t pc, void *cookie) 464 1.1 briggs { 465 1.14 nisimura 466 1.3 lukem intr_disestablish(cookie); 467 1.1 briggs } 468 1.1 briggs 469 1.17 nisimura #if defined(PCI_NETBSD_CONFIGURE) 470 1.1 briggs void 471 1.14 nisimura pci_conf_interrupt(pci_chipset_tag_t pc, int bus, int dev, 472 1.14 nisimura int pin, int swiz, int *iline) 473 1.1 briggs { 474 1.2 briggs if (bus == 0) { 475 1.2 briggs *iline = dev; 476 1.2 briggs } else { 477 1.2 briggs /* 478 1.2 briggs * If we are not on bus zero, we're behind a bridge, so we 479 1.2 briggs * swizzle. 480 1.2 briggs * 481 1.2 briggs * The documentation lies about this. In slot 3 (numbering 482 1.2 briggs * from 0) aka device 16, INTD# becomes an interrupt for 483 1.2 briggs * slot 2. INTC# becomes an interrupt for slot 1, etc. 484 1.2 briggs * In slot 2 aka device 16, INTD# becomes an interrupt for 485 1.2 briggs * slot 1, etc. 486 1.2 briggs * 487 1.2 briggs * Verified for INTD# on device 16, INTC# on device 16, 488 1.2 briggs * INTD# on device 15, INTD# on device 13, and INTC# on 489 1.2 briggs * device 14. I presume that the rest follow the same 490 1.2 briggs * pattern. 491 1.2 briggs * 492 1.2 briggs * Slot 0 is device 13, and is the base for the rest. 493 1.2 briggs */ 494 1.2 briggs *iline = 13 + ((swiz + dev + 3) & 3); 495 1.2 briggs } 496 1.1 briggs } 497 1.17 nisimura #endif 498 1.35 nonaka 499 1.36 nonaka pci_intr_type_t 500 1.36 nonaka pci_intr_type(pci_chipset_tag_t pc, pci_intr_handle_t ih) 501 1.36 nonaka { 502 1.36 nonaka 503 1.36 nonaka return PCI_INTR_TYPE_INTX; 504 1.36 nonaka } 505 1.36 nonaka 506 1.36 nonaka int 507 1.36 nonaka pci_intr_alloc(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 508 1.36 nonaka int *counts, pci_intr_type_t max_type) 509 1.36 nonaka { 510 1.36 nonaka 511 1.36 nonaka if (counts != NULL && counts[PCI_INTR_TYPE_INTX] == 0) 512 1.36 nonaka return EINVAL; 513 1.36 nonaka 514 1.36 nonaka return pci_intx_alloc(pa, ihps); 515 1.36 nonaka } 516 1.36 nonaka 517 1.36 nonaka void 518 1.36 nonaka pci_intr_release(pci_chipset_tag_t pc, pci_intr_handle_t *pih, int count) 519 1.36 nonaka { 520 1.36 nonaka 521 1.36 nonaka kmem_free(pih, sizeof(*pih)); 522 1.36 nonaka } 523 1.36 nonaka 524 1.35 nonaka int 525 1.35 nonaka pci_intx_alloc(const struct pci_attach_args *pa, pci_intr_handle_t **ihpp) 526 1.35 nonaka { 527 1.35 nonaka pci_intr_handle_t *ihp; 528 1.35 nonaka 529 1.35 nonaka ihp = kmem_alloc(sizeof(*ihp), KM_SLEEP); 530 1.35 nonaka if (pci_intr_map(pa, ihp)) { 531 1.35 nonaka kmem_free(ihp, sizeof(*ihp)); 532 1.35 nonaka return EINVAL; 533 1.35 nonaka } 534 1.35 nonaka 535 1.35 nonaka *ihpp = ihp; 536 1.35 nonaka return 0; 537 1.35 nonaka } 538 1.35 nonaka 539 1.35 nonaka /* experimental MSI support */ 540 1.35 nonaka int 541 1.35 nonaka pci_msi_alloc(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 542 1.35 nonaka int *count) 543 1.35 nonaka { 544 1.35 nonaka 545 1.35 nonaka return EOPNOTSUPP; 546 1.35 nonaka } 547 1.35 nonaka 548 1.35 nonaka int 549 1.35 nonaka pci_msi_alloc_exact(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 550 1.35 nonaka int count) 551 1.35 nonaka { 552 1.35 nonaka 553 1.35 nonaka return EOPNOTSUPP; 554 1.35 nonaka } 555 1.35 nonaka 556 1.35 nonaka /* experimental MSI-X support */ 557 1.35 nonaka int 558 1.35 nonaka pci_msix_alloc(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 559 1.35 nonaka int *count) 560 1.35 nonaka { 561 1.35 nonaka 562 1.35 nonaka return EOPNOTSUPP; 563 1.35 nonaka } 564 1.35 nonaka 565 1.35 nonaka int 566 1.35 nonaka pci_msix_alloc_exact(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 567 1.35 nonaka int count) 568 1.35 nonaka { 569 1.35 nonaka 570 1.35 nonaka return EOPNOTSUPP; 571 1.35 nonaka } 572 1.35 nonaka 573 1.35 nonaka int 574 1.35 nonaka pci_msix_alloc_map(const struct pci_attach_args *pa, pci_intr_handle_t **ihps, 575 1.35 nonaka u_int *table_indexes, int count) 576 1.35 nonaka { 577 1.35 nonaka 578 1.35 nonaka return EOPNOTSUPP; 579 1.35 nonaka } 580