summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2016-06-27 11:44:34 -0700
committerDhaval Patel <pdhaval@codeaurora.org>2016-08-01 11:58:13 -0700
commit7191e505e4aa4727ed58752abf4785ff379a5e89 (patch)
tree91865b010677dc4a85778a3c2a70c3ed640f357c /drivers/gpu
parent5edb8d288567ebb7846756f1e8086e6f2cb7ecc7 (diff)
drm/msm/dsi-staging: add debugfs support for dsi driver
Add basic debugfs support for dsi driver. Get controller, clock, power etc status for debugging. Change-Id: I42164988cfe58b67a70ae3ffbc953b24fa708407 Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_catalog.c1
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_catalog.h3
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.c176
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.h5
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw.h4
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw_1_4.c158
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_display.c106
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_display.h4
8 files changed, 453 insertions, 4 deletions
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.c b/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.c
index 3f698cbdc8e5..06027a963be1 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.c
@@ -59,6 +59,7 @@ static void dsi_catalog_14_init(struct dsi_ctrl_hw *ctrl)
ctrl->ops.test_pattern_enable = dsi_ctrl_hw_14_test_pattern_enable;
ctrl->ops.trigger_cmd_test_pattern =
dsi_ctrl_hw_14_trigger_cmd_test_pattern;
+ ctrl->ops.reg_dump_to_buffer = dsi_ctrl_hw_14_reg_dump_to_buffer;
}
/**
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.h b/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.h
index 506fa28f8cd3..98bd9b039f09 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.h
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_catalog.h
@@ -127,4 +127,7 @@ void dsi_ctrl_hw_14_cmd_test_pattern_setup(struct dsi_ctrl_hw *ctrl,
void dsi_ctrl_hw_14_test_pattern_enable(struct dsi_ctrl_hw *ctrl, bool enable);
void dsi_ctrl_hw_14_trigger_cmd_test_pattern(struct dsi_ctrl_hw *ctrl,
u32 stream_id);
+ssize_t dsi_ctrl_hw_14_reg_dump_to_buffer(struct dsi_ctrl_hw *ctrl,
+ char *buf,
+ u32 size);
#endif /* _DSI_CATALOG_H_ */
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.c b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.c
index 381827ece513..1fac1b9a4843 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.c
@@ -34,6 +34,7 @@
#define DSI_CTRL_TX_TO_MS 200
+#define TO_ON_OFF(x) ((x) ? "ON" : "OFF")
/**
* enum dsi_ctrl_driver_ops - controller driver ops
*/
@@ -75,6 +76,163 @@ static const struct of_device_id msm_dsi_of_match[] = {
{}
};
+static ssize_t debugfs_state_info_read(struct file *file,
+ char __user *buff,
+ size_t count,
+ loff_t *ppos)
+{
+ struct dsi_ctrl *dsi_ctrl = file->private_data;
+ char *buf;
+ u32 len = 0;
+
+ if (!dsi_ctrl)
+ return -ENODEV;
+
+ if (*ppos)
+ return 0;
+
+ buf = kzalloc(SZ_4K, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ /* Dump current state */
+ len += snprintf((buf + len), (SZ_4K - len), "Current State:\n");
+ len += snprintf((buf + len), (SZ_4K - len),
+ "\tPOWER_STATUS = %s\n\tCORE_CLOCK = %s\n",
+ TO_ON_OFF(dsi_ctrl->current_state.pwr_enabled),
+ TO_ON_OFF(dsi_ctrl->current_state.core_clk_enabled));
+ len += snprintf((buf + len), (SZ_4K - len),
+ "\tLINK_CLOCK = %s\n\tULPS_STATUS = %s\n",
+ TO_ON_OFF(dsi_ctrl->current_state.link_clk_enabled),
+ TO_ON_OFF(dsi_ctrl->current_state.ulps_enabled));
+ len += snprintf((buf + len), (SZ_4K - len),
+ "\tCLAMP_STATUS = %s\n\tCTRL_ENGINE = %s\n",
+ TO_ON_OFF(dsi_ctrl->current_state.clamp_enabled),
+ TO_ON_OFF(dsi_ctrl->current_state.controller_state));
+ len += snprintf((buf + len), (SZ_4K - len),
+ "\tVIDEO_ENGINE = %s\n\tCOMMAND_ENGINE = %s\n",
+ TO_ON_OFF(dsi_ctrl->current_state.vid_engine_state),
+ TO_ON_OFF(dsi_ctrl->current_state.cmd_engine_state));
+
+ /* Dump clock information */
+ len += snprintf((buf + len), (SZ_4K - len), "\nClock Info:\n");
+ len += snprintf((buf + len), (SZ_4K - len),
+ "\tBYTE_CLK = %llu, PIXEL_CLK = %llu, ESC_CLK = %llu\n",
+ dsi_ctrl->clk_info.link_clks.byte_clk_rate,
+ dsi_ctrl->clk_info.link_clks.pixel_clk_rate,
+ dsi_ctrl->clk_info.link_clks.esc_clk_rate);
+
+ /* TODO: make sure that this does not exceed 4K */
+ if (copy_to_user(buff, buf, len)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+
+ *ppos += len;
+ kfree(buf);
+ return len;
+}
+
+static ssize_t debugfs_reg_dump_read(struct file *file,
+ char __user *buff,
+ size_t count,
+ loff_t *ppos)
+{
+ struct dsi_ctrl *dsi_ctrl = file->private_data;
+ char *buf;
+ u32 len = 0;
+
+ if (!dsi_ctrl)
+ return -ENODEV;
+
+ if (*ppos)
+ return 0;
+
+ buf = kzalloc(SZ_4K, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ if (dsi_ctrl->current_state.core_clk_enabled) {
+ len = dsi_ctrl->hw.ops.reg_dump_to_buffer(&dsi_ctrl->hw,
+ buf,
+ SZ_4K);
+ } else {
+ len = snprintf((buf + len), (SZ_4K - len),
+ "Core clocks are not turned on, cannot read\n");
+ }
+
+ /* TODO: make sure that this does not exceed 4K */
+ if (copy_to_user(buff, buf, len)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+
+ *ppos += len;
+ kfree(buf);
+ return len;
+}
+
+static const struct file_operations state_info_fops = {
+ .open = simple_open,
+ .read = debugfs_state_info_read,
+};
+
+static const struct file_operations reg_dump_fops = {
+ .open = simple_open,
+ .read = debugfs_reg_dump_read,
+};
+
+static int dsi_ctrl_debugfs_init(struct dsi_ctrl *dsi_ctrl,
+ struct dentry *parent)
+{
+ int rc = 0;
+ struct dentry *dir, *state_file, *reg_dump;
+
+ dir = debugfs_create_dir(dsi_ctrl->name, parent);
+ if (IS_ERR_OR_NULL(dir)) {
+ rc = PTR_ERR(dir);
+ pr_err("[DSI_%d] debugfs create dir failed, rc=%d\n",
+ dsi_ctrl->index, rc);
+ goto error;
+ }
+
+ state_file = debugfs_create_file("state_info",
+ 0444,
+ dir,
+ dsi_ctrl,
+ &state_info_fops);
+ if (IS_ERR_OR_NULL(state_file)) {
+ rc = PTR_ERR(state_file);
+ pr_err("[DSI_%d] state file failed, rc=%d\n",
+ dsi_ctrl->index, rc);
+ goto error_remove_dir;
+ }
+
+ reg_dump = debugfs_create_file("reg_dump",
+ 0444,
+ dir,
+ dsi_ctrl,
+ &reg_dump_fops);
+ if (IS_ERR_OR_NULL(reg_dump)) {
+ rc = PTR_ERR(reg_dump);
+ pr_err("[DSI_%d] reg dump file failed, rc=%d\n",
+ dsi_ctrl->index, rc);
+ goto error_remove_dir;
+ }
+
+ dsi_ctrl->debugfs_root = dir;
+error_remove_dir:
+ debugfs_remove(dir);
+error:
+ return rc;
+}
+
+static int dsi_ctrl_debugfs_deinit(struct dsi_ctrl *dsi_ctrl)
+{
+ debugfs_remove(dsi_ctrl->debugfs_root);
+ return 0;
+}
+
static int dsi_ctrl_check_state(struct dsi_ctrl *dsi_ctrl,
enum dsi_ctrl_driver_ops op,
u32 op_state)
@@ -1351,17 +1509,18 @@ void dsi_ctrl_put(struct dsi_ctrl *dsi_ctrl)
/**
* dsi_ctrl_drv_init() - initialize dsi controller driver.
* @dsi_ctrl: DSI controller handle.
+ * @parent: Parent directory for debug fs.
*
* Initializes DSI controller driver. Driver should be initialized after
* dsi_ctrl_get() succeeds.
*
* Return: error code.
*/
-int dsi_ctrl_drv_init(struct dsi_ctrl *dsi_ctrl)
+int dsi_ctrl_drv_init(struct dsi_ctrl *dsi_ctrl, struct dentry *parent)
{
int rc = 0;
- if (!dsi_ctrl) {
+ if (!dsi_ctrl || !parent) {
pr_err("Invalid params\n");
return -EINVAL;
}
@@ -1384,6 +1543,14 @@ int dsi_ctrl_drv_init(struct dsi_ctrl *dsi_ctrl)
pr_err("Failed to initialize tx buffer, rc=%d\n", rc);
goto error;
}
+
+ rc = dsi_ctrl_debugfs_init(dsi_ctrl, parent);
+ if (rc) {
+ pr_err("[DSI_%d] failed to init debug fs, rc=%d\n",
+ dsi_ctrl->index, rc);
+ goto error;
+ }
+
error:
mutex_unlock(&dsi_ctrl->ctrl_lock);
return rc;
@@ -1407,6 +1574,11 @@ int dsi_ctrl_drv_deinit(struct dsi_ctrl *dsi_ctrl)
}
mutex_lock(&dsi_ctrl->ctrl_lock);
+
+ rc = dsi_ctrl_debugfs_deinit(dsi_ctrl);
+ if (rc)
+ pr_err("failed to release debugfs root, rc=%d\n", rc);
+
rc = dsi_ctrl_buffer_deinit(dsi_ctrl);
if (rc)
pr_err("Failed to free cmd buffers, rc=%d\n", rc);
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.h b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.h
index 407ce517b803..ada98aca0f0d 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.h
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl.h
@@ -15,6 +15,8 @@
#ifndef _DSI_CTRL_H_
#define _DSI_CTRL_H_
+#include <linux/debugfs.h>
+
#include "dsi_defs.h"
#include "dsi_ctrl_hw.h"
#include "dsi_clk_pwr.h"
@@ -251,13 +253,14 @@ void dsi_ctrl_put(struct dsi_ctrl *dsi_ctrl);
/**
* dsi_ctrl_drv_init() - initialize dsi controller driver.
* @dsi_ctrl: DSI controller handle.
+ * @parent: Parent directory for debug fs.
*
* Initializes DSI controller driver. Driver should be initialized after
* dsi_ctrl_get() succeeds.
*
* Return: error code.
*/
-int dsi_ctrl_drv_init(struct dsi_ctrl *dsi_ctrl);
+int dsi_ctrl_drv_init(struct dsi_ctrl *dsi_ctrl, struct dentry *parent);
/**
* dsi_ctrl_drv_deinit() - de-initializes dsi controller driver
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw.h b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw.h
index a33d6d3303ef..b81cdaf4ba02 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw.h
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw.h
@@ -544,6 +544,10 @@ struct dsi_ctrl_hw_ops {
*/
void (*trigger_cmd_test_pattern)(struct dsi_ctrl_hw *ctrl,
u32 stream_id);
+
+ ssize_t (*reg_dump_to_buffer)(struct dsi_ctrl_hw *ctrl,
+ char *buf,
+ u32 size);
};
/*
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw_1_4.c b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw_1_4.c
index 9d819a270894..ca04eedd6af1 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw_1_4.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_ctrl_hw_1_4.c
@@ -1352,3 +1352,161 @@ void dsi_ctrl_hw_14_trigger_cmd_test_pattern(struct dsi_ctrl_hw *ctrl,
pr_debug("[DSI_%d] Cmd Test pattern trigger\n", ctrl->index);
}
+
+#define DUMP_REG_VALUE(off) "\t%-30s: 0x%08x\n", #off, DSI_R32(ctrl, off)
+ssize_t dsi_ctrl_hw_14_reg_dump_to_buffer(struct dsi_ctrl_hw *ctrl,
+ char *buf,
+ u32 size)
+{
+ u32 len = 0;
+
+ len += snprintf((buf + len), (size - len), "CONFIGURATION REGS:\n");
+
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_HW_VERSION));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_FIFO_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_SYNC_DATATYPE));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_PIXEL_DATATYPE));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_BLANKING_DATATYPE));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_DATA_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_H));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_ACTIVE_V));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_TOTAL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_HSYNC));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VIDEO_MODE_VSYNC_VPOS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_DMA_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_DCS_CMD_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DMA_CMD_OFFSET));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DMA_CMD_LENGTH));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DMA_FIFO_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DMA_NULL_PACKET_DATA));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM0_TOTAL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM1_TOTAL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_ACK_ERR_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATA0));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATA1));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATA2));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATA3));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATATYPE0));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATATYPE1));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TRIG_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_EXT_MUX));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_EXT_MUX_TE_PULSE_DETECT_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CMD_MODE_DMA_SW_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CMD_MODE_MDP_SW_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CMD_MODE_BTA_SW_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RESET_SW_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_LANE_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_LANE_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_LANE_SWAP_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DLN0_PHY_ERR));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_LP_TIMER_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_HS_TIMER_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TIMEOUT_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CLKOUT_TIMING_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_EOT_PACKET));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_EOT_PACKET_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_GENERIC_ESC_TX_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_ERR_INT_MASK0));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_INT_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_SOFT_RESET));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CLK_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_CLK_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_PHY_SW_RESET));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_AXI2AHB_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_CTRL2));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_COMMAND_MODE_MDP_STREAM2_TOTAL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VBIF_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_AES_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_RDBK_DATA_CTRL));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TEST_PATTERN_GEN_CMD_DMA_INIT_VAL2));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_STATUS));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_WRITE_TRIGGER));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DSI_TIMING_FLUSH));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_DSI_TIMING_DB_MODE));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_TPG_DMA_FIFO_RESET));
+ len += snprintf((buf + len), (size - len),
+ DUMP_REG_VALUE(DSI_VERSION));
+
+ pr_err("LLENGTH = %d\n", len);
+ return len;
+}
+
+
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
index 1e2226c0e159..87a28dcfcf7d 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
@@ -31,6 +31,103 @@ static LIST_HEAD(dsi_display_list);
static struct dsi_display *main_display;
+static ssize_t debugfs_dump_info_read(struct file *file,
+ char __user *buff,
+ size_t count,
+ loff_t *ppos)
+{
+ struct dsi_display *display = file->private_data;
+ char *buf;
+ u32 len = 0;
+ int i;
+
+ if (!display)
+ return -ENODEV;
+
+ if (*ppos)
+ return 0;
+
+ buf = kzalloc(SZ_4K, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ len += snprintf(buf + len, (SZ_4K - len), "name = %s\n", display->name);
+ len += snprintf(buf + len, (SZ_4K - len),
+ "\tResolution = %dx%d\n",
+ display->config.video_timing.h_active,
+ display->config.video_timing.v_active);
+
+ for (i = 0; i < display->ctrl_count; i++) {
+ len += snprintf(buf + len, (SZ_4K - len),
+ "\tCTRL_%d:\n\t\tctrl = %s\n\t\tphy = %s\n",
+ i, display->ctrl[i].ctrl->name,
+ display->ctrl[i].phy->name);
+ }
+
+ len += snprintf(buf + len, (SZ_4K - len),
+ "\tPanel = %s\n", display->panel->name);
+
+ len += snprintf(buf + len, (SZ_4K - len),
+ "\tClock master = %s\n",
+ display->ctrl[display->clk_master_idx].ctrl->name);
+
+ if (copy_to_user(buff, buf, len)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+
+ *ppos += len;
+
+ kfree(buf);
+ return len;
+}
+
+
+static const struct file_operations dump_info_fops = {
+ .open = simple_open,
+ .read = debugfs_dump_info_read,
+};
+
+static int dsi_display_debugfs_init(struct dsi_display *display)
+{
+ int rc = 0;
+ struct dentry *dir, *dump_file;
+
+ dir = debugfs_create_dir(display->name, NULL);
+ if (IS_ERR_OR_NULL(dir)) {
+ rc = PTR_ERR(dir);
+ pr_err("[%s] debugfs create dir failed, rc = %d\n",
+ display->name, rc);
+ goto error;
+ }
+
+ dump_file = debugfs_create_file("dump_info",
+ 0444,
+ dir,
+ display,
+ &dump_info_fops);
+ if (IS_ERR_OR_NULL(dump_file)) {
+ rc = PTR_ERR(dump_file);
+ pr_err("[%s] debugfs create file failed, rc=%d\n",
+ display->name, rc);
+ goto error_remove_dir;
+ }
+
+ display->root = dir;
+ return rc;
+error_remove_dir:
+ debugfs_remove(dir);
+error:
+ return rc;
+}
+
+static int dsi_dipslay_debugfs_deinit(struct dsi_display *display)
+{
+ debugfs_remove(display->root);
+
+ return 0;
+}
+
static int dsi_display_ctrl_power_on(struct dsi_display *display)
{
int rc = 0;
@@ -1356,10 +1453,16 @@ int dsi_display_bind(struct dsi_display *display, struct drm_device *dev)
mutex_lock(&display->display_lock);
+ rc = dsi_display_debugfs_init(display);
+ if (rc) {
+ pr_err("[%s]Debugfs init failed, rc=%d\n", display->name, rc);
+ goto error;
+ }
+
for (i = 0; i < display->ctrl_count; i++) {
display_ctrl = &display->ctrl[i];
- rc = dsi_ctrl_drv_init(display_ctrl->ctrl);
+ rc = dsi_ctrl_drv_init(display_ctrl->ctrl, display->root);
if (rc) {
pr_err("[%s] Failed to initialize ctrl[%d], rc=%d\n",
display->name, i, rc);
@@ -1409,6 +1512,7 @@ error_ctrl_deinit:
(void)dsi_phy_drv_deinit(display_ctrl->phy);
(void)dsi_ctrl_drv_deinit(display_ctrl->ctrl);
}
+ (void)dsi_dipslay_debugfs_deinit(display);
error:
mutex_unlock(&display->display_lock);
return rc;
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.h b/drivers/gpu/drm/msm/dsi-staging/dsi_display.h
index 1897ce3e1bbc..976baf6b8553 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.h
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.h
@@ -17,6 +17,7 @@
#include <linux/types.h>
#include <linux/bitops.h>
+#include <linux/debugfs.h>
#include <linux/of_device.h>
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
@@ -179,6 +180,9 @@ struct dsi_display {
struct dsi_connector *connector;
struct dsi_bridge *bridge;
u32 cmd_engine_refcount;
+
+ /* DEBUG FS */
+ struct dentry *root;
};
int dsi_display_dev_probe(struct platform_device *pdev);