drm/msm/sde: use msm_display_info for display information
Replace dsi_display_info and display_info structures with
a common msm_display_info structure to reduce unnecessary
structure layering and translation.
Change-Id: Ia097a5d64fa35472ea715ac99e14f496553d4b44
Signed-off-by: Clarence Ip <cip@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/display-manager/display_manager.c b/drivers/gpu/drm/msm/display-manager/display_manager.c
index 236550a..17cc224 100644
--- a/drivers/gpu/drm/msm/display-manager/display_manager.c
+++ b/drivers/gpu/drm/msm/display-manager/display_manager.c
@@ -310,12 +310,10 @@
int display_manager_get_info_by_index(struct display_manager *disp_m,
u32 display_index,
- struct display_info *info)
+ struct msm_display_info *info)
{
- int rc = 0;
- int i, j;
struct dsi_display *display;
- struct dsi_display_info dsi_info;
+ int i, rc = 0;
if (!disp_m || !info) {
pr_err("Invalid params\n");
@@ -331,38 +329,15 @@
if (!display || !dsi_display_is_active(display))
continue;
- memset(&dsi_info, 0x0, sizeof(dsi_info));
- rc = dsi_display_get_info(display, &dsi_info);
+ memset(info, 0x0, sizeof(*info));
+ rc = dsi_display_get_info(info, display);
if (rc) {
- pr_err("failed to get display info, rc=%d\n", rc);
- goto error;
- }
-
- info->intf = DISPLAY_INTF_DSI;
- info->num_of_h_tiles = dsi_info.num_of_h_tiles;
-
- for (j = 0; j < info->num_of_h_tiles; j++)
- info->h_tile_instance[j] = dsi_info.h_tile_ids[j];
-
- info->is_hot_pluggable = dsi_info.is_hot_pluggable;
- info->is_connected = dsi_info.is_connected;
- info->is_edid_supported = dsi_info.is_edid_supported;
- info->max_width = 1920; /* TODO: */
- info->max_height = 1080; /* TODO: */
- info->compression = DISPLAY_COMPRESSION_NONE;
- if (dsi_info.op_mode == DSI_OP_VIDEO_MODE) {
- info->intf_mode |= DISPLAY_INTF_MODE_VID;
- } else if (dsi_info.op_mode == DSI_OP_CMD_MODE) {
- info->intf_mode |= DISPLAY_INTF_MODE_CMD;
- } else {
- pr_err("unknwown dsi op_mode %d\n", dsi_info.op_mode);
+ pr_err("failed to get dsi info, rc=%d\n", rc);
rc = -EINVAL;
- goto error;
}
break;
}
-error:
mutex_unlock(&disp_m->lock);
return rc;
}
diff --git a/drivers/gpu/drm/msm/display-manager/display_manager.h b/drivers/gpu/drm/msm/display-manager/display_manager.h
index 7e44573..68659db 100644
--- a/drivers/gpu/drm/msm/display-manager/display_manager.h
+++ b/drivers/gpu/drm/msm/display-manager/display_manager.h
@@ -15,77 +15,6 @@
#ifndef _DISPLAY_MANAGER_H_
#define _DISPLAY_MANAGER_H_
-#define MAX_H_TILES_PER_DISPLAY 2
-
-/**
- * enum display_interface_type - enumerates display interface types
- * @DISPLAY_INTF_DSI: DSI interface
- * @DISPLAY_INTF_HDMI: HDMI interface
- * @DISPLAY_INTF_DP: Display Port interface
- */
-enum display_interface_type {
- DISPLAY_INTF_DSI = 0,
- DISPLAY_INTF_HDMI,
- DISPLAY_INTF_DP,
- DISPLAY_INTF_MAX,
-};
-
-/**
- * enum display_compression_type - compression method used for pixel stream
- * @DISPLAY_COMPRESISON_NONE: Pixel data is not compressed.
- * @DISPLAY_COMPRESSION_DSC: DSC compresison is used.
- * @DISPLAY_COMPRESSION_FBC: FBC compression is used.
- */
-enum display_compression_type {
- DISPLAY_COMPRESSION_NONE = 0,
- DISPLAY_COMPRESSION_DSC,
- DISPLAY_COMPRESSION_FBC,
- DISPLAY_COMPRESISON_MAX
-};
-
-/**
- * enum display_interface_mode - interface modes supported by the display
- * @DISPLAY_INTF_MODE_VID: Display supports video or "active" mode
- * @DISPLAY_INTF_MODE_CMD: Display supports command mode
- */
-enum display_interface_mode {
- DISPLAY_INTF_MODE_VID = BIT(0),
- DISPLAY_INTF_MODE_CMD = BIT(1),
-};
-
-/**
- * struct display_info - defines display properties
- * @intf: The interface on which display is connected to SOC.
- * @num_of_h_tiles: number of horizontal tiles in case of split interface.
- * @h_tile_instance: controller instance used per tile. Number of elements is
- * based on num_of_h_tiles.
- * @is_hot_pluggable: Set to true if hot plug detection is supported.
- * @is_connected: Set to true if display is connected.
- * @is_edid_supported: True if display supports EDID.
- * @max_width: Max width of display. In case of hot pluggable display,
- * this is max width supported by controller.
- * @max_height: Max height of display. In case of hot pluggable display,
- * this is max height supported by controller.
- * @compression: Compression supported by the display.
- * @intf_mode: Bitmask of interface modes supported by the display
- */
-struct display_info {
- enum display_interface_type intf;
-
- u32 num_of_h_tiles;
- u32 h_tile_instance[MAX_H_TILES_PER_DISPLAY];
-
- bool is_hot_pluggable;
- bool is_connected;
- bool is_edid_supported;
-
- u32 max_width;
- u32 max_height;
-
- enum display_compression_type compression;
- enum display_interface_mode intf_mode;
-};
-
struct display_manager {
struct drm_device *drm_dev;
struct platform_device *pdev;
@@ -120,7 +49,7 @@
*/
int display_manager_get_info_by_index(struct display_manager *disp_m,
u32 display_index,
- struct display_info *info);
+ struct msm_display_info *info);
/**
* display_manager_drm_init_by_index() - initialize drm objects for display
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
index a531c7f..2475e20 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
@@ -1956,17 +1956,17 @@
return rc;
}
-int dsi_display_get_info(struct dsi_display *display,
- struct dsi_display_info *info)
+int dsi_display_get_info(struct msm_display_info *info, void *disp)
{
- int rc = 0;
- int i;
+ struct dsi_display *display;
struct dsi_panel_phy_props phy_props;
+ int i, rc;
- if (!display || !info) {
- pr_err("Invalid params\n");
+ if (!info || !disp) {
+ pr_err("invalid params\n");
return -EINVAL;
}
+ display = disp;
mutex_lock(&display->display_lock);
rc = dsi_panel_get_phy_props(display->panel, &phy_props);
@@ -1976,21 +1976,31 @@
goto error;
}
- info->type = display->type;
+ info->intf_type = DRM_MODE_CONNECTOR_DSI;
- /* TODO: do not access dsi_ctrl structure */
info->num_of_h_tiles = display->ctrl_count;
for (i = 0; i < info->num_of_h_tiles; i++)
- info->h_tile_ids[i] = display->ctrl[i].ctrl->index;
+ info->h_tile_instance[i] = display->ctrl[i].ctrl->index;
- info->is_hot_pluggable = false;
- info->is_edid_supported = false;
-
+ info->is_connected = true;
info->width_mm = phy_props.panel_width_mm;
info->height_mm = phy_props.panel_height_mm;
+ info->max_width = 1920;
+ info->max_height = 1080;
+ info->compression = MSM_DISPLAY_COMPRESS_NONE;
- info->op_mode = display->panel->mode.panel_mode;
-
+ switch (display->panel->mode.panel_mode) {
+ case DSI_OP_VIDEO_MODE:
+ info->capabilities |= MSM_DISPLAY_CAP_VID_MODE;
+ break;
+ case DSI_OP_CMD_MODE:
+ info->capabilities |= MSM_DISPLAY_CAP_CMD_MODE;
+ break;
+ default:
+ pr_err("unknwown dsi panel mode %d\n",
+ display->panel->mode.panel_mode);
+ break;
+ }
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 88f396f..1731e9d 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.h
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.h
@@ -22,6 +22,7 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
+#include "msm_drv.h"
#include "dsi_defs.h"
#include "dsi_ctrl.h"
#include "dsi_phy.h"
@@ -54,42 +55,6 @@
};
/**
- * struct dsi_display_info - defines dsi display properties
- * @type: Type of panel connected to DSI interface.
- * @num_of_h_tiles: In case of split panels, number of h tiles indicates the
- * number of dsi interfaces used. For single DSI panels this
- * is set to 1. This will be set for horizontally split
- * panels.
- * @h_tile_ids: The DSI instance ID for each tile.
- * @is_hot_pluggable: Can panel be hot plugged.
- * @is_connected: Is panel connected.
- * @is_edid_supported: Does panel support reading EDID information.
- * @width_mm: Physical width of panel in millimeters.
- * @height_mm: Physical height of panel in millimeters.
- * @dsi_op_mode: dsi operation mode, video or cmd mode
- */
-struct dsi_display_info {
- enum dsi_display_type type;
-
- /* Split DSI properties */
- bool h_tiled;
- u32 num_of_h_tiles;
- u32 h_tile_ids[MAX_DSI_CTRLS_PER_DISPLAY];
-
- /* HPD */
- bool is_hot_pluggable;
- bool is_connected;
- bool is_edid_supported;
-
- /* Physical properties */
- u32 width_mm;
- u32 height_mm;
-
- /* Operation properties */
- enum dsi_op_mode op_mode;
-};
-
-/**
* struct dsi_display_ctrl - dsi ctrl/phy information for the display
* @ctrl: Handle to the DSI controller device.
* @ctrl_of_node: pHandle to the DSI controller device.
@@ -301,13 +266,12 @@
/**
* dsi_display_get_info() - returns the display properties
- * @display: Handle to the display.
* @info: Pointer to the structure where info is stored.
+ * @disp: Handle to the display.
*
* Return: error code.
*/
-int dsi_display_get_info(struct dsi_display *display,
- struct dsi_display_info *info);
+int dsi_display_get_info(struct msm_display_info *info, void *disp);
/**
* dsi_display_get_modes() - get modes supported by display
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
index 7ffcfa7..e41dd41a 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c
@@ -282,28 +282,28 @@
void *display)
{
enum drm_connector_status status = connector_status_unknown;
- struct dsi_display_info dsi_info;
+ struct msm_display_info info;
int rc;
if (!conn || !display)
return status;
/* get display dsi_info */
- memset(&dsi_info, 0x0, sizeof(dsi_info));
- rc = dsi_display_get_info(display, &dsi_info);
+ memset(&info, 0x0, sizeof(info));
+ rc = dsi_display_get_info(&info, display);
if (rc) {
- pr_err("failed to get display dsi_info, rc=%d\n", rc);
+ pr_err("failed to get display info, rc=%d\n", rc);
return connector_status_disconnected;
}
- if (dsi_info.is_hot_pluggable)
- status = (dsi_info.is_connected ? connector_status_connected :
+ if (info.capabilities & MSM_DISPLAY_CAP_HOT_PLUG)
+ status = (info.is_connected ? connector_status_connected :
connector_status_disconnected);
else
status = connector_status_connected;
- conn->display_info.width_mm = dsi_info.width_mm;
- conn->display_info.height_mm = dsi_info.height_mm;
+ conn->display_info.width_mm = info.width_mm;
+ conn->display_info.height_mm = info.height_mm;
return status;
}
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 8dca108..5188df8 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -129,6 +129,68 @@
spinlock_t lock;
};
+#define MAX_H_TILES_PER_DISPLAY 2
+
+/**
+ * enum msm_display_compression - compression method used for pixel stream
+ * @MSM_DISPLAY_COMPRESS_NONE: Pixel data is not compressed
+ * @MSM_DISPLAY_COMPRESS_DSC: DSC compresison is used
+ * @MSM_DISPLAY_COMPRESS_FBC: FBC compression is used
+ */
+enum msm_display_compression {
+ MSM_DISPLAY_COMPRESS_NONE,
+ MSM_DISPLAY_COMPRESS_DSC,
+ MSM_DISPLAY_COMPRESS_FBC,
+};
+
+/**
+ * enum msm_display_caps - features/capabilities supported by displays
+ * @MSM_DISPLAY_CAP_VID_MODE: Video or "active" mode supported
+ * @MSM_DISPLAY_CAP_CMD_MODE: Command mode supported
+ * @MSM_DISPLAY_CAP_HOT_PLUG: Hot plug detection supported
+ * @MSM_DISPLAY_CAP_EDID: EDID supported
+ */
+enum msm_display_caps {
+ MSM_DISPLAY_CAP_VID_MODE = BIT(0),
+ MSM_DISPLAY_CAP_CMD_MODE = BIT(1),
+ MSM_DISPLAY_CAP_HOT_PLUG = BIT(2),
+ MSM_DISPLAY_CAP_EDID = BIT(3),
+};
+
+/**
+ * struct msm_display_info - defines display properties
+ * @intf_type: DRM_MODE_CONNECTOR_ display type
+ * @capabilities: Bitmask of display flags
+ * @num_of_h_tiles: Number of horizontal tiles in case of split interface
+ * @h_tile_instance: Controller instance used per tile. Number of elements is
+ * based on num_of_h_tiles
+ * @is_connected: Set to true if display is connected
+ * @width_mm: Physical width
+ * @height_mm: Physical height
+ * @max_width: Max width of display. In case of hot pluggable display
+ * this is max width supported by controller
+ * @max_height: Max height of display. In case of hot pluggable display
+ * this is max height supported by controller
+ * @compression: Compression supported by the display
+ */
+struct msm_display_info {
+ int intf_type;
+ uint32_t capabilities;
+
+ uint32_t num_of_h_tiles;
+ uint32_t h_tile_instance[MAX_H_TILES_PER_DISPLAY];
+
+ bool is_connected;
+
+ unsigned int width_mm;
+ unsigned int height_mm;
+
+ uint32_t max_width;
+ uint32_t max_height;
+
+ enum msm_display_compression compression;
+};
+
struct display_manager;
struct msm_drm_private {
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c
index 53a0016..159be1c 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.c
@@ -508,7 +508,7 @@
}
static int sde_encoder_virt_add_phys_encs(
- enum display_interface_mode intf_mode,
+ u32 display_caps,
struct sde_encoder_virt *sde_enc,
struct sde_kms *sde_kms,
enum sde_intf intf_idx,
@@ -535,7 +535,7 @@
return -EINVAL;
}
- if (intf_mode & DISPLAY_INTF_MODE_VID) {
+ if (display_caps & MSM_DISPLAY_CAP_VID_MODE) {
enc = sde_encoder_phys_vid_init(sde_kms, intf_idx, ctl_idx,
split_role, &sde_enc->base, parent_ops);
@@ -549,7 +549,7 @@
++sde_enc->num_phys_encs;
}
- if (intf_mode & DISPLAY_INTF_MODE_CMD) {
+ if (display_caps & MSM_DISPLAY_CAP_CMD_MODE) {
enc = sde_encoder_phys_cmd_init(sde_kms, intf_idx, pp_idx,
ctl_idx, split_role, &sde_enc->base,
parent_ops);
@@ -569,7 +569,7 @@
static int sde_encoder_setup_display(struct sde_encoder_virt *sde_enc,
struct sde_kms *sde_kms,
- struct display_info *disp_info,
+ struct msm_display_info *disp_info,
int *drm_enc_mode)
{
int ret = 0;
@@ -578,10 +578,10 @@
DBG("");
- if (disp_info->intf == DISPLAY_INTF_DSI) {
+ if (disp_info->intf_type == DRM_MODE_CONNECTOR_DSI) {
*drm_enc_mode = DRM_MODE_ENCODER_DSI;
intf_type = INTF_DSI;
- } else if (disp_info->intf == DISPLAY_INTF_HDMI) {
+ } else if (disp_info->intf_type == DRM_MODE_CONNECTOR_HDMIA) {
*drm_enc_mode = DRM_MODE_ENCODER_TMDS;
intf_type = INTF_HDMI;
} else {
@@ -633,7 +633,7 @@
if (!ret) {
ret = sde_encoder_virt_add_phys_encs(
- disp_info->intf_mode,
+ disp_info->capabilities,
sde_enc, sde_kms, intf_idx, pp_idx,
ctl_idx, split_role);
if (ret)
@@ -646,7 +646,7 @@
}
static struct drm_encoder *sde_encoder_virt_init(
- struct drm_device *dev, struct display_info *disp_info)
+ struct drm_device *dev, struct msm_display_info *disp_info)
{
struct msm_drm_private *priv = dev->dev_private;
struct sde_kms *sde_kms = to_sde_kms(priv->kms);
@@ -750,7 +750,7 @@
}
for (i = 0; i < num_displays; i++) {
- struct display_info info = { 0 };
+ struct msm_display_info info = { 0 };
struct drm_encoder *enc = NULL;
u32 ret = 0;