1 /*- 2 * Copyright (c) 2015 Landon Fuller <landon@landonf.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer, 10 * without modification. 11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 13 * redistribution must be conditioned upon including a substantially 14 * similar Disclaimer requirement for further binary redistribution. 15 * 16 * NO WARRANTY 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 20 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 22 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 27 * THE POSSIBILITY OF SUCH DAMAGES. 28 */ 29 30 #include <sys/cdefs.h> 31 __FBSDID("$FreeBSD$"); 32 33 /* 34 * Resource specifications and register maps for Broadcom PCI/PCIe cores 35 * configured as PCI-BHND bridges. 36 */ 37 38 #include <sys/param.h> 39 #include <sys/bus.h> 40 41 #include <machine/bus.h> 42 #include <sys/rman.h> 43 #include <machine/resource.h> 44 45 #include <dev/pci/pcireg.h> 46 #include <dev/pci/pcivar.h> 47 48 #include <dev/bhnd/cores/pci/bhnd_pcireg.h> 49 #include <dev/bhnd/cores/pcie2/bhnd_pcie2_reg.h> 50 51 #include "bhndbvar.h" 52 #include "bhndb_pcireg.h" 53 54 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v0; 55 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pci; 56 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pcie; 57 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v2; 58 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v3; 59 60 /** 61 * Define a bhndb_hw match entry. 62 * 63 * @param _name The entry name. 64 * @param _vers The configuration version associated with this entry. 65 */ 66 #define BHNDB_HW_MATCH(_name, _vers, ...) { \ 67 .name = _name, \ 68 .hw_reqs = _BHNDB_HW_REQ_ARRAY(__VA_ARGS__), \ 69 .num_hw_reqs = (sizeof(_BHNDB_HW_REQ_ARRAY(__VA_ARGS__)) / \ 70 sizeof(_BHNDB_HW_REQ_ARRAY(__VA_ARGS__)[0])), \ 71 .cfg = &bhndb_pci_hwcfg_ ## _vers \ 72 } 73 #define _BHNDB_HW_REQ_ARRAY(...) (struct bhnd_core_match[]) { __VA_ARGS__ } 74 75 /** 76 * Generic PCI-SIBA bridge configuration usable with all known siba(4)-based 77 * PCI devices; this configuration is adequate for enumerating a bridged 78 * siba(4) bus to determine the full hardware configuration. 79 * 80 * @par Compatibility 81 * - Compatible with PCI_V0, PCI_V1, PCI_V2, and PCI_V3 devices. 82 * - Compatible with siba(4) bus enumeration. 83 * - Compatible with bcma(4) bus enumeration if the ChipCommon core is mapped 84 * at the default enumeration address (0x18000000). 85 */ 86 const struct bhndb_hwcfg bhndb_pci_siba_generic_hwcfg = { 87 .resource_specs = (const struct resource_spec[]) { 88 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 89 { -1, 0, 0 } 90 }, 91 92 .register_windows = (const struct bhndb_regwin[]) { 93 /* bar0+0x0000: configurable backplane window */ 94 { 95 .win_type = BHNDB_REGWIN_T_DYN, 96 .win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET, 97 .win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE, 98 .d.dyn = { 99 .cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL 100 }, 101 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 102 }, 103 BHNDB_REGWIN_TABLE_END 104 }, 105 106 /* DMA unsupported under generic configuration */ 107 .dma_translations = NULL, 108 }; 109 110 /** 111 * Generic PCI-BCMA bridge configuration usable with all known bcma(4)-based 112 * PCI devices; this configuration is adequate for enumerating a bridged 113 * bcma(4) bus to determine the full hardware configuration. 114 * 115 * @par Compatibility 116 * - Compatible with PCI_V1, PCI_V2, and PCI_V3 devices. 117 * - Compatible with both siba(4) and bcma(4) bus enumeration. 118 */ 119 const struct bhndb_hwcfg bhndb_pci_bcma_generic_hwcfg = { 120 .resource_specs = (const struct resource_spec[]) { 121 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 122 { -1, 0, 0 } 123 }, 124 125 .register_windows = (const struct bhndb_regwin[]) { 126 /* bar0+0x0000: configurable backplane window */ 127 { 128 .win_type = BHNDB_REGWIN_T_DYN, 129 .win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET, 130 .win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE, 131 .d.dyn = { 132 .cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL, 133 }, 134 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 135 }, 136 137 /* bar0+0x3000: chipc core registers */ 138 { 139 .win_type = BHNDB_REGWIN_T_CORE, 140 .win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET, 141 .win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE, 142 .d.core = { 143 .class = BHND_DEVCLASS_CC, 144 .unit = 0, 145 .port = 0, 146 .region = 0, 147 .port_type = BHND_PORT_DEVICE 148 }, 149 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 150 }, 151 152 BHNDB_REGWIN_TABLE_END 153 }, 154 155 /* DMA unsupported under generic configuration */ 156 .dma_translations = NULL, 157 }; 158 159 /** 160 * Hardware configuration tables for Broadcom HND PCI NICs. 161 */ 162 const struct bhndb_hw bhndb_pci_generic_hw_table[] = { 163 /* PCI/V0 WLAN */ 164 BHNDB_HW_MATCH("PCI/v0 WLAN", v0, 165 /* PCI Core */ 166 { 167 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 168 BHND_MATCH_CORE_ID (BHND_COREID_PCI), 169 BHND_MATCH_CORE_REV( 170 HWREV_LTE (BHNDB_PCI_V0_MAX_PCI_HWREV)), 171 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCI), 172 BHND_MATCH_CORE_UNIT (0) 173 }, 174 175 /* 802.11 Core */ 176 { 177 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 178 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN), 179 BHND_MATCH_CORE_UNIT (0) 180 } 181 ), 182 183 /* PCI/V1 WLAN */ 184 BHNDB_HW_MATCH("PCI/v1 WLAN", v1_pci, 185 /* PCI Core */ 186 { 187 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 188 BHND_MATCH_CORE_ID (BHND_COREID_PCI), 189 BHND_MATCH_CORE_REV( 190 HWREV_GTE (BHNDB_PCI_V1_MIN_PCI_HWREV)), 191 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCI), 192 BHND_MATCH_CORE_UNIT (0) 193 }, 194 195 /* 802.11 Core */ 196 { 197 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 198 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN), 199 BHND_MATCH_CORE_UNIT (0) 200 } 201 ), 202 203 /* PCIE/V1 WLAN */ 204 BHNDB_HW_MATCH("PCIe/v1 WLAN", v1_pcie, 205 /* PCIe Core */ 206 { 207 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 208 BHND_MATCH_CORE_ID (BHND_COREID_PCIE), 209 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE), 210 BHND_MATCH_CORE_UNIT (0) 211 }, 212 213 /* ChipCommon (revision <= 31) */ 214 { 215 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 216 BHND_MATCH_CORE_ID (BHND_COREID_CC), 217 BHND_MATCH_CORE_REV( 218 HWREV_LTE (BHNDB_PCI_V1_MAX_CHIPC_HWREV)), 219 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_CC), 220 BHND_MATCH_CORE_UNIT (0) 221 }, 222 223 /* 802.11 Core */ 224 { 225 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 226 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN), 227 BHND_MATCH_CORE_UNIT (0) 228 } 229 ), 230 231 /* PCIE/V2 WLAN */ 232 BHNDB_HW_MATCH("PCIe/v2 WLAN", v2, 233 /* PCIe Core */ 234 { 235 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 236 BHND_MATCH_CORE_ID (BHND_COREID_PCIE), 237 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE), 238 BHND_MATCH_CORE_UNIT (0) 239 }, 240 241 /* ChipCommon (revision >= 32) */ 242 { 243 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 244 BHND_MATCH_CORE_ID (BHND_COREID_CC), 245 BHND_MATCH_CORE_REV( 246 HWREV_GTE (BHNDB_PCI_V2_MIN_CHIPC_HWREV)), 247 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_CC), 248 BHND_MATCH_CORE_UNIT (0) 249 }, 250 251 /* 802.11 Core */ 252 { 253 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 254 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN), 255 BHND_MATCH_CORE_UNIT (0) 256 } 257 ), 258 259 /* PCIE/V3 WLAN */ 260 BHNDB_HW_MATCH("PCIe-Gen2/v3 WLAN", v3, 261 /* PCIe Gen2 Core */ 262 { 263 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 264 BHND_MATCH_CORE_ID (BHND_COREID_PCIE2), 265 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE), 266 BHND_MATCH_CORE_UNIT (0) 267 }, 268 269 /* 802.11 Core */ 270 { 271 BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM), 272 BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN), 273 BHND_MATCH_CORE_UNIT (0) 274 } 275 ), 276 { NULL, NULL, 0, NULL } 277 }; 278 279 /** 280 * PCI_V0 hardware configuration. 281 * 282 * Applies to: 283 * - PCI (cid=0x804, revision <= 12) 284 */ 285 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v0 = { 286 .resource_specs = (const struct resource_spec[]) { 287 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 288 { -1, 0, 0 } 289 }, 290 291 .register_windows = (const struct bhndb_regwin[]) { 292 /* bar0+0x0000: configurable backplane window */ 293 { 294 .win_type = BHNDB_REGWIN_T_DYN, 295 .win_offset = BHNDB_PCI_V0_BAR0_WIN0_OFFSET, 296 .win_size = BHNDB_PCI_V0_BAR0_WIN0_SIZE, 297 .d.dyn = { 298 .cfg_offset = BHNDB_PCI_V0_BAR0_WIN0_CONTROL 299 }, 300 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 301 }, 302 303 /* bar0+0x1000: sprom shadow */ 304 { 305 .win_type = BHNDB_REGWIN_T_SPROM, 306 .win_offset = BHNDB_PCI_V0_BAR0_SPROM_OFFSET, 307 .win_size = BHNDB_PCI_V0_BAR0_SPROM_SIZE, 308 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 309 }, 310 311 /* 312 * bar0+0x1800: pci core registers. 313 * 314 * Does not include the SSB CFG registers found at the end of 315 * the 4K core register block; these are mapped non-contigiously 316 * by the next entry. 317 */ 318 { 319 .win_type = BHNDB_REGWIN_T_CORE, 320 .win_offset = BHNDB_PCI_V0_BAR0_PCIREG_OFFSET, 321 .win_size = BHNDB_PCI_V0_BAR0_PCIREG_SIZE, 322 .d.core = { 323 .class = BHND_DEVCLASS_PCI, 324 .unit = 0, 325 .port = 0, 326 .region = 0, 327 .port_type = BHND_PORT_DEVICE, 328 }, 329 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 330 }, 331 332 /* bar0+0x1E00: pci core (SSB CFG registers) */ 333 { 334 .win_type = BHNDB_REGWIN_T_CORE, 335 .win_offset = BHNDB_PCI_V0_BAR0_PCISB_OFFSET , 336 .win_size = BHNDB_PCI_V0_BAR0_PCISB_SIZE, 337 .d.core = { 338 .class = BHND_DEVCLASS_PCI, 339 .unit = 0, 340 .port = 0, 341 .region = 0, 342 .offset = BHNDB_PCI_V0_BAR0_PCISB_COREOFF, 343 .port_type = BHND_PORT_DEVICE 344 }, 345 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 346 }, 347 348 BHNDB_REGWIN_TABLE_END 349 }, 350 351 .dma_translations = (const struct bhnd_dma_translation[]) { 352 { 353 .base_addr = BHND_PCI_DMA32_TRANSLATION, 354 .addr_mask = ~BHND_PCI_DMA32_MASK, 355 .addrext_mask = BHND_PCI_DMA32_MASK 356 }, 357 BHND_DMA_TRANSLATION_TABLE_END 358 } 359 }; 360 361 /** 362 * PCI_V1 (PCI-only) hardware configuration (PCI version) 363 * 364 * Applies to: 365 * - PCI (cid=0x804, revision >= 13) 366 */ 367 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pci = { 368 .resource_specs = (const struct resource_spec[]) { 369 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 370 { -1, 0, 0 } 371 }, 372 373 .register_windows = (const struct bhndb_regwin[]) { 374 /* bar0+0x0000: configurable backplane window */ 375 { 376 .win_type = BHNDB_REGWIN_T_DYN, 377 .win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET, 378 .win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE, 379 .d.dyn = { 380 .cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL 381 }, 382 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 383 }, 384 385 /* bar0+0x1000: sprom shadow */ 386 { 387 .win_type = BHNDB_REGWIN_T_SPROM, 388 .win_offset = BHNDB_PCI_V1_BAR0_SPROM_OFFSET, 389 .win_size = BHNDB_PCI_V1_BAR0_SPROM_SIZE, 390 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 391 }, 392 393 /* bar0+0x2000: pci core registers */ 394 { 395 .win_type = BHNDB_REGWIN_T_CORE, 396 .win_offset = BHNDB_PCI_V1_BAR0_PCIREG_OFFSET, 397 .win_size = BHNDB_PCI_V1_BAR0_PCIREG_SIZE, 398 .d.core = { 399 .class = BHND_DEVCLASS_PCI, 400 .unit = 0, 401 .port = 0, 402 .region = 0, 403 .port_type = BHND_PORT_DEVICE 404 }, 405 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 406 }, 407 408 /* bar0+0x3000: chipc core registers */ 409 { 410 .win_type = BHNDB_REGWIN_T_CORE, 411 .win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET, 412 .win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE, 413 .d.core = { 414 .class = BHND_DEVCLASS_CC, 415 .unit = 0, 416 .port = 0, 417 .region = 0, 418 .port_type = BHND_PORT_DEVICE 419 }, 420 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 421 }, 422 423 BHNDB_REGWIN_TABLE_END 424 }, 425 426 .dma_translations = (const struct bhnd_dma_translation[]) { 427 { 428 .base_addr = BHND_PCI_DMA32_TRANSLATION, 429 .addr_mask = ~BHND_PCI_DMA32_MASK, 430 .addrext_mask = BHND_PCI_DMA32_MASK 431 }, 432 BHND_DMA_TRANSLATION_TABLE_END 433 } 434 }; 435 436 /** 437 * PCI_V1 hardware configuration (PCIE version). 438 * 439 * Applies to: 440 * - PCIE (cid=0x820) with ChipCommon (revision <= 31) 441 */ 442 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pcie = { 443 .resource_specs = (const struct resource_spec[]) { 444 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 445 { -1, 0, 0 } 446 }, 447 448 .register_windows = (const struct bhndb_regwin[]) { 449 /* bar0+0x0000: configurable backplane window */ 450 { 451 .win_type = BHNDB_REGWIN_T_DYN, 452 .win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET, 453 .win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE, 454 .d.dyn = { 455 .cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL 456 }, 457 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 458 }, 459 460 /* bar0+0x1000: sprom shadow */ 461 { 462 .win_type = BHNDB_REGWIN_T_SPROM, 463 .win_offset = BHNDB_PCI_V1_BAR0_SPROM_OFFSET, 464 .win_size = BHNDB_PCI_V1_BAR0_SPROM_SIZE, 465 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 466 }, 467 468 /* bar0+0x2000: pci core registers */ 469 { 470 .win_type = BHNDB_REGWIN_T_CORE, 471 .win_offset = BHNDB_PCI_V1_BAR0_PCIREG_OFFSET, 472 .win_size = BHNDB_PCI_V1_BAR0_PCIREG_SIZE, 473 .d.core = { 474 .class = BHND_DEVCLASS_PCIE, 475 .unit = 0, 476 .port = 0, 477 .region = 0, 478 .port_type = BHND_PORT_DEVICE 479 }, 480 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 481 }, 482 483 /* bar0+0x3000: chipc core registers */ 484 { 485 .win_type = BHNDB_REGWIN_T_CORE, 486 .win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET, 487 .win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE, 488 .d.core = { 489 .class = BHND_DEVCLASS_CC, 490 .unit = 0, 491 .port = 0, 492 .region = 0, 493 .port_type = BHND_PORT_DEVICE 494 }, 495 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 496 }, 497 498 BHNDB_REGWIN_TABLE_END 499 }, 500 501 .dma_translations = (const struct bhnd_dma_translation[]) { 502 { 503 .base_addr = BHND_PCIE_DMA32_TRANSLATION, 504 .addr_mask = ~BHND_PCIE_DMA32_MASK, 505 .addrext_mask = BHND_PCIE_DMA32_MASK 506 }, 507 { 508 .base_addr = BHND_PCIE_DMA64_TRANSLATION, 509 .addr_mask = ~BHND_PCIE_DMA64_MASK, 510 .addrext_mask = BHND_PCIE_DMA64_MASK 511 }, 512 BHND_DMA_TRANSLATION_TABLE_END 513 } 514 }; 515 516 /** 517 * PCI_V2 hardware configuration. 518 * 519 * Applies to: 520 * - PCIE (cid=0x820) with ChipCommon (revision >= 32) 521 */ 522 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v2 = { 523 .resource_specs = (const struct resource_spec[]) { 524 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 525 { -1, 0, 0 } 526 }, 527 528 .register_windows = (const struct bhndb_regwin[]) { 529 /* bar0+0x0000: configurable backplane window */ 530 { 531 .win_type = BHNDB_REGWIN_T_DYN, 532 .win_offset = BHNDB_PCI_V2_BAR0_WIN0_OFFSET, 533 .win_size = BHNDB_PCI_V2_BAR0_WIN0_SIZE, 534 .d.dyn = { 535 .cfg_offset = BHNDB_PCI_V2_BAR0_WIN0_CONTROL, 536 }, 537 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 538 }, 539 540 /* bar0+0x1000: configurable backplane window */ 541 { 542 .win_type = BHNDB_REGWIN_T_DYN, 543 .win_offset = BHNDB_PCI_V2_BAR0_WIN1_OFFSET, 544 .win_size = BHNDB_PCI_V2_BAR0_WIN1_SIZE, 545 .d.dyn = { 546 .cfg_offset = BHNDB_PCI_V2_BAR0_WIN1_CONTROL, 547 }, 548 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 549 }, 550 551 /* bar0+0x2000: pcie core registers */ 552 { 553 .win_type = BHNDB_REGWIN_T_CORE, 554 .win_offset = BHNDB_PCI_V2_BAR0_PCIREG_OFFSET, 555 .win_size = BHNDB_PCI_V2_BAR0_PCIREG_SIZE, 556 .d.core = { 557 .class = BHND_DEVCLASS_PCIE, 558 .unit = 0, 559 .port = 0, 560 .region = 0, 561 .port_type = BHND_PORT_DEVICE 562 }, 563 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 564 }, 565 566 /* bar0+0x3000: chipc core registers */ 567 { 568 .win_type = BHNDB_REGWIN_T_CORE, 569 .win_offset = BHNDB_PCI_V2_BAR0_CCREGS_OFFSET, 570 .win_size = BHNDB_PCI_V2_BAR0_CCREGS_SIZE, 571 .d.core = { 572 .class = BHND_DEVCLASS_CC, 573 .unit = 0, 574 .port = 0, 575 .region = 0, 576 .port_type = BHND_PORT_DEVICE 577 }, 578 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 579 }, 580 581 BHNDB_REGWIN_TABLE_END 582 }, 583 584 .dma_translations = (const struct bhnd_dma_translation[]) { 585 { 586 .base_addr = BHND_PCIE_DMA32_TRANSLATION, 587 .addr_mask = ~BHND_PCIE_DMA32_MASK, 588 .addrext_mask = BHND_PCIE_DMA32_MASK 589 }, 590 { 591 .base_addr = BHND_PCIE_DMA64_TRANSLATION, 592 .addr_mask = ~BHND_PCIE_DMA64_MASK, 593 .addrext_mask = BHND_PCIE_DMA64_MASK 594 }, 595 BHND_DMA_TRANSLATION_TABLE_END 596 } 597 }; 598 599 /** 600 * PCI_V3 hardware configuration. 601 * 602 * Applies to: 603 * - PCIE2 (cid=0x83c) 604 */ 605 static const struct bhndb_hwcfg bhndb_pci_hwcfg_v3 = { 606 .resource_specs = (const struct resource_spec[]) { 607 { SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE }, 608 { -1, 0, 0 } 609 }, 610 611 .register_windows = (const struct bhndb_regwin[]) { 612 /* bar0+0x0000: configurable backplane window */ 613 { 614 .win_type = BHNDB_REGWIN_T_DYN, 615 .win_offset = BHNDB_PCI_V3_BAR0_WIN0_OFFSET, 616 .win_size = BHNDB_PCI_V3_BAR0_WIN0_SIZE, 617 .d.dyn = { 618 .cfg_offset = BHNDB_PCI_V3_BAR0_WIN0_CONTROL, 619 }, 620 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 621 }, 622 623 /* bar0+0x1000: configurable backplane window */ 624 { 625 .win_type = BHNDB_REGWIN_T_DYN, 626 .win_offset = BHNDB_PCI_V3_BAR0_WIN1_OFFSET, 627 .win_size = BHNDB_PCI_V3_BAR0_WIN1_SIZE, 628 .d.dyn = { 629 .cfg_offset = BHNDB_PCI_V3_BAR0_WIN1_CONTROL, 630 }, 631 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 632 }, 633 634 /* bar0+0x2000: pcie core registers */ 635 { 636 .win_type = BHNDB_REGWIN_T_CORE, 637 .win_offset = BHNDB_PCI_V3_BAR0_PCIREG_OFFSET, 638 .win_size = BHNDB_PCI_V3_BAR0_PCIREG_SIZE, 639 .d.core = { 640 .class = BHND_DEVCLASS_PCIE, 641 .unit = 0, 642 .port = 0, 643 .region = 0, 644 .port_type = BHND_PORT_DEVICE 645 }, 646 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 647 }, 648 649 /* bar0+0x3000: chipc core registers */ 650 { 651 .win_type = BHNDB_REGWIN_T_CORE, 652 .win_offset = BHNDB_PCI_V3_BAR0_CCREGS_OFFSET, 653 .win_size = BHNDB_PCI_V3_BAR0_CCREGS_SIZE, 654 .d.core = { 655 .class = BHND_DEVCLASS_CC, 656 .unit = 0, 657 .port = 0, 658 .region = 0, 659 .port_type = BHND_PORT_DEVICE 660 }, 661 .res = { SYS_RES_MEMORY, PCIR_BAR(0) } 662 }, 663 664 BHNDB_REGWIN_TABLE_END 665 }, 666 667 .dma_translations = (const struct bhnd_dma_translation[]) { 668 { 669 .base_addr = BHND_PCIE2_DMA64_TRANSLATION, 670 .addr_mask = ~BHND_PCIE2_DMA64_MASK, 671 .addrext_mask = BHND_PCIE_DMA64_MASK 672 }, 673 BHND_DMA_TRANSLATION_TABLE_END 674 } 675 }; 676