1 1.122 chs /* $NetBSD: isp_pci.c,v 1.122 2019/11/10 21:16:36 chs Exp $ */ 2 1.41 mjacob /* 3 1.41 mjacob * Copyright (C) 1997, 1998, 1999 National Aeronautics & Space Administration 4 1.1 cgd * All rights reserved. 5 1.1 cgd * 6 1.101 mjacob * Additional Copyright (C) 2000-2007 by Matthew Jacob 7 1.68 mjacob * 8 1.1 cgd * Redistribution and use in source and binary forms, with or without 9 1.1 cgd * modification, are permitted provided that the following conditions 10 1.1 cgd * are met: 11 1.1 cgd * 1. Redistributions of source code must retain the above copyright 12 1.41 mjacob * notice, this list of conditions and the following disclaimer. 13 1.101 mjacob * 2. Redistributions in binary form must reproduce the above copyright 14 1.101 mjacob * notice, this list of conditions and the following disclaimer in the 15 1.101 mjacob * documentation and/or other materials provided with the distribution. 16 1.101 mjacob * 3. The name of the author may not be used to endorse or promote products 17 1.41 mjacob * derived from this software without specific prior written permission 18 1.21 mjacob * 19 1.41 mjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 1.41 mjacob * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 1.41 mjacob * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 1.41 mjacob * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 1.41 mjacob * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 1.41 mjacob * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 1.41 mjacob * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 1.41 mjacob * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 1.41 mjacob * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 1.41 mjacob * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 1.1 cgd */ 30 1.102 mjacob 31 1.101 mjacob /* 32 1.101 mjacob * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. 33 1.101 mjacob */ 34 1.74 lukem 35 1.102 mjacob /* 36 1.102 mjacob * 24XX 4Gb material support provided by MetrumRG Associates. 37 1.102 mjacob * Many thanks are due to them. 38 1.102 mjacob */ 39 1.102 mjacob 40 1.74 lukem #include <sys/cdefs.h> 41 1.122 chs __KERNEL_RCSID(0, "$NetBSD: isp_pci.c,v 1.122 2019/11/10 21:16:36 chs Exp $"); 42 1.1 cgd 43 1.21 mjacob #include <dev/ic/isp_netbsd.h> 44 1.1 cgd #include <dev/pci/pcireg.h> 45 1.1 cgd #include <dev/pci/pcivar.h> 46 1.1 cgd #include <dev/pci/pcidevs.h> 47 1.65 mjacob #include <sys/reboot.h> 48 1.3 cgd 49 1.101 mjacob static uint32_t isp_pci_rd_reg(struct ispsoftc *, int); 50 1.101 mjacob static void isp_pci_wr_reg(struct ispsoftc *, int, uint32_t); 51 1.52 mjacob #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) 52 1.101 mjacob static uint32_t isp_pci_rd_reg_1080(struct ispsoftc *, int); 53 1.101 mjacob static void isp_pci_wr_reg_1080(struct ispsoftc *, int, uint32_t); 54 1.36 mjacob #endif 55 1.101 mjacob #if !defined(ISP_DISABLE_2100_SUPPORT) && \ 56 1.101 mjacob !defined(ISP_DISABLE_2200_SUPPORT) && \ 57 1.101 mjacob !defined(ISP_DISABLE_1020_SUPPORT) && \ 58 1.101 mjacob !defined(ISP_DISABLE_1080_SUPPORT) && \ 59 1.92 perry !defined(ISP_DISABLE_12160_SUPPORT) 60 1.72 mjacob static int 61 1.101 mjacob isp_pci_rd_isr(struct ispsoftc *, uint32_t *, uint16_t *, uint16_t *); 62 1.91 matt #endif 63 1.104 mjacob #if !(defined(ISP_DISABLE_2300_SUPPORT) && defined(ISP_DISABLE_2322_SUPPORT)) 64 1.72 mjacob static int 65 1.101 mjacob isp_pci_rd_isr_2300(struct ispsoftc *, uint32_t *, uint16_t *, uint16_t *); 66 1.101 mjacob #endif 67 1.101 mjacob #if !defined(ISP_DISABLE_2400_SUPPORT) 68 1.101 mjacob static uint32_t isp_pci_rd_reg_2400(struct ispsoftc *, int); 69 1.101 mjacob static void isp_pci_wr_reg_2400(struct ispsoftc *, int, uint32_t); 70 1.101 mjacob static int 71 1.101 mjacob isp_pci_rd_isr_2400(struct ispsoftc *, uint32_t *, uint16_t *, uint16_t *); 72 1.91 matt #endif 73 1.68 mjacob static int isp_pci_mbxdma(struct ispsoftc *); 74 1.109 mjacob static int isp_pci_dmasetup(struct ispsoftc *, XS_T *, void *); 75 1.101 mjacob static void isp_pci_dmateardown(struct ispsoftc *, XS_T *, uint32_t); 76 1.101 mjacob static void isp_pci_reset0(struct ispsoftc *); 77 1.68 mjacob static void isp_pci_reset1(struct ispsoftc *); 78 1.68 mjacob static void isp_pci_dumpregs(struct ispsoftc *, const char *); 79 1.68 mjacob static int isp_pci_intr(void *); 80 1.1 cgd 81 1.101 mjacob #if defined(ISP_DISABLE_1020_SUPPORT) || defined(ISP_DISABLE_FW) 82 1.47 mjacob #define ISP_1040_RISC_CODE NULL 83 1.52 mjacob #else 84 1.101 mjacob #define ISP_1040_RISC_CODE (const uint16_t *) isp_1040_risc_code 85 1.52 mjacob #include <dev/microcode/isp/asm_1040.h> 86 1.47 mjacob #endif 87 1.52 mjacob 88 1.101 mjacob #if defined(ISP_DISABLE_1080_SUPPORT) || defined(ISP_DISABLE_FW) 89 1.47 mjacob #define ISP_1080_RISC_CODE NULL 90 1.52 mjacob #else 91 1.101 mjacob #define ISP_1080_RISC_CODE (const uint16_t *) isp_1080_risc_code 92 1.52 mjacob #include <dev/microcode/isp/asm_1080.h> 93 1.47 mjacob #endif 94 1.52 mjacob 95 1.101 mjacob #if defined(ISP_DISABLE_12160_SUPPORT) || defined(ISP_DISABLE_FW) 96 1.50 mjacob #define ISP_12160_RISC_CODE NULL 97 1.52 mjacob #else 98 1.101 mjacob #define ISP_12160_RISC_CODE (const uint16_t *) isp_12160_risc_code 99 1.52 mjacob #include <dev/microcode/isp/asm_12160.h> 100 1.50 mjacob #endif 101 1.52 mjacob 102 1.101 mjacob #if defined(ISP_DISABLE_2100_SUPPORT) || defined(ISP_DISABLE_FW) 103 1.47 mjacob #define ISP_2100_RISC_CODE NULL 104 1.52 mjacob #else 105 1.101 mjacob #define ISP_2100_RISC_CODE (const uint16_t *) isp_2100_risc_code 106 1.52 mjacob #include <dev/microcode/isp/asm_2100.h> 107 1.47 mjacob #endif 108 1.52 mjacob 109 1.101 mjacob #if defined(ISP_DISABLE_2200_SUPPORT) || defined(ISP_DISABLE_FW) 110 1.47 mjacob #define ISP_2200_RISC_CODE NULL 111 1.52 mjacob #else 112 1.101 mjacob #define ISP_2200_RISC_CODE (const uint16_t *) isp_2200_risc_code 113 1.52 mjacob #include <dev/microcode/isp/asm_2200.h> 114 1.47 mjacob #endif 115 1.47 mjacob 116 1.101 mjacob #if defined(ISP_DISABLE_2300_SUPPORT) || defined(ISP_DISABLE_FW) 117 1.72 mjacob #define ISP_2300_RISC_CODE NULL 118 1.72 mjacob #else 119 1.101 mjacob #define ISP_2300_RISC_CODE (const uint16_t *) isp_2300_risc_code 120 1.72 mjacob #include <dev/microcode/isp/asm_2300.h> 121 1.104 mjacob #endif 122 1.104 mjacob #if defined(ISP_DISABLE_2322_SUPPORT) || defined(ISP_DISABLE_FW) 123 1.104 mjacob #define ISP_2322_RISC_CODE NULL 124 1.104 mjacob #else 125 1.101 mjacob #define ISP_2322_RISC_CODE (const uint16_t *) isp_2322_risc_code 126 1.101 mjacob #include <dev/microcode/isp/asm_2322.h> 127 1.101 mjacob #endif 128 1.101 mjacob 129 1.101 mjacob #if defined(ISP_DISABLE_2400_SUPPORT) || defined(ISP_DISABLE_FW) 130 1.101 mjacob #define ISP_2400_RISC_CODE NULL 131 1.109 mjacob #define ISP_2500_RISC_CODE NULL 132 1.101 mjacob #else 133 1.114 mjacob #define ISP_2500 134 1.114 mjacob #define ISP_2400 135 1.101 mjacob #define ISP_2400_RISC_CODE (const uint32_t *) isp_2400_risc_code 136 1.109 mjacob #define ISP_2500_RISC_CODE (const uint32_t *) isp_2500_risc_code 137 1.101 mjacob #include <dev/microcode/isp/asm_2400.h> 138 1.109 mjacob #include <dev/microcode/isp/asm_2500.h> 139 1.72 mjacob #endif 140 1.72 mjacob 141 1.36 mjacob #ifndef ISP_DISABLE_1020_SUPPORT 142 1.1 cgd static struct ispmdvec mdvec = { 143 1.72 mjacob isp_pci_rd_isr, 144 1.1 cgd isp_pci_rd_reg, 145 1.1 cgd isp_pci_wr_reg, 146 1.1 cgd isp_pci_mbxdma, 147 1.1 cgd isp_pci_dmasetup, 148 1.13 thorpej isp_pci_dmateardown, 149 1.101 mjacob isp_pci_reset0, 150 1.1 cgd isp_pci_reset1, 151 1.15 mjacob isp_pci_dumpregs, 152 1.47 mjacob ISP_1040_RISC_CODE, 153 1.96 christos BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64, 154 1.101 mjacob 0 155 1.15 mjacob }; 156 1.36 mjacob #endif 157 1.36 mjacob 158 1.36 mjacob #ifndef ISP_DISABLE_1080_SUPPORT 159 1.36 mjacob static struct ispmdvec mdvec_1080 = { 160 1.72 mjacob isp_pci_rd_isr, 161 1.36 mjacob isp_pci_rd_reg_1080, 162 1.36 mjacob isp_pci_wr_reg_1080, 163 1.36 mjacob isp_pci_mbxdma, 164 1.36 mjacob isp_pci_dmasetup, 165 1.36 mjacob isp_pci_dmateardown, 166 1.101 mjacob isp_pci_reset0, 167 1.36 mjacob isp_pci_reset1, 168 1.36 mjacob isp_pci_dumpregs, 169 1.47 mjacob ISP_1080_RISC_CODE, 170 1.96 christos BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64, 171 1.101 mjacob 0 172 1.36 mjacob }; 173 1.36 mjacob #endif 174 1.15 mjacob 175 1.50 mjacob #ifndef ISP_DISABLE_12160_SUPPORT 176 1.50 mjacob static struct ispmdvec mdvec_12160 = { 177 1.72 mjacob isp_pci_rd_isr, 178 1.50 mjacob isp_pci_rd_reg_1080, 179 1.50 mjacob isp_pci_wr_reg_1080, 180 1.50 mjacob isp_pci_mbxdma, 181 1.50 mjacob isp_pci_dmasetup, 182 1.50 mjacob isp_pci_dmateardown, 183 1.101 mjacob isp_pci_reset0, 184 1.50 mjacob isp_pci_reset1, 185 1.50 mjacob isp_pci_dumpregs, 186 1.50 mjacob ISP_12160_RISC_CODE, 187 1.96 christos BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64, 188 1.101 mjacob 0 189 1.50 mjacob }; 190 1.50 mjacob #endif 191 1.50 mjacob 192 1.36 mjacob #ifndef ISP_DISABLE_2100_SUPPORT 193 1.15 mjacob static struct ispmdvec mdvec_2100 = { 194 1.72 mjacob isp_pci_rd_isr, 195 1.15 mjacob isp_pci_rd_reg, 196 1.15 mjacob isp_pci_wr_reg, 197 1.15 mjacob isp_pci_mbxdma, 198 1.15 mjacob isp_pci_dmasetup, 199 1.15 mjacob isp_pci_dmateardown, 200 1.101 mjacob isp_pci_reset0, 201 1.15 mjacob isp_pci_reset1, 202 1.15 mjacob isp_pci_dumpregs, 203 1.96 christos ISP_2100_RISC_CODE, 204 1.101 mjacob 0, 205 1.101 mjacob 0 206 1.1 cgd }; 207 1.36 mjacob #endif 208 1.1 cgd 209 1.41 mjacob #ifndef ISP_DISABLE_2200_SUPPORT 210 1.41 mjacob static struct ispmdvec mdvec_2200 = { 211 1.72 mjacob isp_pci_rd_isr, 212 1.41 mjacob isp_pci_rd_reg, 213 1.41 mjacob isp_pci_wr_reg, 214 1.41 mjacob isp_pci_mbxdma, 215 1.41 mjacob isp_pci_dmasetup, 216 1.41 mjacob isp_pci_dmateardown, 217 1.101 mjacob isp_pci_reset0, 218 1.41 mjacob isp_pci_reset1, 219 1.41 mjacob isp_pci_dumpregs, 220 1.96 christos ISP_2200_RISC_CODE, 221 1.101 mjacob 0, 222 1.101 mjacob 0 223 1.41 mjacob }; 224 1.41 mjacob #endif 225 1.41 mjacob 226 1.104 mjacob #ifndef ISP_DISABLE_2300_SUPPORT 227 1.72 mjacob static struct ispmdvec mdvec_2300 = { 228 1.72 mjacob isp_pci_rd_isr_2300, 229 1.72 mjacob isp_pci_rd_reg, 230 1.72 mjacob isp_pci_wr_reg, 231 1.72 mjacob isp_pci_mbxdma, 232 1.72 mjacob isp_pci_dmasetup, 233 1.72 mjacob isp_pci_dmateardown, 234 1.101 mjacob isp_pci_reset0, 235 1.72 mjacob isp_pci_reset1, 236 1.72 mjacob isp_pci_dumpregs, 237 1.96 christos ISP_2300_RISC_CODE, 238 1.101 mjacob 0, 239 1.101 mjacob 0 240 1.101 mjacob }; 241 1.101 mjacob #endif 242 1.101 mjacob 243 1.104 mjacob #ifndef ISP_DISABLE_2322_SUPPORT 244 1.104 mjacob static struct ispmdvec mdvec_2322 = { 245 1.104 mjacob isp_pci_rd_isr_2300, 246 1.104 mjacob isp_pci_rd_reg, 247 1.104 mjacob isp_pci_wr_reg, 248 1.104 mjacob isp_pci_mbxdma, 249 1.104 mjacob isp_pci_dmasetup, 250 1.104 mjacob isp_pci_dmateardown, 251 1.104 mjacob isp_pci_reset0, 252 1.104 mjacob isp_pci_reset1, 253 1.104 mjacob isp_pci_dumpregs, 254 1.104 mjacob ISP_2322_RISC_CODE, 255 1.104 mjacob 0, 256 1.104 mjacob 0 257 1.104 mjacob }; 258 1.104 mjacob #endif 259 1.104 mjacob 260 1.101 mjacob #ifndef ISP_DISABLE_2400_SUPPORT 261 1.101 mjacob static struct ispmdvec mdvec_2400 = { 262 1.101 mjacob isp_pci_rd_isr_2400, 263 1.101 mjacob isp_pci_rd_reg_2400, 264 1.101 mjacob isp_pci_wr_reg_2400, 265 1.101 mjacob isp_pci_mbxdma, 266 1.109 mjacob isp_pci_dmasetup, 267 1.101 mjacob isp_pci_dmateardown, 268 1.101 mjacob isp_pci_reset0, 269 1.101 mjacob isp_pci_reset1, 270 1.101 mjacob NULL, 271 1.101 mjacob ISP_2400_RISC_CODE, 272 1.101 mjacob 0, 273 1.101 mjacob 0 274 1.72 mjacob }; 275 1.109 mjacob static struct ispmdvec mdvec_2500 = { 276 1.109 mjacob isp_pci_rd_isr_2400, 277 1.109 mjacob isp_pci_rd_reg_2400, 278 1.109 mjacob isp_pci_wr_reg_2400, 279 1.109 mjacob isp_pci_mbxdma, 280 1.109 mjacob isp_pci_dmasetup, 281 1.109 mjacob isp_pci_dmateardown, 282 1.109 mjacob isp_pci_reset0, 283 1.109 mjacob isp_pci_reset1, 284 1.109 mjacob NULL, 285 1.109 mjacob ISP_2500_RISC_CODE, 286 1.109 mjacob 0, 287 1.109 mjacob 0 288 1.109 mjacob }; 289 1.72 mjacob #endif 290 1.72 mjacob 291 1.36 mjacob #ifndef PCI_VENDOR_QLOGIC 292 1.36 mjacob #define PCI_VENDOR_QLOGIC 0x1077 293 1.36 mjacob #endif 294 1.36 mjacob 295 1.36 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP1020 296 1.36 mjacob #define PCI_PRODUCT_QLOGIC_ISP1020 0x1020 297 1.36 mjacob #endif 298 1.36 mjacob 299 1.36 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP1080 300 1.36 mjacob #define PCI_PRODUCT_QLOGIC_ISP1080 0x1080 301 1.36 mjacob #endif 302 1.36 mjacob 303 1.36 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP1240 304 1.36 mjacob #define PCI_PRODUCT_QLOGIC_ISP1240 0x1240 305 1.36 mjacob #endif 306 1.1 cgd 307 1.48 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP1280 308 1.48 mjacob #define PCI_PRODUCT_QLOGIC_ISP1280 0x1280 309 1.48 mjacob #endif 310 1.48 mjacob 311 1.86 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP10160 312 1.86 mjacob #define PCI_PRODUCT_QLOGIC_ISP10160 0x1016 313 1.86 mjacob #endif 314 1.86 mjacob 315 1.50 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP12160 316 1.53 mjacob #define PCI_PRODUCT_QLOGIC_ISP12160 0x1216 317 1.50 mjacob #endif 318 1.50 mjacob 319 1.15 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2100 320 1.15 mjacob #define PCI_PRODUCT_QLOGIC_ISP2100 0x2100 321 1.15 mjacob #endif 322 1.36 mjacob 323 1.41 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2200 324 1.41 mjacob #define PCI_PRODUCT_QLOGIC_ISP2200 0x2200 325 1.41 mjacob #endif 326 1.41 mjacob 327 1.72 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2300 328 1.72 mjacob #define PCI_PRODUCT_QLOGIC_ISP2300 0x2300 329 1.72 mjacob #endif 330 1.72 mjacob 331 1.72 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2312 332 1.72 mjacob #define PCI_PRODUCT_QLOGIC_ISP2312 0x2312 333 1.72 mjacob #endif 334 1.72 mjacob 335 1.101 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2322 336 1.101 mjacob #define PCI_PRODUCT_QLOGIC_ISP2322 0x2322 337 1.101 mjacob #endif 338 1.101 mjacob 339 1.101 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2422 340 1.101 mjacob #define PCI_PRODUCT_QLOGIC_ISP2422 0x2422 341 1.101 mjacob #endif 342 1.101 mjacob 343 1.101 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2432 344 1.101 mjacob #define PCI_PRODUCT_QLOGIC_ISP2432 0x2432 345 1.101 mjacob #endif 346 1.101 mjacob 347 1.109 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP2532 348 1.109 mjacob #define PCI_PRODUCT_QLOGIC_ISP2532 0x2532 349 1.109 mjacob #endif 350 1.109 mjacob 351 1.101 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP6312 352 1.101 mjacob #define PCI_PRODUCT_QLOGIC_ISP6312 0x6312 353 1.101 mjacob #endif 354 1.101 mjacob 355 1.101 mjacob #ifndef PCI_PRODUCT_QLOGIC_ISP6322 356 1.101 mjacob #define PCI_PRODUCT_QLOGIC_ISP6322 0x6322 357 1.101 mjacob #endif 358 1.101 mjacob 359 1.101 mjacob 360 1.36 mjacob #define PCI_QLOGIC_ISP ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) 361 1.36 mjacob 362 1.36 mjacob #define PCI_QLOGIC_ISP1080 \ 363 1.36 mjacob ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) 364 1.36 mjacob 365 1.101 mjacob #define PCI_QLOGIC_ISP10160 \ 366 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP10160 << 16) | PCI_VENDOR_QLOGIC) 367 1.101 mjacob 368 1.101 mjacob #define PCI_QLOGIC_ISP12160 \ 369 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP12160 << 16) | PCI_VENDOR_QLOGIC) 370 1.101 mjacob 371 1.36 mjacob #define PCI_QLOGIC_ISP1240 \ 372 1.36 mjacob ((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC) 373 1.36 mjacob 374 1.48 mjacob #define PCI_QLOGIC_ISP1280 \ 375 1.48 mjacob ((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC) 376 1.48 mjacob 377 1.15 mjacob #define PCI_QLOGIC_ISP2100 \ 378 1.15 mjacob ((PCI_PRODUCT_QLOGIC_ISP2100 << 16) | PCI_VENDOR_QLOGIC) 379 1.15 mjacob 380 1.41 mjacob #define PCI_QLOGIC_ISP2200 \ 381 1.41 mjacob ((PCI_PRODUCT_QLOGIC_ISP2200 << 16) | PCI_VENDOR_QLOGIC) 382 1.41 mjacob 383 1.72 mjacob #define PCI_QLOGIC_ISP2300 \ 384 1.72 mjacob ((PCI_PRODUCT_QLOGIC_ISP2300 << 16) | PCI_VENDOR_QLOGIC) 385 1.72 mjacob 386 1.72 mjacob #define PCI_QLOGIC_ISP2312 \ 387 1.72 mjacob ((PCI_PRODUCT_QLOGIC_ISP2312 << 16) | PCI_VENDOR_QLOGIC) 388 1.72 mjacob 389 1.101 mjacob #define PCI_QLOGIC_ISP2322 \ 390 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP2322 << 16) | PCI_VENDOR_QLOGIC) 391 1.101 mjacob 392 1.101 mjacob #define PCI_QLOGIC_ISP2422 \ 393 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC) 394 1.101 mjacob 395 1.101 mjacob #define PCI_QLOGIC_ISP2432 \ 396 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP2432 << 16) | PCI_VENDOR_QLOGIC) 397 1.101 mjacob 398 1.109 mjacob #define PCI_QLOGIC_ISP2532 \ 399 1.109 mjacob ((PCI_PRODUCT_QLOGIC_ISP2532 << 16) | PCI_VENDOR_QLOGIC) 400 1.109 mjacob 401 1.101 mjacob #define PCI_QLOGIC_ISP6312 \ 402 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP6312 << 16) | PCI_VENDOR_QLOGIC) 403 1.101 mjacob 404 1.101 mjacob #define PCI_QLOGIC_ISP6322 \ 405 1.101 mjacob ((PCI_PRODUCT_QLOGIC_ISP6322 << 16) | PCI_VENDOR_QLOGIC) 406 1.101 mjacob 407 1.44 mjacob #define IO_MAP_REG 0x10 408 1.44 mjacob #define MEM_MAP_REG 0x14 409 1.39 mjacob #define PCIR_ROMADDR 0x30 410 1.39 mjacob 411 1.39 mjacob #define PCI_DFLT_LTNCY 0x40 412 1.39 mjacob #define PCI_DFLT_LNSZ 0x10 413 1.6 cgd 414 1.107 cegger static int isp_pci_probe(device_t, cfdata_t, void *); 415 1.107 cegger static void isp_pci_attach(device_t, device_t, void *); 416 1.1 cgd 417 1.1 cgd struct isp_pcisoftc { 418 1.1 cgd struct ispsoftc pci_isp; 419 1.15 mjacob pci_chipset_tag_t pci_pc; 420 1.15 mjacob pcitag_t pci_tag; 421 1.6 cgd bus_space_tag_t pci_st; 422 1.6 cgd bus_space_handle_t pci_sh; 423 1.45 mjacob bus_dmamap_t *pci_xfer_dmap; 424 1.1 cgd void * pci_ih; 425 1.36 mjacob int16_t pci_poff[_NREG_BLKS]; 426 1.1 cgd }; 427 1.1 cgd 428 1.110 tsutsui CFATTACH_DECL_NEW(isp_pci, sizeof (struct isp_pcisoftc), 429 1.85 thorpej isp_pci_probe, isp_pci_attach, NULL, NULL); 430 1.1 cgd 431 1.1 cgd static int 432 1.107 cegger isp_pci_probe(device_t parent, cfdata_t match, void *aux) 433 1.44 mjacob { 434 1.44 mjacob struct pci_attach_args *pa = aux; 435 1.44 mjacob switch (pa->pa_id) { 436 1.36 mjacob #ifndef ISP_DISABLE_1020_SUPPORT 437 1.36 mjacob case PCI_QLOGIC_ISP: 438 1.36 mjacob return (1); 439 1.36 mjacob #endif 440 1.36 mjacob #ifndef ISP_DISABLE_1080_SUPPORT 441 1.36 mjacob case PCI_QLOGIC_ISP1080: 442 1.40 mjacob case PCI_QLOGIC_ISP1240: 443 1.48 mjacob case PCI_QLOGIC_ISP1280: 444 1.36 mjacob return (1); 445 1.36 mjacob #endif 446 1.50 mjacob #ifndef ISP_DISABLE_12160_SUPPORT 447 1.86 mjacob case PCI_QLOGIC_ISP10160: 448 1.50 mjacob case PCI_QLOGIC_ISP12160: 449 1.50 mjacob return (1); 450 1.50 mjacob #endif 451 1.36 mjacob #ifndef ISP_DISABLE_2100_SUPPORT 452 1.36 mjacob case PCI_QLOGIC_ISP2100: 453 1.1 cgd return (1); 454 1.36 mjacob #endif 455 1.41 mjacob #ifndef ISP_DISABLE_2200_SUPPORT 456 1.41 mjacob case PCI_QLOGIC_ISP2200: 457 1.41 mjacob return (1); 458 1.41 mjacob #endif 459 1.72 mjacob #ifndef ISP_DISABLE_2300_SUPPORT 460 1.72 mjacob case PCI_QLOGIC_ISP2300: 461 1.72 mjacob case PCI_QLOGIC_ISP2312: 462 1.104 mjacob case PCI_QLOGIC_ISP6312: 463 1.104 mjacob #endif 464 1.104 mjacob #ifndef ISP_DISABLE_2322_SUPPORT 465 1.101 mjacob case PCI_QLOGIC_ISP2322: 466 1.101 mjacob case PCI_QLOGIC_ISP6322: 467 1.101 mjacob return (1); 468 1.101 mjacob #endif 469 1.101 mjacob #ifndef ISP_DISABLE_2400_SUPPORT 470 1.101 mjacob case PCI_QLOGIC_ISP2422: 471 1.101 mjacob case PCI_QLOGIC_ISP2432: 472 1.109 mjacob case PCI_QLOGIC_ISP2532: 473 1.72 mjacob return (1); 474 1.72 mjacob #endif 475 1.36 mjacob default: 476 1.1 cgd return (0); 477 1.1 cgd } 478 1.1 cgd } 479 1.1 cgd 480 1.44 mjacob static void 481 1.107 cegger isp_pci_attach(device_t parent, device_t self, void *aux) 482 1.1 cgd { 483 1.101 mjacob uint32_t data, rev, linesz = PCI_DFLT_LNSZ; 484 1.1 cgd struct pci_attach_args *pa = aux; 485 1.108 cegger struct isp_pcisoftc *pcs = device_private(self); 486 1.21 mjacob struct ispsoftc *isp = &pcs->pci_isp; 487 1.11 cgd bus_space_tag_t st, iot, memt; 488 1.11 cgd bus_space_handle_t sh, ioh, memh; 489 1.1 cgd pci_intr_handle_t ih; 490 1.89 mjacob pcireg_t mem_type; 491 1.93 christos const char *dstring; 492 1.1 cgd const char *intrstr; 493 1.53 mjacob int ioh_valid, memh_valid; 494 1.104 mjacob size_t mamt; 495 1.117 christos char intrbuf[PCI_INTRSTR_LEN]; 496 1.1 cgd 497 1.110 tsutsui isp->isp_osinfo.dev = self; 498 1.110 tsutsui 499 1.118 msaitoh ioh_valid = (pci_mapreg_map(pa, IO_MAP_REG, PCI_MAPREG_TYPE_IO, 0, 500 1.11 cgd &iot, &ioh, NULL, NULL) == 0); 501 1.92 perry 502 1.89 mjacob mem_type = pci_mapreg_type(pa->pa_pc, pa->pa_tag, MEM_MAP_REG); 503 1.89 mjacob if (PCI_MAPREG_TYPE(mem_type) != PCI_MAPREG_TYPE_MEM) { 504 1.89 mjacob memh_valid = 0; 505 1.89 mjacob } else if (PCI_MAPREG_MEM_TYPE(mem_type) != PCI_MAPREG_MEM_TYPE_32BIT && 506 1.89 mjacob PCI_MAPREG_MEM_TYPE(mem_type) != PCI_MAPREG_MEM_TYPE_64BIT) { 507 1.89 mjacob memh_valid = 0; 508 1.89 mjacob } else { 509 1.89 mjacob memh_valid = (pci_mapreg_map(pa, MEM_MAP_REG, mem_type, 0, 510 1.89 mjacob &memt, &memh, NULL, NULL) == 0); 511 1.89 mjacob } 512 1.11 cgd if (memh_valid) { 513 1.11 cgd st = memt; 514 1.11 cgd sh = memh; 515 1.11 cgd } else if (ioh_valid) { 516 1.11 cgd st = iot; 517 1.11 cgd sh = ioh; 518 1.6 cgd } else { 519 1.119 msaitoh aprint_error(": unable to map device registers\n"); 520 1.9 cgd return; 521 1.1 cgd } 522 1.78 mjacob dstring = "\n"; 523 1.1 cgd 524 1.104 mjacob isp->isp_nchan = 1; 525 1.104 mjacob mamt = 0; 526 1.104 mjacob 527 1.6 cgd pcs->pci_st = st; 528 1.6 cgd pcs->pci_sh = sh; 529 1.15 mjacob pcs->pci_pc = pa->pa_pc; 530 1.15 mjacob pcs->pci_tag = pa->pa_tag; 531 1.36 mjacob pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF; 532 1.36 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF; 533 1.36 mjacob pcs->pci_poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF; 534 1.36 mjacob pcs->pci_poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF; 535 1.36 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF; 536 1.47 mjacob rev = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff; 537 1.36 mjacob 538 1.104 mjacob 539 1.36 mjacob #ifndef ISP_DISABLE_1020_SUPPORT 540 1.15 mjacob if (pa->pa_id == PCI_QLOGIC_ISP) { 541 1.89 mjacob dstring = ": QLogic 1020 Fast Wide SCSI HBA\n"; 542 1.21 mjacob isp->isp_mdvec = &mdvec; 543 1.21 mjacob isp->isp_type = ISP_HA_SCSI_UNKNOWN; 544 1.104 mjacob mamt = sizeof (sdparam); 545 1.36 mjacob } 546 1.36 mjacob #endif 547 1.36 mjacob #ifndef ISP_DISABLE_1080_SUPPORT 548 1.36 mjacob if (pa->pa_id == PCI_QLOGIC_ISP1080) { 549 1.78 mjacob dstring = ": QLogic 1080 Ultra-2 Wide SCSI HBA\n"; 550 1.36 mjacob isp->isp_mdvec = &mdvec_1080; 551 1.36 mjacob isp->isp_type = ISP_HA_SCSI_1080; 552 1.104 mjacob mamt = sizeof (sdparam); 553 1.36 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 554 1.36 mjacob ISP1080_DMA_REGS_OFF; 555 1.36 mjacob } 556 1.40 mjacob if (pa->pa_id == PCI_QLOGIC_ISP1240) { 557 1.78 mjacob dstring = ": QLogic Dual Channel Ultra Wide SCSI HBA\n"; 558 1.40 mjacob isp->isp_mdvec = &mdvec_1080; 559 1.48 mjacob isp->isp_type = ISP_HA_SCSI_1240; 560 1.104 mjacob isp->isp_nchan++; 561 1.104 mjacob mamt = sizeof (sdparam) * 2; 562 1.48 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 563 1.48 mjacob ISP1080_DMA_REGS_OFF; 564 1.48 mjacob } 565 1.48 mjacob if (pa->pa_id == PCI_QLOGIC_ISP1280) { 566 1.78 mjacob dstring = ": QLogic Dual Channel Ultra-2 Wide SCSI HBA\n"; 567 1.48 mjacob isp->isp_mdvec = &mdvec_1080; 568 1.48 mjacob isp->isp_type = ISP_HA_SCSI_1280; 569 1.104 mjacob isp->isp_nchan++; 570 1.104 mjacob mamt = sizeof (sdparam) * 2; 571 1.40 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 572 1.40 mjacob ISP1080_DMA_REGS_OFF; 573 1.40 mjacob } 574 1.36 mjacob #endif 575 1.50 mjacob #ifndef ISP_DISABLE_12160_SUPPORT 576 1.86 mjacob if (pa->pa_id == PCI_QLOGIC_ISP10160) { 577 1.86 mjacob dstring = ": QLogic Ultra-3 Wide SCSI HBA\n"; 578 1.86 mjacob isp->isp_mdvec = &mdvec_12160; 579 1.86 mjacob isp->isp_type = ISP_HA_SCSI_10160; 580 1.104 mjacob mamt = sizeof (sdparam); 581 1.86 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 582 1.86 mjacob ISP1080_DMA_REGS_OFF; 583 1.86 mjacob } 584 1.50 mjacob if (pa->pa_id == PCI_QLOGIC_ISP12160) { 585 1.78 mjacob dstring = ": QLogic Dual Channel Ultra-3 Wide SCSI HBA\n"; 586 1.50 mjacob isp->isp_mdvec = &mdvec_12160; 587 1.50 mjacob isp->isp_type = ISP_HA_SCSI_12160; 588 1.104 mjacob isp->isp_nchan++; 589 1.104 mjacob mamt = sizeof (sdparam) * 2; 590 1.50 mjacob pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 591 1.50 mjacob ISP1080_DMA_REGS_OFF; 592 1.50 mjacob } 593 1.50 mjacob #endif 594 1.36 mjacob #ifndef ISP_DISABLE_2100_SUPPORT 595 1.36 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2100) { 596 1.78 mjacob dstring = ": QLogic FC-AL HBA\n"; 597 1.21 mjacob isp->isp_mdvec = &mdvec_2100; 598 1.21 mjacob isp->isp_type = ISP_HA_FC_2100; 599 1.104 mjacob mamt = sizeof (fcparam); 600 1.36 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 601 1.36 mjacob PCI_MBOX_REGS2100_OFF; 602 1.47 mjacob if (rev < 3) { 603 1.39 mjacob /* 604 1.39 mjacob * XXX: Need to get the actual revision 605 1.39 mjacob * XXX: number of the 2100 FB. At any rate, 606 1.39 mjacob * XXX: lower cache line size for early revision 607 1.39 mjacob * XXX; boards. 608 1.39 mjacob */ 609 1.39 mjacob linesz = 1; 610 1.39 mjacob } 611 1.15 mjacob } 612 1.36 mjacob #endif 613 1.41 mjacob #ifndef ISP_DISABLE_2200_SUPPORT 614 1.41 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2200) { 615 1.78 mjacob dstring = ": QLogic FC-AL and Fabric HBA\n"; 616 1.41 mjacob isp->isp_mdvec = &mdvec_2200; 617 1.41 mjacob isp->isp_type = ISP_HA_FC_2200; 618 1.104 mjacob mamt = sizeof (fcparam); 619 1.41 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 620 1.41 mjacob PCI_MBOX_REGS2100_OFF; 621 1.41 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 622 1.41 mjacob } 623 1.41 mjacob #endif 624 1.72 mjacob #ifndef ISP_DISABLE_2300_SUPPORT 625 1.72 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2300 || 626 1.101 mjacob pa->pa_id == PCI_QLOGIC_ISP2312 || 627 1.101 mjacob pa->pa_id == PCI_QLOGIC_ISP6312) { 628 1.72 mjacob isp->isp_mdvec = &mdvec_2300; 629 1.101 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2300 || 630 1.101 mjacob pa->pa_id == PCI_QLOGIC_ISP6312) { 631 1.78 mjacob dstring = ": QLogic FC-AL and 2Gbps Fabric HBA\n"; 632 1.76 mjacob isp->isp_type = ISP_HA_FC_2300; 633 1.76 mjacob } else { 634 1.78 mjacob dstring = 635 1.78 mjacob ": QLogic Dual Port FC-AL and 2Gbps Fabric HBA\n"; 636 1.76 mjacob isp->isp_port = pa->pa_function; 637 1.76 mjacob } 638 1.101 mjacob isp->isp_type = ISP_HA_FC_2312; 639 1.104 mjacob mamt = sizeof (fcparam); 640 1.101 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 641 1.101 mjacob PCI_MBOX_REGS2300_OFF; 642 1.101 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 643 1.101 mjacob } 644 1.104 mjacob #endif 645 1.104 mjacob #ifndef ISP_DISABLE_2322_SUPPORT 646 1.101 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2322 || 647 1.101 mjacob pa->pa_id == PCI_QLOGIC_ISP6322) { 648 1.104 mjacob isp->isp_mdvec = &mdvec_2322; 649 1.101 mjacob dstring = ": QLogic FC-AL and 2Gbps Fabric PCI-E HBA\n"; 650 1.101 mjacob isp->isp_type = ISP_HA_FC_2322; 651 1.101 mjacob isp->isp_port = pa->pa_function; 652 1.104 mjacob mamt = sizeof (fcparam); 653 1.72 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 654 1.72 mjacob PCI_MBOX_REGS2300_OFF; 655 1.72 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 656 1.72 mjacob } 657 1.72 mjacob #endif 658 1.101 mjacob #ifndef ISP_DISABLE_2400_SUPPORT 659 1.101 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2422 || 660 1.101 mjacob pa->pa_id == PCI_QLOGIC_ISP2432) { 661 1.101 mjacob isp->isp_mdvec = &mdvec_2400; 662 1.101 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2422) { 663 1.101 mjacob dstring = ": QLogic FC-AL and 4Gbps Fabric PCI-X HBA\n"; 664 1.101 mjacob } else { 665 1.101 mjacob dstring = ": QLogic FC-AL and 4Gbps Fabric PCI-E HBA\n"; 666 1.101 mjacob } 667 1.101 mjacob isp->isp_type = ISP_HA_FC_2400; 668 1.112 mjacob isp->isp_port = pa->pa_function; 669 1.104 mjacob mamt = sizeof (fcparam); 670 1.101 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 671 1.101 mjacob PCI_MBOX_REGS2400_OFF; 672 1.101 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 673 1.101 mjacob } 674 1.109 mjacob if (pa->pa_id == PCI_QLOGIC_ISP2532) { 675 1.109 mjacob isp->isp_mdvec = &mdvec_2500; 676 1.109 mjacob dstring = ": QLogic FC-AL and 8Gbps Fabric PCI-E HBA\n"; 677 1.109 mjacob isp->isp_type = ISP_HA_FC_2500; 678 1.112 mjacob isp->isp_port = pa->pa_function; 679 1.109 mjacob mamt = sizeof (fcparam); 680 1.109 mjacob pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 681 1.109 mjacob PCI_MBOX_REGS2400_OFF; 682 1.109 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 683 1.109 mjacob } 684 1.101 mjacob #endif 685 1.104 mjacob if (mamt == 0) { 686 1.104 mjacob return; 687 1.104 mjacob } 688 1.104 mjacob 689 1.122 chs isp->isp_param = malloc(mamt, M_DEVBUF, M_WAITOK | M_ZERO); 690 1.104 mjacob mamt = sizeof (struct scsipi_channel) * isp->isp_nchan; 691 1.122 chs isp->isp_osinfo.chan = malloc(mamt, M_DEVBUF, M_WAITOK | M_ZERO); 692 1.104 mjacob isp->isp_osinfo.adapter.adapt_nchannels = isp->isp_nchan; 693 1.104 mjacob 694 1.53 mjacob /* 695 1.53 mjacob * Set up logging levels. 696 1.53 mjacob */ 697 1.53 mjacob #ifdef ISP_LOGDEFAULT 698 1.53 mjacob isp->isp_dblev = ISP_LOGDEFAULT; 699 1.53 mjacob #else 700 1.65 mjacob isp->isp_dblev = ISP_LOGWARN|ISP_LOGERR; 701 1.65 mjacob if (bootverbose) 702 1.65 mjacob isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO; 703 1.53 mjacob #ifdef SCSIDEBUG 704 1.78 mjacob isp->isp_dblev |= ISP_LOGDEBUG0|ISP_LOGDEBUG1|ISP_LOGDEBUG2; 705 1.53 mjacob #endif 706 1.53 mjacob #endif 707 1.78 mjacob if (isp->isp_dblev & ISP_LOGCONFIG) { 708 1.119 msaitoh aprint_normal("\n"); 709 1.78 mjacob } else { 710 1.119 msaitoh aprint_normal("%s", dstring); 711 1.78 mjacob } 712 1.57 mjacob 713 1.75 mjacob isp->isp_dmatag = pa->pa_dmat; 714 1.47 mjacob isp->isp_revision = rev; 715 1.36 mjacob 716 1.35 mjacob /* 717 1.35 mjacob * Make sure that command register set sanely. 718 1.35 mjacob */ 719 1.35 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 720 1.35 mjacob data |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_INVALIDATE_ENABLE; 721 1.36 mjacob 722 1.35 mjacob /* 723 1.35 mjacob * Not so sure about these- but I think it's important that they get 724 1.35 mjacob * enabled...... 725 1.35 mjacob */ 726 1.35 mjacob data |= PCI_COMMAND_PARITY_ENABLE | PCI_COMMAND_SERR_ENABLE; 727 1.76 mjacob if (IS_2300(isp)) { /* per QLogic errata */ 728 1.76 mjacob data &= ~PCI_COMMAND_INVALIDATE_ENABLE; 729 1.81 mjacob } 730 1.35 mjacob pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, data); 731 1.36 mjacob 732 1.35 mjacob /* 733 1.39 mjacob * Make sure that the latency timer, cache line size, 734 1.39 mjacob * and ROM is disabled. 735 1.35 mjacob */ 736 1.35 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG); 737 1.35 mjacob data &= ~(PCI_LATTIMER_MASK << PCI_LATTIMER_SHIFT); 738 1.35 mjacob data &= ~(PCI_CACHELINE_MASK << PCI_CACHELINE_SHIFT); 739 1.39 mjacob data |= (PCI_DFLT_LTNCY << PCI_LATTIMER_SHIFT); 740 1.39 mjacob data |= (linesz << PCI_CACHELINE_SHIFT); 741 1.35 mjacob pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG, data); 742 1.39 mjacob 743 1.39 mjacob data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR); 744 1.39 mjacob data &= ~1; 745 1.39 mjacob pci_conf_write(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR, data); 746 1.35 mjacob 747 1.64 sommerfe if (pci_intr_map(pa, &ih)) { 748 1.110 tsutsui aprint_error_dev(self, "couldn't map interrupt\n"); 749 1.21 mjacob free(isp->isp_param, M_DEVBUF); 750 1.104 mjacob free(isp->isp_osinfo.chan, M_DEVBUF); 751 1.1 cgd return; 752 1.1 cgd } 753 1.117 christos intrstr = pci_intr_string(pa->pa_pc, ih, intrbuf, sizeof(intrbuf)); 754 1.1 cgd if (intrstr == NULL) 755 1.1 cgd intrstr = "<I dunno>"; 756 1.120 jdolecek pcs->pci_ih = pci_intr_establish_xname(pa->pa_pc, ih, IPL_BIO, 757 1.120 jdolecek isp_pci_intr, isp, device_xname(self)); 758 1.1 cgd if (pcs->pci_ih == NULL) { 759 1.110 tsutsui aprint_error_dev(self, "couldn't establish interrupt at %s\n", 760 1.105 cegger intrstr); 761 1.36 mjacob free(isp->isp_param, M_DEVBUF); 762 1.104 mjacob free(isp->isp_osinfo.chan, M_DEVBUF); 763 1.36 mjacob return; 764 1.36 mjacob } 765 1.53 mjacob 766 1.119 msaitoh aprint_normal_dev(self, "interrupting at %s\n", intrstr); 767 1.36 mjacob 768 1.110 tsutsui isp->isp_confopts = device_cfdata(self)->cf_flags; 769 1.36 mjacob ISP_LOCK(isp); 770 1.109 mjacob isp_reset(isp, 1); 771 1.36 mjacob if (isp->isp_state != ISP_RESETSTATE) { 772 1.36 mjacob ISP_UNLOCK(isp); 773 1.36 mjacob free(isp->isp_param, M_DEVBUF); 774 1.104 mjacob free(isp->isp_osinfo.chan, M_DEVBUF); 775 1.36 mjacob return; 776 1.36 mjacob } 777 1.36 mjacob isp_init(isp); 778 1.36 mjacob if (isp->isp_state != ISP_INITSTATE) { 779 1.21 mjacob isp_uninit(isp); 780 1.22 mjacob ISP_UNLOCK(isp); 781 1.21 mjacob free(isp->isp_param, M_DEVBUF); 782 1.104 mjacob free(isp->isp_osinfo.chan, M_DEVBUF); 783 1.1 cgd return; 784 1.1 cgd } 785 1.1 cgd /* 786 1.53 mjacob * Do platform attach. 787 1.1 cgd */ 788 1.53 mjacob ISP_UNLOCK(isp); 789 1.21 mjacob isp_attach(isp); 790 1.1 cgd } 791 1.1 cgd 792 1.72 mjacob #define IspVirt2Off(a, x) \ 793 1.72 mjacob (((struct isp_pcisoftc *)a)->pci_poff[((x) & _BLK_REG_MASK) >> \ 794 1.72 mjacob _BLK_REG_SHFT] + ((x) & 0xff)) 795 1.72 mjacob 796 1.72 mjacob #define BXR2(pcs, off) \ 797 1.72 mjacob bus_space_read_2(pcs->pci_st, pcs->pci_sh, off) 798 1.72 mjacob #define BXW2(pcs, off, v) \ 799 1.72 mjacob bus_space_write_2(pcs->pci_st, pcs->pci_sh, off, v) 800 1.101 mjacob #define BXR4(pcs, off) \ 801 1.101 mjacob bus_space_read_4(pcs->pci_st, pcs->pci_sh, off) 802 1.101 mjacob #define BXW4(pcs, off, v) \ 803 1.101 mjacob bus_space_write_4(pcs->pci_st, pcs->pci_sh, off, v) 804 1.72 mjacob 805 1.72 mjacob 806 1.101 mjacob static int 807 1.101 mjacob isp_pci_rd_debounced(struct ispsoftc *isp, int off, uint16_t *rp) 808 1.72 mjacob { 809 1.72 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 810 1.101 mjacob uint16_t val0, val1; 811 1.72 mjacob int i = 0; 812 1.72 mjacob 813 1.72 mjacob do { 814 1.72 mjacob val0 = BXR2(pcs, IspVirt2Off(isp, off)); 815 1.72 mjacob val1 = BXR2(pcs, IspVirt2Off(isp, off)); 816 1.72 mjacob } while (val0 != val1 && ++i < 1000); 817 1.72 mjacob if (val0 != val1) { 818 1.72 mjacob return (1); 819 1.72 mjacob } 820 1.72 mjacob *rp = val0; 821 1.72 mjacob return (0); 822 1.72 mjacob } 823 1.72 mjacob 824 1.101 mjacob #if !defined(ISP_DISABLE_2100_SUPPORT) && \ 825 1.101 mjacob !defined(ISP_DISABLE_2200_SUPPORT) && \ 826 1.101 mjacob !defined(ISP_DISABLE_1020_SUPPORT) && \ 827 1.101 mjacob !defined(ISP_DISABLE_1080_SUPPORT) && \ 828 1.92 perry !defined(ISP_DISABLE_12160_SUPPORT) 829 1.72 mjacob static int 830 1.101 mjacob isp_pci_rd_isr(struct ispsoftc *isp, uint32_t *isrp, 831 1.101 mjacob uint16_t *semap, uint16_t *mbp) 832 1.72 mjacob { 833 1.72 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 834 1.101 mjacob uint16_t isr, sema; 835 1.72 mjacob 836 1.72 mjacob if (IS_2100(isp)) { 837 1.72 mjacob if (isp_pci_rd_debounced(isp, BIU_ISR, &isr)) { 838 1.72 mjacob return (0); 839 1.72 mjacob } 840 1.72 mjacob if (isp_pci_rd_debounced(isp, BIU_SEMA, &sema)) { 841 1.72 mjacob return (0); 842 1.72 mjacob } 843 1.72 mjacob } else { 844 1.72 mjacob isr = BXR2(pcs, IspVirt2Off(isp, BIU_ISR)); 845 1.72 mjacob sema = BXR2(pcs, IspVirt2Off(isp, BIU_SEMA)); 846 1.72 mjacob } 847 1.72 mjacob isp_prt(isp, ISP_LOGDEBUG3, "ISR 0x%x SEMA 0x%x", isr, sema); 848 1.72 mjacob isr &= INT_PENDING_MASK(isp); 849 1.72 mjacob sema &= BIU_SEMA_LOCK; 850 1.72 mjacob if (isr == 0 && sema == 0) { 851 1.72 mjacob return (0); 852 1.72 mjacob } 853 1.72 mjacob *isrp = isr; 854 1.72 mjacob if ((*semap = sema) != 0) { 855 1.72 mjacob if (IS_2100(isp)) { 856 1.72 mjacob if (isp_pci_rd_debounced(isp, OUTMAILBOX0, mbp)) { 857 1.72 mjacob return (0); 858 1.72 mjacob } 859 1.72 mjacob } else { 860 1.72 mjacob *mbp = BXR2(pcs, IspVirt2Off(isp, OUTMAILBOX0)); 861 1.72 mjacob } 862 1.72 mjacob } 863 1.72 mjacob return (1); 864 1.72 mjacob } 865 1.91 matt #endif 866 1.72 mjacob 867 1.104 mjacob #if !(defined(ISP_DISABLE_2300_SUPPORT) || defined(ISP_DISABLE_2322_SUPPORT)) 868 1.72 mjacob static int 869 1.101 mjacob isp_pci_rd_isr_2300(struct ispsoftc *isp, uint32_t *isrp, 870 1.101 mjacob uint16_t *semap, uint16_t *mbox0p) 871 1.72 mjacob { 872 1.72 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 873 1.101 mjacob uint32_t r2hisr; 874 1.72 mjacob 875 1.73 mjacob if (!(BXR2(pcs, IspVirt2Off(isp, BIU_ISR)) & BIU2100_ISR_RISC_INT)) { 876 1.73 mjacob *isrp = 0; 877 1.73 mjacob return (0); 878 1.73 mjacob } 879 1.72 mjacob r2hisr = bus_space_read_4(pcs->pci_st, pcs->pci_sh, 880 1.72 mjacob IspVirt2Off(pcs, BIU_R2HSTSLO)); 881 1.72 mjacob isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr); 882 1.72 mjacob if ((r2hisr & BIU_R2HST_INTR) == 0) { 883 1.72 mjacob *isrp = 0; 884 1.72 mjacob return (0); 885 1.72 mjacob } 886 1.72 mjacob switch (r2hisr & BIU_R2HST_ISTAT_MASK) { 887 1.72 mjacob case ISPR2HST_ROM_MBX_OK: 888 1.72 mjacob case ISPR2HST_ROM_MBX_FAIL: 889 1.72 mjacob case ISPR2HST_MBX_OK: 890 1.72 mjacob case ISPR2HST_MBX_FAIL: 891 1.72 mjacob case ISPR2HST_ASYNC_EVENT: 892 1.82 mjacob *isrp = r2hisr & 0xffff; 893 1.82 mjacob *mbox0p = (r2hisr >> 16); 894 1.82 mjacob *semap = 1; 895 1.82 mjacob return (1); 896 1.76 mjacob case ISPR2HST_RIO_16: 897 1.82 mjacob *isrp = r2hisr & 0xffff; 898 1.111 mjacob *mbox0p = ASYNC_RIO16_1; 899 1.82 mjacob *semap = 1; 900 1.82 mjacob return (1); 901 1.72 mjacob case ISPR2HST_FPOST: 902 1.82 mjacob *isrp = r2hisr & 0xffff; 903 1.82 mjacob *mbox0p = ASYNC_CMD_CMPLT; 904 1.82 mjacob *semap = 1; 905 1.82 mjacob return (1); 906 1.72 mjacob case ISPR2HST_FPOST_CTIO: 907 1.72 mjacob *isrp = r2hisr & 0xffff; 908 1.82 mjacob *mbox0p = ASYNC_CTIO_DONE; 909 1.72 mjacob *semap = 1; 910 1.72 mjacob return (1); 911 1.72 mjacob case ISPR2HST_RSPQ_UPDATE: 912 1.72 mjacob *isrp = r2hisr & 0xffff; 913 1.72 mjacob *mbox0p = 0; 914 1.72 mjacob *semap = 0; 915 1.72 mjacob return (1); 916 1.72 mjacob default: 917 1.72 mjacob return (0); 918 1.72 mjacob } 919 1.72 mjacob } 920 1.72 mjacob #endif 921 1.72 mjacob 922 1.101 mjacob #ifndef ISP_DISABLE_2400_SUPPORT 923 1.101 mjacob static int 924 1.101 mjacob isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, 925 1.101 mjacob uint16_t *semap, uint16_t *mbox0p) 926 1.101 mjacob { 927 1.101 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 928 1.101 mjacob uint32_t r2hisr; 929 1.101 mjacob 930 1.101 mjacob r2hisr = BXR4(pcs, IspVirt2Off(pcs, BIU2400_R2HSTSLO)); 931 1.101 mjacob isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr); 932 1.101 mjacob if ((r2hisr & BIU2400_R2HST_INTR) == 0) { 933 1.101 mjacob *isrp = 0; 934 1.101 mjacob return (0); 935 1.101 mjacob } 936 1.101 mjacob switch (r2hisr & BIU2400_R2HST_ISTAT_MASK) { 937 1.101 mjacob case ISP2400R2HST_ROM_MBX_OK: 938 1.101 mjacob case ISP2400R2HST_ROM_MBX_FAIL: 939 1.101 mjacob case ISP2400R2HST_MBX_OK: 940 1.101 mjacob case ISP2400R2HST_MBX_FAIL: 941 1.101 mjacob case ISP2400R2HST_ASYNC_EVENT: 942 1.101 mjacob *isrp = r2hisr & 0xffff; 943 1.101 mjacob *mbox0p = (r2hisr >> 16); 944 1.101 mjacob *semap = 1; 945 1.101 mjacob return (1); 946 1.101 mjacob case ISP2400R2HST_RSPQ_UPDATE: 947 1.101 mjacob case ISP2400R2HST_ATIO_RSPQ_UPDATE: 948 1.101 mjacob case ISP2400R2HST_ATIO_RQST_UPDATE: 949 1.101 mjacob *isrp = r2hisr & 0xffff; 950 1.101 mjacob *mbox0p = 0; 951 1.101 mjacob *semap = 0; 952 1.101 mjacob return (1); 953 1.101 mjacob default: 954 1.101 mjacob ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT); 955 1.101 mjacob isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr); 956 1.101 mjacob return (0); 957 1.101 mjacob } 958 1.101 mjacob } 959 1.101 mjacob 960 1.101 mjacob static uint32_t 961 1.101 mjacob isp_pci_rd_reg_2400(ispsoftc_t *isp, int regoff) 962 1.101 mjacob { 963 1.101 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 964 1.101 mjacob uint32_t rv; 965 1.101 mjacob int block = regoff & _BLK_REG_MASK; 966 1.101 mjacob 967 1.101 mjacob switch (block) { 968 1.101 mjacob case BIU_BLOCK: 969 1.101 mjacob break; 970 1.101 mjacob case MBOX_BLOCK: 971 1.101 mjacob return (BXR2(pcs, IspVirt2Off(pcs, regoff))); 972 1.101 mjacob case SXP_BLOCK: 973 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "SXP_BLOCK read at 0x%x", regoff); 974 1.101 mjacob return (0xffffffff); 975 1.101 mjacob case RISC_BLOCK: 976 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "RISC_BLOCK read at 0x%x", regoff); 977 1.101 mjacob return (0xffffffff); 978 1.101 mjacob case DMA_BLOCK: 979 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "DMA_BLOCK read at 0x%x", regoff); 980 1.101 mjacob return (0xffffffff); 981 1.101 mjacob default: 982 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "unknown block read at 0x%x", regoff); 983 1.101 mjacob return (0xffffffff); 984 1.101 mjacob } 985 1.101 mjacob 986 1.101 mjacob 987 1.101 mjacob switch (regoff) { 988 1.101 mjacob case BIU2400_FLASH_ADDR: 989 1.101 mjacob case BIU2400_FLASH_DATA: 990 1.101 mjacob case BIU2400_ICR: 991 1.101 mjacob case BIU2400_ISR: 992 1.101 mjacob case BIU2400_CSR: 993 1.101 mjacob case BIU2400_REQINP: 994 1.101 mjacob case BIU2400_REQOUTP: 995 1.101 mjacob case BIU2400_RSPINP: 996 1.101 mjacob case BIU2400_RSPOUTP: 997 1.104 mjacob case BIU2400_PRI_REQINP: 998 1.104 mjacob case BIU2400_PRI_REQOUTP: 999 1.101 mjacob case BIU2400_ATIO_RSPINP: 1000 1.104 mjacob case BIU2400_ATIO_RSPOUTP: 1001 1.101 mjacob case BIU2400_HCCR: 1002 1.101 mjacob case BIU2400_GPIOD: 1003 1.101 mjacob case BIU2400_GPIOE: 1004 1.101 mjacob case BIU2400_HSEMA: 1005 1.101 mjacob rv = BXR4(pcs, IspVirt2Off(pcs, regoff)); 1006 1.101 mjacob break; 1007 1.101 mjacob case BIU2400_R2HSTSLO: 1008 1.101 mjacob rv = BXR4(pcs, IspVirt2Off(pcs, regoff)); 1009 1.101 mjacob break; 1010 1.101 mjacob case BIU2400_R2HSTSHI: 1011 1.101 mjacob rv = BXR4(pcs, IspVirt2Off(pcs, regoff)) >> 16; 1012 1.101 mjacob break; 1013 1.101 mjacob default: 1014 1.101 mjacob isp_prt(isp, ISP_LOGERR, 1015 1.101 mjacob "isp_pci_rd_reg_2400: unknown offset %x", regoff); 1016 1.101 mjacob rv = 0xffffffff; 1017 1.101 mjacob break; 1018 1.101 mjacob } 1019 1.101 mjacob return (rv); 1020 1.101 mjacob } 1021 1.101 mjacob 1022 1.101 mjacob static void 1023 1.101 mjacob isp_pci_wr_reg_2400(ispsoftc_t *isp, int regoff, uint32_t val) 1024 1.101 mjacob { 1025 1.101 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1026 1.101 mjacob int block = regoff & _BLK_REG_MASK; 1027 1.101 mjacob 1028 1.101 mjacob switch (block) { 1029 1.101 mjacob case BIU_BLOCK: 1030 1.101 mjacob break; 1031 1.101 mjacob case MBOX_BLOCK: 1032 1.101 mjacob BXW2(pcs, IspVirt2Off(pcs, regoff), val); 1033 1.116 martin (void)BXR2(pcs, IspVirt2Off(pcs, regoff)); 1034 1.101 mjacob return; 1035 1.101 mjacob case SXP_BLOCK: 1036 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "SXP_BLOCK write at 0x%x", regoff); 1037 1.101 mjacob return; 1038 1.101 mjacob case RISC_BLOCK: 1039 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "RISC_BLOCK write at 0x%x", regoff); 1040 1.101 mjacob return; 1041 1.101 mjacob case DMA_BLOCK: 1042 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "DMA_BLOCK write at 0x%x", regoff); 1043 1.101 mjacob return; 1044 1.101 mjacob default: 1045 1.101 mjacob isp_prt(isp, ISP_LOGWARN, "unknown block write at 0x%x", 1046 1.101 mjacob regoff); 1047 1.101 mjacob break; 1048 1.101 mjacob } 1049 1.101 mjacob 1050 1.101 mjacob switch (regoff) { 1051 1.101 mjacob case BIU2400_FLASH_ADDR: 1052 1.101 mjacob case BIU2400_FLASH_DATA: 1053 1.101 mjacob case BIU2400_ICR: 1054 1.101 mjacob case BIU2400_ISR: 1055 1.101 mjacob case BIU2400_CSR: 1056 1.101 mjacob case BIU2400_REQINP: 1057 1.101 mjacob case BIU2400_REQOUTP: 1058 1.101 mjacob case BIU2400_RSPINP: 1059 1.101 mjacob case BIU2400_RSPOUTP: 1060 1.104 mjacob case BIU2400_PRI_REQINP: 1061 1.104 mjacob case BIU2400_PRI_REQOUTP: 1062 1.101 mjacob case BIU2400_ATIO_RSPINP: 1063 1.104 mjacob case BIU2400_ATIO_RSPOUTP: 1064 1.101 mjacob case BIU2400_HCCR: 1065 1.101 mjacob case BIU2400_GPIOD: 1066 1.101 mjacob case BIU2400_GPIOE: 1067 1.101 mjacob case BIU2400_HSEMA: 1068 1.101 mjacob BXW4(pcs, IspVirt2Off(pcs, regoff), val); 1069 1.116 martin (void)BXR4(pcs, IspVirt2Off(pcs, regoff)); 1070 1.101 mjacob break; 1071 1.101 mjacob default: 1072 1.101 mjacob isp_prt(isp, ISP_LOGERR, 1073 1.101 mjacob "isp_pci_wr_reg_2400: bad offset 0x%x", regoff); 1074 1.101 mjacob break; 1075 1.101 mjacob } 1076 1.101 mjacob } 1077 1.101 mjacob #endif 1078 1.101 mjacob 1079 1.101 mjacob static uint32_t 1080 1.68 mjacob isp_pci_rd_reg(struct ispsoftc *isp, int regoff) 1081 1.1 cgd { 1082 1.101 mjacob uint32_t rv; 1083 1.1 cgd struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1084 1.72 mjacob int oldconf = 0; 1085 1.15 mjacob 1086 1.36 mjacob if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1087 1.1 cgd /* 1088 1.15 mjacob * We will assume that someone has paused the RISC processor. 1089 1.1 cgd */ 1090 1.72 mjacob oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1091 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1092 1.72 mjacob oldconf | BIU_PCI_CONF1_SXP); 1093 1.72 mjacob } 1094 1.72 mjacob rv = BXR2(pcs, IspVirt2Off(isp, regoff)); 1095 1.36 mjacob if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1096 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); 1097 1.15 mjacob } 1098 1.15 mjacob return (rv); 1099 1.1 cgd } 1100 1.1 cgd 1101 1.1 cgd static void 1102 1.101 mjacob isp_pci_wr_reg(struct ispsoftc *isp, int regoff, uint32_t val) 1103 1.1 cgd { 1104 1.1 cgd struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1105 1.72 mjacob int oldconf = 0; 1106 1.36 mjacob 1107 1.36 mjacob if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1108 1.1 cgd /* 1109 1.15 mjacob * We will assume that someone has paused the RISC processor. 1110 1.1 cgd */ 1111 1.72 mjacob oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1112 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1113 1.72 mjacob oldconf | BIU_PCI_CONF1_SXP); 1114 1.72 mjacob } 1115 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, regoff), val); 1116 1.36 mjacob if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1117 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); 1118 1.36 mjacob } 1119 1.36 mjacob } 1120 1.36 mjacob 1121 1.52 mjacob #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) 1122 1.101 mjacob static uint32_t 1123 1.68 mjacob isp_pci_rd_reg_1080(struct ispsoftc *isp, int regoff) 1124 1.36 mjacob { 1125 1.101 mjacob uint16_t rv, oc = 0; 1126 1.36 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1127 1.36 mjacob 1128 1.121 christos if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1129 1.101 mjacob uint16_t tc; 1130 1.36 mjacob /* 1131 1.36 mjacob * We will assume that someone has paused the RISC processor. 1132 1.36 mjacob */ 1133 1.72 mjacob oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1134 1.48 mjacob tc = oc & ~BIU_PCI1080_CONF1_DMA; 1135 1.72 mjacob if (regoff & SXP_BANK1_SELECT) 1136 1.72 mjacob tc |= BIU_PCI1080_CONF1_SXP1; 1137 1.72 mjacob else 1138 1.48 mjacob tc |= BIU_PCI1080_CONF1_SXP0; 1139 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); 1140 1.36 mjacob } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 1141 1.72 mjacob oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1142 1.92 perry BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1143 1.72 mjacob oc | BIU_PCI1080_CONF1_DMA); 1144 1.72 mjacob } 1145 1.72 mjacob rv = BXR2(pcs, IspVirt2Off(isp, regoff)); 1146 1.48 mjacob if (oc) { 1147 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); 1148 1.36 mjacob } 1149 1.36 mjacob return (rv); 1150 1.36 mjacob } 1151 1.36 mjacob 1152 1.36 mjacob static void 1153 1.101 mjacob isp_pci_wr_reg_1080(struct ispsoftc *isp, int regoff, uint32_t val) 1154 1.36 mjacob { 1155 1.36 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1156 1.72 mjacob int oc = 0; 1157 1.36 mjacob 1158 1.121 christos if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1159 1.101 mjacob uint16_t tc; 1160 1.36 mjacob /* 1161 1.36 mjacob * We will assume that someone has paused the RISC processor. 1162 1.36 mjacob */ 1163 1.72 mjacob oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1164 1.48 mjacob tc = oc & ~BIU_PCI1080_CONF1_DMA; 1165 1.72 mjacob if (regoff & SXP_BANK1_SELECT) 1166 1.72 mjacob tc |= BIU_PCI1080_CONF1_SXP1; 1167 1.72 mjacob else 1168 1.48 mjacob tc |= BIU_PCI1080_CONF1_SXP0; 1169 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); 1170 1.36 mjacob } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 1171 1.72 mjacob oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1172 1.92 perry BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1173 1.72 mjacob oc | BIU_PCI1080_CONF1_DMA); 1174 1.72 mjacob } 1175 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, regoff), val); 1176 1.48 mjacob if (oc) { 1177 1.72 mjacob BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); 1178 1.15 mjacob } 1179 1.1 cgd } 1180 1.36 mjacob #endif 1181 1.1 cgd 1182 1.13 thorpej static int 1183 1.68 mjacob isp_pci_mbxdma(struct ispsoftc *isp) 1184 1.1 cgd { 1185 1.53 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1186 1.75 mjacob bus_dma_tag_t dmat = isp->isp_dmatag; 1187 1.53 mjacob bus_dma_segment_t sg; 1188 1.103 mjacob bus_size_t len, dbound; 1189 1.15 mjacob fcparam *fcp; 1190 1.53 mjacob int rs, i; 1191 1.13 thorpej 1192 1.43 mjacob if (isp->isp_rquest_dma) /* been here before? */ 1193 1.43 mjacob return (0); 1194 1.43 mjacob 1195 1.103 mjacob if (isp->isp_type <= ISP_HA_SCSI_1040B) { 1196 1.103 mjacob dbound = 1 << 24; 1197 1.103 mjacob } else { 1198 1.103 mjacob /* 1199 1.103 mjacob * For 32-bit PCI DMA, the range is 32 bits or zero :-) 1200 1.103 mjacob */ 1201 1.103 mjacob dbound = 0; 1202 1.103 mjacob } 1203 1.111 mjacob len = isp->isp_maxcmds * sizeof (isp_hdl_t); 1204 1.111 mjacob isp->isp_xflist = (isp_hdl_t *) malloc(len, M_DEVBUF, M_WAITOK); 1205 1.43 mjacob if (isp->isp_xflist == NULL) { 1206 1.53 mjacob isp_prt(isp, ISP_LOGERR, "cannot malloc xflist array"); 1207 1.43 mjacob return (1); 1208 1.43 mjacob } 1209 1.70 thorpej memset(isp->isp_xflist, 0, len); 1210 1.111 mjacob for (len = 0; len < isp->isp_maxcmds - 1; len++) { 1211 1.111 mjacob isp->isp_xflist[len].cmd = &isp->isp_xflist[len+1]; 1212 1.111 mjacob } 1213 1.111 mjacob isp->isp_xffree = isp->isp_xflist; 1214 1.45 mjacob len = isp->isp_maxcmds * sizeof (bus_dmamap_t); 1215 1.53 mjacob pcs->pci_xfer_dmap = (bus_dmamap_t *) malloc(len, M_DEVBUF, M_WAITOK); 1216 1.53 mjacob if (pcs->pci_xfer_dmap == NULL) { 1217 1.53 mjacob free(isp->isp_xflist, M_DEVBUF); 1218 1.53 mjacob isp->isp_xflist = NULL; 1219 1.88 wiz isp_prt(isp, ISP_LOGERR, "cannot malloc DMA map array"); 1220 1.53 mjacob return (1); 1221 1.53 mjacob } 1222 1.53 mjacob for (i = 0; i < isp->isp_maxcmds; i++) { 1223 1.59 thorpej if (bus_dmamap_create(dmat, MAXPHYS, (MAXPHYS / PAGE_SIZE) + 1, 1224 1.103 mjacob MAXPHYS, dbound, BUS_DMA_NOWAIT, &pcs->pci_xfer_dmap[i])) { 1225 1.88 wiz isp_prt(isp, ISP_LOGERR, "cannot create DMA maps"); 1226 1.53 mjacob break; 1227 1.53 mjacob } 1228 1.53 mjacob } 1229 1.53 mjacob if (i < isp->isp_maxcmds) { 1230 1.53 mjacob while (--i >= 0) { 1231 1.53 mjacob bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]); 1232 1.53 mjacob } 1233 1.53 mjacob free(isp->isp_xflist, M_DEVBUF); 1234 1.53 mjacob free(pcs->pci_xfer_dmap, M_DEVBUF); 1235 1.53 mjacob isp->isp_xflist = NULL; 1236 1.53 mjacob pcs->pci_xfer_dmap = NULL; 1237 1.45 mjacob return (1); 1238 1.45 mjacob } 1239 1.43 mjacob 1240 1.13 thorpej /* 1241 1.13 thorpej * Allocate and map the request queue. 1242 1.13 thorpej */ 1243 1.53 mjacob len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1244 1.101 mjacob if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, 0)) { 1245 1.101 mjacob goto dmafail; 1246 1.101 mjacob } 1247 1.101 mjacob if (bus_dmamem_map(isp->isp_dmatag, &sg, rs, len, 1248 1.101 mjacob (void *)&isp->isp_rquest, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 1249 1.53 mjacob goto dmafail; 1250 1.53 mjacob } 1251 1.103 mjacob if (bus_dmamap_create(dmat, len, 1, len, dbound, BUS_DMA_NOWAIT, 1252 1.101 mjacob &isp->isp_rqdmap)) { 1253 1.101 mjacob goto dmafail; 1254 1.101 mjacob } 1255 1.101 mjacob if (bus_dmamap_load(dmat, isp->isp_rqdmap, isp->isp_rquest, len, NULL, 1256 1.53 mjacob BUS_DMA_NOWAIT)) { 1257 1.53 mjacob goto dmafail; 1258 1.53 mjacob } 1259 1.75 mjacob isp->isp_rquest_dma = isp->isp_rqdmap->dm_segs[0].ds_addr; 1260 1.13 thorpej 1261 1.13 thorpej /* 1262 1.13 thorpej * Allocate and map the result queue. 1263 1.13 thorpej */ 1264 1.53 mjacob len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); 1265 1.59 thorpej if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, 1266 1.101 mjacob BUS_DMA_NOWAIT)) { 1267 1.101 mjacob goto dmafail; 1268 1.101 mjacob } 1269 1.101 mjacob if (bus_dmamem_map(dmat, &sg, rs, len, 1270 1.101 mjacob (void *)&isp->isp_result, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 1271 1.53 mjacob goto dmafail; 1272 1.53 mjacob } 1273 1.103 mjacob if (bus_dmamap_create(dmat, len, 1, len, dbound, BUS_DMA_NOWAIT, 1274 1.101 mjacob &isp->isp_rsdmap)) { 1275 1.101 mjacob goto dmafail; 1276 1.101 mjacob } 1277 1.101 mjacob if (bus_dmamap_load(dmat, isp->isp_rsdmap, isp->isp_result, len, NULL, 1278 1.53 mjacob BUS_DMA_NOWAIT)) { 1279 1.53 mjacob goto dmafail; 1280 1.53 mjacob } 1281 1.75 mjacob isp->isp_result_dma = isp->isp_rsdmap->dm_segs[0].ds_addr; 1282 1.1 cgd 1283 1.41 mjacob if (IS_SCSI(isp)) { 1284 1.15 mjacob return (0); 1285 1.15 mjacob } 1286 1.1 cgd 1287 1.101 mjacob /* 1288 1.101 mjacob * Allocate and map an FC scratch area 1289 1.101 mjacob */ 1290 1.15 mjacob fcp = isp->isp_param; 1291 1.104 mjacob len = ISP_FC_SCRLEN; 1292 1.104 mjacob if (bus_dmamem_alloc(dmat, len, sizeof (uint64_t), 0, &sg, 1, &rs, 1293 1.101 mjacob BUS_DMA_NOWAIT)) { 1294 1.101 mjacob goto dmafail; 1295 1.101 mjacob } 1296 1.101 mjacob if (bus_dmamem_map(dmat, &sg, rs, len, 1297 1.101 mjacob (void *)&fcp->isp_scratch, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 1298 1.53 mjacob goto dmafail; 1299 1.53 mjacob } 1300 1.103 mjacob if (bus_dmamap_create(dmat, len, 1, len, dbound, BUS_DMA_NOWAIT, 1301 1.101 mjacob &isp->isp_scdmap)) { 1302 1.101 mjacob goto dmafail; 1303 1.101 mjacob } 1304 1.101 mjacob if (bus_dmamap_load(dmat, isp->isp_scdmap, fcp->isp_scratch, len, NULL, 1305 1.53 mjacob BUS_DMA_NOWAIT)) { 1306 1.53 mjacob goto dmafail; 1307 1.53 mjacob } 1308 1.75 mjacob fcp->isp_scdma = isp->isp_scdmap->dm_segs[0].ds_addr; 1309 1.13 thorpej return (0); 1310 1.53 mjacob dmafail: 1311 1.88 wiz isp_prt(isp, ISP_LOGERR, "mailbox DMA setup failure"); 1312 1.53 mjacob for (i = 0; i < isp->isp_maxcmds; i++) { 1313 1.53 mjacob bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]); 1314 1.53 mjacob } 1315 1.53 mjacob free(isp->isp_xflist, M_DEVBUF); 1316 1.53 mjacob free(pcs->pci_xfer_dmap, M_DEVBUF); 1317 1.53 mjacob isp->isp_xflist = NULL; 1318 1.53 mjacob pcs->pci_xfer_dmap = NULL; 1319 1.53 mjacob return (1); 1320 1.1 cgd } 1321 1.1 cgd 1322 1.1 cgd static int 1323 1.109 mjacob isp_pci_dmasetup(struct ispsoftc *isp, struct scsipi_xfer *xs, void *arg) 1324 1.1 cgd { 1325 1.53 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1326 1.109 mjacob ispreq_t *rq = arg; 1327 1.52 mjacob bus_dmamap_t dmap; 1328 1.109 mjacob bus_dma_segment_t *dm_segs; 1329 1.111 mjacob uint32_t nsegs, hidx; 1330 1.109 mjacob isp_ddir_t ddir; 1331 1.1 cgd 1332 1.111 mjacob hidx = isp_handle_index(isp, rq->req_handle); 1333 1.111 mjacob if (hidx == ISP_BAD_HANDLE_INDEX) { 1334 1.111 mjacob XS_SETERR(xs, HBA_BOTCH); 1335 1.111 mjacob return (CMD_COMPLETE); 1336 1.111 mjacob } 1337 1.111 mjacob dmap = pcs->pci_xfer_dmap[hidx]; 1338 1.1 cgd if (xs->datalen == 0) { 1339 1.109 mjacob ddir = ISP_NOXFR; 1340 1.109 mjacob nsegs = 0; 1341 1.109 mjacob dm_segs = NULL; 1342 1.109 mjacob } else { 1343 1.109 mjacob int error; 1344 1.109 mjacob uint32_t flag, flg2; 1345 1.109 mjacob 1346 1.109 mjacob if (sizeof (bus_addr_t) > 4) { 1347 1.109 mjacob if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) { 1348 1.109 mjacob rq->req_header.rqs_entry_type = RQSTYPE_T3RQS; 1349 1.109 mjacob } else if (rq->req_header.rqs_entry_type == RQSTYPE_REQUEST) { 1350 1.109 mjacob rq->req_header.rqs_entry_type = RQSTYPE_A64; 1351 1.109 mjacob } 1352 1.51 mjacob } 1353 1.13 thorpej 1354 1.109 mjacob if (xs->xs_control & XS_CTL_DATA_IN) { 1355 1.109 mjacob flg2 = BUS_DMASYNC_PREREAD; 1356 1.109 mjacob flag = BUS_DMA_READ; 1357 1.109 mjacob ddir = ISP_FROM_DEVICE; 1358 1.15 mjacob } else { 1359 1.109 mjacob flg2 = BUS_DMASYNC_PREWRITE; 1360 1.109 mjacob flag = BUS_DMA_WRITE; 1361 1.109 mjacob ddir = ISP_TO_DEVICE; 1362 1.15 mjacob } 1363 1.118 msaitoh error = bus_dmamap_load(isp->isp_dmatag, dmap, xs->data, 1364 1.118 msaitoh xs->datalen, NULL, ((xs->xs_control & XS_CTL_NOSLEEP) ? 1365 1.118 msaitoh BUS_DMA_NOWAIT : 1366 1.118 msaitoh BUS_DMA_WAITOK) | BUS_DMA_STREAMING | flag); 1367 1.109 mjacob if (error) { 1368 1.118 msaitoh isp_prt(isp, ISP_LOGWARN, "unable to load DMA (%d)", 1369 1.118 msaitoh error); 1370 1.21 mjacob XS_SETERR(xs, HBA_BOTCH); 1371 1.109 mjacob if (error == EAGAIN || error == ENOMEM) { 1372 1.109 mjacob return (CMD_EAGAIN); 1373 1.109 mjacob } else { 1374 1.109 mjacob return (CMD_COMPLETE); 1375 1.109 mjacob } 1376 1.101 mjacob } 1377 1.109 mjacob dm_segs = dmap->dm_segs; 1378 1.109 mjacob nsegs = dmap->dm_nsegs; 1379 1.118 msaitoh bus_dmamap_sync(isp->isp_dmatag, dmap, 0, dmap->dm_mapsize, 1380 1.118 msaitoh flg2); 1381 1.101 mjacob } 1382 1.101 mjacob 1383 1.118 msaitoh if (isp_send_cmd(isp, rq, dm_segs, nsegs, xs->datalen, ddir) 1384 1.118 msaitoh != CMD_QUEUED) { 1385 1.109 mjacob return (CMD_EAGAIN); 1386 1.101 mjacob } else { 1387 1.109 mjacob return (CMD_QUEUED); 1388 1.101 mjacob } 1389 1.101 mjacob } 1390 1.101 mjacob 1391 1.26 mjacob static int 1392 1.68 mjacob isp_pci_intr(void *arg) 1393 1.26 mjacob { 1394 1.101 mjacob uint32_t isr; 1395 1.101 mjacob uint16_t sema, mbox; 1396 1.72 mjacob struct ispsoftc *isp = arg; 1397 1.72 mjacob 1398 1.72 mjacob isp->isp_intcnt++; 1399 1.72 mjacob if (ISP_READ_ISR(isp, &isr, &sema, &mbox) == 0) { 1400 1.92 perry isp->isp_intbogus++; 1401 1.72 mjacob return (0); 1402 1.72 mjacob } else { 1403 1.72 mjacob isp->isp_osinfo.onintstack = 1; 1404 1.72 mjacob isp_intr(isp, isr, sema, mbox); 1405 1.72 mjacob isp->isp_osinfo.onintstack = 0; 1406 1.72 mjacob return (1); 1407 1.72 mjacob } 1408 1.13 thorpej } 1409 1.13 thorpej 1410 1.13 thorpej static void 1411 1.101 mjacob isp_pci_dmateardown(struct ispsoftc *isp, XS_T *xs, uint32_t handle) 1412 1.13 thorpej { 1413 1.53 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1414 1.111 mjacob uint32_t hidx; 1415 1.111 mjacob bus_dmamap_t dmap; 1416 1.111 mjacob 1417 1.111 mjacob hidx = isp_handle_index(isp, handle); 1418 1.111 mjacob if (hidx == ISP_BAD_HANDLE_INDEX) { 1419 1.111 mjacob isp_xs_prt(isp, xs, ISP_LOGERR, "bad handle on teardown"); 1420 1.111 mjacob return; 1421 1.111 mjacob } 1422 1.111 mjacob dmap = pcs->pci_xfer_dmap[hidx]; 1423 1.75 mjacob bus_dmamap_sync(isp->isp_dmatag, dmap, 0, dmap->dm_mapsize, 1424 1.42 thorpej xs->xs_control & XS_CTL_DATA_IN ? 1425 1.13 thorpej BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 1426 1.75 mjacob bus_dmamap_unload(isp->isp_dmatag, dmap); 1427 1.1 cgd } 1428 1.1 cgd 1429 1.1 cgd static void 1430 1.101 mjacob isp_pci_reset0(ispsoftc_t *isp) 1431 1.1 cgd { 1432 1.101 mjacob ISP_DISABLE_INTS(isp); 1433 1.101 mjacob } 1434 1.101 mjacob 1435 1.101 mjacob static void 1436 1.101 mjacob isp_pci_reset1(ispsoftc_t *isp) 1437 1.101 mjacob { 1438 1.101 mjacob if (!IS_24XX(isp)) { 1439 1.101 mjacob /* Make sure the BIOS is disabled */ 1440 1.101 mjacob isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS); 1441 1.76 mjacob } 1442 1.101 mjacob /* and enable interrupts */ 1443 1.101 mjacob ISP_ENABLE_INTS(isp); 1444 1.15 mjacob } 1445 1.15 mjacob 1446 1.15 mjacob static void 1447 1.68 mjacob isp_pci_dumpregs(struct ispsoftc *isp, const char *msg) 1448 1.15 mjacob { 1449 1.53 mjacob struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1450 1.53 mjacob if (msg) 1451 1.110 tsutsui printf("%s: %s\n", device_xname(isp->isp_osinfo.dev), msg); 1452 1.53 mjacob if (IS_SCSI(isp)) 1453 1.53 mjacob printf(" biu_conf1=%x", ISP_READ(isp, BIU_CONF1)); 1454 1.53 mjacob else 1455 1.53 mjacob printf(" biu_csr=%x", ISP_READ(isp, BIU2100_CSR)); 1456 1.53 mjacob printf(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR), 1457 1.53 mjacob ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA)); 1458 1.53 mjacob printf("risc_hccr=%x\n", ISP_READ(isp, HCCR)); 1459 1.53 mjacob 1460 1.53 mjacob 1461 1.53 mjacob if (IS_SCSI(isp)) { 1462 1.53 mjacob ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 1463 1.53 mjacob printf(" cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n", 1464 1.53 mjacob ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS), 1465 1.53 mjacob ISP_READ(isp, CDMA_FIFO_STS)); 1466 1.53 mjacob printf(" ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n", 1467 1.53 mjacob ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS), 1468 1.53 mjacob ISP_READ(isp, DDMA_FIFO_STS)); 1469 1.53 mjacob printf(" sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n", 1470 1.53 mjacob ISP_READ(isp, SXP_INTERRUPT), 1471 1.53 mjacob ISP_READ(isp, SXP_GROSS_ERR), 1472 1.53 mjacob ISP_READ(isp, SXP_PINS_CTRL)); 1473 1.53 mjacob ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 1474 1.53 mjacob } 1475 1.53 mjacob printf(" mbox regs: %x %x %x %x %x\n", 1476 1.53 mjacob ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1), 1477 1.53 mjacob ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3), 1478 1.53 mjacob ISP_READ(isp, OUTMAILBOX4)); 1479 1.53 mjacob printf(" PCI Status Command/Status=%x\n", 1480 1.53 mjacob pci_conf_read(pcs->pci_pc, pcs->pci_tag, PCI_COMMAND_STATUS_REG)); 1481 1.1 cgd } 1482