summaryrefslogtreecommitdiff
path: root/samsung/exynos_drm_dsim.c
diff options
context:
space:
mode:
authorShiyong Li <shiyongli@google.com>2022-04-22 22:44:32 +0000
committerShiyong Li <shiyongli@google.com>2022-04-22 23:38:11 +0000
commit403e086c538117a9a5a043f550b8beadfb01bd6d (patch)
treedadc1ce0a12bc2074d88d9360a8d0ca2bb0f5fa9 /samsung/exynos_drm_dsim.c
parent0c16193b9911d4274f1e63f3ca68adc75543df17 (diff)
downloaddisplay-403e086c538117a9a5a043f550b8beadfb01bd6d.tar.gz
Revert "drm: samsung: dsim: cleanup packetgo cmd transfer"
This reverts commit 16136e2ceb8dfe8bef6d72603cfe56c38dec1248. Bug: 230048347 Change-Id: Id70fb88a63ecaf469c6c666321da5aac250d2a95 Signed-off-by: Shiyong Li <shiyongli@google.com>
Diffstat (limited to 'samsung/exynos_drm_dsim.c')
-rw-r--r--samsung/exynos_drm_dsim.c164
1 files changed, 63 insertions, 101 deletions
diff --git a/samsung/exynos_drm_dsim.c b/samsung/exynos_drm_dsim.c
index 7bc2a72..11cab14 100644
--- a/samsung/exynos_drm_dsim.c
+++ b/samsung/exynos_drm_dsim.c
@@ -410,20 +410,13 @@ static void _dsim_disable(struct dsim_device *dsim)
dsim->state = DSIM_STATE_SUSPEND;
WARN_ON(dsim_reg_has_pend_cmd(dsim->id));
-
- dsim->force_batching = false;
- if (WARN(dsim->total_pend_ph, "pending packets remaining ph(%u) pl(%u)\n",
- dsim->total_pend_ph, dsim->total_pend_pl)) {
- dsim->total_pend_ph = 0;
- dsim->total_pend_pl = 0;
-
- /* balance runtime vote placed when packetgo was enabled */
- pm_runtime_put(dsim->dev);
- }
mutex_unlock(&dsim->cmd_lock);
mutex_unlock(&dsim->state_lock);
dsim_phy_power_off(dsim);
+ dsim->total_pend_ph = 0;
+ dsim->total_pend_pl = 0;
+ dsim->force_batching = false;
#if defined(CONFIG_CPU_IDLE)
exynos_update_ip_idle_status(dsim->idle_ip_index, 1);
@@ -1804,74 +1797,39 @@ dsim_write_payload(struct dsim_device *dsim, const u8* buf, size_t len)
}
}
-static void __dsim_write_packet(struct dsim_device *dsim, const struct mipi_dsi_packet *packet)
+static void __dsim_write_data(struct dsim_device *dsim,
+ const struct mipi_dsi_msg *msg, bool is_long)
{
- if (packet->payload_length > 0)
- dsim_write_payload(dsim, packet->payload, packet->payload_length);
-
- dsim_reg_wr_tx_header(dsim->id, packet->header[0], packet->header[1], packet->header[2],
- false);
-
- dsim_debug(dsim, "header(0x%x 0x%x 0x%x) size(%lu) ph fifo(%d)\n", packet->header[0],
- packet->header[1], packet->header[2], packet->size,
- dsim_reg_get_ph_cnt(dsim->id));
-}
+ struct mipi_dsi_packet packet;
-static void __dsim_cmd_prepare(struct dsim_device *dsim)
-{
- WARN_ON(!mutex_is_locked(&dsim->cmd_lock));
+ mipi_dsi_create_packet(&packet, msg);
- dsim_reg_clear_int(dsim->id, DSIM_INTSRC_SFR_PH_FIFO_EMPTY | DSIM_INTSRC_SFR_PL_FIFO_EMPTY);
+ if (is_long)
+ dsim_write_payload(dsim, packet.payload, packet.payload_length);
+ dsim_reg_wr_tx_header(dsim->id, packet.header[0], packet.header[1],
+ packet.header[2], false);
- reinit_completion(&dsim->pl_wr_comp);
- reinit_completion(&dsim->ph_wr_comp);
+ dsim_debug(dsim, "header(0x%x 0x%x 0x%x) size(%lu) ph fifo(%d)\n",
+ packet.header[0], packet.header[1], packet.header[2],
+ packet.size, dsim_reg_get_ph_cnt(dsim->id));
}
static int dsim_write_single_cmd_locked(struct dsim_device *dsim,
- const struct mipi_dsi_packet *packet)
+ const struct mipi_dsi_msg *msg, bool is_long)
{
- __dsim_cmd_prepare(dsim);
-
- __dsim_write_packet(dsim, packet);
-
- return dsim_wait_for_cmd_fifo_empty(dsim, packet->payload_length > 0);
-}
-
-static int dsim_cmd_packetgo_flush_locked(struct dsim_device *dsim)
-{
- int ret;
+ const u8 *tx_buf = msg->tx_buf;
- /* this should only be called with pending packets */
- WARN_ON(!dsim->total_pend_ph);
-
- __dsim_cmd_prepare(dsim);
-
- dsim_reg_ready_packetgo(dsim->id, true);
- dsim_debug(dsim, "packet go ready (ph: %d, pl: %d)\n", dsim->total_pend_ph,
- dsim->total_pend_pl);
-
- ret = dsim_wait_for_cmd_fifo_empty(dsim, dsim->total_pend_pl > 0);
- if (ret)
- dsim_warn(dsim, "packetgo failed on wait for cmd fifo empty (%d)\n", ret);
+ WARN_ON(!mutex_is_locked(&dsim->cmd_lock));
- /* clear packetgo pending */
- dsim->total_pend_ph = 0;
- dsim->total_pend_pl = 0;
+ DPU_EVENT_LOG_CMD(dsim, msg->type, tx_buf[0], msg->tx_len);
- return ret;
-}
+ dsim_reg_clear_int(dsim->id, DSIM_INTSRC_SFR_PH_FIFO_EMPTY);
-static void dsim_cmd_packetgo_queue_locked(struct dsim_device *dsim,
- const struct mipi_dsi_packet *packet)
-{
- WARN_ON(!mutex_is_locked(&dsim->cmd_lock));
+ reinit_completion(is_long ? &dsim->pl_wr_comp : &dsim->ph_wr_comp);
- dsim->total_pend_ph++;
- dsim->total_pend_pl += ALIGN(packet->payload_length, 4);
- __dsim_write_packet(dsim, packet);
+ __dsim_write_data(dsim, msg, is_long);
- dsim_debug(dsim, "total pending packet header(%u) payload(%u)\n", dsim->total_pend_ph,
- dsim->total_pend_pl);
+ return dsim_wait_for_cmd_fifo_empty(dsim, is_long);
}
/*
@@ -1936,9 +1894,10 @@ static int
dsim_write_data(struct dsim_device *dsim, const struct mipi_dsi_msg *msg)
{
int ret = 0;
- const u16 flags = msg->flags;
+ u16 flags = msg->flags;
+ bool is_long;
+ bool is_empty_msg;
bool is_last;
- struct mipi_dsi_packet packet = { .size = 0 };
if (flags & EXYNOS_DSI_MSG_FORCE_BATCH) {
WARN_ON(dsim->force_batching);
@@ -1946,45 +1905,35 @@ dsim_write_data(struct dsim_device *dsim, const struct mipi_dsi_msg *msg)
return 0;
}
- if (msg->tx_len > 0) {
- const u8 *tx_buf = msg->tx_buf;
-
- ret = mipi_dsi_create_packet(&packet, msg);
- if (ret) {
- dsim_err(dsim, "unable to create dsi packet (%d)\n", ret);
- return ret;
- }
-
- DPU_EVENT_LOG_CMD(dsim, msg->type, tx_buf[0], msg->tx_len);
- }
-
DPU_ATRACE_BEGIN(__func__);
+ is_long = mipi_dsi_packet_format_is_long(msg->type);
if (dsim->config.mode == DSIM_VIDEO_MODE) {
- ret = dsim_write_single_cmd_locked(dsim, &packet);
+ ret = dsim_write_single_cmd_locked(dsim, msg, is_long);
goto err;
}
- if (((dsim->total_pend_pl + packet.payload_length) > MAX_PL_FIFO) ||
- (dsim->total_pend_ph == MAX_PH_FIFO)) {
+ if (((dsim->total_pend_pl + msg->tx_len) > MAX_PL_FIFO) ||
+ (dsim->total_pend_ph == MAX_PH_FIFO)) {
dsim_err(dsim, "fifo would be full. ph(%u) pl(%lu) max(%d/%d)\n",
- dsim->total_pend_ph, dsim->total_pend_pl + packet.payload_length,
- MAX_PH_FIFO, MAX_PL_FIFO);
- ret = -ENOSPC;
+ dsim->total_pend_ph,
+ dsim->total_pend_pl + msg->tx_len,
+ MAX_PH_FIFO, MAX_PL_FIFO);
+ ret = -EINVAL;
goto err;
}
is_last = (IS_LAST(flags) && !dsim->force_batching) || (flags & EXYNOS_DSI_MSG_FORCE_FLUSH);
+ is_empty_msg = msg->tx_len == 0;
if (flags & EXYNOS_DSI_MSG_FORCE_FLUSH) {
dsim->force_batching = false;
- /* force batching should happen only with empty msg */
- WARN_ON(packet.size);
+ WARN_ON(!is_empty_msg);
}
- if (!is_last && packet.size &&
- (((dsim->total_pend_ph + 1) == MAX_PH_FIFO) ||
- ((dsim->total_pend_pl + packet.payload_length) > PL_FIFO_THRESHOLD))) {
- dsim_warn(dsim, "warning. changed last command. pending ph/pl(%u,%u) new pl(%zu)\n",
- dsim->total_pend_ph, dsim->total_pend_pl, packet.payload_length);
+ if (!is_last && !is_empty_msg &&
+ (((dsim->total_pend_ph + 1) == MAX_PH_FIFO) ||
+ ((dsim->total_pend_pl + msg->tx_len) > PL_FIFO_THRESHOLD))) {
+ dsim_warn(dsim, "warning. changed last command. pend pl/pl(%u,%u)\n",
+ dsim->total_pend_ph, dsim->total_pend_pl);
is_last = true;
}
@@ -1992,26 +1941,39 @@ dsim_write_data(struct dsim_device *dsim, const struct mipi_dsi_msg *msg)
if (is_last) {
if (dsim->total_pend_ph) {
- if (packet.size)
- dsim_cmd_packetgo_queue_locked(dsim, &packet);
+ reinit_completion(is_long ?
+ &dsim->pl_wr_comp : &dsim->ph_wr_comp);
+
+ if (!is_empty_msg)
+ __dsim_write_data(dsim, msg, is_long);
if (!(flags & EXYNOS_DSI_MSG_IGNORE_VBLANK))
need_wait_vblank(dsim);
- ret = dsim_cmd_packetgo_flush_locked(dsim);
+ dsim_reg_ready_packetgo(dsim->id, true);
+ dsim_debug(dsim, "packet go ready\n");
- dsim_reg_enable_packetgo(dsim->id, false);
- pm_runtime_put(dsim->dev);
- } else if (packet.size) {
- ret = dsim_write_single_cmd_locked(dsim, &packet);
+ ret = dsim_wait_for_cmd_fifo_empty(dsim, is_long);
+ if (!ret) {
+ dsim_reg_enable_packetgo(dsim->id, false);
+ dsim->total_pend_ph = 0;
+ dsim->total_pend_pl = 0;
+ }
+
+ pm_runtime_put_sync(dsim->dev);
+ } else if (!is_empty_msg) {
+ ret = dsim_write_single_cmd_locked(dsim, msg, is_long);
}
- } else if (packet.size) {
- /* if this is the first packet being queued, enable packet go feature */
+ } else if (!is_empty_msg) {
if (!dsim->total_pend_ph) {
pm_runtime_get_sync(dsim->dev);
dsim_reg_enable_packetgo(dsim->id, true);
}
- dsim_cmd_packetgo_queue_locked(dsim, &packet);
+ dsim->total_pend_ph++;
+ dsim->total_pend_pl += ALIGN(msg->tx_len, 4);
+ __dsim_write_data(dsim, msg, is_long);
+ dsim_debug(dsim, "total pending packet header(%u) payload(%u)\n",
+ dsim->total_pend_ph, dsim->total_pend_pl);
}
err: