summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDhaval Patel <pdhaval@codeaurora.org>2016-08-31 16:39:24 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-31 16:39:24 -0700
commitabb85b87044166cd71cd743bee2029b119e70d9b (patch)
tree720f8cd724a1bb2cd540ea2caeb26b0880d70bbc
parentcb13ee03c2bff36200d3bf4232d0539624fbc272 (diff)
parentf6ae7b854ea598927e153611b635f9cb9128828a (diff)
Merge "drm/msm: update plane, crtc and connector caps blob prop" into dev/msm-4.4-drm_kms
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_drm.c88
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h2
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.c14
-rw-r--r--drivers/gpu/drm/msm/sde/sde_connector.h4
-rw-r--r--drivers/gpu/drm/msm/sde/sde_crtc.c19
-rw-r--r--drivers/gpu/drm/msm/sde/sde_kms.c7
-rw-r--r--drivers/gpu/drm/msm/sde/sde_plane.c45
7 files changed, 137 insertions, 42 deletions
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
index e41dd41ade41..bf50ebba1580 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
@@ -269,11 +269,91 @@ int dsi_conn_post_init(struct drm_connector *connector,
void *info,
void *display)
{
- if (info)
- sde_kms_info_add_keystr(info,
- "DISPLAY_TYPE",
- ((struct dsi_display *)display)->display_type);
+ struct dsi_display *dsi_display = display;
+ struct dsi_panel *panel;
+ if (!info || !dsi_display)
+ return -EINVAL;
+
+ sde_kms_info_add_keystr(info,
+ "display type", dsi_display->display_type);
+
+ switch (dsi_display->type) {
+ case DSI_DISPLAY_SINGLE:
+ sde_kms_info_add_keystr(info, "display config",
+ "single display");
+ break;
+ case DSI_DISPLAY_EXT_BRIDGE:
+ sde_kms_info_add_keystr(info, "display config", "ext bridge");
+ break;
+ case DSI_DISPLAY_SPLIT:
+ sde_kms_info_add_keystr(info, "display config",
+ "split display");
+ break;
+ case DSI_DISPLAY_SPLIT_EXT_BRIDGE:
+ sde_kms_info_add_keystr(info, "display config",
+ "split ext bridge");
+ break;
+ default:
+ pr_debug("invalid display type:%d\n", dsi_display->type);
+ break;
+ }
+
+ if (!dsi_display->panel) {
+ pr_debug("invalid panel data\n");
+ goto end;
+ }
+
+ panel = dsi_display->panel;
+ sde_kms_info_add_keystr(info, "panel name", panel->name);
+
+ switch (panel->mode.panel_mode) {
+ case DSI_OP_VIDEO_MODE:
+ sde_kms_info_add_keystr(info, "panel mode", "video");
+ break;
+ case DSI_OP_CMD_MODE:
+ sde_kms_info_add_keystr(info, "panel mode", "command");
+ break;
+ default:
+ pr_debug("invalid panel type:%d\n", panel->mode.panel_mode);
+ break;
+ }
+ sde_kms_info_add_keystr(info, "dfps support",
+ panel->dfps_caps.dfps_support ? "true" : "false");
+
+ switch (panel->phy_props.rotation) {
+ case DSI_PANEL_ROTATE_NONE:
+ sde_kms_info_add_keystr(info, "panel orientation", "none");
+ break;
+ case DSI_PANEL_ROTATE_H_FLIP:
+ sde_kms_info_add_keystr(info, "panel orientation", "horz flip");
+ break;
+ case DSI_PANEL_ROTATE_V_FLIP:
+ sde_kms_info_add_keystr(info, "panel orientation", "vert flip");
+ break;
+ default:
+ pr_debug("invalid panel rotation:%d\n",
+ panel->phy_props.rotation);
+ break;
+ }
+
+ switch (panel->bl_config.type) {
+ case DSI_BACKLIGHT_PWM:
+ sde_kms_info_add_keystr(info, "backlight type", "pwm");
+ break;
+ case DSI_BACKLIGHT_WLED:
+ sde_kms_info_add_keystr(info, "backlight type", "wled");
+ break;
+ case DSI_BACKLIGHT_DCS:
+ sde_kms_info_add_keystr(info, "backlight type", "dcs");
+ break;
+ default:
+ pr_debug("invalid panel backlight type:%d\n",
+ panel->bl_config.type);
+ break;
+ }
+
+end:
return 0;
}
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index d72fe9a10f04..6873beaa6f87 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -76,7 +76,7 @@ enum msm_mdp_plane_property {
/* blob properties, always put these first */
PLANE_PROP_SCALER,
PLANE_PROP_CSC,
- PLANE_PROP_SDE_INFO,
+ PLANE_PROP_INFO,
/* # of blob properties */
PLANE_PROP_BLOBCOUNT,
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.c b/drivers/gpu/drm/msm/sde/sde_connector.c
index f123778ad4aa..c9e55337e1b8 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.c
+++ b/drivers/gpu/drm/msm/sde/sde_connector.c
@@ -64,8 +64,8 @@ static void sde_connector_destroy(struct drm_connector *connector)
c_conn = to_sde_connector(connector);
- if (c_conn->blob_sde_info)
- drm_property_unreference_blob(c_conn->blob_sde_info);
+ if (c_conn->blob_caps)
+ drm_property_unreference_blob(c_conn->blob_caps);
msm_property_destroy(&c_conn->property_info);
drm_connector_unregister(connector);
@@ -560,12 +560,12 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
}
msm_property_install_blob(&c_conn->property_info,
- "sde_info",
+ "capabilities",
DRM_MODE_PROP_IMMUTABLE,
CONNECTOR_PROP_SDE_INFO);
msm_property_set_blob(&c_conn->property_info,
- &c_conn->blob_sde_info,
+ &c_conn->blob_caps,
SDE_KMS_INFO_DATA(info),
SDE_KMS_INFO_DATALEN(info),
CONNECTOR_PROP_SDE_INFO);
@@ -573,7 +573,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
}
msm_property_install_range(&c_conn->property_info, "RETIRE_FENCE",
- 0x0, 0, ~0, ~0, CONNECTOR_PROP_RETIRE_FENCE);
+ 0x0, 0, INR_OPEN_MAX, 0, CONNECTOR_PROP_RETIRE_FENCE);
/* enum/bitmask properties */
msm_property_install_enum(&c_conn->property_info, "topology_name",
@@ -599,8 +599,8 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
return &c_conn->base;
error_destroy_property:
- if (c_conn->blob_sde_info)
- drm_property_unreference_blob(c_conn->blob_sde_info);
+ if (c_conn->blob_caps)
+ drm_property_unreference_blob(c_conn->blob_caps);
msm_property_destroy(&c_conn->property_info);
error_unregister_conn:
drm_connector_unregister(&c_conn->base);
diff --git a/drivers/gpu/drm/msm/sde/sde_connector.h b/drivers/gpu/drm/msm/sde/sde_connector.h
index 7a8349f2f5ed..f47d3b01de29 100644
--- a/drivers/gpu/drm/msm/sde/sde_connector.h
+++ b/drivers/gpu/drm/msm/sde/sde_connector.h
@@ -127,7 +127,7 @@ struct sde_connector_ops {
* @ops: Local callback function pointer table
* @property_info: Private structure for generic property handling
* @property_data: Array of private data for generic property handling
- * @blob_sde_info: Pointer to blob structure for 'sde_info' property
+ * @blob_caps: Pointer to blob structure for 'capabilities' property
*/
struct sde_connector {
struct drm_connector base;
@@ -147,7 +147,7 @@ struct sde_connector {
struct msm_property_info property_info;
struct msm_property_data property_data[CONNECTOR_PROP_COUNT];
- struct drm_property_blob *blob_sde_info;
+ struct drm_property_blob *blob_caps;
};
/**
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c
index 395a37182df3..5d05b9adc0fd 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.c
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.c
@@ -35,6 +35,13 @@
/* default input fence timeout, in ms */
#define SDE_CRTC_INPUT_FENCE_TIMEOUT 2000
+/*
+ * The default input fence timeout is 2 seconds while max allowed
+ * range is 10 seconds. Any value above 10 seconds adds glitches beyond
+ * tolerance limit.
+ */
+#define SDE_CRTC_MAX_INPUT_FENCE_TIMEOUT 10000
+
static struct sde_kms *get_kms(struct drm_crtc *crtc)
{
struct msm_drm_private *priv = crtc->dev->dev_private;
@@ -988,13 +995,11 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc)
/* range properties */
msm_property_install_range(&sde_crtc->property_info,
- "input_fence_timeout",
- 0x0, 0, ~0, SDE_CRTC_INPUT_FENCE_TIMEOUT,
- CRTC_PROP_INPUT_FENCE_TIMEOUT);
- msm_property_install_range(&sde_crtc->property_info,
- "output_fence",
- 0x0, 0, ~0, ~0,
- CRTC_PROP_OUTPUT_FENCE);
+ "input_fence_timeout", 0x0, 0, SDE_CRTC_MAX_INPUT_FENCE_TIMEOUT,
+ SDE_CRTC_INPUT_FENCE_TIMEOUT, CRTC_PROP_INPUT_FENCE_TIMEOUT);
+
+ msm_property_install_range(&sde_crtc->property_info, "output_fence",
+ 0x0, 0, INR_OPEN_MAX, 0x0, CRTC_PROP_OUTPUT_FENCE);
}
/**
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.c b/drivers/gpu/drm/msm/sde/sde_kms.c
index 800a5cb2e723..60373390f87e 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.c
+++ b/drivers/gpu/drm/msm/sde/sde_kms.c
@@ -707,11 +707,10 @@ struct msm_kms *sde_kms_init(struct drm_device *dev)
dev->mode_config.min_height = 0;
/*
- * we can assume the max crtc width is equal to the max supported
- * by LM_0
- * Also fixing the max height to 4k
+ * max crtc width is equal to the max mixer width * 2 and max height is
+ * is 4K
*/
- dev->mode_config.max_width = catalog->mixer[0].sblk->maxwidth;
+ dev->mode_config.max_width = catalog->mixer[0].sblk->maxwidth * 2;
dev->mode_config.max_height = 4096;
/*
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index 904ae0d7f705..53c7699b13d6 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -62,7 +62,7 @@ struct sde_plane {
struct msm_property_info property_info;
struct msm_property_data property_data[PLANE_PROP_COUNT];
- struct drm_property_blob *blob_sde_info;
+ struct drm_property_blob *blob_info;
/* debugfs related stuff */
struct dentry *debugfs_root;
@@ -1114,7 +1114,7 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
{SDE_DRM_DEINTERLACE, "deinterlace"}
};
const struct sde_format_extended *format_list;
- static struct sde_kms_info sde_info;
+ struct sde_kms_info *info;
struct sde_plane *psde = to_sde_plane(plane);
if (!plane || !psde || !psde->pipe_hw || !psde->pipe_sblk) {
@@ -1130,7 +1130,7 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
/* linux default file descriptor range on each process */
msm_property_install_range(&psde->property_info, "input_fence",
- 0x0, 0, 1024, 0, PLANE_PROP_INPUT_FENCE);
+ 0x0, 0, INR_OPEN_MAX, 0, PLANE_PROP_INPUT_FENCE);
/* standard properties */
msm_property_install_rotation(&psde->property_info,
@@ -1154,15 +1154,16 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
msm_property_install_blob(&psde->property_info, "csc", 0,
PLANE_PROP_CSC);
+ info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL);
+ if (!info)
+ return;
+
+ msm_property_install_blob(&psde->property_info, "capabilities",
+ DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO);
+ sde_kms_info_reset(info);
+
format_list = psde->pipe_sblk->format_list;
if (format_list) {
- /* it is called during probe - single threaded */
- struct sde_kms_info *info = &sde_info;
-
- msm_property_install_blob(&psde->property_info, "sde_info",
- DRM_MODE_PROP_IMMUTABLE,
- PLANE_PROP_SDE_INFO);
- sde_kms_info_reset(info);
sde_kms_info_start(info, "pixel_formats");
while (format_list->fourcc_format) {
sde_kms_info_append_format(info,
@@ -1171,12 +1172,22 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
++format_list;
}
sde_kms_info_stop(info);
- msm_property_set_blob(&psde->property_info,
- &psde->blob_sde_info,
- SDE_KMS_INFO_DATA(info),
- SDE_KMS_INFO_DATALEN(info),
- PLANE_PROP_SDE_INFO);
}
+
+ sde_kms_info_add_keyint(info, "max_linewidth",
+ psde->pipe_sblk->maxlinewidth);
+ sde_kms_info_add_keyint(info, "max_upscale",
+ psde->pipe_sblk->maxupscale);
+ sde_kms_info_add_keyint(info, "max_downscale",
+ psde->pipe_sblk->maxdwnscale);
+ sde_kms_info_add_keyint(info, "max_horizontal_deci",
+ psde->pipe_sblk->maxhdeciexp);
+ sde_kms_info_add_keyint(info, "max_vertical_deci",
+ psde->pipe_sblk->maxvdeciexp);
+ msm_property_set_blob(&psde->property_info, &psde->blob_info,
+ info->data, info->len, PLANE_PROP_INFO);
+
+ kfree(info);
}
static int sde_plane_atomic_set_property(struct drm_plane *plane,
@@ -1255,8 +1266,8 @@ static void sde_plane_destroy(struct drm_plane *plane)
debugfs_remove_recursive(psde->debugfs_root);
- if (psde->blob_sde_info)
- drm_property_unreference_blob(psde->blob_sde_info);
+ if (psde->blob_info)
+ drm_property_unreference_blob(psde->blob_info);
msm_property_destroy(&psde->property_info);
mutex_destroy(&psde->lock);