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
190static 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};
192static const uint32_t sdio_cis_tpl_funce_tran_speed_unit[8] =
193    {1, 10, 100, 1000, 0, 0, 0, 0 }; //Kbit/sec
194
195