blob: 95b726ff8eb2dcb6025a39fb684ab985d2570502 [file] [log] [blame]
/*
* Chip-specific hardware definitions for
* Broadcom 802.11abg Networking Device Driver
*
* Broadcom Proprietary and Confidential. Copyright (C) 2020,
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom;
* the contents of this file may not be disclosed to third parties,
* copied or duplicated in any form, in whole or in part, without
* the prior written permission of Broadcom.
*
*
* <<Broadcom-WL-IPTag/Proprietary:>>
*/
#ifndef _D11REGS_H
#define _D11REGS_H
#include <typedefs.h>
#include <sbhndpio.h>
#include <sbhnddma.h>
#include <sbconfig.h>
#if !defined(BCMDONGLEHOST)
#include <dot11mac_all_regs.h>
#include <d11regs_comp.h>
#endif
#if defined(BCMDONGLEHOST) || defined(WL_UNITTEST)
typedef struct {
uint32 pad;
} d11regdefs_t;
typedef volatile uint8 d11regs_t;
typedef struct _d11regs_info {
uint32 pad;
} d11regs_info_t;
#else /* defined(BCMDONGLEHOST) || defined(WL_UNITTEST) */
typedef volatile struct d11regs d11regs_t;
typedef struct _d11regs_info {
d11regs_t *regs;
} d11regs_info_t;
#endif /* !defined(BCMDONGLEHOST) || !defined(WL_UNITTEST) */
typedef volatile struct {
uint32 intstatus;
uint32 intmask;
} intctrlregs_t;
/**
* read: 32-bit register that can be read as 32-bit or as 2 16-bit
* write: only low 16b-it half can be written
*/
typedef volatile union {
uint32 pmqhostdata; /**< read only! */
struct {
uint16 pmqctrlstatus; /**< read/write */
uint16 PAD;
} w;
} pmqreg_t;
/** dma corerev >= 11 */
typedef volatile struct {
dma64regs_t dmaxmt; /* dma tx */
pio4regs_t piotx; /* pio tx */
dma64regs_t dmarcv; /* dma rx */
pio4regs_t piorx; /* pio rx */
} fifo64_t;
/** indirect dma corerev >= 64 */
typedef volatile struct {
dma64regs_t dma; /**< dma tx */
uint32 indintstatus;
uint32 indintmask;
} ind_dma_t;
/** indirect dma corerev 80, 81, 82 */
typedef volatile struct {
uint32 indintstatus;
uint32 indintmask;
dma64regs_t dma; /**< dma tx, */
} ind_dma_axc_t;
/* access to register offsets and fields defined in dot11mac_all_regs.h */
#define D11_REG_OFF(regname) \
dot11mac_##regname##_ADDR
#define D11_REG_FIELD_MASK(regname, regfield) \
dot11mac_##regname##__##regfield##_MASK
#define D11_REG_FIELD_SHIFT(regname, regfield) \
dot11mac_##regname##__##regfield##_SHIFT
/* convert register offset to backplane address */
#ifndef D11_REG_ADDR_CHK
// #define D11_REG_ADDR_CHK
#endif
#ifdef D11_REG_ADDR_CHK
#define D11_REG_ADDR_EXEMPT(regname) \
(D11_REG_OFF(regname) == D11_REG_OFF(PHY_REG_ADDR) || \
D11_REG_OFF(regname) == D11_REG_OFF(radioregaddr) || \
D11_REG_OFF(regname) == D11_REG_OFF(radioregdata) || \
D11_REG_OFF(regname) == D11_REG_OFF(OBJ_DATA) || \
0)
#define D11_REG32_ADDR(regbase, regname) \
({ \
STATIC_ASSERT(D11_REG_ADDR_EXEMPT(regname) || D11_REG_OFF(regname) < 0x3e0); \
(volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname)); \
})
#define D11_REG16_ADDR(regbase, regname) \
({ \
STATIC_ASSERT(D11_REG_ADDR_EXEMPT(regname) || D11_REG_OFF(regname) >= 0x3e0); \
(volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname)); \
})
#else /* !D11_REG_ADDR_CHK */
#define D11_REG32_ADDR(regbase, regname) \
(volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname))
#define D11_REG16_ADDR(regbase, regname) \
(volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname))
#endif /* !D11_REG_ADDR_CHK */
/* used in table */
#define D11_REG32_ADDR_ENTRY(regbase, regname) \
(volatile uint32 *)((uintptr)(regbase) + D11_REG_OFF(regname))
#define D11_REG16_ADDR_ENTRY(regbase, regname) \
(volatile uint16 *)((uintptr)(regbase) + D11_REG_OFF(regname))
#ifndef D11_NEW_ACCESS_MACROS
/* MOVED TO src/wl/sys/wlc_hw_priv.h */
#define GET_MACINTSTATUS(osh, hw) R_REG((osh), D11_MACINTSTATUS(hw))
#define SET_MACINTSTATUS(osh, hw, val) W_REG((osh), D11_MACINTSTATUS(hw), (val))
#define GET_MACINTMASK(osh, hw) R_REG((osh), D11_MACINTMASK(hw))
#define SET_MACINTMASK(osh, hw, val) W_REG((osh), D11_MACINTMASK(hw), (val))
#define GET_MACINTSTATUS_X(osh, hw) R_REG((osh), D11_MACINTSTATUS_psmx(hw))
#define SET_MACINTSTATUS_X(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_psmx(hw), (val))
#define GET_MACINTMASK_X(osh, hw) R_REG((osh), D11_MACINTMASK_psmx(hw))
#define SET_MACINTMASK_X(osh, hw, val) W_REG((osh), D11_MACINTMASK_psmx(hw), (val))
#define GET_MACINTSTATUS_EXT(osh, hw) R_REG((osh), D11_MACINTSTATUS_EXT(hw))
#define SET_MACINTSTATUS_EXT(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_EXT(hw), (val))
#define GET_MACINTMASK_EXT(osh, hw) R_REG((osh), D11_MACINTMASK_EXT(hw))
#define SET_MACINTMASK_EXT(osh, hw, val) W_REG((osh), D11_MACINTMASK_EXT(hw), (val))
#define GET_MACINTSTATUS_EXT_X(osh, hw) R_REG((osh), D11_MACINTSTATUS_EXT_psmx(hw))
#define SET_MACINTSTATUS_EXT_X(osh, hw, val) W_REG((osh), D11_MACINTSTATUS_EXT_psmx(hw), (val))
#define GET_MACINTMASK_EXT_X(osh, hw) R_REG((osh), D11_MACINTMASK_EXT_psmx(hw))
#define SET_MACINTMASK_EXT_X(osh, hw, val) W_REG((osh), D11_MACINTMASK_EXT_psmx(hw), (val))
#define D11Reggrp_intctrlregs(hw, ix) ((intctrlregs_t*)(((volatile uint8*)D11_intstat0(hw)) + \
(sizeof(intctrlregs_t)*ix)))
#define D11Reggrp_inddma(hw, ix) (D11REV_GE(hw->corerev, 86) ? \
((ind_dma_t*)(((volatile uint8*)D11_ind_xmt_control(hw)) + (sizeof(ind_dma_t)*ix))) : \
((ind_dma_t*)(((volatile uint8*)D11_inddma(hw)) + (sizeof(ind_dma_t)*ix))))
#define D11Reggrp_inddma_axc(hw, ix) ((ind_dma_axc_t*)(((volatile uint8*)D11_inddma(hw)) + \
(sizeof(ind_dma_axc_t)*ix)))
#define D11Reggrp_indaqm(hw, ix) (D11REV_GE(hw->corerev, 86) ? \
((ind_dma_t*)(((volatile uint8*)D11_IndAQMctl(hw)) + (sizeof(ind_dma_t)*ix))) : \
((ind_dma_t*)(((volatile uint8*)D11_indaqm(hw)) + (sizeof(ind_dma_t)*ix))))
#define D11Reggrp_pmqreg(hw, ix) ((pmqreg_t*)(((volatile uint8*)D11_PMQHOSTDATA(hw)) + \
(sizeof(pmqreg_t)*ix)))
#define D11Reggrp_f64regs(hw, ix) ((fifo64_t*)(((volatile uint8*)D11_xmt0ctl(hw)) + \
(sizeof(fifo64_t)*ix)))
#define D11Reggrp_dmafifo(hw, ix) ((dma32diag_t*)(((volatile uint8*)D11_fifobase(hw)) + \
(sizeof(dma32diag_t)*ix)))
#define D11Reggrp_intrcvlazy(hw, ix) ((volatile uint32*)(((volatile uint8*)D11_intrcvlzy0(hw)) + \
(sizeof(uint32)*ix)))
#define D11Reggrp_altintmask(hw, ix) ((volatile uint32*)(((volatile uint8*)D11_alt_intmask0(hw)) + \
(sizeof(uint32)*ix)))
#define D11REG_ISVALID(ptr, addr) ((volatile uint16 *)(addr) != \
((volatile uint16 *) &((ptr)->regs->INVALID_ID)))
#endif /* D11_NEW_ACCESS_MACROS */
#endif /* _D11REGS_H */