summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGowtham Tammana <g-tammana@ti.com>2017-01-23 15:45:35 -0600
committerGowtham Tammana <g-tammana@ti.com>2017-01-25 16:29:18 -0600
commitb81b98dfba61af220be84f3803d5c999d765c8d6 (patch)
treebbd714b3e183f9eb4fd8a2d8d05ddac9970ae867
parent13fe0514d30acf99cc11480175264445d8e0d7ea (diff)
downloaddra7xx-b81b98dfba61af220be84f3803d5c999d765c8d6.tar.gz
hwc: Assign display type via system properties
The following system properties are used to configure the setting of primary and external displays. - ro.hwc.primary.conn - ro.hwc.external.conn They define the type of connector to be used for primary and external configuration and they take on string values as defined by DRM interface. By default primary is set "Unknown" (DRM_CONNECTOR_TYPE_Unknown) and external is set to "HDMI" (DRM_CONNECTOR_TYPE_HDMIA). Change-Id: Ieda3dd39915cf9aa7780dc7439944c4b31e9015d Signed-off-by: Gowtham Tammana <g-tammana@ti.com>
-rw-r--r--hwcomposer/display.c98
1 files changed, 91 insertions, 7 deletions
diff --git a/hwcomposer/display.c b/hwcomposer/display.c
index 58d6f61..31257ae 100644
--- a/hwcomposer/display.c
+++ b/hwcomposer/display.c
@@ -621,6 +621,72 @@ static void vblank_handler(int fd, unsigned int frame, unsigned int sec,
}
}
+#define CONNECTOR_TYPE_STR(type) { DRM_MODE_CONNECTOR_ ## type, #type }
+
+struct drm_connector_type {
+ int type;
+ char name[64];
+};
+
+static const struct drm_connector_type connector_type_list[] = {
+ CONNECTOR_TYPE_STR(Unknown),
+ CONNECTOR_TYPE_STR(VGA),
+ CONNECTOR_TYPE_STR(DVII),
+ CONNECTOR_TYPE_STR(DVID),
+ CONNECTOR_TYPE_STR(DVIA),
+ CONNECTOR_TYPE_STR(Composite),
+ CONNECTOR_TYPE_STR(SVIDEO),
+ CONNECTOR_TYPE_STR(LVDS),
+ CONNECTOR_TYPE_STR(Component),
+ CONNECTOR_TYPE_STR(9PinDIN),
+ CONNECTOR_TYPE_STR(DisplayPort),
+ CONNECTOR_TYPE_STR(HDMIA),
+ CONNECTOR_TYPE_STR(HDMIB),
+ CONNECTOR_TYPE_STR(TV),
+ CONNECTOR_TYPE_STR(eDP),
+ CONNECTOR_TYPE_STR(VIRTUAL),
+ CONNECTOR_TYPE_STR(DSI)
+};
+
+/* The connectors for primary and external displays can be controlled
+ * by the below system properties
+ * - ro.hwc.primary.conn
+ * - ro.hwc.external.conn
+ * If these are not set (default), `DRM_CONNECTOR_TYPE_Unknown` will be
+ * considered as primary display connector, and `DRM_CONNECTOR_TYPE_HDMIA`
+ * will be considered as secondary display.
+ *
+ * The values are <string> constants, with acceptable values being as defined
+ * by the DRM interface `DRM_CONNECTOR_TYPE_<string>`.
+ */
+static int display_get_connector_type(int disp)
+{
+ int type = -1;
+ uint32_t i = 0;
+ char prop_val[PROPERTY_VALUE_MAX];
+
+ if (disp) {
+ property_get("ro.hwc.external.conn", prop_val, "HDMI");
+ } else {
+ property_get("ro.hwc.primary.conn", prop_val, "");
+ }
+
+ /* If nothing is set, primary is `Unknown` and external is `HDMIA`
+ * connector.
+ */
+ if (prop_val[0] == '\0')
+ return DRM_MODE_CONNECTOR_Unknown;
+ if (!strncasecmp(prop_val, "HDMI", 64))
+ return DRM_MODE_CONNECTOR_HDMIA;
+
+ for (i = 0; i < ARRAY_SIZE(connector_type_list); i++) {
+ if (!strncasecmp(prop_val, connector_type_list[i].name, 64))
+ return connector_type_list[i].type;
+ }
+
+ return type;
+}
+
int init_primary_display(omap_hwc_device_t *hwc_dev)
{
if (hwc_dev->displays[HWC_DISPLAY_PRIMARY]) {
@@ -637,6 +703,7 @@ int init_primary_display(omap_hwc_device_t *hwc_dev)
drmModeModeInfoPtr mode;
uint32_t possible_crtcs;
IMG_gralloc_module_public_t *m = NULL;
+ uint32_t connector_type;
/* Open DRM device */
for (i = 0; i < ARRAY_SIZE(modules); i++) {
@@ -669,11 +736,18 @@ int init_primary_display(omap_hwc_device_t *hwc_dev)
goto close;
}
- connector = drmModeGetConnector(drm_fd, resources->connectors[HWC_DISPLAY_PRIMARY]);
- if (!connector) {
- ALOGE("No connector for DISPLAY %d\n", HWC_DISPLAY_PRIMARY);
- goto free_ressources;
- }
+ connector_type = display_get_connector_type(HWC_DISPLAY_PRIMARY);
+ for (i = 0; i < resources->count_connectors; i++) {
+ connector = drmModeGetConnector(drm_fd, resources->connectors[i]);
+ if (connector->connector_type == connector_type)
+ break;
+ drmModeFreeConnector(connector);
+ connector = NULL;
+ }
+ if (!connector) {
+ ALOGE("No connector found for primary display");
+ goto free_resources;
+ }
mode = &connector->modes[0];
@@ -796,7 +870,7 @@ int init_primary_display(omap_hwc_device_t *hwc_dev)
free_connector:
drmModeFreeConnector(connector);
-free_ressources:
+free_resources:
drmModeFreeResources(resources);
close:
drmClose(drm_fd);
@@ -1215,13 +1289,23 @@ int add_external_hdmi_display(omap_hwc_device_t *hwc_dev)
drmModeConnector *connector;
drmModeEncoder *encoder;
drmModeModeInfoPtr mode;
+ drmModeResPtr resources = hwc_dev->drm_resources;
uint32_t possible_crtcs;
+ uint32_t connector_type;
int err, i, n, j;
drmSetMaster(hwc_dev->drm_fd);
- connector = drmModeGetConnector(hwc_dev->drm_fd, hwc_dev->drm_resources->connectors[HWC_DISPLAY_EXTERNAL]);
+ connector_type = display_get_connector_type(HWC_DISPLAY_EXTERNAL);
+ for (i = 0; i < resources->count_connectors; i++) {
+ connector =
+ drmModeGetConnector(hwc_dev->drm_fd, resources->connectors[i]);
+ if (connector->connector_type == connector_type)
+ break;
+ drmModeFreeConnector(connector);
+ connector = NULL;
+ }
if (!connector) {
ALOGE("No connector for DISPLAY %d\n", HWC_DISPLAY_EXTERNAL);
return -1;