Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7d59e1e3 authored by Sayali Lokhande's avatar Sayali Lokhande Committed by Gerrit - the friendly Code Review server
Browse files

mmc: sdhci: Add mmc tracing events for legacy mode.



Add ring buffer tracing events in legacy mode for
debug purpose.
Tracing events include cpu, timestamp, legacy command
opcode, argument, response, interrupts.

Example:
<5> 171912889412: sdhci_prepare_data: mmc0: 0x28=0x0000003c
0x3E=0x00000000
<5> 171912901235: sdhci_set_transfer_mode: mmc0: 0x00=0x00000000
<5> 171912908579: sdhci_send_command: mmc0: updated
0x8=0x00000000 0xC=0x00000013 0xE=0x0000083a
<5> 171912920922: sdhci_irq: mmc0: resp 0: 0x00000900
resp 1: 0x00000000 resp 2: 0x00000000 resp 3: 0x00000000
<5> 171912931339: sdhci_irq: mmc0: intmask: 0x1
<5> 171912938839: sdhci_irq: mmc0: intmask: 0x2
<5> 171912945766: sdhci_finish_data: mmc0: 0x24=0x01f80000

Change-Id: I26d2de3ddf72a74dd84199a9772d48da128796f4
Signed-off-by: default avatarSayali Lokhande <sayalil@codeaurora.org>
parent b221bf4b
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -2582,9 +2582,17 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type)
	if (done)
		init_completion(&msm_host->pwr_irq_completion);
	else if (!wait_for_completion_timeout(&msm_host->pwr_irq_completion,
				msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS)))
				msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) {
		__WARN_printf("%s: request(%d) timed out waiting for pwr_irq\n",
					mmc_hostname(host->mmc), req_type);
		MMC_TRACE(host->mmc,
			"request(%d) timed out waiting for pwr_irq, 0xDC: 0x%08x | 0xE0: 0x%08x | 0xE8: 0x%08x\n",
			req_type,
			readl_relaxed(msm_host->core_mem + CORE_PWRCTL_STATUS),
			readl_relaxed(msm_host->core_mem + CORE_PWRCTL_MASK),
			readl_relaxed(msm_host->core_mem + CORE_PWRCTL_CTL));
		mmc_stop_tracing(host->mmc);
		}

	pr_debug("%s: %s: request %d done\n", mmc_hostname(host->mmc),
			__func__, req_type);
@@ -3089,6 +3097,9 @@ void sdhci_msm_dump_vendor_regs(struct sdhci_host *host)
	if (host->cq_host)
		sdhci_msm_cmdq_dump_debug_ram(host);

	MMC_TRACE(host->mmc, "Data cnt: 0x%08x | Fifo cnt: 0x%08x\n",
		readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT),
		readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT));
	pr_info("Data cnt: 0x%08x | Fifo cnt: 0x%08x | Int sts: 0x%08x\n",
		readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT),
		readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT),
+35 −0
Original line number Diff line number Diff line
@@ -105,6 +105,17 @@ static void sdhci_dump_state(struct sdhci_host *host)

static void sdhci_dumpregs(struct sdhci_host *host)
{
	MMC_TRACE(host->mmc,
		"%s: 0x04=0x%08x 0x06=0x%08x 0x0E=0x%08x 0x30=0x%08x 0x34=0x%08x 0x38=0x%08x\n",
		__func__,
		sdhci_readw(host, SDHCI_BLOCK_SIZE),
		sdhci_readw(host, SDHCI_BLOCK_COUNT),
		sdhci_readw(host, SDHCI_COMMAND),
		sdhci_readl(host, SDHCI_INT_STATUS),
		sdhci_readl(host, SDHCI_INT_ENABLE),
		sdhci_readl(host, SDHCI_SIGNAL_ENABLE));
	mmc_stop_tracing(host->mmc);

	pr_info(DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n",
		mmc_hostname(host->mmc));

@@ -1046,6 +1057,11 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
	/* Set the DMA boundary value and block size */
	sdhci_set_blk_size_reg(host, data->blksz, SDHCI_DEFAULT_BOUNDARY_ARG);
	sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);
	MMC_TRACE(host->mmc,
		"%s: 0x28=0x%08x 0x3E=0x%08x 0x06=0x%08x\n", __func__,
		sdhci_readb(host, SDHCI_HOST_CONTROL),
		sdhci_readw(host, SDHCI_HOST_CONTROL2),
		sdhci_readw(host, SDHCI_BLOCK_COUNT));
}

static void sdhci_set_transfer_mode(struct sdhci_host *host,
@@ -1096,6 +1112,9 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
		mode |= SDHCI_TRNS_DMA;

	sdhci_writew(host, mode, SDHCI_TRANSFER_MODE);
	MMC_TRACE(host->mmc, "%s: 0x00=0x%08x 0x0C=0x%08x\n", __func__,
		sdhci_readw(host, SDHCI_ARGUMENT2),
		sdhci_readw(host, SDHCI_TRANSFER_MODE));
}

static void sdhci_finish_data(struct sdhci_host *host)
@@ -1107,6 +1126,8 @@ static void sdhci_finish_data(struct sdhci_host *host)
	data = host->data;
	host->data = NULL;

	MMC_TRACE(host->mmc, "%s: 0x24=0x%08x\n", __func__,
		sdhci_readl(host, SDHCI_PRESENT_STATE));
	if (host->flags & SDHCI_REQ_USE_DMA) {
		if (host->flags & SDHCI_USE_ADMA)
			sdhci_adma_table_post(host, data);
@@ -1233,6 +1254,11 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
	if (cmd->data)
		host->data_start_time = ktime_get();
	trace_mmc_cmd_rw_start(cmd->opcode, cmd->arg, cmd->flags);
	MMC_TRACE(host->mmc,
		"%s: updated 0x8=0x%08x 0xC=0x%08x 0xE=0x%08x\n", __func__,
		sdhci_readl(host, SDHCI_ARGUMENT),
		sdhci_readw(host, SDHCI_TRANSFER_MODE),
		sdhci_readw(host, SDHCI_COMMAND));
	sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND);
}
EXPORT_SYMBOL_GPL(sdhci_send_command);
@@ -1254,8 +1280,14 @@ static void sdhci_finish_command(struct sdhci_host *host)
						sdhci_readb(host,
						SDHCI_RESPONSE + (3-i)*4-1);
			}
			MMC_TRACE(host->mmc,
			"%s: resp 0: 0x%08x resp 1: 0x%08x resp 2: 0x%08x resp 3: 0x%08x\n",
			__func__, host->cmd->resp[0], host->cmd->resp[1],
			host->cmd->resp[2], host->cmd->resp[3]);
		} else {
			host->cmd->resp[0] = sdhci_readl(host, SDHCI_RESPONSE);
			MMC_TRACE(host->mmc, "%s: resp 0: 0x%08x\n",
				__func__, host->cmd->resp[0]);
		}
	}

@@ -3187,6 +3219,9 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
				goto out;
		}

		MMC_TRACE(host->mmc,
			"%s: intmask: 0x%x\n", __func__, intmask);

		if (intmask & SDHCI_INT_AUTO_CMD_ERR)
			host->auto_cmd_err_sts = sdhci_readw(host,
					SDHCI_AUTO_CMD_ERR);