Merge "mmc: cmdq_hci: Add tracing events for CQ mode."
This commit is contained in:
commit
c51bfb9f3d
1 changed files with 31 additions and 2 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2015-2017 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 and
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -198,6 +198,14 @@ static void cmdq_dumpregs(struct cmdq_host *cq_host)
|
||||||
{
|
{
|
||||||
struct mmc_host *mmc = cq_host->mmc;
|
struct mmc_host *mmc = cq_host->mmc;
|
||||||
|
|
||||||
|
MMC_TRACE(mmc,
|
||||||
|
"%s: 0x0C=0x%08x 0x10=0x%08x 0x14=0x%08x 0x18=0x%08x 0x28=0x%08x 0x2C=0x%08x 0x30=0x%08x 0x34=0x%08x 0x54=0x%08x 0x58=0x%08x 0x5C=0x%08x 0x48=0x%08x\n",
|
||||||
|
__func__, cmdq_readl(cq_host, CQCTL), cmdq_readl(cq_host, CQIS),
|
||||||
|
cmdq_readl(cq_host, CQISTE), cmdq_readl(cq_host, CQISGE),
|
||||||
|
cmdq_readl(cq_host, CQTDBR), cmdq_readl(cq_host, CQTCN),
|
||||||
|
cmdq_readl(cq_host, CQDQS), cmdq_readl(cq_host, CQDPT),
|
||||||
|
cmdq_readl(cq_host, CQTERRI), cmdq_readl(cq_host, CQCRI),
|
||||||
|
cmdq_readl(cq_host, CQCRA), cmdq_readl(cq_host, CQCRDCT));
|
||||||
pr_err(DRV_NAME ": ========== REGISTER DUMP (%s)==========\n",
|
pr_err(DRV_NAME ": ========== REGISTER DUMP (%s)==========\n",
|
||||||
mmc_hostname(mmc));
|
mmc_hostname(mmc));
|
||||||
|
|
||||||
|
@ -426,6 +434,7 @@ static int cmdq_enable(struct mmc_host *mmc)
|
||||||
pm_ref_count:
|
pm_ref_count:
|
||||||
cmdq_runtime_pm_put(cq_host);
|
cmdq_runtime_pm_put(cq_host);
|
||||||
out:
|
out:
|
||||||
|
MMC_TRACE(mmc, "%s: CQ enabled err: %d\n", __func__, err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -443,6 +452,7 @@ static void cmdq_disable_nosync(struct mmc_host *mmc, bool soft)
|
||||||
|
|
||||||
cq_host->enabled = false;
|
cq_host->enabled = false;
|
||||||
mmc_host_set_cq_disable(mmc);
|
mmc_host_set_cq_disable(mmc);
|
||||||
|
MMC_TRACE(mmc, "%s: CQ disabled\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmdq_disable(struct mmc_host *mmc, bool soft)
|
static void cmdq_disable(struct mmc_host *mmc, bool soft)
|
||||||
|
@ -525,6 +535,12 @@ static void cmdq_prep_task_desc(struct mmc_request *mrq,
|
||||||
REL_WRITE(!!(req_flags & REL_WR)) |
|
REL_WRITE(!!(req_flags & REL_WR)) |
|
||||||
BLK_COUNT(mrq->cmdq_req->data.blocks) |
|
BLK_COUNT(mrq->cmdq_req->data.blocks) |
|
||||||
BLK_ADDR((u64)mrq->cmdq_req->blk_addr);
|
BLK_ADDR((u64)mrq->cmdq_req->blk_addr);
|
||||||
|
|
||||||
|
MMC_TRACE(mrq->host,
|
||||||
|
"%s: Task: 0x%08x | Args: 0x%08x | cnt: 0x%08x\n", __func__,
|
||||||
|
lower_32_bits(*data),
|
||||||
|
upper_32_bits(*data),
|
||||||
|
mrq->cmdq_req->data.blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmdq_dma_map(struct mmc_host *host, struct mmc_request *mrq)
|
static int cmdq_dma_map(struct mmc_host *host, struct mmc_request *mrq)
|
||||||
|
@ -665,6 +681,11 @@ static void cmdq_prep_dcmd_desc(struct mmc_host *mmc,
|
||||||
dataddr = (__le64 __force *)(desc + 4);
|
dataddr = (__le64 __force *)(desc + 4);
|
||||||
dataddr[0] = cpu_to_le64((u64)mrq->cmd->arg);
|
dataddr[0] = cpu_to_le64((u64)mrq->cmd->arg);
|
||||||
cmdq_log_task_desc_history(cq_host, *task_desc, true);
|
cmdq_log_task_desc_history(cq_host, *task_desc, true);
|
||||||
|
MMC_TRACE(mrq->host,
|
||||||
|
"%s: DCMD: Task: 0x%08x | Args: 0x%08x\n",
|
||||||
|
__func__,
|
||||||
|
lower_32_bits(*task_desc),
|
||||||
|
upper_32_bits(*task_desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmdq_pm_qos_vote(struct sdhci_host *host, struct mmc_request *mrq)
|
static void cmdq_pm_qos_vote(struct sdhci_host *host, struct mmc_request *mrq)
|
||||||
|
@ -743,6 +764,7 @@ ring_doorbell:
|
||||||
cmdq_dumpregs(cq_host);
|
cmdq_dumpregs(cq_host);
|
||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
}
|
}
|
||||||
|
MMC_TRACE(mmc, "%s: tag: %d\n", __func__, tag);
|
||||||
cmdq_writel(cq_host, 1 << tag, CQTDBR);
|
cmdq_writel(cq_host, 1 << tag, CQTDBR);
|
||||||
/* Commit the doorbell write immediately */
|
/* Commit the doorbell write immediately */
|
||||||
wmb();
|
wmb();
|
||||||
|
@ -785,6 +807,8 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err)
|
||||||
|
|
||||||
if (!status && !err)
|
if (!status && !err)
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
MMC_TRACE(mmc, "%s: CQIS: 0x%x err: %d\n",
|
||||||
|
__func__, status, err);
|
||||||
|
|
||||||
if (err || (status & CQIS_RED)) {
|
if (err || (status & CQIS_RED)) {
|
||||||
err_info = cmdq_readl(cq_host, CQTERRI);
|
err_info = cmdq_readl(cq_host, CQTERRI);
|
||||||
|
@ -920,6 +944,8 @@ skip_cqterri:
|
||||||
/* complete the corresponding mrq */
|
/* complete the corresponding mrq */
|
||||||
pr_debug("%s: completing tag -> %lu\n",
|
pr_debug("%s: completing tag -> %lu\n",
|
||||||
mmc_hostname(mmc), tag);
|
mmc_hostname(mmc), tag);
|
||||||
|
MMC_TRACE(mmc, "%s: completing tag -> %lu\n",
|
||||||
|
__func__, tag);
|
||||||
cmdq_finish_data(mmc, tag);
|
cmdq_finish_data(mmc, tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -997,6 +1023,8 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt)
|
||||||
retries--;
|
retries--;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
MMC_TRACE(mmc, "%s: halt done , retries: %d\n",
|
||||||
|
__func__, retries);
|
||||||
/* halt done: re-enable legacy interrupts */
|
/* halt done: re-enable legacy interrupts */
|
||||||
if (cq_host->ops->clear_set_irqs)
|
if (cq_host->ops->clear_set_irqs)
|
||||||
cq_host->ops->clear_set_irqs(mmc,
|
cq_host->ops->clear_set_irqs(mmc,
|
||||||
|
@ -1014,6 +1042,7 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt)
|
||||||
cq_host->ops->set_data_timeout(mmc, 0xf);
|
cq_host->ops->set_data_timeout(mmc, 0xf);
|
||||||
if (cq_host->ops->clear_set_irqs)
|
if (cq_host->ops->clear_set_irqs)
|
||||||
cq_host->ops->clear_set_irqs(mmc, true);
|
cq_host->ops->clear_set_irqs(mmc, true);
|
||||||
|
MMC_TRACE(mmc, "%s: unhalt done\n", __func__);
|
||||||
cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) & ~HALT,
|
cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) & ~HALT,
|
||||||
CQCTL);
|
CQCTL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue