xref: /freebsd/sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c (revision 7ef62cebc2f965b0f640263e179276928885e33d)
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