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

Commit 1b9d7657 authored by Harigovindan P's avatar Harigovindan P
Browse files

disp: msm: clear dma done interrupt status for slave controller



When Broadcast is enabled, DMA_DONE bit gets set for slave
controller on command transfer completion but it is not
getting cleared. Due to this, DMA transfer failures on slave
controller are not getting caught. This patch add supports for
clearing DMA_DONE for slave controller on every successful
transfer. This also prints error if transfer fails on slave
controller.

Change-Id: I61ce7b2d8be323adc70d888b5a2416afd9ae9fac
Signed-off-by: default avatarHarigovindan P <harigovi@codeaurora.org>
parent 00534122
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ static void dsi_catalog_cmn_init(struct dsi_ctrl_hw *ctrl,
	ctrl->ops.reset_cmd_fifo         = dsi_ctrl_hw_cmn_reset_cmd_fifo;
	ctrl->ops.trigger_command_dma    = dsi_ctrl_hw_cmn_trigger_command_dma;
	ctrl->ops.get_interrupt_status   = dsi_ctrl_hw_cmn_get_interrupt_status;
	ctrl->ops.poll_slave_dma_status  = dsi_ctrl_hw_cmn_poll_slave_dma_status;
	ctrl->ops.get_error_status       = dsi_ctrl_hw_cmn_get_error_status;
	ctrl->ops.clear_error_status     = dsi_ctrl_hw_cmn_clear_error_status;
	ctrl->ops.clear_interrupt_status =
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ void dsi_phy_hw_v4_0_commit_phy_timing(struct dsi_phy_hw *phy,

/* DSI controller common ops */
u32 dsi_ctrl_hw_cmn_get_interrupt_status(struct dsi_ctrl_hw *ctrl);
u32 dsi_ctrl_hw_cmn_poll_slave_dma_status(struct dsi_ctrl_hw *ctrl);
void dsi_ctrl_hw_cmn_clear_interrupt_status(struct dsi_ctrl_hw *ctrl, u32 ints);
void dsi_ctrl_hw_cmn_enable_status_interrupts(struct dsi_ctrl_hw *ctrl,
					     u32 ints);
+36 −0
Original line number Diff line number Diff line
@@ -1505,6 +1505,39 @@ static void dsi_ctrl_validate_msg_flags(struct dsi_ctrl *dsi_ctrl,
		*flags &= ~DSI_CTRL_CMD_ASYNC_WAIT;
}

/**
 * dsi_ctrl_clear_slave_dma_status -   API to clear slave DMA status
 * @dsi_ctrl:                   DSI controller handle.
 * @flags:                      Modifiers
 */
static void dsi_ctrl_clear_slave_dma_status(struct dsi_ctrl *dsi_ctrl, u32 flags)
{
	struct dsi_ctrl_hw_ops dsi_hw_ops;
	u32 status = 0;

	if (!dsi_ctrl) {
		DSI_CTRL_ERR(dsi_ctrl, "Invalid params\n");
		return;
	}

	/* Return if this is not the last command */
	if (!(flags & DSI_CTRL_CMD_LAST_COMMAND))
		return;

	SDE_EVT32(dsi_ctrl->cell_index, SDE_EVTLOG_FUNC_ENTRY);

	dsi_hw_ops = dsi_ctrl->hw.ops;

	status = dsi_hw_ops.poll_slave_dma_status(&dsi_ctrl->hw);

	if (status) {
		status |= (DSI_CMD_MODE_DMA_DONE | DSI_BTA_DONE);
		dsi_hw_ops.clear_interrupt_status(&dsi_ctrl->hw,
						status);
		SDE_EVT32(dsi_ctrl->cell_index, status);
	}
}

static int dsi_message_tx(struct dsi_ctrl *dsi_ctrl,
			  const struct mipi_dsi_msg *msg,
			  u32 *flags)
@@ -1537,6 +1570,9 @@ static int dsi_message_tx(struct dsi_ctrl *dsi_ctrl,
	if (dsi_ctrl->dma_wait_queued)
		dsi_ctrl_flush_cmd_dma_queue(dsi_ctrl);

	if (!(*flags & DSI_CTRL_CMD_BROADCAST_MASTER))
		dsi_ctrl_clear_slave_dma_status(dsi_ctrl, *flags);

	if (*flags & DSI_CTRL_CMD_NON_EMBEDDED_MODE) {
		cmd_mem.offset = dsi_ctrl->cmd_buffer_iova;
		cmd_mem.en_broadcast = (*flags & DSI_CTRL_CMD_BROADCAST) ?
+6 −0
Original line number Diff line number Diff line
@@ -641,6 +641,12 @@ struct dsi_ctrl_hw_ops {
	 */
	void (*clear_interrupt_status)(struct dsi_ctrl_hw *ctrl, u32 ints);

	/**
	 * poll_slave_dma_status()- API to poll slave DMA status
	 * @ctrl:                 Pointer to the controller host hardware.
	 */
	u32 (*poll_slave_dma_status)(struct dsi_ctrl_hw *ctrl);

	/**
	 * enable_status_interrupts() - enable the specified interrupts
	 * @ctrl:          Pointer to the controller host hardware.
+27 −0
Original line number Diff line number Diff line
@@ -937,6 +937,33 @@ u32 dsi_ctrl_hw_cmn_get_cmd_read_data(struct dsi_ctrl_hw *ctrl,
	return rx_byte;
}

/**
 * poll_slave_dma_status() - API to clear poll DMA status
 * @ctrl:          Pointer to the controller host hardware.
 *
 * Return: DMA status.
 */
u32 dsi_ctrl_hw_cmn_poll_slave_dma_status(struct dsi_ctrl_hw *ctrl)
{
	int rc = 0;
	u32 status;
	u32 const delay_us = 10;
	u32 const timeout_us = 5000;

	rc = readl_poll_timeout_atomic(ctrl->base + DSI_INT_CTRL,
				      status,
				      ((status & DSI_CMD_MODE_DMA_DONE)
					> 0),
				      delay_us,
				      timeout_us);
	if (rc) {
		DSI_CTRL_HW_DBG(ctrl, "DSI1 CMD_MODE_DMA_DONE failed\n");
		status = 0;
	}

	return status;
}

/**
 * get_interrupt_status() - returns the interrupt status
 * @ctrl:          Pointer to the controller host hardware.