]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c
Filter TCP connections to SO_REUSEPORT_LB listen sockets by NUMA domain
[FreeBSD/FreeBSD.git] / sys / dev / bhnd / bhndb / bhndb_pci_hwdata.c
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 };