diff options
| author | Dhaval Patel <pdhaval@codeaurora.org> | 2016-08-31 16:39:24 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-31 16:39:24 -0700 |
| commit | abb85b87044166cd71cd743bee2029b119e70d9b (patch) | |
| tree | 720f8cd724a1bb2cd540ea2caeb26b0880d70bbc | |
| parent | cb13ee03c2bff36200d3bf4232d0539624fbc272 (diff) | |
| parent | f6ae7b854ea598927e153611b635f9cb9128828a (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.c | 88 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_connector.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_connector.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_crtc.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_kms.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/sde/sde_plane.c | 45 |
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); |
