1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016 - 2020, Broadcom 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <string.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/mmio.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <platform_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include "bcm_emmc.h" 15*91f16700Schasinglulu #include "emmc_chal_types.h" 16*91f16700Schasinglulu #include "emmc_chal_sd.h" 17*91f16700Schasinglulu #include "emmc_pboot_hal_memory_drv.h" 18*91f16700Schasinglulu 19*91f16700Schasinglulu extern void emmc_soft_reset(void); 20*91f16700Schasinglulu 21*91f16700Schasinglulu #define SD_VDD_WINDOW_1_6_TO_1_7 0x00000010 // 1.6 V to 1.7 Volts 22*91f16700Schasinglulu #define SD_VDD_WINDOW_1_7_TO_1_8 0x00000020 // 1.7 V to 1.8 Volts 23*91f16700Schasinglulu #define SD_VDD_WINDOW_1_8_TO_1_9 0x00000040 // 1.8 V to 1.9 Volts 24*91f16700Schasinglulu #define SD_VDD_WINDOW_1_9_TO_2_0 0x00000080 // 1.9 V to 2.0 Volts 25*91f16700Schasinglulu #define SD_VDD_WINDOW_2_0_TO_2_1 0x00000100 // 2.0 V to 2.1 Volts 26*91f16700Schasinglulu #define SD_VDD_WINDOW_2_1_TO_2_2 0x00000200 // 2.1 V to 2.2 Volts 27*91f16700Schasinglulu #define SD_VDD_WINDOW_2_2_TO_2_3 0x00000400 // 2.2 V to 2.3 Volts 28*91f16700Schasinglulu #define SD_VDD_WINDOW_2_3_TO_2_4 0x00000800 // 2.3 V to 2.4 Volts 29*91f16700Schasinglulu #define SD_VDD_WINDOW_2_4_TO_2_5 0x00001000 // 2.4 V to 2.5 Volts 30*91f16700Schasinglulu #define SD_VDD_WINDOW_2_5_TO_2_6 0x00002000 // 2.5 V to 2.6 Volts 31*91f16700Schasinglulu #define SD_VDD_WINDOW_2_6_TO_2_7 0x00004000 // 2.6 V to 2.7 Volts 32*91f16700Schasinglulu #define SD_VDD_WINDOW_2_7_TO_2_8 0x00008000 // 2.7 V to 2.8 Volts 33*91f16700Schasinglulu #define SD_VDD_WINDOW_2_8_TO_2_9 0x00010000 // 2.8 V to 2.9 Volts 34*91f16700Schasinglulu #define SD_VDD_WINDOW_2_9_TO_3_0 0x00020000 // 2.9 V to 3.0 Volts 35*91f16700Schasinglulu #define SD_VDD_WINDOW_3_0_TO_3_1 0x00040000 // 3.0 V to 3.1 Volts 36*91f16700Schasinglulu #define SD_VDD_WINDOW_3_1_TO_3_2 0x00080000 // 3.1 V to 3.2 Volts 37*91f16700Schasinglulu #define SD_VDD_WINDOW_3_2_TO_3_3 0x00100000 // 3.2 V to 3.3 Volts 38*91f16700Schasinglulu #define SD_VDD_WINDOW_3_3_TO_3_4 0x00200000 // 3.3 V to 3.4 Volts 39*91f16700Schasinglulu #define SD_VDD_WINDOW_3_4_TO_3_5 0x00400000 // 3.4 V to 3.5 Volts 40*91f16700Schasinglulu #define SD_VDD_WINDOW_3_5_TO_3_6 0x00800000 // 3.5 V to 3.6 Volts 41*91f16700Schasinglulu 42*91f16700Schasinglulu #define SD_VDD_WINDOW_1_6_TO_2_6 (SD_VDD_WINDOW_1_6_TO_1_7 | \ 43*91f16700Schasinglulu SD_VDD_WINDOW_1_7_TO_1_8 | \ 44*91f16700Schasinglulu SD_VDD_WINDOW_1_8_TO_1_9 | \ 45*91f16700Schasinglulu SD_VDD_WINDOW_1_9_TO_2_0 | \ 46*91f16700Schasinglulu SD_VDD_WINDOW_2_0_TO_2_1 | \ 47*91f16700Schasinglulu SD_VDD_WINDOW_2_1_TO_2_2 | \ 48*91f16700Schasinglulu SD_VDD_WINDOW_2_2_TO_2_3 | \ 49*91f16700Schasinglulu SD_VDD_WINDOW_2_3_TO_2_4 | \ 50*91f16700Schasinglulu SD_VDD_WINDOW_2_4_TO_2_5 | \ 51*91f16700Schasinglulu SD_VDD_WINDOW_2_5_TO_2_6) 52*91f16700Schasinglulu 53*91f16700Schasinglulu #define SD_VDD_WINDOW_2_6_TO_3_2 (SD_VDD_WINDOW_2_6_TO_2_7 | \ 54*91f16700Schasinglulu SD_VDD_WINDOW_2_7_TO_2_8 | \ 55*91f16700Schasinglulu SD_VDD_WINDOW_2_8_TO_2_9 | \ 56*91f16700Schasinglulu SD_VDD_WINDOW_2_9_TO_3_0 | \ 57*91f16700Schasinglulu SD_VDD_WINDOW_3_0_TO_3_1 | \ 58*91f16700Schasinglulu SD_VDD_WINDOW_3_1_TO_3_2) 59*91f16700Schasinglulu 60*91f16700Schasinglulu #define SD_VDD_WINDOW_3_2_TO_3_6 (SD_VDD_WINDOW_3_2_TO_3_3 | \ 61*91f16700Schasinglulu SD_VDD_WINDOW_3_3_TO_3_4 | \ 62*91f16700Schasinglulu SD_VDD_WINDOW_3_4_TO_3_5 | \ 63*91f16700Schasinglulu SD_VDD_WINDOW_3_5_TO_3_6) 64*91f16700Schasinglulu 65*91f16700Schasinglulu 66*91f16700Schasinglulu static int32_t chal_sd_set_power(struct sd_dev *handle, 67*91f16700Schasinglulu uint32_t voltage, uint32_t state); 68*91f16700Schasinglulu 69*91f16700Schasinglulu static void chal_sd_set_dma_boundary(struct sd_dev *handle, uint32_t boundary); 70*91f16700Schasinglulu 71*91f16700Schasinglulu static int32_t chal_sd_setup_handler(struct sd_dev *handle, 72*91f16700Schasinglulu uint32_t sdBbase, uint32_t hostBase); 73*91f16700Schasinglulu 74*91f16700Schasinglulu /* 75*91f16700Schasinglulu * Configure host controller pwr settings, 76*91f16700Schasinglulu * to match voltage requirements by SD Card 77*91f16700Schasinglulu */ 78*91f16700Schasinglulu static int32_t chal_sd_set_power(struct sd_dev *handle, 79*91f16700Schasinglulu uint32_t voltage, uint32_t state) 80*91f16700Schasinglulu { 81*91f16700Schasinglulu int32_t rc, rval = SD_FAIL; 82*91f16700Schasinglulu uint32_t time = 0; 83*91f16700Schasinglulu 84*91f16700Schasinglulu if (handle == NULL) 85*91f16700Schasinglulu return SD_INVALID_HANDLE; 86*91f16700Schasinglulu 87*91f16700Schasinglulu mmio_clrsetbits_32(handle->ctrl.sdRegBaseAddr + 88*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET, 89*91f16700Schasinglulu (SD4_EMMC_TOP_CTRL_SDVSELVDD1_MASK | 90*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_SDPWR_MASK), 91*91f16700Schasinglulu (voltage << 9)); 92*91f16700Schasinglulu 93*91f16700Schasinglulu /* 94*91f16700Schasinglulu * Long delay is required here in emulation. Without this, the initial 95*91f16700Schasinglulu * commands sent to the eMMC card timeout. We don't know if this 96*91f16700Schasinglulu * delay is necessary with silicon, leaving in for safety. 97*91f16700Schasinglulu * It is observed that 403ms on emulation system and as per the clock 98*91f16700Schasinglulu * calculations it is expected to complete with in 1ms on chip 99*91f16700Schasinglulu */ 100*91f16700Schasinglulu do { 101*91f16700Schasinglulu rc = mmio_read_32(handle->ctrl.sdRegBaseAddr + 102*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET); 103*91f16700Schasinglulu 104*91f16700Schasinglulu if ((rc & SD4_EMMC_TOP_INTR_CRDINS_MASK) == 105*91f16700Schasinglulu SD4_EMMC_TOP_INTR_CRDINS_MASK) 106*91f16700Schasinglulu break; 107*91f16700Schasinglulu 108*91f16700Schasinglulu mdelay(1); 109*91f16700Schasinglulu } while (time++ < EMMC_CARD_DETECT_TIMEOUT_MS); 110*91f16700Schasinglulu 111*91f16700Schasinglulu if (time >= EMMC_CARD_DETECT_TIMEOUT_MS) { 112*91f16700Schasinglulu ERROR("EMMC: Card insert event detection timeout\n"); 113*91f16700Schasinglulu return rval; 114*91f16700Schasinglulu } 115*91f16700Schasinglulu 116*91f16700Schasinglulu VERBOSE("EMMC: Card detection delay: %dms\n", time); 117*91f16700Schasinglulu 118*91f16700Schasinglulu if (state) 119*91f16700Schasinglulu mmio_setbits_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL_OFFSET, 120*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_SDPWR_MASK); 121*91f16700Schasinglulu 122*91f16700Schasinglulu /* dummy write & ack to verify if the sdio is ready to send commands */ 123*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_ARG_OFFSET, 0); 124*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CMD_OFFSET, 0); 125*91f16700Schasinglulu 126*91f16700Schasinglulu /* 127*91f16700Schasinglulu * 63ms observed on emulation system, As per clock calculations 128*91f16700Schasinglulu * it will complete < 1ms on chip. 129*91f16700Schasinglulu */ 130*91f16700Schasinglulu time = 0; 131*91f16700Schasinglulu do { 132*91f16700Schasinglulu rc = mmio_read_32(handle->ctrl.sdRegBaseAddr + 133*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET); 134*91f16700Schasinglulu 135*91f16700Schasinglulu if (rc & SD4_EMMC_TOP_INTR_ERRIRQ_MASK) 136*91f16700Schasinglulu break; 137*91f16700Schasinglulu 138*91f16700Schasinglulu if ((rc & SD4_EMMC_TOP_INTR_CMDDONE_MASK) == 139*91f16700Schasinglulu SD4_EMMC_TOP_INTR_CMDDONE_MASK) 140*91f16700Schasinglulu break; 141*91f16700Schasinglulu 142*91f16700Schasinglulu mdelay(1); 143*91f16700Schasinglulu } while (time++ < EMMC_CMD_TIMEOUT_MS); 144*91f16700Schasinglulu 145*91f16700Schasinglulu if (time >= EMMC_CMD_TIMEOUT_MS) { 146*91f16700Schasinglulu WARN("%s %d Initial dummy command timeout is happened\n", 147*91f16700Schasinglulu __func__, __LINE__); 148*91f16700Schasinglulu return rval; 149*91f16700Schasinglulu } 150*91f16700Schasinglulu 151*91f16700Schasinglulu VERBOSE("EMMC: Dummy Command delay: %dms\n", time); 152*91f16700Schasinglulu 153*91f16700Schasinglulu return SD_OK; 154*91f16700Schasinglulu } 155*91f16700Schasinglulu 156*91f16700Schasinglulu /* 157*91f16700Schasinglulu * Configure DMA Boundaries 158*91f16700Schasinglulu */ 159*91f16700Schasinglulu static void chal_sd_set_dma_boundary(struct sd_dev *handle, uint32_t boundary) 160*91f16700Schasinglulu { 161*91f16700Schasinglulu if (handle == NULL) 162*91f16700Schasinglulu return; 163*91f16700Schasinglulu 164*91f16700Schasinglulu mmio_clrsetbits_32(handle->ctrl.sdRegBaseAddr + 165*91f16700Schasinglulu SD4_EMMC_TOP_BLOCK_OFFSET, 166*91f16700Schasinglulu SD4_EMMC_TOP_BLOCK_HSBS_MASK, boundary); 167*91f16700Schasinglulu } 168*91f16700Schasinglulu 169*91f16700Schasinglulu static int32_t chal_sd_setup_handler(struct sd_dev *handle, uint32_t sdBase, 170*91f16700Schasinglulu uint32_t hostBase) 171*91f16700Schasinglulu { 172*91f16700Schasinglulu if (handle == NULL) 173*91f16700Schasinglulu return SD_INVALID_HANDLE; 174*91f16700Schasinglulu 175*91f16700Schasinglulu handle->ctrl.sdRegBaseAddr = sdBase; 176*91f16700Schasinglulu handle->ctrl.hostRegBaseAddr = hostBase; 177*91f16700Schasinglulu handle->ctrl.present = 0; 178*91f16700Schasinglulu handle->ctrl.rca = 0; 179*91f16700Schasinglulu handle->ctrl.blkGapEnable = 0; 180*91f16700Schasinglulu handle->ctrl.cmdStatus = 0; 181*91f16700Schasinglulu 182*91f16700Schasinglulu return SD_OK; 183*91f16700Schasinglulu } 184*91f16700Schasinglulu 185*91f16700Schasinglulu /* 186*91f16700Schasinglulu * Initialize SD Host controller 187*91f16700Schasinglulu */ 188*91f16700Schasinglulu int32_t chal_sd_init(CHAL_HANDLE *sd_handle) 189*91f16700Schasinglulu { 190*91f16700Schasinglulu uint32_t cap_val_l = 0; 191*91f16700Schasinglulu uint32_t ctl_val, voltage; 192*91f16700Schasinglulu uint32_t timeout_val; 193*91f16700Schasinglulu struct sd_dev *handle; 194*91f16700Schasinglulu uint32_t reg_val; 195*91f16700Schasinglulu int32_t rval = SD_FAIL; 196*91f16700Schasinglulu 197*91f16700Schasinglulu if (sd_handle == NULL) 198*91f16700Schasinglulu return SD_INVALID_HANDLE; 199*91f16700Schasinglulu 200*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 201*91f16700Schasinglulu 202*91f16700Schasinglulu /* 203*91f16700Schasinglulu * Set SDIO Host Controller capabilities register 204*91f16700Schasinglulu */ 205*91f16700Schasinglulu EMMC_TRACE("Set Host Controller Capabilities register\n"); 206*91f16700Schasinglulu 207*91f16700Schasinglulu reg_val = 0; 208*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__SLOT_TYPE_R); 209*91f16700Schasinglulu reg_val |= (0 << ICFG_SDIO0_CAP0__INT_MODE_R); 210*91f16700Schasinglulu reg_val |= (0 << ICFG_SDIO0_CAP0__SYS_BUS_64BIT_R); 211*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_1P8V_R); 212*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_3P0V_R); 213*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__VOLTAGE_3P3V_R); 214*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__SUSPEND_RESUME_R); 215*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__SDMA_R); 216*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__HIGH_SPEED_R); 217*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__ADMA2_R); 218*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__EXTENDED_MEDIA_R); 219*91f16700Schasinglulu reg_val |= (2 << ICFG_SDIO0_CAP0__MAX_BLOCK_LEN_R); 220*91f16700Schasinglulu reg_val |= (0xd0 << ICFG_SDIO0_CAP0__BASE_CLK_FREQ_R); 221*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP0__TIMEOUT_UNIT_R); 222*91f16700Schasinglulu reg_val |= (0x30 << ICFG_SDIO0_CAP0__TIMEOUT_CLK_FREQ_R); 223*91f16700Schasinglulu 224*91f16700Schasinglulu mmio_write_32(ICFG_SDIO0_CAP0, reg_val); 225*91f16700Schasinglulu 226*91f16700Schasinglulu reg_val = 0; 227*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__SPI_BLOCK_MODE_R); 228*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__SPI_MODE_R); 229*91f16700Schasinglulu reg_val |= (0 << ICFG_SDIO0_CAP1__CLK_MULT_R); 230*91f16700Schasinglulu reg_val |= (0 << ICFG_SDIO0_CAP1__RETUNING_MODE_R); 231*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__TUNE_SDR50_R); 232*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__TIME_RETUNE_R); 233*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_D_R); 234*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_C_R); 235*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__DRIVER_A_R); 236*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__DDR50_R); 237*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__SDR104_R); 238*91f16700Schasinglulu reg_val |= (1 << ICFG_SDIO0_CAP1__SDR50_R); 239*91f16700Schasinglulu 240*91f16700Schasinglulu mmio_write_32(ICFG_SDIO0_CAP1, reg_val); 241*91f16700Schasinglulu 242*91f16700Schasinglulu /* Reset the SDIO controller */ 243*91f16700Schasinglulu chal_sd_stop(); 244*91f16700Schasinglulu 245*91f16700Schasinglulu /* Turn on SD clock */ 246*91f16700Schasinglulu chal_sd_set_clock(sd_handle, 247*91f16700Schasinglulu chal_sd_freq_2_div_ctrl_setting(INIT_CLK_FREQ), 1); 248*91f16700Schasinglulu 249*91f16700Schasinglulu /* program data time out value to the max */ 250*91f16700Schasinglulu timeout_val = SD_HOST_CORE_TIMEOUT; 251*91f16700Schasinglulu 252*91f16700Schasinglulu ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr + 253*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 254*91f16700Schasinglulu ctl_val |= ((timeout_val & 0xf) << SD4_EMMC_TOP_CTRL1_DTCNT_SHIFT); 255*91f16700Schasinglulu 256*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET, 257*91f16700Schasinglulu ctl_val); 258*91f16700Schasinglulu 259*91f16700Schasinglulu /* enable all interrupt status */ 260*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN1_OFFSET, 261*91f16700Schasinglulu 0); 262*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN2_OFFSET, 263*91f16700Schasinglulu 0); 264*91f16700Schasinglulu 265*91f16700Schasinglulu SD_US_DELAY(100); 266*91f16700Schasinglulu 267*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN1_OFFSET, 268*91f16700Schasinglulu SD_NOR_INTERRUPTS | SD_ERR_INTERRUPTS); 269*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_INTREN2_OFFSET, 270*91f16700Schasinglulu SD_NOR_INTERRUPTS | SD_ERR_INTERRUPTS); 271*91f16700Schasinglulu 272*91f16700Schasinglulu /* Select SD bus voltage */ 273*91f16700Schasinglulu cap_val_l = mmio_read_32(handle->ctrl.sdRegBaseAddr + 274*91f16700Schasinglulu SD4_EMMC_TOP_CAPABILITIES1_OFFSET); 275*91f16700Schasinglulu handle->cfg.voltage = 0; 276*91f16700Schasinglulu voltage = 0x7; 277*91f16700Schasinglulu 278*91f16700Schasinglulu if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V33_MASK) { 279*91f16700Schasinglulu handle->cfg.voltage |= SD_VDD_WINDOW_3_3_TO_3_4; 280*91f16700Schasinglulu voltage = 0x7; 281*91f16700Schasinglulu } else if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V3_MASK) { 282*91f16700Schasinglulu handle->cfg.voltage |= SD_VDD_WINDOW_3_0_TO_3_1; 283*91f16700Schasinglulu voltage = 0x6; 284*91f16700Schasinglulu } else if (cap_val_l & SD4_EMMC_TOP_CAPABILITIES1_V18_MASK) { 285*91f16700Schasinglulu handle->cfg.voltage |= SD_VDD_WINDOW_1_8_TO_1_9; 286*91f16700Schasinglulu voltage = 0x5; 287*91f16700Schasinglulu } 288*91f16700Schasinglulu 289*91f16700Schasinglulu rval = chal_sd_set_power(handle, voltage, SD4_EMMC_TOP_CTRL_SDPWR_MASK); 290*91f16700Schasinglulu 291*91f16700Schasinglulu ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr + 292*91f16700Schasinglulu SD4_EMMC_TOP_HCVERSIRQ_OFFSET); 293*91f16700Schasinglulu handle->ctrl.version = ((ctl_val >> 16) & 0xFF); 294*91f16700Schasinglulu 295*91f16700Schasinglulu return rval; 296*91f16700Schasinglulu } 297*91f16700Schasinglulu 298*91f16700Schasinglulu void chal_sd_set_speed(CHAL_HANDLE *sd_handle, uint32_t speed) 299*91f16700Schasinglulu { 300*91f16700Schasinglulu struct sd_dev *handle; 301*91f16700Schasinglulu 302*91f16700Schasinglulu if (sd_handle == NULL) 303*91f16700Schasinglulu return; 304*91f16700Schasinglulu 305*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 306*91f16700Schasinglulu 307*91f16700Schasinglulu if (speed) { 308*91f16700Schasinglulu EMMC_TRACE("enable HighSpeed\n"); 309*91f16700Schasinglulu mmio_setbits_32(handle->ctrl.sdRegBaseAddr + 310*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET, 311*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_HSEN_MASK); 312*91f16700Schasinglulu } else { 313*91f16700Schasinglulu EMMC_TRACE("disable HighSpeed\n"); 314*91f16700Schasinglulu mmio_clrbits_32(handle->ctrl.sdRegBaseAddr + 315*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET, 316*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_HSEN_MASK); 317*91f16700Schasinglulu } 318*91f16700Schasinglulu } 319*91f16700Schasinglulu 320*91f16700Schasinglulu int32_t chal_sd_stop(void) 321*91f16700Schasinglulu { 322*91f16700Schasinglulu uintptr_t idm_rst_ctrl_addr = EMMC_IDM_RESET_CTRL_ADDR; 323*91f16700Schasinglulu 324*91f16700Schasinglulu /* Configure IO pins */ 325*91f16700Schasinglulu emmc_soft_reset(); 326*91f16700Schasinglulu 327*91f16700Schasinglulu /* Reset the SDIO controller */ 328*91f16700Schasinglulu mmio_write_32(idm_rst_ctrl_addr, 1); 329*91f16700Schasinglulu SD_US_DELAY(100); 330*91f16700Schasinglulu mmio_write_32(idm_rst_ctrl_addr, 0); 331*91f16700Schasinglulu SD_US_DELAY(100); 332*91f16700Schasinglulu 333*91f16700Schasinglulu return SD_OK; 334*91f16700Schasinglulu } 335*91f16700Schasinglulu 336*91f16700Schasinglulu /* 337*91f16700Schasinglulu * Check if host supports specified capability 338*91f16700Schasinglulu * returns -ve val on error, 0 if capability not supported else 1. 339*91f16700Schasinglulu */ 340*91f16700Schasinglulu int32_t chal_sd_check_cap(CHAL_HANDLE *sd_handle, uint32_t caps) 341*91f16700Schasinglulu { 342*91f16700Schasinglulu struct sd_dev *handle; 343*91f16700Schasinglulu 344*91f16700Schasinglulu if (sd_handle == NULL) 345*91f16700Schasinglulu return SD_INVALID_HANDLE; 346*91f16700Schasinglulu 347*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 348*91f16700Schasinglulu 349*91f16700Schasinglulu if (caps & mmio_read_32(handle->ctrl.sdRegBaseAddr + 350*91f16700Schasinglulu SD4_EMMC_TOP_CAPABILITIES1_OFFSET)) 351*91f16700Schasinglulu return 1; 352*91f16700Schasinglulu else 353*91f16700Schasinglulu return 0; 354*91f16700Schasinglulu } 355*91f16700Schasinglulu 356*91f16700Schasinglulu int32_t chal_sd_start(CHAL_HANDLE *sd_handle, 357*91f16700Schasinglulu uint32_t mode, uint32_t sd_base, uint32_t host_base) 358*91f16700Schasinglulu { 359*91f16700Schasinglulu 360*91f16700Schasinglulu struct sd_dev *handle; 361*91f16700Schasinglulu int32_t rval = SD_FAIL; 362*91f16700Schasinglulu 363*91f16700Schasinglulu if (sd_handle == NULL) 364*91f16700Schasinglulu return SD_INVALID_HANDLE; 365*91f16700Schasinglulu 366*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 367*91f16700Schasinglulu 368*91f16700Schasinglulu handle->cfg.mode = SD_PIO_MODE; /* set to PIO mode first for init */ 369*91f16700Schasinglulu handle->cfg.dma = SD_DMA_OFF; 370*91f16700Schasinglulu 371*91f16700Schasinglulu chal_sd_setup_handler(handle, sd_base, host_base); 372*91f16700Schasinglulu 373*91f16700Schasinglulu /* init and start hw */ 374*91f16700Schasinglulu rval = chal_sd_init(sd_handle); 375*91f16700Schasinglulu if (rval != SD_OK) 376*91f16700Schasinglulu return rval; 377*91f16700Schasinglulu 378*91f16700Schasinglulu chal_sd_clear_pending_irq(sd_handle); 379*91f16700Schasinglulu 380*91f16700Schasinglulu handle->ctrl.eventList = 0; 381*91f16700Schasinglulu handle->cfg.mode = mode; 382*91f16700Schasinglulu 383*91f16700Schasinglulu return SD_OK; 384*91f16700Schasinglulu } 385*91f16700Schasinglulu 386*91f16700Schasinglulu /* 387*91f16700Schasinglulu * Function to check 8bits of err generated from auto CMD12 388*91f16700Schasinglulu */ 389*91f16700Schasinglulu int32_t chal_sd_get_atuo12_error(CHAL_HANDLE *sd_handle) 390*91f16700Schasinglulu { 391*91f16700Schasinglulu struct sd_dev *handle; 392*91f16700Schasinglulu 393*91f16700Schasinglulu if (sd_handle == NULL) 394*91f16700Schasinglulu return SD_INVALID_HANDLE; 395*91f16700Schasinglulu 396*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 397*91f16700Schasinglulu 398*91f16700Schasinglulu return (mmio_read_32(handle->ctrl.sdRegBaseAddr + 399*91f16700Schasinglulu SD4_EMMC_TOP_ERRSTAT_OFFSET) & 0xFF); 400*91f16700Schasinglulu } 401*91f16700Schasinglulu 402*91f16700Schasinglulu /* 403*91f16700Schasinglulu * Read present state register 404*91f16700Schasinglulu */ 405*91f16700Schasinglulu uint32_t chal_sd_get_present_status(CHAL_HANDLE *sd_handle) 406*91f16700Schasinglulu { 407*91f16700Schasinglulu struct sd_dev *handle; 408*91f16700Schasinglulu 409*91f16700Schasinglulu if (sd_handle == NULL) 410*91f16700Schasinglulu return SD_INVALID_HANDLE; 411*91f16700Schasinglulu 412*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 413*91f16700Schasinglulu 414*91f16700Schasinglulu return mmio_read_32(handle->ctrl.sdRegBaseAddr + 415*91f16700Schasinglulu SD4_EMMC_TOP_PSTATE_OFFSET); 416*91f16700Schasinglulu } 417*91f16700Schasinglulu 418*91f16700Schasinglulu /* 419*91f16700Schasinglulu * Set SD bus width 420*91f16700Schasinglulu */ 421*91f16700Schasinglulu int32_t chal_sd_config_bus_width(CHAL_HANDLE *sd_handle, int32_t width) 422*91f16700Schasinglulu { 423*91f16700Schasinglulu uint32_t ctl_val; 424*91f16700Schasinglulu struct sd_dev *handle; 425*91f16700Schasinglulu 426*91f16700Schasinglulu if (sd_handle == NULL) 427*91f16700Schasinglulu return SD_INVALID_HANDLE; 428*91f16700Schasinglulu 429*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 430*91f16700Schasinglulu 431*91f16700Schasinglulu ctl_val = mmio_read_32(handle->ctrl.sdRegBaseAddr + 432*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET); 433*91f16700Schasinglulu 434*91f16700Schasinglulu switch (width) { 435*91f16700Schasinglulu #ifdef DRIVER_EMMC_ENABLE_DATA_WIDTH_8BIT 436*91f16700Schasinglulu case SD_BUS_DATA_WIDTH_8BIT: 437*91f16700Schasinglulu ctl_val &= ~SD_BUS_DATA_WIDTH_4BIT; 438*91f16700Schasinglulu ctl_val |= SD_BUS_DATA_WIDTH_8BIT; 439*91f16700Schasinglulu break; 440*91f16700Schasinglulu #endif 441*91f16700Schasinglulu case SD_BUS_DATA_WIDTH_4BIT: 442*91f16700Schasinglulu ctl_val &= ~SD_BUS_DATA_WIDTH_8BIT; 443*91f16700Schasinglulu ctl_val |= SD_BUS_DATA_WIDTH_4BIT; 444*91f16700Schasinglulu break; 445*91f16700Schasinglulu case SD_BUS_DATA_WIDTH_1BIT: 446*91f16700Schasinglulu ctl_val &= ~(SD_BUS_DATA_WIDTH_4BIT | SD_BUS_DATA_WIDTH_8BIT); 447*91f16700Schasinglulu break; 448*91f16700Schasinglulu default: 449*91f16700Schasinglulu return SD_INV_DATA_WIDTH; 450*91f16700Schasinglulu }; 451*91f16700Schasinglulu 452*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL_OFFSET, 453*91f16700Schasinglulu ctl_val); 454*91f16700Schasinglulu 455*91f16700Schasinglulu return SD_OK; 456*91f16700Schasinglulu } 457*91f16700Schasinglulu 458*91f16700Schasinglulu /* 459*91f16700Schasinglulu * Function to enable or disable DMA control. 460*91f16700Schasinglulu */ 461*91f16700Schasinglulu int32_t chal_sd_set_dma(CHAL_HANDLE *sd_handle, uint32_t mode) 462*91f16700Schasinglulu { 463*91f16700Schasinglulu uint32_t val; 464*91f16700Schasinglulu struct sd_dev *handle; 465*91f16700Schasinglulu int32_t rc; 466*91f16700Schasinglulu 467*91f16700Schasinglulu if (sd_handle == NULL) 468*91f16700Schasinglulu return SD_INVALID_HANDLE; 469*91f16700Schasinglulu 470*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 471*91f16700Schasinglulu 472*91f16700Schasinglulu if (mode) { 473*91f16700Schasinglulu rc = chal_sd_check_cap(sd_handle, 474*91f16700Schasinglulu SD4_EMMC_TOP_CAPABILITIES1_SDMA_MASK | 475*91f16700Schasinglulu SD4_EMMC_TOP_CAPABILITIES1_ADMA2_MASK); 476*91f16700Schasinglulu if (rc < 0) 477*91f16700Schasinglulu return rc; 478*91f16700Schasinglulu 479*91f16700Schasinglulu if (rc) { 480*91f16700Schasinglulu 481*91f16700Schasinglulu handle->cfg.dma = mode; 482*91f16700Schasinglulu val = mmio_read_32(handle->ctrl.sdRegBaseAddr + 483*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET); 484*91f16700Schasinglulu val &= ~(SD4_EMMC_TOP_CTRL_DMASEL_MASK); 485*91f16700Schasinglulu val |= handle->cfg.dma - 1; 486*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + 487*91f16700Schasinglulu SD4_EMMC_TOP_CTRL_OFFSET, val); 488*91f16700Schasinglulu return SD_OK; 489*91f16700Schasinglulu } 490*91f16700Schasinglulu } 491*91f16700Schasinglulu handle->cfg.dma = 0; 492*91f16700Schasinglulu 493*91f16700Schasinglulu return SD_FAIL; 494*91f16700Schasinglulu } 495*91f16700Schasinglulu 496*91f16700Schasinglulu /* 497*91f16700Schasinglulu * Get current DMA address. 498*91f16700Schasinglulu * Called only when there is no data transaction activity. 499*91f16700Schasinglulu */ 500*91f16700Schasinglulu uintptr_t chal_sd_get_dma_addr(CHAL_HANDLE *sd_handle) 501*91f16700Schasinglulu { 502*91f16700Schasinglulu struct sd_dev *handle; 503*91f16700Schasinglulu 504*91f16700Schasinglulu if (sd_handle == NULL) 505*91f16700Schasinglulu return SD_INVALID_HANDLE; 506*91f16700Schasinglulu 507*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 508*91f16700Schasinglulu 509*91f16700Schasinglulu if (handle->cfg.dma == SD_DMA_OFF) 510*91f16700Schasinglulu return 0; 511*91f16700Schasinglulu 512*91f16700Schasinglulu return (uintptr_t)mmio_read_32(handle->ctrl.sdRegBaseAddr + 513*91f16700Schasinglulu SD4_EMMC_TOP_SYSADDR_OFFSET); 514*91f16700Schasinglulu } 515*91f16700Schasinglulu 516*91f16700Schasinglulu int32_t chal_sd_send_cmd(CHAL_HANDLE *sd_handle, uint32_t cmd_idx, 517*91f16700Schasinglulu uint32_t argument, uint32_t options) 518*91f16700Schasinglulu { 519*91f16700Schasinglulu uint32_t cmd_mode_reg = 0; 520*91f16700Schasinglulu struct sd_dev *handle; 521*91f16700Schasinglulu 522*91f16700Schasinglulu if (sd_handle == NULL) 523*91f16700Schasinglulu return SD_INVALID_HANDLE; 524*91f16700Schasinglulu 525*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 526*91f16700Schasinglulu 527*91f16700Schasinglulu EMMC_TRACE("%s %d cmd:%d argReg:%x options:%x\n", 528*91f16700Schasinglulu __func__, __LINE__, cmd_idx, argument, options); 529*91f16700Schasinglulu 530*91f16700Schasinglulu /* Configure the value for command and mode registers */ 531*91f16700Schasinglulu cmd_mode_reg = (cmd_idx << 24) | options; 532*91f16700Schasinglulu 533*91f16700Schasinglulu /* 534*91f16700Schasinglulu * 1. Write block size reg & block count reg, 535*91f16700Schasinglulu * this is done in the tx or rx setup 536*91f16700Schasinglulu */ 537*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_BLOCK_OFFSET, 538*91f16700Schasinglulu handle->ctrl.blkReg); 539*91f16700Schasinglulu 540*91f16700Schasinglulu /* 2. Write argument reg */ 541*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_ARG_OFFSET, 542*91f16700Schasinglulu argument); 543*91f16700Schasinglulu handle->ctrl.argReg = argument; 544*91f16700Schasinglulu 545*91f16700Schasinglulu /* 546*91f16700Schasinglulu * 3. Write transfer mode reg & command reg, check the DMA bit which is 547*91f16700Schasinglulu * set before this function call if it is selected. 548*91f16700Schasinglulu */ 549*91f16700Schasinglulu if (cmd_idx == 24 || cmd_idx == 25 || cmd_idx == 18 || cmd_idx == 17 || 550*91f16700Schasinglulu cmd_idx == 42 || cmd_idx == 51 || cmd_idx == 53) 551*91f16700Schasinglulu cmd_mode_reg |= ((handle->cfg.dma) ? 1 : 0); 552*91f16700Schasinglulu 553*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CMD_OFFSET, 554*91f16700Schasinglulu cmd_mode_reg); 555*91f16700Schasinglulu 556*91f16700Schasinglulu handle->ctrl.cmdIndex = cmd_idx; 557*91f16700Schasinglulu 558*91f16700Schasinglulu return SD_OK; 559*91f16700Schasinglulu } 560*91f16700Schasinglulu 561*91f16700Schasinglulu int32_t chal_sd_set_dma_addr(CHAL_HANDLE *sd_handle, uintptr_t address) 562*91f16700Schasinglulu { 563*91f16700Schasinglulu struct sd_dev *handle; 564*91f16700Schasinglulu 565*91f16700Schasinglulu if (sd_handle == NULL) 566*91f16700Schasinglulu return SD_INVALID_HANDLE; 567*91f16700Schasinglulu 568*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 569*91f16700Schasinglulu 570*91f16700Schasinglulu if (handle->cfg.dma == SD_DMA_OFF) 571*91f16700Schasinglulu return SD_FAIL; 572*91f16700Schasinglulu 573*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_SYSADDR_OFFSET, 574*91f16700Schasinglulu address); 575*91f16700Schasinglulu return SD_OK; 576*91f16700Schasinglulu } 577*91f16700Schasinglulu 578*91f16700Schasinglulu uint32_t chal_sd_freq_2_div_ctrl_setting(uint32_t desired_freq) 579*91f16700Schasinglulu { 580*91f16700Schasinglulu /* 581*91f16700Schasinglulu * Divider control setting represents 1/2 of the actual divider value. 582*91f16700Schasinglulu * 583*91f16700Schasinglulu * DesiredFreq = BaseClockFreq / (2 * div_ctrl_setting) 584*91f16700Schasinglulu * 585*91f16700Schasinglulu * ==> div_ctrl_setting = BaseClockFreq / (2 * DesiredFreq) 586*91f16700Schasinglulu */ 587*91f16700Schasinglulu uint32_t div_ctrl_setting; 588*91f16700Schasinglulu uint32_t actual_freq; 589*91f16700Schasinglulu 590*91f16700Schasinglulu assert(desired_freq != 0); 591*91f16700Schasinglulu 592*91f16700Schasinglulu /* Special case, 0 = divider of 1. */ 593*91f16700Schasinglulu if (desired_freq >= BASE_CLK_FREQ) 594*91f16700Schasinglulu return 0; 595*91f16700Schasinglulu 596*91f16700Schasinglulu /* Normal case, desired_freq < BASE_CLK_FREQ */ 597*91f16700Schasinglulu div_ctrl_setting = BASE_CLK_FREQ / (2 * desired_freq); 598*91f16700Schasinglulu 599*91f16700Schasinglulu actual_freq = BASE_CLK_FREQ / (2 * div_ctrl_setting); 600*91f16700Schasinglulu 601*91f16700Schasinglulu if (actual_freq > desired_freq) { 602*91f16700Schasinglulu /* 603*91f16700Schasinglulu * Division does not result in exact frequency match. 604*91f16700Schasinglulu * Make sure resulting frequency does not exceed requested freq. 605*91f16700Schasinglulu */ 606*91f16700Schasinglulu div_ctrl_setting++; 607*91f16700Schasinglulu } 608*91f16700Schasinglulu 609*91f16700Schasinglulu return div_ctrl_setting; 610*91f16700Schasinglulu } 611*91f16700Schasinglulu 612*91f16700Schasinglulu int32_t chal_sd_set_clock(CHAL_HANDLE *sd_handle, uint32_t div_ctrl_setting, 613*91f16700Schasinglulu uint32_t on) 614*91f16700Schasinglulu { 615*91f16700Schasinglulu uint32_t value; 616*91f16700Schasinglulu struct sd_dev *handle; 617*91f16700Schasinglulu uint32_t time; 618*91f16700Schasinglulu uint32_t clk_sel_high_byte = 0xFF & (div_ctrl_setting >> 8); 619*91f16700Schasinglulu uint32_t clk_sel_low_byte = 0xFF & div_ctrl_setting; 620*91f16700Schasinglulu 621*91f16700Schasinglulu if (sd_handle == NULL) 622*91f16700Schasinglulu return SD_INVALID_HANDLE; 623*91f16700Schasinglulu 624*91f16700Schasinglulu EMMC_TRACE("set_clock(div_ctrl_setting=%d,on=%d)\n", 625*91f16700Schasinglulu div_ctrl_setting, on); 626*91f16700Schasinglulu 627*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 628*91f16700Schasinglulu 629*91f16700Schasinglulu /* Read control register content. */ 630*91f16700Schasinglulu value = mmio_read_32(handle->ctrl.sdRegBaseAddr + 631*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 632*91f16700Schasinglulu 633*91f16700Schasinglulu /* Disable Clock */ 634*91f16700Schasinglulu value &= ~(SD4_EMMC_TOP_CTRL1_SDCLKEN_MASK); 635*91f16700Schasinglulu 636*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET, 637*91f16700Schasinglulu value); 638*91f16700Schasinglulu 639*91f16700Schasinglulu /* Clear bits of interest. */ 640*91f16700Schasinglulu value &= ~(SD4_EMMC_TOP_CTRL1_SDCLKSEL_MASK | 641*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_MASK); 642*91f16700Schasinglulu 643*91f16700Schasinglulu /* Set bits of interest to new value. */ 644*91f16700Schasinglulu value |= (SD4_EMMC_TOP_CTRL1_SDCLKSEL_MASK & 645*91f16700Schasinglulu (clk_sel_low_byte << SD4_EMMC_TOP_CTRL1_SDCLKSEL_SHIFT)); 646*91f16700Schasinglulu value |= (SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_MASK & 647*91f16700Schasinglulu (clk_sel_high_byte << SD4_EMMC_TOP_CTRL1_SDCLKSEL_UP_SHIFT)); 648*91f16700Schasinglulu value |= SD4_EMMC_TOP_CTRL1_ICLKEN_MASK; 649*91f16700Schasinglulu 650*91f16700Schasinglulu /* Write updated value back to control register. */ 651*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET, 652*91f16700Schasinglulu value); 653*91f16700Schasinglulu 654*91f16700Schasinglulu time = 0; 655*91f16700Schasinglulu do { 656*91f16700Schasinglulu value = mmio_read_32(handle->ctrl.sdRegBaseAddr + 657*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 658*91f16700Schasinglulu 659*91f16700Schasinglulu if ((value & SD4_EMMC_TOP_CTRL1_ICLKSTB_MASK) == 660*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_ICLKSTB_MASK) 661*91f16700Schasinglulu break; 662*91f16700Schasinglulu 663*91f16700Schasinglulu mdelay(1); 664*91f16700Schasinglulu } while (time++ < EMMC_CLOCK_SETTING_TIMEOUT_MS); 665*91f16700Schasinglulu 666*91f16700Schasinglulu if (time >= EMMC_CLOCK_SETTING_TIMEOUT_MS) 667*91f16700Schasinglulu WARN("%s %d clock settings timeout happenedi (%dms)\n", 668*91f16700Schasinglulu __func__, __LINE__, time); 669*91f16700Schasinglulu 670*91f16700Schasinglulu VERBOSE("EMMC: clock settings delay: %dms\n", time); 671*91f16700Schasinglulu 672*91f16700Schasinglulu value = mmio_read_32(handle->ctrl.sdRegBaseAddr + 673*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 674*91f16700Schasinglulu 675*91f16700Schasinglulu if (on) 676*91f16700Schasinglulu value |= SD4_EMMC_TOP_CTRL1_SDCLKEN_MASK; 677*91f16700Schasinglulu 678*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET, 679*91f16700Schasinglulu value); 680*91f16700Schasinglulu 681*91f16700Schasinglulu return SD_OK; 682*91f16700Schasinglulu } 683*91f16700Schasinglulu 684*91f16700Schasinglulu /* 685*91f16700Schasinglulu * function to setup DMA buffer and data length, calculates block 686*91f16700Schasinglulu * size and the number of blocks to be transferred and return 687*91f16700Schasinglulu * the DMA buffer address. 688*91f16700Schasinglulu */ 689*91f16700Schasinglulu int32_t chal_sd_setup_xfer(CHAL_HANDLE *sd_handle, 690*91f16700Schasinglulu uint8_t *data, uint32_t length, int32_t dir) 691*91f16700Schasinglulu { 692*91f16700Schasinglulu uint32_t blocks = 0; 693*91f16700Schasinglulu struct sd_dev *handle; 694*91f16700Schasinglulu 695*91f16700Schasinglulu if (sd_handle == NULL) 696*91f16700Schasinglulu return SD_INVALID_HANDLE; 697*91f16700Schasinglulu 698*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 699*91f16700Schasinglulu 700*91f16700Schasinglulu if (length <= handle->cfg.blockSize) { 701*91f16700Schasinglulu handle->ctrl.blkReg = length | handle->cfg.dmaBoundary; 702*91f16700Schasinglulu } else { 703*91f16700Schasinglulu blocks = length / handle->cfg.blockSize; 704*91f16700Schasinglulu handle->ctrl.blkReg = (blocks << 16) | handle->cfg.blockSize | 705*91f16700Schasinglulu handle->cfg.dmaBoundary; 706*91f16700Schasinglulu } 707*91f16700Schasinglulu 708*91f16700Schasinglulu if (handle->cfg.dma != SD_DMA_OFF) { 709*91f16700Schasinglulu /* For DMA target address setting, physical address should be used */ 710*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_SYSADDR_OFFSET, 711*91f16700Schasinglulu (uintptr_t)data); 712*91f16700Schasinglulu } 713*91f16700Schasinglulu 714*91f16700Schasinglulu return SD_OK; 715*91f16700Schasinglulu } 716*91f16700Schasinglulu 717*91f16700Schasinglulu #ifdef INCLUDE_EMMC_DRIVER_WRITE_CODE 718*91f16700Schasinglulu /* 719*91f16700Schasinglulu * function to write one block data directly to the 720*91f16700Schasinglulu * host controller's FIFO which is 1K uint8_t or 721*91f16700Schasinglulu * 2K uint8_t in size. 722*91f16700Schasinglulu * It is used in Non-DMA mode for data transmission. 723*91f16700Schasinglulu */ 724*91f16700Schasinglulu int32_t chal_sd_write_buffer(CHAL_HANDLE *sd_handle, uint32_t length, 725*91f16700Schasinglulu uint8_t *data) 726*91f16700Schasinglulu { 727*91f16700Schasinglulu uint32_t i, leftOver = 0, blockSize, size, value = 0; 728*91f16700Schasinglulu struct sd_dev *handle; 729*91f16700Schasinglulu 730*91f16700Schasinglulu if (sd_handle == NULL) 731*91f16700Schasinglulu return SD_INVALID_HANDLE; 732*91f16700Schasinglulu 733*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 734*91f16700Schasinglulu 735*91f16700Schasinglulu blockSize = handle->cfg.blockSize; 736*91f16700Schasinglulu 737*91f16700Schasinglulu if (length == 0) 738*91f16700Schasinglulu return SD_OK; 739*91f16700Schasinglulu 740*91f16700Schasinglulu /* PIO mode, push into fifo word by word */ 741*91f16700Schasinglulu if (length >= blockSize) { 742*91f16700Schasinglulu size = blockSize; 743*91f16700Schasinglulu } else { 744*91f16700Schasinglulu size = ((length >> 2) << 2); 745*91f16700Schasinglulu leftOver = length % 4; 746*91f16700Schasinglulu } 747*91f16700Schasinglulu 748*91f16700Schasinglulu for (i = 0; i < size; i += 4) { 749*91f16700Schasinglulu value = *(uint32_t *)(data + i); 750*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + 751*91f16700Schasinglulu SD4_EMMC_TOP_BUFDAT_OFFSET, value); 752*91f16700Schasinglulu } 753*91f16700Schasinglulu /* 754*91f16700Schasinglulu * BUG ALERT: 755*91f16700Schasinglulu * This implementation has TWO issues that must be addressed before you 756*91f16700Schasinglulu * can safely INCLUDE_EMMC_DRIVER_WRITE_CODE. 757*91f16700Schasinglulu * 758*91f16700Schasinglulu * (1) For the last leftOver bytes, driver writes full word, which means 759*91f16700Schasinglulu * some of the eMMC content (i.e. "4 - leftOver" will be erroneously 760*91f16700Schasinglulu * overwritten). 761*91f16700Schasinglulu * (2) eMMC is a block device. What happens when less than a full block of 762*91f16700Schasinglulu * data is submitted??? 763*91f16700Schasinglulu */ 764*91f16700Schasinglulu if (leftOver > 0) { 765*91f16700Schasinglulu value = ((*(uint32_t *)(data + i)) << (4 - leftOver)); 766*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + 767*91f16700Schasinglulu SD4_EMMC_TOP_BUFDAT_OFFSET, value); 768*91f16700Schasinglulu } 769*91f16700Schasinglulu 770*91f16700Schasinglulu return SD_OK; 771*91f16700Schasinglulu } 772*91f16700Schasinglulu #endif /* INCLUDE_EMMC_DRIVER_WRITE_CODE */ 773*91f16700Schasinglulu 774*91f16700Schasinglulu /* 775*91f16700Schasinglulu * Function to read maximal one block data directly 776*91f16700Schasinglulu * from the data port of the host controller (FIFO). It is used 777*91f16700Schasinglulu * in Non-DMA mode for data transmission. 778*91f16700Schasinglulu */ 779*91f16700Schasinglulu int32_t chal_sd_read_buffer(CHAL_HANDLE *sd_handle, uint32_t length, 780*91f16700Schasinglulu uint8_t *data) 781*91f16700Schasinglulu { 782*91f16700Schasinglulu uint32_t i, size, leftOver, blockSize, value; 783*91f16700Schasinglulu struct sd_dev *handle; 784*91f16700Schasinglulu 785*91f16700Schasinglulu if (sd_handle == NULL) 786*91f16700Schasinglulu return SD_INVALID_HANDLE; 787*91f16700Schasinglulu 788*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 789*91f16700Schasinglulu 790*91f16700Schasinglulu value = 0; 791*91f16700Schasinglulu 792*91f16700Schasinglulu blockSize = handle->cfg.blockSize; 793*91f16700Schasinglulu 794*91f16700Schasinglulu /* PIO mode, extract fifo word by word */ 795*91f16700Schasinglulu if (length >= blockSize) { 796*91f16700Schasinglulu size = blockSize; 797*91f16700Schasinglulu leftOver = 0; 798*91f16700Schasinglulu } else { 799*91f16700Schasinglulu leftOver = length % 4; 800*91f16700Schasinglulu size = ((length >> 2) << 2); 801*91f16700Schasinglulu } 802*91f16700Schasinglulu 803*91f16700Schasinglulu for (i = 0; i < size; i += 4) { 804*91f16700Schasinglulu value = 805*91f16700Schasinglulu mmio_read_32(handle->ctrl.sdRegBaseAddr + 806*91f16700Schasinglulu SD4_EMMC_TOP_BUFDAT_OFFSET); 807*91f16700Schasinglulu memcpy((void *)(data + i), &value, sizeof(uint32_t)); 808*91f16700Schasinglulu } 809*91f16700Schasinglulu 810*91f16700Schasinglulu if (leftOver > 0) { 811*91f16700Schasinglulu value = mmio_read_32(handle->ctrl.sdRegBaseAddr + 812*91f16700Schasinglulu SD4_EMMC_TOP_BUFDAT_OFFSET); 813*91f16700Schasinglulu 814*91f16700Schasinglulu /* 815*91f16700Schasinglulu * Copy remaining non-full word bytes. 816*91f16700Schasinglulu * (We run ARM as Little Endian) 817*91f16700Schasinglulu */ 818*91f16700Schasinglulu uint8_t j = 0; 819*91f16700Schasinglulu 820*91f16700Schasinglulu for (j = 0; j < leftOver; j++) { 821*91f16700Schasinglulu data[i + j] = (value >> (j * 8)) & 0xFF; 822*91f16700Schasinglulu } 823*91f16700Schasinglulu } 824*91f16700Schasinglulu 825*91f16700Schasinglulu return SD_OK; 826*91f16700Schasinglulu } 827*91f16700Schasinglulu 828*91f16700Schasinglulu /* 829*91f16700Schasinglulu * Resets both DAT or CMD line. 830*91f16700Schasinglulu */ 831*91f16700Schasinglulu int32_t chal_sd_reset_line(CHAL_HANDLE *sd_handle, uint32_t line) 832*91f16700Schasinglulu { 833*91f16700Schasinglulu uint32_t control, flag; 834*91f16700Schasinglulu struct sd_dev *handle; 835*91f16700Schasinglulu 836*91f16700Schasinglulu if (sd_handle == NULL) 837*91f16700Schasinglulu return SD_INVALID_HANDLE; 838*91f16700Schasinglulu 839*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 840*91f16700Schasinglulu 841*91f16700Schasinglulu flag = SD4_EMMC_TOP_CTRL1_CMDRST_MASK | SD4_EMMC_TOP_CTRL1_DATRST_MASK; 842*91f16700Schasinglulu 843*91f16700Schasinglulu if (flag != (line | flag)) 844*91f16700Schasinglulu return SD_FAIL; 845*91f16700Schasinglulu 846*91f16700Schasinglulu control = mmio_read_32(handle->ctrl.sdRegBaseAddr + 847*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 848*91f16700Schasinglulu control |= line; 849*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + SD4_EMMC_TOP_CTRL1_OFFSET, 850*91f16700Schasinglulu control); 851*91f16700Schasinglulu 852*91f16700Schasinglulu /* reset CMD and DATA line should always work, no need to timed out */ 853*91f16700Schasinglulu do { 854*91f16700Schasinglulu control = mmio_read_32(handle->ctrl.sdRegBaseAddr + 855*91f16700Schasinglulu SD4_EMMC_TOP_CTRL1_OFFSET); 856*91f16700Schasinglulu } while (control & line); 857*91f16700Schasinglulu 858*91f16700Schasinglulu return SD_OK; 859*91f16700Schasinglulu } 860*91f16700Schasinglulu 861*91f16700Schasinglulu /* 862*91f16700Schasinglulu * Function to be called once a SD command is done to read 863*91f16700Schasinglulu * back it's response data. 864*91f16700Schasinglulu */ 865*91f16700Schasinglulu int32_t chal_sd_get_response(CHAL_HANDLE *sd_handle, uint32_t *resp) 866*91f16700Schasinglulu { 867*91f16700Schasinglulu struct sd_dev *handle; 868*91f16700Schasinglulu 869*91f16700Schasinglulu if (sd_handle == NULL) 870*91f16700Schasinglulu return SD_INVALID_HANDLE; 871*91f16700Schasinglulu 872*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 873*91f16700Schasinglulu resp[0] = mmio_read_32(handle->ctrl.sdRegBaseAddr + 874*91f16700Schasinglulu SD4_EMMC_TOP_RESP0_OFFSET); 875*91f16700Schasinglulu resp[1] = mmio_read_32(handle->ctrl.sdRegBaseAddr + 876*91f16700Schasinglulu SD4_EMMC_TOP_RESP2_OFFSET); 877*91f16700Schasinglulu resp[2] = mmio_read_32(handle->ctrl.sdRegBaseAddr + 878*91f16700Schasinglulu SD4_EMMC_TOP_RESP4_OFFSET); 879*91f16700Schasinglulu resp[3] = mmio_read_32(handle->ctrl.sdRegBaseAddr + 880*91f16700Schasinglulu SD4_EMMC_TOP_RESP6_OFFSET); 881*91f16700Schasinglulu 882*91f16700Schasinglulu return SD_OK; 883*91f16700Schasinglulu } 884*91f16700Schasinglulu 885*91f16700Schasinglulu /* 886*91f16700Schasinglulu * The function is called to clean all the pending interrupts. 887*91f16700Schasinglulu */ 888*91f16700Schasinglulu int32_t chal_sd_clear_pending_irq(CHAL_HANDLE *sd_handle) 889*91f16700Schasinglulu { 890*91f16700Schasinglulu uint32_t status = SD_OK; 891*91f16700Schasinglulu struct sd_dev *handle; 892*91f16700Schasinglulu 893*91f16700Schasinglulu if (sd_handle == NULL) 894*91f16700Schasinglulu return SD_INVALID_HANDLE; 895*91f16700Schasinglulu 896*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 897*91f16700Schasinglulu 898*91f16700Schasinglulu /* Make sure clean all interrupts */ 899*91f16700Schasinglulu do { 900*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + 901*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET, 0xFFFFFFFF); 902*91f16700Schasinglulu SD_US_DELAY(10); 903*91f16700Schasinglulu } while (mmio_read_32(handle->ctrl.sdRegBaseAddr + 904*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET)); 905*91f16700Schasinglulu 906*91f16700Schasinglulu return status; 907*91f16700Schasinglulu } 908*91f16700Schasinglulu 909*91f16700Schasinglulu /* 910*91f16700Schasinglulu * The function returns interrupt status register value. 911*91f16700Schasinglulu */ 912*91f16700Schasinglulu int32_t chal_sd_get_irq_status(CHAL_HANDLE *sd_handle) 913*91f16700Schasinglulu { 914*91f16700Schasinglulu struct sd_dev *handle; 915*91f16700Schasinglulu 916*91f16700Schasinglulu if (sd_handle == NULL) 917*91f16700Schasinglulu return SD_INVALID_HANDLE; 918*91f16700Schasinglulu 919*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 920*91f16700Schasinglulu 921*91f16700Schasinglulu return (mmio_read_32(handle->ctrl.sdRegBaseAddr + 922*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET)); 923*91f16700Schasinglulu } 924*91f16700Schasinglulu 925*91f16700Schasinglulu /* 926*91f16700Schasinglulu * The function clears interrupt(s) specified in the mask. 927*91f16700Schasinglulu */ 928*91f16700Schasinglulu int32_t chal_sd_clear_irq(CHAL_HANDLE *sd_handle, uint32_t mask) 929*91f16700Schasinglulu { 930*91f16700Schasinglulu struct sd_dev *handle; 931*91f16700Schasinglulu 932*91f16700Schasinglulu if (sd_handle == NULL) 933*91f16700Schasinglulu return SD_INVALID_HANDLE; 934*91f16700Schasinglulu 935*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 936*91f16700Schasinglulu 937*91f16700Schasinglulu /* Make sure clean masked interrupts */ 938*91f16700Schasinglulu do { 939*91f16700Schasinglulu mmio_write_32(handle->ctrl.sdRegBaseAddr + 940*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET, mask); 941*91f16700Schasinglulu SD_US_DELAY(10); 942*91f16700Schasinglulu } while (mask & 943*91f16700Schasinglulu mmio_read_32(handle->ctrl.sdRegBaseAddr + 944*91f16700Schasinglulu SD4_EMMC_TOP_INTR_OFFSET)); 945*91f16700Schasinglulu 946*91f16700Schasinglulu return SD_OK; 947*91f16700Schasinglulu } 948*91f16700Schasinglulu 949*91f16700Schasinglulu /* 950*91f16700Schasinglulu * Description: The function configures the SD host controller. 951*91f16700Schasinglulu */ 952*91f16700Schasinglulu int32_t chal_sd_config(CHAL_HANDLE *sd_handle, uint32_t speed, uint32_t retry, 953*91f16700Schasinglulu uint32_t boundary, uint32_t blkSize, uint32_t dma) 954*91f16700Schasinglulu { 955*91f16700Schasinglulu struct sd_dev *handle; 956*91f16700Schasinglulu 957*91f16700Schasinglulu if (sd_handle == NULL) 958*91f16700Schasinglulu return SD_INVALID_HANDLE; 959*91f16700Schasinglulu 960*91f16700Schasinglulu handle = (struct sd_dev *) sd_handle; 961*91f16700Schasinglulu 962*91f16700Schasinglulu handle->cfg.speedMode = speed; 963*91f16700Schasinglulu handle->cfg.retryLimit = retry; 964*91f16700Schasinglulu handle->cfg.dmaBoundary = boundary; 965*91f16700Schasinglulu handle->cfg.blockSize = blkSize; 966*91f16700Schasinglulu 967*91f16700Schasinglulu chal_sd_set_dma(sd_handle, dma); 968*91f16700Schasinglulu SD_US_DELAY(100); 969*91f16700Schasinglulu chal_sd_set_dma_boundary(handle, boundary); 970*91f16700Schasinglulu SD_US_DELAY(100); 971*91f16700Schasinglulu 972*91f16700Schasinglulu chal_sd_set_speed(sd_handle, speed); 973*91f16700Schasinglulu 974*91f16700Schasinglulu SD_US_DELAY(100); 975*91f16700Schasinglulu return SD_OK; 976*91f16700Schasinglulu } 977*91f16700Schasinglulu 978*91f16700Schasinglulu /* 979*91f16700Schasinglulu * Cleans up HC FIFO. 980*91f16700Schasinglulu */ 981*91f16700Schasinglulu void chal_sd_dump_fifo(CHAL_HANDLE *sd_handle) 982*91f16700Schasinglulu { 983*91f16700Schasinglulu struct sd_dev *handle; 984*91f16700Schasinglulu 985*91f16700Schasinglulu if (sd_handle == NULL) 986*91f16700Schasinglulu return; 987*91f16700Schasinglulu 988*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 989*91f16700Schasinglulu 990*91f16700Schasinglulu /* in case there still data in the host buffer */ 991*91f16700Schasinglulu while (mmio_read_32(handle->ctrl.sdRegBaseAddr + 992*91f16700Schasinglulu SD4_EMMC_TOP_PSTATE_OFFSET) & 0x800) { 993*91f16700Schasinglulu mmio_read_32(handle->ctrl.sdRegBaseAddr + 994*91f16700Schasinglulu SD4_EMMC_TOP_BUFDAT_OFFSET); 995*91f16700Schasinglulu }; 996*91f16700Schasinglulu } 997*91f16700Schasinglulu 998*91f16700Schasinglulu /* 999*91f16700Schasinglulu * Enable or disable a SD interrupt signal. 1000*91f16700Schasinglulu */ 1001*91f16700Schasinglulu void chal_sd_set_irq_signal(CHAL_HANDLE *sd_handle, uint32_t mask, 1002*91f16700Schasinglulu uint32_t state) 1003*91f16700Schasinglulu { 1004*91f16700Schasinglulu struct sd_dev *handle; 1005*91f16700Schasinglulu 1006*91f16700Schasinglulu if (sd_handle == NULL) 1007*91f16700Schasinglulu return; 1008*91f16700Schasinglulu 1009*91f16700Schasinglulu handle = (struct sd_dev *)sd_handle; 1010*91f16700Schasinglulu 1011*91f16700Schasinglulu if (state) 1012*91f16700Schasinglulu mmio_setbits_32(handle->ctrl.sdRegBaseAddr + 1013*91f16700Schasinglulu SD4_EMMC_TOP_INTREN2_OFFSET, mask); 1014*91f16700Schasinglulu else 1015*91f16700Schasinglulu mmio_clrbits_32(handle->ctrl.sdRegBaseAddr + 1016*91f16700Schasinglulu SD4_EMMC_TOP_INTREN2_OFFSET, mask); 1017*91f16700Schasinglulu } 1018