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

Commit fc9fbe34 authored by Sayali Lokhande's avatar Sayali Lokhande
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 b88a7af7
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
 * drivers/mmc/host/sdhci-msm.c - Qualcomm Technologies, Inc. MSM SDHCI Platform
 * driver source file
 *
 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
 *
 * 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
@@ -3293,6 +3293,11 @@ 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",
		sdhci_msm_readl_relaxed(host,
			msm_host_offset->CORE_MCI_DATA_CNT),
		sdhci_msm_readl_relaxed(host,
			msm_host_offset->CORE_MCI_FIFO_CNT));
	pr_info("Data cnt: 0x%08x | Fifo cnt: 0x%08x | Int sts: 0x%08x\n",
		sdhci_msm_readl_relaxed(host,
			msm_host_offset->CORE_MCI_DATA_CNT),
+35 −0
Original line number Diff line number Diff line
@@ -111,6 +111,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));

@@ -1013,6 +1024,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,
@@ -1071,6 +1087,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)
@@ -1082,6 +1101,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);
@@ -1210,6 +1231,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);
@@ -1231,8 +1257,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]);
		}
	}

@@ -3169,6 +3201,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);