1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <ddk/device.h>
8 #include <zircon/compiler.h>
9 #include "sdmmc.h"
10 
11 
12 #define SDIO_IO_RW_DIRECT             52
13 #define SDIO_IO_RW_DIRECT_EXTENDED    53
14 #define SDIO_SEND_OP_COND             5
15 
16 #define SDIO_IO_RW_DIRECT_FLAGS             SDMMC_RESP_R5 | SDMMC_CMD_TYPE_ABORT
17 #define SDIO_IO_RW_DIRECT_EXTENDED_FLAGS    SDMMC_RESP_R5 | SDMMC_CMD_TYPE_ABORT | \
18                                             SDMMC_RESP_DATA_PRESENT
19 #define SDIO_SEND_OP_COND_FLAGS             SDMMC_RESP_R4
20 
21 //(CMD5) Fields
22 #define SDIO_SEND_OP_COND_IO_OCR_33V           (1 << 21)
23 #define SDIO_SEND_OP_COND_CMD_S18R             (1 << 24)
24 
25 //CMD5 RESP OCR Fields
26 #define SDIO_SEND_OP_COND_RESP_S18A            (1 << 24)
27 #define SDIO_SEND_OP_COND_RESP_MEM_PRESENT     (1 << 27)
28 #define SDIO_SEND_OP_COND_RESP_NUM_FUNC_LOC    28
29 #define SDIO_SEND_OP_COND_RESP_NUM_FUNC_MASK   0x70000000
30 
31 // IO_RW_DIRECT CMD Fields
32 #define SDIO_IO_RW_DIRECT_WRITE_BYTE_LOC       0
33 #define SDIO_IO_RW_DIRECT_WRITE_BYTE_MASK      0x000000ff
34 #define SDIO_IO_RW_DIRECT_REG_ADDR_LOC         9
35 #define SDIO_IO_RW_DIRECT_REG_ADDR_MASK        0x03fffe00
36 #define SDIO_IO_RW_DIRECT_RAW_FLAG             0x08000000
37 #define SDIO_IO_RW_DIRECT_FN_IDX_LOC           28
38 #define SDIO_IO_RW_DIRECT_FN_IDX_MASK          0x70000000
39 #define SDIO_IO_RW_DIRECT_RW_FLAG              0x80000000
40 
41 // IO_RW_DIRECT RESP Fields
42 #define SDIO_IO_RW_DIRECT_RESP_READ_BYTE_LOC   0
43 #define SDIO_IO_RW_DIRECT_RESP_READ_BYTE_MASK  0x000000ff
44 
45 // IO_RW_EXTENDED Fields
46 #define SDIO_IO_RW_EXTD_BYTE_BLK_COUNT_LOC      0
47 #define SDIO_IO_RW_EXTD_BYTE_BLK_COUNT_MASK     0x000001ff
48 #define SDIO_IO_RW_EXTD_MAX_BLKS_PER_CMD        511 // 9 bits
49 #define SDIO_IO_RW_EXTD_REG_ADDR_LOC            9
50 #define SDIO_IO_RW_EXTD_REG_ADDR_MASK           0x03fffe00
51 #define SDIO_IO_RW_EXTD_OP_CODE_INCR            0x04000000
52 #define SDIO_IO_RW_EXTD_BLOCK_MODE              0x08000000
53 #define SDIO_IO_RW_EXTD_FN_IDX_LOC              28
54 #define SDIO_IO_RW_EXTD_FN_IDX_MASK             0x70000000
55 #define SDIO_IO_RW_EXTD_RW_FLAG                 0x80000000
56 
57 //SDIO CIA Fields.Refer Sec 6.8 SDIO SPEC
58 #define SDIO_CIA_CCCR_CCCR_SDIO_VER_ADDR        0x00
59 #define SDIO_CIA_CCCR_CCCR_VER_LOC              0
60 #define SDIO_CIA_CCCR_CCCR_VER_MASK             0x0f
61 #define SDIO_CIA_CCCR_SDIO_VER_LOC              4
62 #define SDIO_CIA_CCCR_SDIO_VER_MASK             0xf0
63 
64 #define SDIO_CCCR_FORMAT_VER_1                  0
65 #define SDIO_CCCR_FORMAT_VER_1_1                1
66 #define SDIO_CCCR_FORMAT_VER_2                  2
67 #define SDIO_CCCR_FORMAT_VER_3                  3
68 #define SDIO_SDIO_VER_1                         0
69 #define SDIO_SDIO_VER_1_1                       1
70 #define SDIO_SDIO_VER_1_2                       2
71 #define SDIO_SDIO_VER_2                         3
72 #define SDIO_SDIO_VER_3                         4
73 
74 #define SDIO_CIA_CCCR_NON_VENDOR_REG_SIZE       0x16
75 #define SDIO_CIA_CCCR_SD_FORMAT_VER_ADDR        0x01
76 #define SDIO_CIA_CCCR_IOEx_EN_FUNC_ADDR         0x02
77 #define SDIO_CIA_CCCR_IORx_FUNC_RDY_ADDR        0x03
78 
79 #define SDIO_CIA_CCCR_IEN_INTR_EN_ADDR          0x04
80 #define SDIO_ALL_INTR_ENABLED_MASK              0xFE
81 
82 #define SDIO_CIA_CCCR_INTx_INTR_PEN_ADDR        0x05
83 #define SDIO_CIA_CCCR_ASx_ABORT_SEL_CR_ADDR     0x06
84 #define SDIO_CIA_CCCR_ASx_ABORT_SOFT_RESET      0x08
85 
86 #define SDIO_CIA_CCCR_BUS_INTF_CTRL_ADDR        0x07
87 #define SDIO_CIA_CCCR_INTF_CTRL_BW_LOC          0
88 #define SDIO_CIA_CCCR_INTF_CTRL_BW_MASK         0x03
89 #define SDIO_BW_1BIT                            0
90 #define SDIO_BW_RSVD                            1
91 #define SDIO_BW_4BIT                            2
92 #define SDIO_CIA_CCCR_INTF_CTRL_BW_8BIT_SUPPRT  0x04
93 #define SDIO_CIA_CCCR_INTF_CTRL_CD_DISABLE      0x80
94 
95 #define SDIO_CIA_CCCR_CARD_CAPS_ADDR            0x08
96 #define SDIO_CIA_CCCR_CARD_CAP_SDC              0x01
97 #define SDIO_CIA_CCCR_CARD_CAP_SMB              0x02
98 #define SDIO_CIA_CCCR_CARD_CAP_SRW              0x04
99 #define SDIO_CIA_CCCR_CARD_CAP_SBS              0x08
100 #define SDIO_CIA_CCCR_CARD_CAP_S4MI             0x10
101 #define SDIO_CIA_CCCR_CARD_CAP_E4MI             0x20
102 #define SDIO_CIA_CCCR_CARD_CAP_LSC              0x40
103 #define SDIO_CIA_CCCR_CARD_CAP_4BLS             0x80
104 
105 #define SDIO_CIA_CCCR_COMMON_CIS_ADDR           0x09    // 0x09 - 0x0B
106 #define SDIO_CIS_ADDRESS_SIZE                   3       //bytes
107 #define SDIO_CIA_CCCR_BUS_SUSPEND_ADDR          0x0C
108 #define SDIO_CIA_CCCR_FUNC_SEL_ADDR             0x0D
109 #define SDIO_CIA_CCCR_EXEC_FLAGS_ADDR           0x0E
110 #define SDIO_CIA_CCCR_RDY_FLAGS_ADDR            0x0F
111 #define SDIO_CIA_CCCR_FN0_BLKSIZE_ADDR          0x10
112 
113 #define SDIO_CIA_CCCR_PWR_CTRL_ADDR             0x12
114 #define SDIO_CIA_CCCR_PWR_CTRL_SMPC             0x01
115 #define SDIO_CIA_CCCR_PWR_CTRL_EMPC             0x02
116 
117 #define SDIO_CIA_CCCR_BUS_SPEED_SEL_ADDR        0x13
118 #define SDIO_CIA_CCCR_BUS_SPEED_SEL_SHS         0x01
119 #define SDIO_CIA_CCCR_BUS_SPEED_BSS_LOC         1
120 #define SDIO_CIA_CCCR_BUS_SPEED_BSS_MASK        0x0e
121 
122 #define SDIO_BUS_SPEED_SDR12                    0
123 #define SDIO_BUS_SPEED_SDR25                    1
124 #define SDIO_BUS_SPEED_SDR50                    2
125 #define SDIO_BUS_SPEED_SDR104                   3
126 #define SDIO_BUS_SPEED_DDR50                    4
127 #define SDIO_BUS_SPEED_EN_HS                    1
128 
129 #define SDIO_CIA_CCCR_UHS_SUPPORT_ADDR          0x14
130 #define SDIO_CIA_CCCR_UHS_SDR50                 0x01
131 #define SDIO_CIA_CCCR_UHS_SDR104                0x02
132 #define SDIO_CIA_CCCR_UHS_DDR50                 0x04
133 
134 #define SDIO_UHS_SDR104_MAX_FREQ                208000000
135 #define SDIO_UHS_SDR50_MAX_FREQ                 100000000
136 #define SDIO_UHS_DDR50_MAX_FREQ                 50000000
137 #define SDIO_HS_MAX_FREQ                        50000000
138 #define SDIO_DEFAULT_FREQ                       25000000
139 
140 #define SDIO_CIA_CCCR_DRV_STRENGTH_ADDR         0x15
141 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTA         0x01
142 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTB         0x02
143 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTD         0x04
144 #define SDIO_CIA_CCCR_DRV_STRENGTH_DTS_LOC      4
145 #define SDIO_CIA_CCCR_DRV_STRENGTH_DTS_MASK     0x30
146 #define SDIO_DRV_STRENGTH_TYPE_B                0
147 #define SDIO_DRV_STRENGTH_TYPE_A                1
148 #define SDIO_DRV_STRENGTH_TYPE_C                2
149 #define SDIO_DRV_STRENGTH_TYPE_D                3
150 
151 #define SDIO_CIA_FBR_BASE_ADDR(f)               ((f) * 0x100)
152 #define SDIO_CIA_FBR_STD_IF_CODE_ADDR           0x00
153 #define SDIO_CIA_FBR_STD_IF_CODE_LOC            0
154 #define SDIO_CIA_FBR_STD_IF_CODE_MASK           0x0f
155 #define SDIO_CIA_FBR_STD_IF_CODE_EXT_ADDR       0x01
156 #define SDIO_CIA_FBR_CIS_ADDR                   0x09
157 #define SDIO_CIA_FBR_BLK_SIZE_ADDR              0x10
158 
159 //Sec.16.5 CIS FIELDS
160 
161 #define SDIO_CIS_TPL_FRMT_TCODE_OFF           0x00
162 #define SDIO_CIS_TPL_FRMT_TLINK_OFF           0x01
163 #define SDIO_CIS_TPL_FRMT_TBODY_OFF           0x02
164 
165 #define SDIO_CIS_TPL_CODE_NULL                0x00
166 #define SDIO_CIS_TPL_CODE_CHECKSUM            0x10
167 #define SDIO_CIS_TPL_CODE_VES_1               0x15
168 #define SDIO_CIS_TPL_CODE_ALTSTR              0x16
169 #define SDIO_CIS_TPL_CODE_MANFID              0x20
170 #define SDIO_CIS_TPL_MANFID_MIN_BDY_SZ        4
171 #define SDIO_CIS_TPL_CODE_FUNCID              0x21
172 #define SDIO_CIS_TPL_CODE_FUNCE               0x22
173 #define SDIO_CIS_TPL_FUNC0_FUNCE_MIN_BDY_SZ   4
174 #define SDIO_CIS_TPL_FUNCx_FUNCE_MIN_BDY_SZ   42
175 #define SDIO_CIS_TPL_CODE_VENDOR_START        0x80
176 #define SDIO_CIS_TPL_CODE_VENDOR_END          0x8F
177 #define SDIO_CIS_TPL_CODE_SDIO_STD            0x91
178 #define SDIO_CIS_TPL_CODE_SDIO_EXT            0x92
179 #define SDIO_CIS_TPL_CODE_END                 0xFF
180 #define SDIO_CIS_TPL_LINK_END                 0xFF
181 
182 #define SDIO_CIS_TPL_FUNCE_FUNC0_MAX_BLK_SIZE_LOC    1
183 #define SDIO_CIS_TPL_FUNCE_FUNCx_MAX_BLK_SIZE_LOC    12
184 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_UNIT_LOC   0
185 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_UNIT_MASK  0x07
186 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_VAL_LOC    3
187 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_VAL_MASK   0x78
188 
189 //Sec.16.7.3
190 static const uint32_t sdio_cis_tpl_funce_tran_speed_val[16] =
191     {0, 100, 120, 130, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 700, 800};
192 static const uint32_t sdio_cis_tpl_funce_tran_speed_unit[8] =
193     {1, 10, 100, 1000, 0, 0, 0, 0 }; //Kbit/sec
194 
195