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