aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
diff options
context:
space:
mode:
authorEmily Deng <Emily.Deng@amd.com>2016-08-07 23:36:31 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-08-08 14:12:56 -0400
commit048a5b76d2ba40adedb98a987bb15a9cc1f0a62b (patch)
tree6cab016f0073bbe4d5d627e24e82527811a768f9 /drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
parent6b5084ccfcd4d43d31c6124968dcc537ea265994 (diff)
drm/amdgpu: Add DRM_MODE_CONNECTOR_VIRTUAL connector in amdgpu_connector_add.
For virtual display feature, add one connector type in amdgpu_connector_add. Signed-off-by: Emily Deng <Emily.Deng@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index ff0b55a65ca3..319a5e1d9389 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -1504,6 +1504,86 @@ static const struct drm_connector_funcs amdgpu_connector_edp_funcs = {
1504 .force = amdgpu_connector_dvi_force, 1504 .force = amdgpu_connector_dvi_force,
1505}; 1505};
1506 1506
1507static struct drm_encoder *
1508amdgpu_connector_virtual_encoder(struct drm_connector *connector)
1509{
1510 int enc_id = connector->encoder_ids[0];
1511 struct drm_encoder *encoder;
1512 int i;
1513 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1514 if (connector->encoder_ids[i] == 0)
1515 break;
1516
1517 encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
1518 if (!encoder)
1519 continue;
1520
1521 if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
1522 return encoder;
1523 }
1524
1525 /* pick the first one */
1526 if (enc_id)
1527 return drm_encoder_find(connector->dev, enc_id);
1528 return NULL;
1529}
1530
1531static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector)
1532{
1533 struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
1534
1535 if (encoder) {
1536 amdgpu_connector_add_common_modes(encoder, connector);
1537 }
1538
1539 return 0;
1540}
1541
1542static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector,
1543 struct drm_display_mode *mode)
1544{
1545 return MODE_OK;
1546}
1547
1548int amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode)
1549{
1550 return 0;
1551}
1552
1553static enum drm_connector_status
1554
1555amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force)
1556{
1557 return connector_status_connected;
1558}
1559
1560int amdgpu_connector_virtual_set_property(struct drm_connector *connector,
1561 struct drm_property *property,
1562 uint64_t val)
1563{
1564 return 0;
1565}
1566
1567static void amdgpu_connector_virtual_force(struct drm_connector *connector)
1568{
1569 return;
1570}
1571
1572static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = {
1573 .get_modes = amdgpu_connector_virtual_get_modes,
1574 .mode_valid = amdgpu_connector_virtual_mode_valid,
1575 .best_encoder = amdgpu_connector_virtual_encoder,
1576};
1577
1578static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = {
1579 .dpms = amdgpu_connector_virtual_dpms,
1580 .detect = amdgpu_connector_virtual_detect,
1581 .fill_modes = drm_helper_probe_single_connector_modes,
1582 .set_property = amdgpu_connector_virtual_set_property,
1583 .destroy = amdgpu_connector_destroy,
1584 .force = amdgpu_connector_virtual_force,
1585};
1586
1507void 1587void
1508amdgpu_connector_add(struct amdgpu_device *adev, 1588amdgpu_connector_add(struct amdgpu_device *adev,
1509 uint32_t connector_id, 1589 uint32_t connector_id,
@@ -1888,6 +1968,17 @@ amdgpu_connector_add(struct amdgpu_device *adev,
1888 connector->interlace_allowed = false; 1968 connector->interlace_allowed = false;
1889 connector->doublescan_allowed = false; 1969 connector->doublescan_allowed = false;
1890 break; 1970 break;
1971 case DRM_MODE_CONNECTOR_VIRTUAL:
1972 amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1973 if (!amdgpu_dig_connector)
1974 goto failed;
1975 amdgpu_connector->con_priv = amdgpu_dig_connector;
1976 drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type);
1977 drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs);
1978 subpixel_order = SubPixelHorizontalRGB;
1979 connector->interlace_allowed = false;
1980 connector->doublescan_allowed = false;
1981 break;
1891 } 1982 }
1892 } 1983 }
1893 1984