• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Broadcom SiliconBackplane SDIO/PCMCIA hardware-specific
3  * device core support
4  *
5  * Copyright (C) 1999-2017, Broadcom Corporation
6  *
7  *      Unless you and Broadcom execute a separate written software license
8  * agreement governing use of this software, this software is licensed to you
9  * under the terms of the GNU General Public License version 2 (the "GPL"),
10  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11  * following added to such license:
12  *
13  *      As a special exception, the copyright holders of this software give you
14  * permission to link this software with independent modules, and to copy and
15  * distribute the resulting executable under terms of your choice, provided that
16  * you also meet, for each linked independent module, the terms and conditions of
17  * the license of that module.  An independent module is a module which is not
18  * derived from this software.  The special exception does not apply to any
19  * modifications of the software.
20  *
21  *      Notwithstanding the above, under no circumstances may you combine this
22  * software in any way with any other Broadcom software provided under a license
23  * other than the GPL, without Broadcom's express prior written consent.
24  *
25  *
26  * <<Broadcom-WL-IPTag/Open:>>
27  *
28  * $Id: sbsdpcmdev.h 610395 2016-01-06 22:52:57Z $
29  */
30 
31 #ifndef    _sbsdpcmdev_h_
32 #define    _sbsdpcmdev_h_
33 
34 /* cpp contortions to concatenate w/arg prescan */
35 #ifndef PAD
36 #define    _PADLINE(line)    pad ## line
37 #define    _XSTR(line)    _PADLINE(line)
38 #define    PAD        _XSTR(__LINE__)
39 #endif    /* PAD */
40 
41 
42 typedef volatile struct {
43     dma64regs_t    xmt;        /* dma tx */
44     uint32 PAD[2];
45     dma64regs_t    rcv;        /* dma rx */
46     uint32 PAD[2];
47 } dma64p_t;
48 
49 /* dma64 sdiod corerev >= 1 */
50 typedef volatile struct {
51     dma64p_t dma64regs[2];
52     dma64diag_t dmafifo;        /* DMA Diagnostic Regs, 0x280-0x28c */
53     uint32 PAD[92];
54 } sdiodma64_t;
55 
56 /* dma32 sdiod corerev == 0 */
57 typedef volatile struct {
58     dma32regp_t dma32regs[2];    /* dma tx & rx, 0x200-0x23c */
59     dma32diag_t dmafifo;        /* DMA Diagnostic Regs, 0x240-0x24c */
60     uint32 PAD[108];
61 } sdiodma32_t;
62 
63 /* dma32 regs for pcmcia core */
64 typedef volatile struct {
65     dma32regp_t dmaregs;        /* DMA Regs, 0x200-0x21c, rev8 */
66     dma32diag_t dmafifo;        /* DMA Diagnostic Regs, 0x220-0x22c */
67     uint32 PAD[116];
68 } pcmdma32_t;
69 
70 /* core registers */
71 typedef volatile struct {
72     uint32 corecontrol;        /* CoreControl, 0x000, rev8 */
73     uint32 corestatus;        /* CoreStatus, 0x004, rev8  */
74     uint32 PAD[1];
75     uint32 biststatus;        /* BistStatus, 0x00c, rev8  */
76 
77     /* PCMCIA access */
78     uint16 pcmciamesportaladdr;    /* PcmciaMesPortalAddr, 0x010, rev8   */
79     uint16 PAD[1];
80     uint16 pcmciamesportalmask;    /* PcmciaMesPortalMask, 0x014, rev8   */
81     uint16 PAD[1];
82     uint16 pcmciawrframebc;        /* PcmciaWrFrameBC, 0x018, rev8   */
83     uint16 PAD[1];
84     uint16 pcmciaunderflowtimer;    /* PcmciaUnderflowTimer, 0x01c, rev8   */
85     uint16 PAD[1];
86 
87     /* interrupt */
88     uint32 intstatus;        /* IntStatus, 0x020, rev8   */
89     uint32 hostintmask;        /* IntHostMask, 0x024, rev8   */
90     uint32 intmask;            /* IntSbMask, 0x028, rev8   */
91     uint32 sbintstatus;        /* SBIntStatus, 0x02c, rev8   */
92     uint32 sbintmask;        /* SBIntMask, 0x030, rev8   */
93     uint32 funcintmask;        /* SDIO Function Interrupt Mask, SDIO rev4 */
94     uint32 PAD[2];
95     uint32 tosbmailbox;        /* ToSBMailbox, 0x040, rev8   */
96     uint32 tohostmailbox;        /* ToHostMailbox, 0x044, rev8   */
97     uint32 tosbmailboxdata;        /* ToSbMailboxData, 0x048, rev8   */
98     uint32 tohostmailboxdata;    /* ToHostMailboxData, 0x04c, rev8   */
99 
100     /* synchronized access to registers in SDIO clock domain */
101     uint32 sdioaccess;        /* SdioAccess, 0x050, rev8   */
102     uint32 PAD[3];
103 
104     /* PCMCIA frame control */
105     uint8 pcmciaframectrl;        /* pcmciaFrameCtrl, 0x060, rev8   */
106     uint8 PAD[3];
107     uint8 pcmciawatermark;        /* pcmciaWaterMark, 0x064, rev8   */
108     uint8 PAD[155];
109 
110     /* interrupt batching control */
111     uint32 intrcvlazy;        /* IntRcvLazy, 0x100, rev8 */
112     uint32 PAD[3];
113 
114     /* counters */
115     uint32 cmd52rd;            /* Cmd52RdCount, 0x110, rev8, SDIO: cmd52 reads */
116     uint32 cmd52wr;            /* Cmd52WrCount, 0x114, rev8, SDIO: cmd52 writes */
117     uint32 cmd53rd;            /* Cmd53RdCount, 0x118, rev8, SDIO: cmd53 reads */
118     uint32 cmd53wr;            /* Cmd53WrCount, 0x11c, rev8, SDIO: cmd53 writes */
119     uint32 abort;            /* AbortCount, 0x120, rev8, SDIO: aborts */
120     uint32 datacrcerror;        /* DataCrcErrorCount, 0x124, rev8, SDIO: frames w/bad CRC */
121     uint32 rdoutofsync;        /* RdOutOfSyncCount, 0x128, rev8, SDIO/PCMCIA: Rd Frm OOS */
122     uint32 wroutofsync;        /* RdOutOfSyncCount, 0x12c, rev8, SDIO/PCMCIA: Wr Frm OOS */
123     uint32 writebusy;        /* WriteBusyCount, 0x130, rev8, SDIO: dev asserted "busy" */
124     uint32 readwait;        /* ReadWaitCount, 0x134, rev8, SDIO: read: no data avail */
125     uint32 readterm;        /* ReadTermCount, 0x138, rev8, SDIO: rd frm terminates */
126     uint32 writeterm;        /* WriteTermCount, 0x13c, rev8, SDIO: wr frm terminates */
127     uint32 PAD[40];
128     uint32 clockctlstatus;        /* ClockCtlStatus, 0x1e0, rev8 */
129     uint32 PAD[1];
130     uint32 powerctl;        /* 0x1e8 */
131     uint32 PAD[5];
132 
133     /* DMA engines */
134     volatile union {
135         pcmdma32_t pcm32;
136         sdiodma32_t sdiod32;
137         sdiodma64_t sdiod64;
138     } dma;
139 
140     /* SDIO/PCMCIA CIS region */
141     char cis[512];            /* 512 byte CIS, 0x400-0x5ff, rev6 */
142 
143     /* PCMCIA function control registers */
144     char pcmciafcr[256];        /* PCMCIA FCR, 0x600-6ff, rev6 */
145     uint16 PAD[55];
146 
147     /* PCMCIA backplane access */
148     uint16 backplanecsr;        /* BackplaneCSR, 0x76E, rev6 */
149     uint16 backplaneaddr0;        /* BackplaneAddr0, 0x770, rev6 */
150     uint16 backplaneaddr1;        /* BackplaneAddr1, 0x772, rev6 */
151     uint16 backplaneaddr2;        /* BackplaneAddr2, 0x774, rev6 */
152     uint16 backplaneaddr3;        /* BackplaneAddr3, 0x776, rev6 */
153     uint16 backplanedata0;        /* BackplaneData0, 0x778, rev6 */
154     uint16 backplanedata1;        /* BackplaneData1, 0x77a, rev6 */
155     uint16 backplanedata2;        /* BackplaneData2, 0x77c, rev6 */
156     uint16 backplanedata3;        /* BackplaneData3, 0x77e, rev6 */
157     uint16 PAD[31];
158 
159     /* sprom "size" & "blank" info */
160     uint16 spromstatus;        /* SPROMStatus, 0x7BE, rev2 */
161     uint32 PAD[464];
162 
163     /* Sonics SiliconBackplane registers */
164     sbconfig_t sbconfig;        /* SbConfig Regs, 0xf00-0xfff, rev8 */
165 } sdpcmd_regs_t;
166 
167 /* corecontrol */
168 #define CC_CISRDY        (1 << 0)    /* CIS Ready */
169 #define CC_BPRESEN        (1 << 1)    /* CCCR RES signal causes backplane reset */
170 #define CC_F2RDY        (1 << 2)    /* set CCCR IOR2 bit */
171 #define CC_CLRPADSISO        (1 << 3)    /* clear SDIO pads isolation bit (rev 11) */
172 #define CC_XMTDATAAVAIL_MODE    (1 << 4)    /* data avail generates an interrupt */
173 #define CC_XMTDATAAVAIL_CTRL    (1 << 5)    /* data avail interrupt ctrl */
174 
175 /* corestatus */
176 #define CS_PCMCIAMODE    (1 << 0)    /* Device Mode; 0=SDIO, 1=PCMCIA */
177 #define CS_SMARTDEV    (1 << 1)    /* 1=smartDev enabled */
178 #define CS_F2ENABLED    (1 << 2)    /* 1=host has enabled the device */
179 
180 #define PCMCIA_MES_PA_MASK    0x7fff    /* PCMCIA Message Portal Address Mask */
181 #define PCMCIA_MES_PM_MASK    0x7fff    /* PCMCIA Message Portal Mask Mask */
182 #define PCMCIA_WFBC_MASK    0xffff    /* PCMCIA Write Frame Byte Count Mask */
183 #define PCMCIA_UT_MASK        0x07ff    /* PCMCIA Underflow Timer Mask */
184 
185 /* intstatus */
186 #define I_SMB_SW0    (1 << 0)    /* To SB Mail S/W interrupt 0 */
187 #define I_SMB_SW1    (1 << 1)    /* To SB Mail S/W interrupt 1 */
188 #define I_SMB_SW2    (1 << 2)    /* To SB Mail S/W interrupt 2 */
189 #define I_SMB_SW3    (1 << 3)    /* To SB Mail S/W interrupt 3 */
190 #define I_SMB_SW_MASK    0x0000000f    /* To SB Mail S/W interrupts mask */
191 #define I_SMB_SW_SHIFT    0        /* To SB Mail S/W interrupts shift */
192 #define I_HMB_SW0    (1 << 4)    /* To Host Mail S/W interrupt 0 */
193 #define I_HMB_SW1    (1 << 5)    /* To Host Mail S/W interrupt 1 */
194 #define I_HMB_SW2    (1 << 6)    /* To Host Mail S/W interrupt 2 */
195 #define I_HMB_SW3    (1 << 7)    /* To Host Mail S/W interrupt 3 */
196 #define I_HMB_SW_MASK    0x000000f0    /* To Host Mail S/W interrupts mask */
197 #define I_HMB_SW_SHIFT    4        /* To Host Mail S/W interrupts shift */
198 #define I_WR_OOSYNC    (1 << 8)    /* Write Frame Out Of Sync */
199 #define I_RD_OOSYNC    (1 << 9)    /* Read Frame Out Of Sync */
200 #define    I_PC        (1 << 10)    /* descriptor error */
201 #define    I_PD        (1 << 11)    /* data error */
202 #define    I_DE        (1 << 12)    /* Descriptor protocol Error */
203 #define    I_RU        (1 << 13)    /* Receive descriptor Underflow */
204 #define    I_RO        (1 << 14)    /* Receive fifo Overflow */
205 #define    I_XU        (1 << 15)    /* Transmit fifo Underflow */
206 #define    I_RI        (1 << 16)    /* Receive Interrupt */
207 #define I_BUSPWR    (1 << 17)    /* SDIO Bus Power Change (rev 9) */
208 #define I_XMTDATA_AVAIL (1 << 23)    /* bits in fifo */
209 #define    I_XI        (1 << 24)    /* Transmit Interrupt */
210 #define I_RF_TERM    (1 << 25)    /* Read Frame Terminate */
211 #define I_WF_TERM    (1 << 26)    /* Write Frame Terminate */
212 #define I_PCMCIA_XU    (1 << 27)    /* PCMCIA Transmit FIFO Underflow */
213 #define I_SBINT        (1 << 28)    /* sbintstatus Interrupt */
214 #define I_CHIPACTIVE    (1 << 29)    /* chip transitioned from doze to active state */
215 #define I_SRESET    (1 << 30)    /* CCCR RES interrupt */
216 #define I_IOE2        (1U << 31)    /* CCCR IOE2 Bit Changed */
217 #define    I_ERRORS    (I_PC | I_PD | I_DE | I_RU | I_RO | I_XU)    /* DMA Errors */
218 #define I_DMA        (I_RI | I_XI | I_ERRORS)
219 
220 /* sbintstatus */
221 #define I_SB_SERR    (1 << 8)    /* Backplane SError (write) */
222 #define I_SB_RESPERR    (1 << 9)    /* Backplane Response Error (read) */
223 #define I_SB_SPROMERR    (1 << 10)    /* Error accessing the sprom */
224 
225 /* sdioaccess */
226 #define SDA_DATA_MASK    0x000000ff    /* Read/Write Data Mask */
227 #define SDA_ADDR_MASK    0x000fff00    /* Read/Write Address Mask */
228 #define SDA_ADDR_SHIFT    8        /* Read/Write Address Shift */
229 #define SDA_WRITE    0x01000000    /* Write bit  */
230 #define SDA_READ    0x00000000    /* Write bit cleared for Read */
231 #define SDA_BUSY    0x80000000    /* Busy bit */
232 
233 /* sdioaccess-accessible register address spaces */
234 #define SDA_CCCR_SPACE        0x000    /* sdioAccess CCCR register space */
235 #define SDA_F1_FBR_SPACE    0x100    /* sdioAccess F1 FBR register space */
236 #define SDA_F2_FBR_SPACE    0x200    /* sdioAccess F2 FBR register space */
237 #define SDA_F1_REG_SPACE    0x300    /* sdioAccess F1 core-specific register space */
238 
239 /* SDA_F1_REG_SPACE sdioaccess-accessible F1 reg space register offsets */
240 #define SDA_CHIPCONTROLDATA    0x006    /* ChipControlData */
241 #define SDA_CHIPCONTROLENAB    0x007    /* ChipControlEnable */
242 #define SDA_F2WATERMARK        0x008    /* Function 2 Watermark */
243 #define SDA_DEVICECONTROL    0x009    /* DeviceControl */
244 #define SDA_SBADDRLOW        0x00a    /* SbAddrLow */
245 #define SDA_SBADDRMID        0x00b    /* SbAddrMid */
246 #define SDA_SBADDRHIGH        0x00c    /* SbAddrHigh */
247 #define SDA_FRAMECTRL        0x00d    /* FrameCtrl */
248 #define SDA_CHIPCLOCKCSR    0x00e    /* ChipClockCSR */
249 #define SDA_SDIOPULLUP        0x00f    /* SdioPullUp */
250 #define SDA_SDIOWRFRAMEBCLOW    0x019    /* SdioWrFrameBCLow */
251 #define SDA_SDIOWRFRAMEBCHIGH    0x01a    /* SdioWrFrameBCHigh */
252 #define SDA_SDIORDFRAMEBCLOW    0x01b    /* SdioRdFrameBCLow */
253 #define SDA_SDIORDFRAMEBCHIGH    0x01c    /* SdioRdFrameBCHigh */
254 
255 /* SDA_F2WATERMARK */
256 #define SDA_F2WATERMARK_MASK    0x7f    /* F2Watermark Mask */
257 
258 /* SDA_SBADDRLOW */
259 #define SDA_SBADDRLOW_MASK    0x80    /* SbAddrLow Mask */
260 
261 /* SDA_SBADDRMID */
262 #define SDA_SBADDRMID_MASK    0xff    /* SbAddrMid Mask */
263 
264 /* SDA_SBADDRHIGH */
265 #define SDA_SBADDRHIGH_MASK    0xff    /* SbAddrHigh Mask */
266 
267 /* SDA_FRAMECTRL */
268 #define SFC_RF_TERM    (1 << 0)    /* Read Frame Terminate */
269 #define SFC_WF_TERM    (1 << 1)    /* Write Frame Terminate */
270 #define SFC_CRC4WOOS    (1 << 2)    /* HW reports CRC error for write out of sync */
271 #define SFC_ABORTALL    (1 << 3)    /* Abort cancels all in-progress frames */
272 
273 /* pcmciaframectrl */
274 #define PFC_RF_TERM    (1 << 0)    /* Read Frame Terminate */
275 #define PFC_WF_TERM    (1 << 1)    /* Write Frame Terminate */
276 
277 /* intrcvlazy */
278 #define    IRL_TO_MASK    0x00ffffff    /* timeout */
279 #define    IRL_FC_MASK    0xff000000    /* frame count */
280 #define    IRL_FC_SHIFT    24        /* frame count */
281 
282 /* rx header */
283 typedef volatile struct {
284     uint16 len;
285     uint16 flags;
286 } sdpcmd_rxh_t;
287 
288 /* rx header flags */
289 #define RXF_CRC        0x0001        /* CRC error detected */
290 #define RXF_WOOS    0x0002        /* write frame out of sync */
291 #define RXF_WF_TERM    0x0004        /* write frame terminated */
292 #define RXF_ABORT    0x0008        /* write frame aborted */
293 #define RXF_DISCARD    (RXF_CRC | RXF_WOOS | RXF_WF_TERM | RXF_ABORT)    /* bad frame */
294 
295 /* HW frame tag */
296 #define SDPCM_FRAMETAG_LEN    4    /* HW frametag: 2 bytes len, 2 bytes check val */
297 
298 #define SDPCM_HWEXT_LEN    8
299 
300 #endif    /* _sbsdpcmdev_h_ */
301