#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/bhnd/cores/pci/bhnd_pcireg.h>
#include <dev/bhnd/cores/pcie2/bhnd_pcie2_reg.h>
#include "bhndbvar.h"
#include "bhndb_pcireg.h"
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v0;
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pci;
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pcie;
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v2;
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v3;
#define BHNDB_HW_MATCH(_name, _vers, ...) { \
.name = _name, \
.hw_reqs = _BHNDB_HW_REQ_ARRAY(__VA_ARGS__), \
.num_hw_reqs = (sizeof(_BHNDB_HW_REQ_ARRAY(__VA_ARGS__)) / \
sizeof(_BHNDB_HW_REQ_ARRAY(__VA_ARGS__)[0])), \
.cfg = &bhndb_pci_hwcfg_ ## _vers \
}
#define _BHNDB_HW_REQ_ARRAY(...) (struct bhnd_core_match[]) { __VA_ARGS__ }
const struct bhndb_hwcfg bhndb_pci_siba_generic_hwcfg = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = NULL,
};
const struct bhndb_hwcfg bhndb_pci_bcma_generic_hwcfg = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE,
.d.core = {
.class = BHND_DEVCLASS_CC,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = NULL,
};
const struct bhndb_hw bhndb_pci_generic_hw_table[] = {
BHNDB_HW_MATCH("PCI/v0 WLAN", v0,
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_PCI),
BHND_MATCH_CORE_REV(
HWREV_LTE (BHNDB_PCI_V0_MAX_PCI_HWREV)),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCI),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN),
BHND_MATCH_CORE_UNIT (0)
}
),
BHNDB_HW_MATCH("PCI/v1 WLAN", v1_pci,
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_PCI),
BHND_MATCH_CORE_REV(
HWREV_GTE (BHNDB_PCI_V1_MIN_PCI_HWREV)),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCI),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN),
BHND_MATCH_CORE_UNIT (0)
}
),
BHNDB_HW_MATCH("PCIe/v1 WLAN", v1_pcie,
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_PCIE),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_CC),
BHND_MATCH_CORE_REV(
HWREV_LTE (BHNDB_PCI_V1_MAX_CHIPC_HWREV)),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_CC),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN),
BHND_MATCH_CORE_UNIT (0)
}
),
BHNDB_HW_MATCH("PCIe/v2 WLAN", v2,
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_PCIE),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_CC),
BHND_MATCH_CORE_REV(
HWREV_GTE (BHNDB_PCI_V2_MIN_CHIPC_HWREV)),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_CC),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN),
BHND_MATCH_CORE_UNIT (0)
}
),
BHNDB_HW_MATCH("PCIe-Gen2/v3 WLAN", v3,
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_ID (BHND_COREID_PCIE2),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_PCIE),
BHND_MATCH_CORE_UNIT (0)
},
{
BHND_MATCH_CORE_VENDOR (BHND_MFGID_BCM),
BHND_MATCH_CORE_CLASS (BHND_DEVCLASS_WLAN),
BHND_MATCH_CORE_UNIT (0)
}
),
{ NULL, NULL, 0, NULL }
};
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v0 = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V0_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V0_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V0_BAR0_WIN0_CONTROL
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_SPROM,
.win_offset = BHNDB_PCI_V0_BAR0_SPROM_OFFSET,
.win_size = BHNDB_PCI_V0_BAR0_SPROM_SIZE,
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V0_BAR0_PCIREG_OFFSET,
.win_size = BHNDB_PCI_V0_BAR0_PCIREG_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCI,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V0_BAR0_PCISB_OFFSET ,
.win_size = BHNDB_PCI_V0_BAR0_PCISB_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCI,
.unit = 0,
.port = 0,
.region = 0,
.offset = BHNDB_PCI_V0_BAR0_PCISB_COREOFF,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = (const struct bhnd_dma_translation[]) {
{
.base_addr = BHND_PCI_DMA32_TRANSLATION,
.addr_mask = ~BHND_PCI_DMA32_MASK,
.addrext_mask = BHND_PCI_DMA32_MASK
},
BHND_DMA_TRANSLATION_TABLE_END
}
};
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pci = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_SPROM,
.win_offset = BHNDB_PCI_V1_BAR0_SPROM_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_SPROM_SIZE,
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V1_BAR0_PCIREG_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_PCIREG_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCI,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE,
.d.core = {
.class = BHND_DEVCLASS_CC,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = (const struct bhnd_dma_translation[]) {
{
.base_addr = BHND_PCI_DMA32_TRANSLATION,
.addr_mask = ~BHND_PCI_DMA32_MASK,
.addrext_mask = BHND_PCI_DMA32_MASK
},
BHND_DMA_TRANSLATION_TABLE_END
}
};
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pcie = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V1_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V1_BAR0_WIN0_CONTROL
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_SPROM,
.win_offset = BHNDB_PCI_V1_BAR0_SPROM_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_SPROM_SIZE,
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V1_BAR0_PCIREG_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_PCIREG_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCIE,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V1_BAR0_CCREGS_OFFSET,
.win_size = BHNDB_PCI_V1_BAR0_CCREGS_SIZE,
.d.core = {
.class = BHND_DEVCLASS_CC,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = (const struct bhnd_dma_translation[]) {
{
.base_addr = BHND_PCIE_DMA32_TRANSLATION,
.addr_mask = ~BHND_PCIE_DMA32_MASK,
.addrext_mask = BHND_PCIE_DMA32_MASK
},
{
.base_addr = BHND_PCIE_DMA64_TRANSLATION,
.addr_mask = ~BHND_PCIE_DMA64_MASK,
.addrext_mask = BHND_PCIE_DMA64_MASK
},
BHND_DMA_TRANSLATION_TABLE_END
}
};
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v2 = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V2_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V2_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V2_BAR0_WIN0_CONTROL,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V2_BAR0_WIN1_OFFSET,
.win_size = BHNDB_PCI_V2_BAR0_WIN1_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V2_BAR0_WIN1_CONTROL,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V2_BAR0_PCIREG_OFFSET,
.win_size = BHNDB_PCI_V2_BAR0_PCIREG_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCIE,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V2_BAR0_CCREGS_OFFSET,
.win_size = BHNDB_PCI_V2_BAR0_CCREGS_SIZE,
.d.core = {
.class = BHND_DEVCLASS_CC,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = (const struct bhnd_dma_translation[]) {
{
.base_addr = BHND_PCIE_DMA32_TRANSLATION,
.addr_mask = ~BHND_PCIE_DMA32_MASK,
.addrext_mask = BHND_PCIE_DMA32_MASK
},
{
.base_addr = BHND_PCIE_DMA64_TRANSLATION,
.addr_mask = ~BHND_PCIE_DMA64_MASK,
.addrext_mask = BHND_PCIE_DMA64_MASK
},
BHND_DMA_TRANSLATION_TABLE_END
}
};
static const struct bhndb_hwcfg bhndb_pci_hwcfg_v3 = {
.resource_specs = (const struct resource_spec[]) {
{ SYS_RES_MEMORY, PCIR_BAR(0), RF_ACTIVE },
{ -1, 0, 0 }
},
.register_windows = (const struct bhndb_regwin[]) {
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V3_BAR0_WIN0_OFFSET,
.win_size = BHNDB_PCI_V3_BAR0_WIN0_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V3_BAR0_WIN0_CONTROL,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_DYN,
.win_offset = BHNDB_PCI_V3_BAR0_WIN1_OFFSET,
.win_size = BHNDB_PCI_V3_BAR0_WIN1_SIZE,
.d.dyn = {
.cfg_offset = BHNDB_PCI_V3_BAR0_WIN1_CONTROL,
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V3_BAR0_PCIREG_OFFSET,
.win_size = BHNDB_PCI_V3_BAR0_PCIREG_SIZE,
.d.core = {
.class = BHND_DEVCLASS_PCIE,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
{
.win_type = BHNDB_REGWIN_T_CORE,
.win_offset = BHNDB_PCI_V3_BAR0_CCREGS_OFFSET,
.win_size = BHNDB_PCI_V3_BAR0_CCREGS_SIZE,
.d.core = {
.class = BHND_DEVCLASS_CC,
.unit = 0,
.port = 0,
.region = 0,
.port_type = BHND_PORT_DEVICE
},
.res = { SYS_RES_MEMORY, PCIR_BAR(0) }
},
BHNDB_REGWIN_TABLE_END
},
.dma_translations = (const struct bhnd_dma_translation[]) {
{
.base_addr = BHND_PCIE2_DMA64_TRANSLATION,
.addr_mask = ~BHND_PCIE2_DMA64_MASK,
.addrext_mask = BHND_PCIE_DMA64_MASK
},
BHND_DMA_TRANSLATION_TABLE_END
}
};