1 1.1 mlelstv /* $OpenBSD: if_bwfm_sdio.h,v 1.2 2018/05/19 10:43:10 patrick Exp $ */ 2 1.1 mlelstv /* 3 1.1 mlelstv * Copyright (c) 2010-2016 Broadcom Corporation 4 1.1 mlelstv * Copyright (c) 2018 Patrick Wildt <patrick (at) blueri.se> 5 1.1 mlelstv * 6 1.1 mlelstv * Permission to use, copy, modify, and/or distribute this software for any 7 1.1 mlelstv * purpose with or without fee is hereby granted, provided that the above 8 1.1 mlelstv * copyright notice and this permission notice appear in all copies. 9 1.1 mlelstv * 10 1.1 mlelstv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 1.1 mlelstv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 1.1 mlelstv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 1.1 mlelstv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 1.1 mlelstv * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 1.1 mlelstv * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 1.1 mlelstv * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 1.1 mlelstv */ 18 1.1 mlelstv 19 1.1 mlelstv /* Registers */ 20 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP 0xf0 21 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD14_SUPPORT (1 << 1) 22 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD14_EXT (1 << 2) 23 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCAP_CMD_NODEC (1 << 3) 24 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCTRL 0xf1 25 1.1 mlelstv #define BWFM_SDIO_CCCR_CARDCTRL_WLANRESET (1 << 1) 26 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT 0xf2 27 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_MASK 0x01 28 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_OE (1 << 1) 29 1.1 mlelstv #define BWFM_SDIO_CCCR_SEPINT_ACT_HI (1 << 2) 30 1.1 mlelstv 31 1.1 mlelstv #define BWFM_SDIO_WATERMARK 0x10008 32 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL 0x10009 33 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SETBUSY 0x01 34 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SPI_INTR_SYNC 0x02 35 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_CA_INT_ONLY 0x04 36 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_PADS_ISO 0x08 37 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_SB_RST_CTL 0x30 38 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_CORECTL 0x00 39 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_BPRESET 0x10 40 1.1 mlelstv #define BWFM_SDIO_DEVICE_CTL_RST_NOBPRESET 0x20 41 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRLOW 0x1000A 42 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRMID 0x1000B 43 1.1 mlelstv #define BWFM_SDIO_FUNC1_SBADDRHIGH 0x1000C 44 1.2 mlelstv #define BWFM_SDIO_FUNC1_FRAMECTRL 0x1000D 45 1.2 mlelstv #define BWFM_SDIO_FUNC1_FRAMECTRL_RF_TERM (1 << 0) 46 1.2 mlelstv #define BWFM_SDIO_FUNC1_FRAMECTRL_WF_TERM (1 << 1) 47 1.2 mlelstv #define BWFM_SDIO_FUNC1_FRAMECTRL_CRC4WOOS (1 << 2) 48 1.2 mlelstv #define BWFM_SDIO_FUNC1_FRAMECTRL_ABORTALL (1 << 3) 49 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR 0x1000E 50 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ALP 0x01 51 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT 0x02 52 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ILP 0x04 53 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL_REQ 0x08 54 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL_REQ 0x10 55 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HW_CLKREQ_OFF 0x20 56 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL 0x40 57 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL 0x80 58 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_CSR_MASK 0x1F 59 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS \ 60 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL | \ 61 1.1 mlelstv BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL) 62 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) \ 63 1.1 mlelstv ((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS) 64 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval) \ 65 1.1 mlelstv (((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS) == BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS) 66 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPONLY(regval) \ 67 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \ 68 1.1 mlelstv !BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval)) 69 1.1 mlelstv #define BWFM_SDIO_FUNC1_CHIPCLKCSR_CLKAV(regval, alponly) \ 70 1.1 mlelstv (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \ 71 1.1 mlelstv (alponly ? 1 : BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval))) 72 1.1 mlelstv #define BWFM_SDIO_FUNC1_SDIOPULLUP 0x1000F 73 1.2 mlelstv #define BWFM_SDIO_FUNC1_WFRAMEBCLO 0x10019 74 1.2 mlelstv #define BWFM_SDIO_FUNC1_WFRAMEBCHI 0x1001A 75 1.2 mlelstv #define BWFM_SDIO_FUNC1_RFRAMEBCLO 0x1001B 76 1.2 mlelstv #define BWFM_SDIO_FUNC1_RFRAMEBCHI 0x1001C 77 1.2 mlelstv #define BWFM_SDIO_FUNC1_MESBUSYCTRL 0x1001D 78 1.1 mlelstv #define BWFM_SDIO_FUNC1_WAKEUPCTRL 0x1001E 79 1.1 mlelstv #define BWFM_SDIO_FUNC1_WAKEUPCTRL_HTWAIT (1 << 1) 80 1.1 mlelstv #define BWFM_SDIO_FUNC1_SLEEPCSR 0x1001F 81 1.1 mlelstv #define BWFM_SDIO_FUNC1_SLEEPCSR_KSO (1 << 0) 82 1.3 jmcneill #define BWFM_SDIO_FUNC1_SLEEPCSR_DEVON (1 << 1) 83 1.1 mlelstv 84 1.1 mlelstv #define BWFM_SDIO_SB_OFT_ADDR_PAGE 0x08000 85 1.1 mlelstv #define BWFM_SDIO_SB_OFT_ADDR_MASK 0x07FFF 86 1.1 mlelstv #define BWFM_SDIO_SB_ACCESS_2_4B_FLAG 0x08000 87 1.1 mlelstv 88 1.1 mlelstv /* Protocol defines */ 89 1.1 mlelstv #define SDPCM_PROT_VERSION 4 90 1.1 mlelstv #define SDPCM_PROT_VERSION_SHIFT 16 91 1.1 mlelstv #define SDPCM_PROT_VERSION_MASK 0x00ff0000 92 1.1 mlelstv #define SDPCM_SHARED_VERSION 0x0003 93 1.1 mlelstv #define SDPCM_SHARED_VERSION_MASK 0x00FF 94 1.1 mlelstv #define SDPCM_SHARED_ASSERT_BUILT 0x0100 95 1.1 mlelstv #define SDPCM_SHARED_ASSERT 0x0200 96 1.1 mlelstv #define SDPCM_SHARED_TRAP 0x0400 97 1.1 mlelstv 98 1.1 mlelstv #define SDPCMD_INTSTATUS 0x020 99 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW0 (1 << 0) /* To SB Mail S/W interrupt 0 */ 100 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW1 (1 << 1) /* To SB Mail S/W interrupt 1 */ 101 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW2 (1 << 2) /* To SB Mail S/W interrupt 2 */ 102 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW3 (1 << 3) /* To SB Mail S/W interrupt 3 */ 103 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW_MASK 0x0000000f /* To SB Mail S/W interrupts mask */ 104 1.1 mlelstv #define SDPCMD_INTSTATUS_SMB_SW_SHIFT 0 /* To SB Mail S/W interrupts shift */ 105 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW0 (1 << 4) /* To Host Mail S/W interrupt 0 */ 106 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW1 (1 << 5) /* To Host Mail S/W interrupt 1 */ 107 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW2 (1 << 6) /* To Host Mail S/W interrupt 2 */ 108 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW3 (1 << 7) /* To Host Mail S/W interrupt 3 */ 109 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FC_STATE SDPCMD_INTSTATUS_HMB_SW0 110 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FC_CHANGE SDPCMD_INTSTATUS_HMB_SW1 111 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_FRAME_IND SDPCMD_INTSTATUS_HMB_SW2 112 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_HOST_INT SDPCMD_INTSTATUS_HMB_SW3 113 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW_MASK 0x000000f0 /* To Host Mail S/W interrupts mask */ 114 1.1 mlelstv #define SDPCMD_INTSTATUS_HMB_SW_SHIFT 4 /* To Host Mail S/W interrupts shift */ 115 1.1 mlelstv #define SDPCMD_INTSTATUS_WR_OOSYNC (1 << 8) /* Write Frame Out Of Sync */ 116 1.1 mlelstv #define SDPCMD_INTSTATUS_RD_OOSYNC (1 << 9) /* Read Frame Out Of Sync */ 117 1.1 mlelstv #define SDPCMD_INTSTATUS_PC (1 << 10)/* descriptor error */ 118 1.1 mlelstv #define SDPCMD_INTSTATUS_PD (1 << 11)/* data error */ 119 1.1 mlelstv #define SDPCMD_INTSTATUS_DE (1 << 12)/* Descriptor protocol Error */ 120 1.1 mlelstv #define SDPCMD_INTSTATUS_RU (1 << 13)/* Receive descriptor Underflow */ 121 1.1 mlelstv #define SDPCMD_INTSTATUS_RO (1 << 14)/* Receive fifo Overflow */ 122 1.1 mlelstv #define SDPCMD_INTSTATUS_XU (1 << 15)/* Transmit fifo Underflow */ 123 1.1 mlelstv #define SDPCMD_INTSTATUS_RI (1 << 16)/* Receive Interrupt */ 124 1.1 mlelstv #define SDPCMD_INTSTATUS_BUSPWR (1 << 17)/* SDIO Bus Power Change (rev 9) */ 125 1.1 mlelstv #define SDPCMD_INTSTATUS_XMTDATA_AVAIL (1 << 23)/* bits in fifo */ 126 1.1 mlelstv #define SDPCMD_INTSTATUS_XI (1 << 24)/* Transmit Interrupt */ 127 1.1 mlelstv #define SDPCMD_INTSTATUS_RF_TERM (1 << 25)/* Read Frame Terminate */ 128 1.1 mlelstv #define SDPCMD_INTSTATUS_WF_TERM (1 << 26)/* Write Frame Terminate */ 129 1.1 mlelstv #define SDPCMD_INTSTATUS_PCMCIA_XU (1 << 27)/* PCMCIA Transmit FIFO Underflow */ 130 1.1 mlelstv #define SDPCMD_INTSTATUS_SBINT (1 << 28)/* sbintstatus Interrupt */ 131 1.1 mlelstv #define SDPCMD_INTSTATUS_CHIPACTIVE (1 << 29)/* chip from doze to active state */ 132 1.1 mlelstv #define SDPCMD_INTSTATUS_SRESET (1 << 30)/* CCCR RES interrupt */ 133 1.1 mlelstv #define SDPCMD_INTSTATUS_IOE2 (1U << 31)/* CCCR IOE2 Bit Changed */ 134 1.1 mlelstv #define SDPCMD_INTSTATUS_ERRORS (SDPCMD_INTSTATUS_PC | \ 135 1.1 mlelstv SDPCMD_INTSTATUS_PD | \ 136 1.1 mlelstv SDPCMD_INTSTATUS_DE | \ 137 1.1 mlelstv SDPCMD_INTSTATUS_RU | \ 138 1.1 mlelstv SDPCMD_INTSTATUS_RO | \ 139 1.1 mlelstv SDPCMD_INTSTATUS_XU) 140 1.1 mlelstv #define SDPCMD_INTSTATUS_DMA (SDPCMD_INTSTATUS_RI | \ 141 1.1 mlelstv SDPCMD_INTSTATUS_XI | \ 142 1.1 mlelstv SDPCMD_INTSTATUS_ERRORS) 143 1.1 mlelstv #define SDPCMD_HOSTINTMASK 0x024 144 1.1 mlelstv #define SDPCMD_INTMASK 0x028 145 1.1 mlelstv #define SDPCMD_SBINTSTATUS 0x02c 146 1.1 mlelstv #define SDPCMD_SBINTMASK 0x030 147 1.1 mlelstv #define SDPCMD_FUNCTINTMASK 0x034 148 1.1 mlelstv #define SDPCMD_TOSBMAILBOX 0x040 149 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_NAK (1 << 0) 150 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_INT_ACK (1 << 1) 151 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_USE_OOB (1 << 2) 152 1.1 mlelstv #define SDPCMD_TOSBMAILBOX_DEV_INT (1 << 3) 153 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOX 0x044 154 1.1 mlelstv #define SDPCMD_TOSBMAILBOXDATA 0x048 155 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA 0x04C 156 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_NAKHANDLED (1 << 0) 157 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_DEVREADY (1 << 1) 158 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FC (1 << 2) 159 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FWREADY (1 << 3) 160 1.1 mlelstv #define SDPCMD_TOHOSTMAILBOXDATA_FWHALT (1 << 4) 161 1.1 mlelstv 162 1.1 mlelstv struct bwfm_sdio_hwhdr { 163 1.1 mlelstv uint16_t frmlen; 164 1.1 mlelstv uint16_t cksum; 165 1.1 mlelstv }; 166 1.1 mlelstv 167 1.1 mlelstv struct bwfm_sdio_hwexthdr { 168 1.1 mlelstv uint16_t pktlen; 169 1.1 mlelstv uint8_t res0; 170 1.1 mlelstv uint8_t flags; 171 1.1 mlelstv uint16_t res1; 172 1.1 mlelstv uint16_t padlen; 173 1.1 mlelstv }; 174 1.1 mlelstv 175 1.1 mlelstv struct bwfm_sdio_swhdr { 176 1.1 mlelstv uint8_t seqnr; 177 1.1 mlelstv uint8_t chanflag; /* channel + flag */ 178 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_CONTROL 0x00 179 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_EVENT 0x01 180 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_DATA 0x02 181 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_GLOM 0x03 182 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_TEST 0x0F 183 1.1 mlelstv #define BWFM_SDIO_SWHDR_CHANNEL_MASK 0x0F 184 1.1 mlelstv uint8_t nextlen; 185 1.1 mlelstv uint8_t dataoff; 186 1.1 mlelstv uint8_t flowctl; 187 1.1 mlelstv uint8_t maxseqnr; 188 1.1 mlelstv uint16_t res0; 189 1.1 mlelstv }; 190 1.1 mlelstv 191 1.1 mlelstv struct bwfm_sdio_sdpcm { 192 1.1 mlelstv uint32_t flags; 193 1.1 mlelstv uint32_t trap_addr; 194 1.1 mlelstv uint32_t assert_exp_addr; 195 1.1 mlelstv uint32_t assert_file_addr; 196 1.1 mlelstv uint32_t assert_line; 197 1.1 mlelstv uint32_t console_addr; 198 1.1 mlelstv uint32_t msgtrace_addr; 199 1.1 mlelstv uint8_t tag[32]; 200 1.1 mlelstv uint32_t brpt_addr; 201 1.1 mlelstv }; 202 1.1 mlelstv 203 1.1 mlelstv struct bwfm_sdio_console { 204 1.1 mlelstv uint32_t vcons_in; 205 1.1 mlelstv uint32_t vcons_out; 206 1.1 mlelstv uint32_t log_buf; 207 1.1 mlelstv uint32_t log_bufsz; 208 1.1 mlelstv uint32_t log_idx; 209 1.1 mlelstv }; 210