// SPDX-License-Identifier: GPL-2.0-or-later /* * linux/drivers/mmc/host/sdhci.c - Secure Digital Host Controller Interface driver * * Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved. * * Thanks to the following companies for their support: * * - JMicron (hardware and technical support)
*/
/* * This can be called before sdhci_add_host() by Vendor's host controller * driver to enable v4 mode if supported.
*/ void sdhci_enable_v4_mode(struct sdhci_host *host)
{
host->v4_mode = true;
sdhci_do_enable_v4_mode(host);
}
EXPORT_SYMBOL_GPL(sdhci_enable_v4_mode);
if (mask & SDHCI_RESET_ALL) {
host->clock = 0; /* Reset-all turns off SD Bus Power */ if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON)
sdhci_runtime_pm_bus_off(host);
}
/* Wait max 100 ms */
timeout = ktime_add_ms(ktime_get(), 100);
/* hw clears the bit when it's done */ while (1) { bool timedout = ktime_after(ktime_get(), timeout);
if (!(sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask)) break; if (timedout) {
pr_err("%s: Reset 0x%x never completed.\n",
mmc_hostname(host->mmc), (int)mask);
sdhci_err_stats_inc(host, CTRL_TIMEOUT);
sdhci_dumpregs(host); return;
}
udelay(10);
}
}
EXPORT_SYMBOL_GPL(sdhci_reset);
switch (reason) { case SDHCI_RESET_FOR_INIT:
sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); break; case SDHCI_RESET_FOR_REQUEST_ERROR: case SDHCI_RESET_FOR_TUNING_ABORT: case SDHCI_RESET_FOR_CARD_REMOVED: case SDHCI_RESET_FOR_CQE_RECOVERY:
sdhci_do_reset(host, SDHCI_RESET_CMD);
sdhci_do_reset(host, SDHCI_RESET_DATA); break; case SDHCI_RESET_FOR_REQUEST_ERROR_DATA_ONLY:
sdhci_do_reset(host, SDHCI_RESET_DATA); break;
}
}
/* * Always adjust the DMA selection as some controllers * (e.g. JMicron) can't do PIO properly when the selection * is ADMA.
*/
ctrl &= ~SDHCI_CTRL_DMA_MASK; if (!(host->flags & SDHCI_REQ_USE_DMA)) goto out;
/* Note if DMA Select is zero then SDMA is selected */ if (host->flags & SDHCI_USE_ADMA)
ctrl |= SDHCI_CTRL_ADMA32;
if (host->flags & SDHCI_USE_64_BIT_DMA) { /* * If v4 mode, all supported DMA can be 64-bit addressing if * controller supports 64-bit system address, otherwise only * ADMA can support 64-bit addressing.
*/ if (host->v4_mode) {
ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
ctrl2 |= SDHCI_CTRL_64BIT_ADDR;
sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
} elseif (host->flags & SDHCI_USE_ADMA) { /* * Don't need to undo SDHCI_CTRL_ADMA32 in order to * set SDHCI_CTRL_ADMA64.
*/
ctrl |= SDHCI_CTRL_ADMA64;
}
}
/* * A change to the card detect bits indicates a change in present state, * refer sdhci_set_card_detection(). A card detect interrupt might have * been missed while the host controller was being reset, so trigger a * rescan to check.
*/ if (cd != (host->ier & (SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT)))
mmc_detect_change(host->mmc, msecs_to_jiffies(200));
}
/* * Some controllers (JMicron JMB38x) mess up the buffer bits * for transfers < 4 bytes. As long as it is just one block, * we can ignore the bits.
*/ if ((host->quirks & SDHCI_QUIRK_BROKEN_SMALL_PIO) &&
(host->data->blocks == 1))
mask = ~0;
while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { if (host->quirks & SDHCI_QUIRK_PIO_NEEDS_DELAY)
udelay(100);
if (host->data->flags & MMC_DATA_READ)
sdhci_read_block_pio(host); else
sdhci_write_block_pio(host);
host->blocks--; if (host->blocks == 0) break;
}
DBG("PIO transfer complete.\n");
}
staticint sdhci_pre_dma_transfer(struct sdhci_host *host, struct mmc_data *data, int cookie)
{ int sg_count;
/* * If the data buffers are already mapped, return the previous * dma_map_sg() result.
*/ if (data->host_cookie == COOKIE_PRE_MAPPED) return data->sg_count;
/* Bounce write requests to the bounce buffer */ if (host->bounce_buffer) { unsignedint length = data->blksz * data->blocks;
if (length > host->bounce_buffer_size) {
pr_err("%s: asked for transfer of %u bytes exceeds bounce buffer %u bytes\n",
mmc_hostname(host->mmc), length,
host->bounce_buffer_size); return -EIO;
} if (mmc_get_dma_dir(data) == DMA_TO_DEVICE) { /* Copy the data to the bounce buffer */ if (host->ops->copy_to_bounce_buffer) {
host->ops->copy_to_bounce_buffer(host,
data, length);
} else {
sg_copy_to_buffer(data->sg, data->sg_len,
host->bounce_buffer, length);
}
} /* Switch ownership to the DMA */
dma_sync_single_for_device(mmc_dev(host->mmc),
host->bounce_addr,
host->bounce_buffer_size,
mmc_get_dma_dir(data)); /* Just a dummy value */
sg_count = 1;
} else { /* Just access the data directly from memory */
sg_count = dma_map_sg(mmc_dev(host->mmc),
data->sg, data->sg_len,
mmc_get_dma_dir(data));
}
/* 32-bit and 64-bit descriptors have these members in same position */
dma_desc->cmd = cpu_to_le16(cmd);
dma_desc->len = cpu_to_le16(len);
dma_desc->addr_lo = cpu_to_le32(lower_32_bits(addr));
if (host->flags & SDHCI_USE_64_BIT_DMA)
dma_desc->addr_hi = cpu_to_le32(upper_32_bits(addr));
/* * The SDHCI specification states that ADMA addresses must * be 32-bit aligned. If they aren't, then we use a bounce * buffer for the (up to three) bytes that screw up the * alignment.
*/
offset = (SDHCI_ADMA2_ALIGN - (addr & SDHCI_ADMA2_MASK)) &
SDHCI_ADMA2_MASK; if (offset) { if (data->flags & MMC_DATA_WRITE) {
buffer = sdhci_kmap_atomic(sg);
memcpy(align, buffer, offset);
sdhci_kunmap_atomic(buffer);
}
/* * The block layer forces a minimum segment size of PAGE_SIZE, * so 'len' can be too big here if PAGE_SIZE >= 64KiB. Write * multiple descriptors, noting that the ADMA table is sized * for 4KiB chunks anyway, so it will be big enough.
*/ while (len > host->max_adma) { int n = 32 * 1024; /* 32KiB*/
__sdhci_adma_write_desc(host, &desc, addr, n, ADMA2_TRAN_VALID);
addr += n;
len -= n;
}
/* * If this triggers then we have a calculation bug * somewhere. :/
*/
WARN_ON((desc - host->adma_table) >= host->adma_table_sz);
}
if (host->quirks & SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC) { /* Mark the last descriptor as the terminating descriptor */ if (desc != host->adma_table) {
desc -= host->desc_sz;
sdhci_adma_mark_end(desc);
}
} else { /* Add a terminating entry - nop, end, valid */
__sdhci_adma_write_desc(host, &desc, 0, 0, ADMA2_NOP_END_VALID);
}
}
staticvoid sdhci_adma_table_post(struct sdhci_host *host, struct mmc_data *data)
{ struct scatterlist *sg; int i, size; void *align; char *buffer;
if (data->flags & MMC_DATA_READ) { bool has_unaligned = false;
/* Do a quick scan of the SG list for any unaligned mappings */
for_each_sg(data->sg, sg, host->sg_count, i) if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
has_unaligned = true; break;
}
if (has_unaligned) {
dma_sync_sg_for_cpu(mmc_dev(host->mmc), data->sg,
data->sg_len, DMA_FROM_DEVICE);
/* timeout in us */ if (!data) {
target_timeout = cmd->busy_timeout * 1000;
} else {
target_timeout = DIV_ROUND_UP(data->timeout_ns, 1000); if (host->clock && data->timeout_clks) { unsignedlonglong val;
/* * data->timeout_clks is in units of clock cycles. * host->clock is in Hz. target_timeout is in us. * Hence, us = 1000000 * cycles / Hz. Round up.
*/
val = 1000000ULL * data->timeout_clks; if (do_div(val, host->clock))
target_timeout++;
target_timeout += val;
}
}
/* * If the host controller provides us with an incorrect timeout * value, just skip the check and use the maximum. The hardware may take * longer to time out, but that's much better than having a too-short * timeout value.
*/ if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL) return host->max_timeout_count;
/* Unspecified command, assume max */ if (cmd == NULL) return host->max_timeout_count;
data = cmd->data; /* Unspecified timeout, assume max */ if (!data && !cmd->busy_timeout) return host->max_timeout_count;
/* timeout in us */
target_timeout = sdhci_target_timeout(host, cmd, data);
/* * Figure out needed cycles. * We do this in steps in order to fit inside a 32 bit int. * The first step is the minimum timeout, which will have a * minimum resolution of 6 bits: * (1) 2^13*1000 > 2^22, * (2) host->timeout_clk < 2^16 * => * (1) / (2) > 2^6
*/
count = 0;
current_timeout = (1 << 13) * 1000 / host->timeout_clk; while (current_timeout < target_timeout) {
count++;
current_timeout <<= 1; if (count > host->max_timeout_count) { if (!(host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT))
DBG("Too large timeout 0x%x requested for CMD%d!\n",
count, cmd->opcode);
count = host->max_timeout_count;
*too_big = true; break;
}
}
staticinlinevoid sdhci_set_block_info(struct sdhci_host *host, struct mmc_data *data)
{ /* Set the DMA boundary value and block size */
sdhci_writew(host,
SDHCI_MAKE_BLKSZ(host->sdma_boundary, data->blksz),
SDHCI_BLOCK_SIZE); /* * For Version 4.10 onwards, if v4 mode is enabled, 32-bit Block Count * can be supported, in that case 16-bit block count register must be 0.
*/ if (host->version >= SDHCI_SPEC_410 && host->v4_mode &&
(host->quirks2 & SDHCI_QUIRK2_USE_32BIT_BLK_CNT)) { if (sdhci_readw(host, SDHCI_BLOCK_COUNT))
sdhci_writew(host, 0, SDHCI_BLOCK_COUNT);
sdhci_writew(host, data->blocks, SDHCI_32BIT_BLK_CNT);
} else {
sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);
}
}
/* * FIXME: This doesn't account for merging when mapping the * scatterlist. * * The assumption here being that alignment and lengths are * the same after DMA mapping to device address space.
*/
length_mask = 0;
offset_mask = 0; if (host->flags & SDHCI_USE_ADMA) { if (host->quirks & SDHCI_QUIRK_32BIT_ADMA_SIZE) {
length_mask = 3; /* * As we use up to 3 byte chunks to work * around alignment problems, we need to * check the offset as well.
*/
offset_mask = 3;
}
} else { if (host->quirks & SDHCI_QUIRK_32BIT_DMA_SIZE)
length_mask = 3; if (host->quirks & SDHCI_QUIRK_32BIT_DMA_ADDR)
offset_mask = 3;
}
if (unlikely(length_mask | offset_mask)) {
for_each_sg(data->sg, sg, data->sg_len, i) { if (sg->length & length_mask) {
DBG("Reverting to PIO because of transfer size (%d)\n",
sg->length);
host->flags &= ~SDHCI_REQ_USE_DMA; break;
} if (sg->offset & offset_mask) {
DBG("Reverting to PIO because of bad alignment\n");
host->flags &= ~SDHCI_REQ_USE_DMA; break;
}
}
}
}
sdhci_config_dma(host);
if (host->flags & SDHCI_REQ_USE_DMA) { int sg_cnt = sdhci_pre_dma_transfer(host, data, COOKIE_MAPPED);
if (sg_cnt <= 0) { /* * This only happens when someone fed * us an invalid request.
*/
WARN_ON(1);
host->flags &= ~SDHCI_REQ_USE_DMA;
} elseif (host->flags & SDHCI_USE_ADMA) {
sdhci_adma_table_pre(host, data, sg_cnt);
sdhci_set_adma_addr(host, host->adma_addr);
} else {
WARN_ON(sg_cnt != 1);
sdhci_set_sdma_addr(host, sdhci_sdma_address(host));
}
}
if (!(host->flags & SDHCI_REQ_USE_DMA)) { int flags;
/* Sanity check: all the SG entries must be aligned by block size. */ for (i = 0; i < data->sg_len; i++) { if ((data->sg + i)->length % data->blksz) return -EINVAL;
}
chan = sdhci_external_dma_channel(host, data);
ret = dmaengine_slave_config(chan, &cfg); if (ret) return ret;
/* * In case of Version 4.10 or later, use of 'Auto CMD Auto * Select' is recommended rather than use of 'Auto CMD12 * Enable' or 'Auto CMD23 Enable'. We require Version 4 Mode * here because some controllers (e.g sdhci-of-dwmshc) expect it.
*/ if (host->version >= SDHCI_SPEC_410 && host->v4_mode &&
(use_cmd12 || use_cmd23)) {
*mode |= SDHCI_TRNS_AUTO_SEL;
/* * If we are sending CMD23, CMD12 never gets sent * on successful completion (so no Auto-CMD12).
*/ if (use_cmd12)
*mode |= SDHCI_TRNS_AUTO_CMD12; elseif (use_cmd23)
*mode |= SDHCI_TRNS_AUTO_CMD23;
}
if (data == NULL) { if (host->quirks2 &
SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) { /* must not clear SDHCI_TRANSFER_MODE when tuning */ if (!mmc_op_tuning(cmd->opcode))
sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE);
} else { /* clear Auto CMD settings for no data CMDs */
mode = sdhci_readw(host, SDHCI_TRANSFER_MODE);
sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 |
SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);
} return;
}
WARN_ON(!host->data);
if (!(host->quirks2 & SDHCI_QUIRK2_SUPPORT_SINGLE))
mode = SDHCI_TRNS_BLK_CNT_EN;
/* * The specification states that the block count register must * be updated, but it does not specify at what point in the * data flow. That makes the register entirely useless to read * back so we have to assume that nothing made it to the card * in the event of an error.
*/ if (data->error)
data->bytes_xfered = 0; else
data->bytes_xfered = data->blksz * data->blocks;
}
EXPORT_SYMBOL_GPL(__sdhci_finish_data_common);
/* * Need to send CMD12 if - * a) open-ended multiblock transfer not using auto CMD12 (no CMD23) * b) error in multiblock transfer
*/ if (data->stop &&
((!data->mrq->sbc && !sdhci_auto_cmd12(host, data->mrq)) ||
data->error)) { /* * 'cap_cmd_during_tfr' request must not use the command line * after mmc_command_done() has been called. It is upper layer's * responsibility to send the stop command if required.
*/ if (data->mrq->cap_cmd_during_tfr) {
__sdhci_finish_mrq(host, data->mrq);
} else { /* Avoid triggering warning in sdhci_send_command() */
host->cmd = NULL; if (!sdhci_send_command(host, data->stop)) { if (sw_data_timeout) { /* * This is anyway a sw data timeout, so * give up now.
*/
data->stop->error = -EIO;
__sdhci_finish_mrq(host, data->mrq);
} else {
WARN_ON(host->deferred_cmd);
host->deferred_cmd = data->stop;
}
}
}
} else {
__sdhci_finish_mrq(host, data->mrq);
}
}
mask = SDHCI_CMD_INHIBIT; if (sdhci_data_line_cmd(cmd))
mask |= SDHCI_DATA_INHIBIT;
/* We shouldn't wait for data inihibit for stop commands, even
though they might use busy signaling */ if (cmd->mrq->data && (cmd == cmd->mrq->data->stop))
mask &= ~SDHCI_DATA_INHIBIT;
if (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) returnfalse;
if (cmd->data) { if (host->use_external_dma)
sdhci_external_dma_prepare_data(host, cmd); else
sdhci_prepare_data(host, cmd);
}
sdhci_writel(host, cmd->arg, SDHCI_ARGUMENT);
sdhci_set_transfer_mode(host, cmd);
if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
WARN_ONCE(1, "Unsupported response type!\n"); /* * This does not happen in practice because 136-bit response * commands never have busy waiting, so rather than complicate * the error path, just remove busy waiting and continue.
*/
cmd->flags &= ~MMC_RSP_BUSY;
}
while (!sdhci_send_command(host, cmd)) { if (!timeout--) {
pr_err("%s: Controller never released inhibit bit(s).\n",
mmc_hostname(host->mmc));
sdhci_err_stats_inc(host, CTRL_TIMEOUT);
sdhci_dumpregs(host);
cmd->error = -EIO; returnfalse;
}
spin_unlock_irqrestore(&host->lock, flags);
usleep_range(1000, 1250);
present = host->mmc->ops->get_cd(host->mmc);
spin_lock_irqsave(&host->lock, flags);
/* A deferred command might disappear, handle that */ if (cmd == deferred_cmd && cmd != host->deferred_cmd) returntrue;
if (sdhci_present_error(host, cmd, present)) returnfalse;
}
if (cmd == host->deferred_cmd)
host->deferred_cmd = NULL;
returntrue;
}
staticvoid sdhci_read_rsp_136(struct sdhci_host *host, struct mmc_command *cmd)
{ int i, reg;
for (i = 0; i < 4; i++) {
reg = SDHCI_RESPONSE + (3 - i) * 4;
cmd->resp[i] = sdhci_readl(host, reg);
}
if (host->quirks2 & SDHCI_QUIRK2_RSP_136_HAS_CRC) return;
/* CRC is stripped so we need to do some shifting */ for (i = 0; i < 4; i++) {
cmd->resp[i] <<= 8; if (i != 3)
cmd->resp[i] |= cmd->resp[i + 1] >> 24;
}
}
if (cmd->mrq->cap_cmd_during_tfr && cmd == cmd->mrq->cmd)
mmc_command_done(host->mmc, cmd->mrq);
/* * The host can send and interrupt when the busy state has * ended, allowing us to wait without wasting CPU cycles. * The busy signal uses DAT0 so this is similar to waiting * for data to complete. * * Note: The 1.0 specification is a bit ambiguous about this * feature so there might be some problems with older * controllers.
*/ if (cmd->flags & MMC_RSP_BUSY) { if (cmd->data) {
DBG("Cannot wait for busy signal when also doing a data transfer");
} elseif (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ) &&
cmd == host->data_cmd) { /* Command complete before busy is ended */ return;
}
}
/* Finished CMD23, now send actual command. */ if (cmd == cmd->mrq->sbc) { if (!sdhci_send_command(host, cmd->mrq->cmd)) {
WARN_ON(host->deferred_cmd);
host->deferred_cmd = cmd->mrq->cmd;
}
} else {
/* Processed actual command. */ if (host->data && host->data_early)
sdhci_finish_data(host);
if (!cmd->data)
__sdhci_finish_mrq(host, cmd->mrq);
}
}
/* * Check if the Host Controller supports Programmable Clock * Mode.
*/ if (host->clk_mul) { for (div = 1; div <= 1024; div++) { if ((host->max_clk * host->clk_mul / div)
<= clock) break;
} if ((host->max_clk * host->clk_mul / div) <= clock) { /* * Set Programmable Clock Mode in the Clock * Control register.
*/
clk = SDHCI_PROG_CLOCK_MODE;
real_div = div;
clk_mul = host->clk_mul;
div--;
} else { /* * Divisor can be too small to reach clock * speed requirement. Then use the base clock.
*/
switch_base_clk = true;
}
}
if (!host->clk_mul || switch_base_clk) { /* Version 3.00 divisors must be a multiple of 2. */ if (host->max_clk <= clock)
div = 1; else { for (div = 2; div < SDHCI_MAX_DIV_SPEC_300;
div += 2) { if ((host->max_clk / div) <= clock) break;
}
}
real_div = div;
div >>= 1; if ((host->quirks2 & SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN)
&& !div && host->max_clk <= 25000000)
div = 1;
}
} else { /* Version 2.00 divisors must be a power of 2. */ for (div = 1; div < SDHCI_MAX_DIV_SPEC_200; div *= 2) { if ((host->max_clk / div) <= clock) break;
}
real_div = div;
div >>= 1;
}
unsignedshort sdhci_get_vdd_value(unsignedshort vdd)
{ switch (1 << vdd) { case MMC_VDD_165_195: /* * Without a regulator, SDHCI does not support 2.0v * so we only get here if the driver deliberately * added the 2.0v range to ocr_avail. Map it to 1.8v * for the purpose of turning on the power.
*/ case MMC_VDD_20_21: return SDHCI_POWER_180; case MMC_VDD_29_30: case MMC_VDD_30_31: return SDHCI_POWER_300; case MMC_VDD_32_33: case MMC_VDD_33_34: /* * 3.4V ~ 3.6V are valid only for those platforms where it's * known that the voltage range is supported by hardware.
*/ case MMC_VDD_34_35: case MMC_VDD_35_36: return SDHCI_POWER_330; default: return 0;
}
}
EXPORT_SYMBOL_GPL(sdhci_get_vdd_value);
if (mode != MMC_POWER_OFF) {
pwr = sdhci_get_vdd_value(vdd); if (!pwr) {
WARN(1, "%s: Invalid vdd %#x\n",
mmc_hostname(host->mmc), vdd);
}
}
if (host->pwr == pwr) return;
host->pwr = pwr;
if (pwr == 0) {
sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON)
sdhci_runtime_pm_bus_off(host);
} else { /* * Spec says that we should clear the power reg before setting * a new value. Some controllers don't seem to like this though.
*/ if (!(host->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE))
sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
/* * At least the Marvell CaFe chip gets confused if we set the * voltage and set turn on power at the same time, so set the * voltage first.
*/ if (host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER)
sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
pwr |= SDHCI_POWER_ON;
sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON)
sdhci_runtime_pm_bus_on(host);
/* * Some controllers need an extra 10ms delay of 10ms before * they can apply clock after applying power
*/ if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
mdelay(10);
}
}
EXPORT_SYMBOL_GPL(sdhci_set_power_noreg);
/* * Some controllers need to configure a valid bus voltage on their power * register regardless of whether an external regulator is taking care of power * supply. This helper function takes care of it if set as the controller's * sdhci_ops.set_power callback.
*/ void sdhci_set_power_and_bus_voltage(struct sdhci_host *host, unsignedchar mode, unsignedshort vdd)
{ if (!IS_ERR(host->mmc->supply.vmmc)) { struct mmc_host *mmc = host->mmc;
/* * The HSQ may send a command in interrupt context without polling * the busy signaling, which means we should return BUSY if controller * has not released inhibit bits to allow HSQ trying to send request * again in non-atomic context. So we should not finish this request * here.
*/ if (!sdhci_send_command(host, cmd))
ret = -EBUSY; else
sdhci_led_activate(host);
staticbool sdhci_timing_has_preset(unsignedchar timing)
{ switch (timing) { case MMC_TIMING_UHS_SDR12: case MMC_TIMING_UHS_SDR25: case MMC_TIMING_UHS_SDR50: case MMC_TIMING_UHS_SDR104: case MMC_TIMING_UHS_DDR50: case MMC_TIMING_MMC_DDR52: returntrue;
} returnfalse;
}
/* * Reset the chip on each power off. * Should clear out any weird states.
*/ if (ios->power_mode == MMC_POWER_OFF) {
sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE);
sdhci_reinit(host);
}
if (host->ops->set_power)
host->ops->set_power(host, ios->power_mode, ios->vdd); else
sdhci_set_power(host, ios->power_mode, ios->vdd);
if (host->ops->platform_send_init_74_clocks)
host->ops->platform_send_init_74_clocks(host, ios->power_mode);
host->ops->set_bus_width(host, ios->bus_width);
/* * Special case to avoid multiple clock changes during voltage * switching.
*/ if (!reinit_uhs &&
turning_on_clk &&
host->timing == ios->timing &&
host->version >= SDHCI_SPEC_300 &&
!sdhci_presetable_values_change(host, ios)) return;
if (host->version >= SDHCI_SPEC_300) {
u16 clk, ctrl_2;
/* * According to SDHCI Spec v3.00, if the Preset Value * Enable in the Host Control 2 register is set, we * need to reset SD Clock Enable before changing High * Speed Enable to avoid generating clock glitches.
*/
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); if (clk & SDHCI_CLOCK_CARD_EN) {
clk &= ~SDHCI_CLOCK_CARD_EN;
sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
}
sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
if (!host->preset_enabled) { /* * We only need to set Driver Strength if the * preset value enable is not set.
*/
ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
ctrl_2 &= ~SDHCI_CTRL_DRV_TYPE_MASK; if (ios->drv_type == MMC_SET_DRIVER_TYPE_A)
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_A; elseif (ios->drv_type == MMC_SET_DRIVER_TYPE_B)
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_B; elseif (ios->drv_type == MMC_SET_DRIVER_TYPE_C)
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_C; elseif (ios->drv_type == MMC_SET_DRIVER_TYPE_D)
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_D; else {
pr_warn("%s: invalid driver type, default to driver type B\n",
mmc_hostname(mmc));
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_B;
}
int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios)
{ struct sdhci_host *host = mmc_priv(mmc);
u16 ctrl; int ret;
/* * Signal Voltage Switching is only applicable for Host Controllers * v3.00 and above.
*/ if (host->version < SDHCI_SPEC_300) return 0;
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
switch (ios->signal_voltage) { case MMC_SIGNAL_VOLTAGE_330: if (!(host->flags & SDHCI_SIGNALING_330)) return -EINVAL; /* Set 1.8V Signal Enable in the Host Control2 register to 0 */
ctrl &= ~SDHCI_CTRL_VDD_180;
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
if (!IS_ERR(mmc->supply.vqmmc)) {
ret = mmc_regulator_set_vqmmc(mmc, ios); if (ret < 0) {
pr_warn("%s: Switching to 3.3V signalling voltage failed\n",
mmc_hostname(mmc)); return -EIO;
}
} /* Wait for 5ms */
usleep_range(5000, 5500);
/* 3.3V regulator output should be stable within 5 ms */
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); if (!(ctrl & SDHCI_CTRL_VDD_180)) return 0;
pr_warn("%s: 3.3V regulator output did not become stable\n",
mmc_hostname(mmc));
return -EAGAIN; case MMC_SIGNAL_VOLTAGE_180: if (!(host->flags & SDHCI_SIGNALING_180)) return -EINVAL; if (!IS_ERR(mmc->supply.vqmmc)) {
ret = mmc_regulator_set_vqmmc(mmc, ios); if (ret < 0) {
pr_warn("%s: Switching to 1.8V signalling voltage failed\n",
mmc_hostname(mmc)); return -EIO;
}
}
/* * Enable 1.8V Signal Enable in the Host Control2 * register
*/
ctrl |= SDHCI_CTRL_VDD_180;
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
/* Some controller need to do more when switching */ if (host->ops->voltage_switch)
host->ops->voltage_switch(host);
/* 1.8V regulator output should be stable within 5 ms */
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); if (ctrl & SDHCI_CTRL_VDD_180) return 0;
pr_warn("%s: 1.8V regulator output did not become stable\n",
mmc_hostname(mmc));
return -EAGAIN; case MMC_SIGNAL_VOLTAGE_120: if (!(host->flags & SDHCI_SIGNALING_120)) return -EINVAL; if (!IS_ERR(mmc->supply.vqmmc)) {
ret = mmc_regulator_set_vqmmc(mmc, ios); if (ret < 0) {
pr_warn("%s: Switching to 1.2V signalling voltage failed\n",
mmc_hostname(mmc)); return -EIO;
}
} return 0; default: /* No signal voltage switch required */ return 0;
}
}
EXPORT_SYMBOL_GPL(sdhci_start_signal_voltage_switch);
/* * As per the Host Controller spec v3.00, tuning command * generates Buffer Read Ready interrupt, so enable that. * * Note: The spec clearly says that when tuning sequence * is being performed, the controller does not generate * interrupts other than Buffer Read Ready interrupt. But * to make sure we don't hit a controller bug, we _only_ * enable Buffer Read Ready interrupt here.
*/
sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE);
sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE);
}
EXPORT_SYMBOL_GPL(sdhci_start_tuning);
/* * We use sdhci_send_tuning() because mmc_send_tuning() is not a good fit. SDHCI * tuning command does not have a data payload (or rather the hardware does it * automatically) so mmc_send_tuning() will return -EIO. Also the tuning command * interrupt setup is different to other commands and there is no timeout * interrupt so special handling is needed.
*/ void sdhci_send_tuning(struct sdhci_host *host, u32 opcode)
{ struct mmc_host *mmc = host->mmc; struct mmc_command cmd = {}; struct mmc_request mrq = {}; unsignedlong flags;
u32 b = host->sdma_boundary;
mrq.cmd = &cmd; /* * In response to CMD19, the card sends 64 bytes of tuning * block to the Host Controller. So we set the block size * to 64 here.
*/ if (cmd.opcode == MMC_SEND_TUNING_BLOCK_HS200 &&
mmc->ios.bus_width == MMC_BUS_WIDTH_8)
sdhci_writew(host, SDHCI_MAKE_BLKSZ(b, 128), SDHCI_BLOCK_SIZE); else
sdhci_writew(host, SDHCI_MAKE_BLKSZ(b, 64), SDHCI_BLOCK_SIZE);
/* * The tuning block is sent by the card to the host controller. * So we set the TRNS_READ bit in the Transfer Mode register. * This also takes care of setting DMA Enable and Multi Block * Select in the same register to 0.
*/
sdhci_writew(host, SDHCI_TRNS_READ, SDHCI_TRANSFER_MODE);
int __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
{ int i;
/* * Issue opcode repeatedly till Execute Tuning is set to 0 or the number * of loops reaches tuning loop count.
*/ for (i = 0; i < host->tuning_loop_count; i++) {
u16 ctrl;
sdhci_send_tuning(host, opcode);
if (!host->tuning_done) {
pr_debug("%s: Tuning timeout, falling back to fixed sampling clock\n",
mmc_hostname(host->mmc));
sdhci_abort_tuning(host, opcode); return -ETIMEDOUT;
}
/* Spec does not require a delay between tuning cycles */ if (host->tuning_delay > 0)
mdelay(host->tuning_delay);
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); if (!(ctrl & SDHCI_CTRL_EXEC_TUNING)) { if (ctrl & SDHCI_CTRL_TUNED_CLK) return 0; /* Success! */ break;
}
}
pr_info("%s: Tuning failed, falling back to fixed sampling clock\n",
mmc_hostname(host->mmc));
sdhci_reset_tuning(host); return -EAGAIN;
}
EXPORT_SYMBOL_GPL(__sdhci_execute_tuning);
if (host->tuning_mode == SDHCI_TUNING_MODE_1)
tuning_count = host->tuning_count;
/* * The Host Controller needs tuning in case of SDR104 and DDR50 * mode, and for SDR50 mode when Use Tuning for SDR50 is set in * the Capabilities register. * If the Host Controller supports the HS200 mode then the * tuning function has to be executed.
*/ switch (host->timing) { /* HS400 tuning is done in HS200 mode */ case MMC_TIMING_MMC_HS400:
err = -EINVAL; goto out;
case MMC_TIMING_MMC_HS200: /* * Periodic re-tuning for HS400 is not expected to be needed, so * disable it here.
*/ if (hs400_tuning)
tuning_count = 0; break;
case MMC_TIMING_UHS_SDR104: case MMC_TIMING_UHS_DDR50: break;
case MMC_TIMING_UHS_SDR50: if (host->flags & SDHCI_SDR50_NEEDS_TUNING) break;
fallthrough;
default: goto out;
}
if (host->ops->platform_execute_tuning) {
err = host->ops->platform_execute_tuning(host, opcode); goto out;
}
mmc->retune_period = tuning_count;
if (host->tuning_delay < 0)
host->tuning_delay = opcode == MMC_SEND_TUNING_BLOCK;
/* * We only enable or disable Preset Value if they are not already * enabled or disabled respectively. Otherwise, we bail out.
*/ if (host->preset_enabled != enable) {
u16 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
if (enable)
ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE; else
ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE;
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
if (enable)
host->flags |= SDHCI_PV_ENABLED; else
host->flags &= ~SDHCI_PV_ENABLED;
/* * No pre-mapping in the pre hook if we're using the bounce buffer, * for that we would need two bounce buffers since one buffer is * in flight when this is getting called.
*/ if (host->flags & SDHCI_REQ_USE_DMA && !host->bounce_buffer)
sdhci_pre_dma_transfer(host, mrq->data, COOKIE_PRE_MAPPED);
}
staticvoid sdhci_error_out_mrqs(struct sdhci_host *host, int err)
{ if (host->data_cmd) {
host->data_cmd->error = err;
sdhci_finish_mrq(host, host->data_cmd->mrq);
}
if (host->cmd) {
host->cmd->error = err;
sdhci_finish_mrq(host, host->cmd->mrq);
}
}
/* First check if client has provided their own card event */ if (host->ops->card_event)
host->ops->card_event(host);
present = mmc->ops->get_cd(mmc);
spin_lock_irqsave(&host->lock, flags);
/* Check sdhci_has_requests() first in case we are runtime suspended */ if (sdhci_has_requests(host) && !present) {
pr_err("%s: Card removed during transfer!\n",
mmc_hostname(mmc));
pr_err("%s: Resetting controller.\n",
mmc_hostname(mmc));
if (data && data->host_cookie == COOKIE_MAPPED) { if (host->bounce_buffer) { /* * On reads, copy the bounced data into the * sglist
*/ if (mmc_get_dma_dir(data) == DMA_FROM_DEVICE) { unsignedint length = data->bytes_xfered;
if (length > host->bounce_buffer_size) {
pr_err("%s: bounce buffer is %u bytes but DMA claims to have transferred %u bytes\n",
mmc_hostname(host->mmc),
host->bounce_buffer_size,
data->bytes_xfered); /* Cap it down and continue */
length = host->bounce_buffer_size;
}
dma_sync_single_for_cpu(mmc_dev(host->mmc),
host->bounce_addr,
host->bounce_buffer_size,
DMA_FROM_DEVICE);
sg_copy_from_buffer(data->sg,
data->sg_len,
host->bounce_buffer,
length);
} else { /* No copying, just switch ownership */
dma_sync_single_for_cpu(mmc_dev(host->mmc),
host->bounce_addr,
host->bounce_buffer_size,
mmc_get_dma_dir(data));
}
} else { /* Unmap the raw data */
dma_unmap_sg(mmc_dev(host->mmc), data->sg,
data->sg_len,
mmc_get_dma_dir(data));
}
data->host_cookie = COOKIE_UNMAPPED;
}
}
EXPORT_SYMBOL_GPL(sdhci_request_done_dma);
for (i = 0; i < SDHCI_MAX_MRQS; i++) {
mrq = host->mrqs_done[i]; if (mrq) break;
}
if (!mrq) {
spin_unlock_irqrestore(&host->lock, flags); returntrue;
}
/* * The controller needs a reset of internal state machines * upon error conditions.
*/ if (sdhci_needs_reset(host, mrq)) { /* * Do not finish until command and data lines are available for * reset. Note there can only be one other mrq, so it cannot * also be in mrqs_done, otherwise host->cmd and host->data_cmd * would both be null.
*/ if (host->cmd || host->data_cmd) {
spin_unlock_irqrestore(&host->lock, flags); returntrue;
}
/* Some controllers need this kick or reset won't work here */ if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) /* This is to force an update */
host->ops->set_clock(host, host->clock);
sdhci_reset_for(host, REQUEST_ERROR);
host->pending_reset = false;
}
/* * Always unmap the data buffers if they were mapped by * sdhci_prepare_data() whenever we finish with a request. * This avoids leaking DMA mappings on error.
*/ if (host->flags & SDHCI_REQ_USE_DMA) { struct mmc_data *data = mrq->data;
if (host->use_external_dma && data &&
(mrq->cmd->error || data->error)) { struct dma_chan *chan = sdhci_external_dma_channel(host, data);
/* Treat auto-CMD12 error the same as data error */ if (!mrq->sbc && (host->flags & SDHCI_AUTO_CMD12)) {
*intmask_p |= data_err_bit; return;
}
}
if (!host->cmd) { /* * SDHCI recovers from errors by resetting the cmd and data * circuits. Until that is done, there very well might be more * interrupts, so ignore them in that case.
*/ if (host->pending_reset) return;
pr_err("%s: Got command interrupt 0x%08x even though no command operation was in progress.\n",
mmc_hostname(host->mmc), (unsigned)intmask);
sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
sdhci_dumpregs(host); return;
}
if (intmask & (SDHCI_INT_TIMEOUT | SDHCI_INT_CRC |
SDHCI_INT_END_BIT | SDHCI_INT_INDEX)) { if (intmask & SDHCI_INT_TIMEOUT) {
host->cmd->error = -ETIMEDOUT;
sdhci_err_stats_inc(host, CMD_TIMEOUT);
} else {
host->cmd->error = -EILSEQ; if (!mmc_op_tuning(host->cmd->opcode))
sdhci_err_stats_inc(host, CMD_CRC);
} /* Treat data command CRC error the same as data CRC error */ if (host->cmd->data &&
(intmask & (SDHCI_INT_CRC | SDHCI_INT_TIMEOUT)) ==
SDHCI_INT_CRC) {
host->cmd = NULL;
*intmask_p |= SDHCI_INT_DATA_CRC; return;
}
while (true) { struct sdhci_adma2_64_desc *dma_desc = desc;
if (host->flags & SDHCI_USE_64_BIT_DMA)
SDHCI_DUMP("%08llx: DMA 0x%08x%08x, LEN 0x%04x, Attr=0x%02x\n",
(unsignedlonglong)dma,
le32_to_cpu(dma_desc->addr_hi),
le32_to_cpu(dma_desc->addr_lo),
le16_to_cpu(dma_desc->len),
le16_to_cpu(dma_desc->cmd)); else
SDHCI_DUMP("%08llx: DMA 0x%08x, LEN 0x%04x, Attr=0x%02x\n",
(unsignedlonglong)dma,
le32_to_cpu(dma_desc->addr_lo),
le16_to_cpu(dma_desc->len),
le16_to_cpu(dma_desc->cmd));
desc += host->desc_sz;
dma += host->desc_sz;
if (dma_desc->cmd & cpu_to_le16(ADMA2_END)) break;
}
}
staticvoid sdhci_data_irq(struct sdhci_host *host, u32 intmask)
{ /* * CMD19 generates _only_ Buffer Read Ready interrupt if * use sdhci_send_tuning. * Need to exclude this case: PIO mode and use mmc_send_tuning, * If not, sdhci_transfer_pio will never be called, make the * SDHCI_INT_DATA_AVAIL always there, stuck in irq storm.
*/ if (intmask & SDHCI_INT_DATA_AVAIL && !host->data) { if (mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)))) {
host->tuning_done = 1;
wake_up(&host->buf_ready_int); return;
}
}
if (!host->data) { struct mmc_command *data_cmd = host->data_cmd;
/* * The "data complete" interrupt is also used to * indicate that a busy state has ended. See comment * above in sdhci_cmd_irq().
*/ if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) { if (intmask & SDHCI_INT_DATA_TIMEOUT) {
host->data_cmd = NULL;
data_cmd->error = -ETIMEDOUT;
sdhci_err_stats_inc(host, CMD_TIMEOUT);
__sdhci_finish_mrq(host, data_cmd->mrq); return;
} if (intmask & SDHCI_INT_DATA_END) {
host->data_cmd = NULL; /* * Some cards handle busy-end interrupt * before the command completed, so make * sure we do things in the proper order.
*/ if (host->cmd == data_cmd) return;
/* * SDHCI recovers from errors by resetting the cmd and data * circuits. Until that is done, there very well might be more * interrupts, so ignore them in that case.
*/ if (host->pending_reset) return;
pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
mmc_hostname(host->mmc), (unsigned)intmask);
sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
sdhci_dumpregs(host);
if (host->data->error)
sdhci_finish_data(host); else { if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL))
sdhci_transfer_pio(host);
/* * We currently don't do anything fancy with DMA * boundaries, but as we can't disable the feature * we need to at least restart the transfer. * * According to the spec sdhci_readl(host, SDHCI_DMA_ADDRESS) * should return a valid address to continue from, but as * some controllers are faulty, don't trust them.
*/ if (intmask & SDHCI_INT_DMA_END) {
dma_addr_t dmastart, dmanow;
dmastart = sdhci_sdma_address(host);
dmanow = dmastart + host->data->bytes_xfered; /* * Force update to the next DMA block boundary.
*/
dmanow = (dmanow &
~((dma_addr_t)SDHCI_DEFAULT_BOUNDARY_SIZE - 1)) +
SDHCI_DEFAULT_BOUNDARY_SIZE;
host->data->bytes_xfered = dmanow - dmastart;
DBG("DMA base %pad, transferred 0x%06x bytes, next %pad\n",
&dmastart, host->data->bytes_xfered, &dmanow);
sdhci_set_sdma_addr(host, dmanow);
}
if (intmask & SDHCI_INT_DATA_END) { if (host->cmd == host->data_cmd) { /* * Data managed to finish before the * command completed. Make sure we do * things in the proper order.
*/
host->data_early = 1;
} else {
sdhci_finish_data(host);
}
}
}
}
/* * There is a observation on i.mx esdhc. INSERT * bit will be immediately set again when it gets * cleared, if a card is inserted. We have to mask * the irq to prevent interrupt storm which will * freeze the system. And the REMOVE gets the * same situation. * * More testing are needed here to ensure it works * for other platforms though.
*/
host->ier &= ~(SDHCI_INT_CARD_INSERT |
SDHCI_INT_CARD_REMOVE);
host->ier |= present ? SDHCI_INT_CARD_REMOVE :
SDHCI_INT_CARD_INSERT;
sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
/* * To enable wakeup events, the corresponding events have to be enabled in * the Interrupt Status Enable register too. See 'Table 1-6: Wakeup Signal * Table' in the SD Host Controller Standard Specification. * It is useless to restore SDHCI_INT_ENABLE state in * sdhci_disable_irq_wakeups() since it will be set by * sdhci_enable_card_detection() or sdhci_init().
*/ bool sdhci_enable_irq_wakeups(struct sdhci_host *host)
{
u8 mask = SDHCI_WAKE_ON_INSERT | SDHCI_WAKE_ON_REMOVE |
SDHCI_WAKE_ON_INT;
u32 irq_val = 0;
u8 wake_val = 0;
u8 val;
/* * The DMA table descriptor count is calculated as the maximum * number of segments times 2, to allow for an alignment * descriptor for each segment, plus 1 for a nop end descriptor.
*/
host->adma_table_cnt = SDHCI_MAX_SEGS * 2 + 1;
host->max_adma = 65536;
staticint sdhci_set_dma_mask(struct sdhci_host *host)
{ struct mmc_host *mmc = host->mmc; struct device *dev = mmc_dev(mmc); int ret = -EINVAL;
if (host->quirks2 & SDHCI_QUIRK2_BROKEN_64_BIT_DMA)
host->flags &= ~SDHCI_USE_64_BIT_DMA;
/* Try 64-bit mask if hardware is capable of it */ if (host->flags & SDHCI_USE_64_BIT_DMA) {
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); if (ret) {
pr_warn("%s: Failed to set 64-bit DMA mask.\n",
mmc_hostname(mmc));
host->flags &= ~SDHCI_USE_64_BIT_DMA;
}
}
/* 32-bit mask as default & fallback */ if (ret) {
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); if (ret)
pr_warn("%s: Failed to set 32-bit DMA mask.\n",
mmc_hostname(mmc));
}
/* * Cap the bounce buffer at 64KB. Using a bigger bounce buffer * has diminishing returns, this is probably because SD/MMC * cards are usually optimized to handle this size of requests.
*/
bounce_size = SZ_64K; /* * Adjust downwards to maximum request size if this is less * than our segment size, else hammer down the maximum * request size to the maximum buffer size.
*/ if (mmc->max_req_size < bounce_size)
bounce_size = mmc->max_req_size;
max_blocks = bounce_size / 512;
/* * When we just support one segment, we can get significant * speedups by the help of a bounce buffer to group scattered * reads/writes together.
*/
host->bounce_buffer = devm_kmalloc(mmc_dev(mmc),
bounce_size,
GFP_KERNEL); if (!host->bounce_buffer) {
pr_err("%s: failed to allocate %u bytes for bounce buffer, falling back to single segments\n",
mmc_hostname(mmc),
bounce_size); /* * Exiting with zero here makes sure we proceed with * mmc->max_segs == 1.
*/ return;
}
host->bounce_addr = dma_map_single(mmc_dev(mmc),
host->bounce_buffer,
bounce_size,
DMA_BIDIRECTIONAL);
ret = dma_mapping_error(mmc_dev(mmc), host->bounce_addr); if (ret) {
devm_kfree(mmc_dev(mmc), host->bounce_buffer);
host->bounce_buffer = NULL; /* Again fall back to max_segs == 1 */ return;
}
host->bounce_buffer_size = bounce_size;
/* Lie about this since we're bouncing */
mmc->max_segs = max_blocks;
mmc->max_seg_size = bounce_size;
mmc->max_req_size = bounce_size;
pr_info("%s bounce up to %u segments into one, max segment size %u bytes\n",
mmc_hostname(mmc), max_blocks, bounce_size);
}
staticinlinebool sdhci_can_64bit_dma(struct sdhci_host *host)
{ /* * According to SD Host Controller spec v4.10, bit[27] added from * version 4.10 in Capabilities Register is used as 64-bit System * Address support for V4 mode.
*/ if (host->version >= SDHCI_SPEC_410 && host->v4_mode) return host->caps & SDHCI_CAN_64BIT_V4;
return host->caps & SDHCI_CAN_64BIT;
}
int sdhci_setup_host(struct sdhci_host *host)
{ struct mmc_host *mmc;
u32 max_current_caps; unsignedint ocr_avail; unsignedint override_timeout_clk;
u32 max_clk; int ret = 0; bool enable_vqmmc = false;
WARN_ON(host == NULL); if (host == NULL) return -EINVAL;
mmc = host->mmc;
/* * If there are external regulators, get them. Note this must be done * early before resetting the host and reading the capabilities so that * the host can take the appropriate action if regulators are not * available.
*/ if (!mmc->supply.vqmmc) {
ret = mmc_regulator_get_supply(mmc); if (ret) return ret;
enable_vqmmc = true;
}
if (host->version > SDHCI_SPEC_420) {
pr_err("%s: Unknown controller version (%d). You may experience problems.\n",
mmc_hostname(mmc), host->version);
}
if (host->quirks & SDHCI_QUIRK_FORCE_DMA)
host->flags |= SDHCI_USE_SDMA; elseif (!(host->caps & SDHCI_CAN_DO_SDMA))
DBG("Controller doesn't have SDMA capability\n"); else
host->flags |= SDHCI_USE_SDMA;
if ((host->quirks & SDHCI_QUIRK_BROKEN_DMA) &&
(host->flags & SDHCI_USE_SDMA)) {
DBG("Disabling DMA as it is marked broken\n");
host->flags &= ~SDHCI_USE_SDMA;
}
if ((host->quirks & SDHCI_QUIRK_BROKEN_ADMA) &&
(host->flags & SDHCI_USE_ADMA)) {
DBG("Disabling ADMA as it is marked broken\n");
host->flags &= ~SDHCI_USE_ADMA;
}
if (sdhci_can_64bit_dma(host))
host->flags |= SDHCI_USE_64_BIT_DMA;
if (host->use_external_dma) {
ret = sdhci_external_dma_init(host); if (ret == -EPROBE_DEFER) goto unreg; /* * Fall back to use the DMA/PIO integrated in standard SDHCI * instead of external DMA devices.
*/ elseif (ret)
sdhci_switch_external_dma(host, false); /* Disable internal DMA sources */ else
host->flags &= ~(SDHCI_USE_SDMA | SDHCI_USE_ADMA);
}
if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { if (host->ops->set_dma_mask)
ret = host->ops->set_dma_mask(host); else
ret = sdhci_set_dma_mask(host);
if (!ret && host->ops->enable_dma)
ret = host->ops->enable_dma(host);
if (ret) {
pr_warn("%s: No suitable DMA available - falling back to PIO\n",
mmc_hostname(mmc));
host->flags &= ~(SDHCI_USE_SDMA | SDHCI_USE_ADMA);
ret = 0;
}
}
/* SDMA does not support 64-bit DMA if v4 mode not set */ if ((host->flags & SDHCI_USE_64_BIT_DMA) && !host->v4_mode)
host->flags &= ~SDHCI_USE_SDMA;
if (host->flags & SDHCI_USE_ADMA) {
dma_addr_t dma; void *buf;
host->align_buffer_sz = SDHCI_MAX_SEGS * SDHCI_ADMA2_ALIGN; /* * Use zalloc to zero the reserved high 32-bits of 128-bit * descriptors so that they never need to be written.
*/
buf = dma_alloc_coherent(mmc_dev(mmc),
host->align_buffer_sz + host->adma_table_sz,
&dma, GFP_KERNEL); if (!buf) {
pr_warn("%s: Unable to allocate ADMA buffers - falling back to standard DMA\n",
mmc_hostname(mmc));
host->flags &= ~SDHCI_USE_ADMA;
} elseif ((dma + host->align_buffer_sz) &
(SDHCI_ADMA2_DESC_ALIGN - 1)) {
pr_warn("%s: unable to allocate aligned ADMA descriptor\n",
mmc_hostname(mmc));
host->flags &= ~SDHCI_USE_ADMA;
dma_free_coherent(mmc_dev(mmc), host->align_buffer_sz +
host->adma_table_sz, buf, dma);
} else {
host->align_buffer = buf;
host->align_addr = dma;
/* * If we use DMA, then it's up to the caller to set the DMA * mask, but PIO does not need the hw shim so we set a new * mask here in that case.
*/ if (!(host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA))) {
host->dma_mask = DMA_BIT_MASK(64);
mmc_dev(mmc)->dma_mask = &host->dma_mask;
}
host->max_clk *= 1000000; if (host->max_clk == 0 || host->quirks &
SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN) { if (!host->ops->get_max_clock) {
pr_err("%s: Hardware doesn't specify base clock frequency.\n",
mmc_hostname(mmc));
ret = -ENODEV; goto undma;
}
host->max_clk = host->ops->get_max_clock(host);
}
/* * In case of Host Controller v3.00, find out whether clock * multiplier is supported.
*/
host->clk_mul = FIELD_GET(SDHCI_CLOCK_MUL_MASK, host->caps1);
/* * In case the value in Clock Multiplier is 0, then programmable * clock mode is not supported, otherwise the actual clock * multiplier is one more than the value of Clock Multiplier * in the Capabilities Register.
*/ if (host->clk_mul)
host->clk_mul += 1;
/* * Set host parameters.
*/
max_clk = host->max_clk;
if (host->ops->get_min_clock)
mmc->f_min = host->ops->get_min_clock(host); elseif (host->version >= SDHCI_SPEC_300) { if (host->clk_mul)
max_clk = host->max_clk * host->clk_mul; /* * Divided Clock Mode minimum clock rate is always less than * Programmable Clock Mode minimum clock rate.
*/
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300;
} else
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
if (!mmc->f_max || mmc->f_max > max_clk)
mmc->f_max = max_clk;
if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
host->timeout_clk = FIELD_GET(SDHCI_TIMEOUT_CLK_MASK, host->caps);
if (host->caps & SDHCI_TIMEOUT_CLK_UNIT)
host->timeout_clk *= 1000;
if (host->timeout_clk == 0) { if (!host->ops->get_timeout_clock) {
pr_err("%s: Hardware doesn't specify timeout clock frequency.\n",
mmc_hostname(mmc));
ret = -ENODEV; goto undma;
}
if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
host->flags |= SDHCI_AUTO_CMD12;
/* * For v3 mode, Auto-CMD23 stuff only works in ADMA or PIO. * For v4 mode, SDMA may use Auto-CMD23 as well.
*/ if ((host->version >= SDHCI_SPEC_300) &&
((host->flags & SDHCI_USE_ADMA) ||
!(host->flags & SDHCI_USE_SDMA) || host->v4_mode) &&
!(host->quirks2 & SDHCI_QUIRK2_ACMD23_BROKEN)) {
host->flags |= SDHCI_AUTO_CMD23;
DBG("Auto-CMD23 available\n");
} else {
DBG("Auto-CMD23 unavailable\n");
}
/* * A controller may support 8-bit width, but the board itself * might not have the pins brought out. Boards that support * 8-bit width must set "mmc->caps |= MMC_CAP_8_BIT_DATA;" in * their platform code before calling sdhci_add_host(), and we * won't assume 8-bit width for hosts without that CAP.
*/ if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA))
mmc->caps |= MMC_CAP_4_BIT_DATA;
if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23)
mmc->caps &= ~MMC_CAP_CMD23;
if (host->caps & SDHCI_CAN_DO_HISPD)
mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;
if (!IS_ERR(mmc->supply.vqmmc)) { if (enable_vqmmc) {
ret = regulator_enable(mmc->supply.vqmmc);
host->sdhci_core_to_disable_vqmmc = !ret;
}
/* If vqmmc provides no 1.8V signalling, then there's no UHS */ if (!regulator_is_supported_voltage(mmc->supply.vqmmc, 1700000,
1950000))
host->caps1 &= ~(SDHCI_SUPPORT_SDR104 |
SDHCI_SUPPORT_SDR50 |
SDHCI_SUPPORT_DDR50);
/* In eMMC case vqmmc might be a fixed 1.8V regulator */ if (!regulator_is_supported_voltage(mmc->supply.vqmmc, 2700000,
3600000))
host->flags &= ~SDHCI_SIGNALING_330;
if (ret) {
pr_warn("%s: Failed to enable vqmmc regulator: %d\n",
mmc_hostname(mmc), ret);
mmc->supply.vqmmc = ERR_PTR(-EINVAL);
}
}
if (host->quirks2 & SDHCI_QUIRK2_NO_1_8_V) {
host->caps1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
SDHCI_SUPPORT_DDR50); /* * The SDHCI controller in a SoC might support HS200/HS400 * (indicated using mmc-hs200-1_8v/mmc-hs400-1_8v dt property), * but if the board is modeled such that the IO lines are not * connected to 1.8v then HS200/HS400 cannot be supported. * Disable HS200/HS400 if the board does not have 1.8v connected * to the IO lines. (Applicable for other modes in 1.8v)
*/
mmc->caps2 &= ~(MMC_CAP2_HSX00_1_8V | MMC_CAP2_HS400_ES);
mmc->caps &= ~(MMC_CAP_1_8V_DDR | MMC_CAP_UHS);
}
/* Any UHS-I mode in caps implies SDR12 and SDR25 support. */ if (host->caps1 & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
SDHCI_SUPPORT_DDR50))
mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25;
/* SDR104 supports also implies SDR50 support */ if (host->caps1 & SDHCI_SUPPORT_SDR104) {
mmc->caps |= MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50; /* SD3.0: SDR104 is supported so (for eMMC) the caps2 * field can be promoted to support HS200.
*/ if (!(host->quirks2 & SDHCI_QUIRK2_BROKEN_HS200))
mmc->caps2 |= MMC_CAP2_HS200;
} elseif (host->caps1 & SDHCI_SUPPORT_SDR50) {
mmc->caps |= MMC_CAP_UHS_SDR50;
}
/* Does the host need tuning for SDR50? */ if (host->caps1 & SDHCI_USE_SDR50_TUNING)
host->flags |= SDHCI_SDR50_NEEDS_TUNING;
/* Driver Type(s) (A, C, D) supported by the host */ if (host->caps1 & SDHCI_DRIVER_TYPE_A)
mmc->caps |= MMC_CAP_DRIVER_TYPE_A; if (host->caps1 & SDHCI_DRIVER_TYPE_C)
mmc->caps |= MMC_CAP_DRIVER_TYPE_C; if (host->caps1 & SDHCI_DRIVER_TYPE_D)
mmc->caps |= MMC_CAP_DRIVER_TYPE_D;
/* Initial value for re-tuning timer count */
host->tuning_count = FIELD_GET(SDHCI_RETUNING_TIMER_COUNT_MASK,
host->caps1);
/* * In case Re-tuning Timer is not disabled, the actual value of * re-tuning timer will be 2 ^ (n - 1).
*/ if (host->tuning_count)
host->tuning_count = 1 << (host->tuning_count - 1);
/* Re-tuning mode supported by the Host Controller */
host->tuning_mode = FIELD_GET(SDHCI_RETUNING_MODE_MASK, host->caps1);
ocr_avail = 0;
/* * According to SD Host Controller spec v3.00, if the Host System * can afford more than 150mA, Host Driver should set XPC to 1. Also * the value is meaningful only if Voltage Support in the Capabilities * register is set. The actual current value is 4 times the register * value.
*/
max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT); if (!max_current_caps && !IS_ERR(mmc->supply.vmmc)) { int curr = regulator_get_current_limit(mmc->supply.vmmc); if (curr > 0) {
/* convert to SDHCI_MAX_CURRENT format */
curr = curr/1000; /* convert to mA */
curr = curr/SDHCI_MAX_CURRENT_MULTIPLIER;
if (mmc->caps2 & MMC_CAP2_HSX00_1_2V)
host->flags |= SDHCI_SIGNALING_120;
spin_lock_init(&host->lock);
/* * Maximum number of sectors in one transfer. Limited by SDMA boundary * size (512KiB). Note some tuning modes impose a 4MiB limit, but this * is less anyway.
*/
mmc->max_req_size = 524288;
/* * Maximum number of segments. Depends on if the hardware * can do scatter/gather or not.
*/ if (host->flags & SDHCI_USE_ADMA) {
mmc->max_segs = SDHCI_MAX_SEGS;
} elseif (host->flags & SDHCI_USE_SDMA) {
mmc->max_segs = 1;
mmc->max_req_size = min_t(size_t, mmc->max_req_size,
dma_max_mapping_size(mmc_dev(mmc)));
} else { /* PIO */
mmc->max_segs = SDHCI_MAX_SEGS;
}
/* * Maximum segment size. Could be one segment with the maximum number * of bytes. When doing hardware scatter/gather, each entry cannot * be larger than 64 KiB though.
*/ if (host->flags & SDHCI_USE_ADMA) { if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) {
host->max_adma = 65532; /* 32-bit alignment */
mmc->max_seg_size = 65535; /* * sdhci_adma_table_pre() expects to define 1 DMA * descriptor per segment, so the maximum segment size * is set accordingly. SDHCI allows up to 64KiB per DMA * descriptor (16-bit field), but some controllers do * not support "zero means 65536" reducing the maximum * for them to 65535. That is a problem if PAGE_SIZE is * 64KiB because the block layer does not support * max_seg_size < PAGE_SIZE, however * sdhci_adma_table_pre() has a workaround to handle * that case, and split the descriptor. Refer also * comment in sdhci_adma_table_pre().
*/ if (mmc->max_seg_size < PAGE_SIZE)
mmc->max_seg_size = PAGE_SIZE;
} else {
mmc->max_seg_size = 65536;
}
} else {
mmc->max_seg_size = mmc->max_req_size;
}
/* * Maximum block size. This varies from controller to controller and * is specified in the capabilities register.
*/ if (host->quirks & SDHCI_QUIRK_FORCE_BLK_SZ_2048) {
mmc->max_blk_size = 2;
} else {
mmc->max_blk_size = (host->caps & SDHCI_MAX_BLOCK_MASK) >>
SDHCI_MAX_BLOCK_SHIFT; if (mmc->max_blk_size >= 3) {
pr_warn("%s: Invalid maximum block size, assuming 512 bytes\n",
mmc_hostname(mmc));
mmc->max_blk_size = 0;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.