diff options
author | Emily Deng <Emily.Deng@amd.com> | 2016-08-07 23:36:31 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-08 14:12:56 -0400 |
commit | 048a5b76d2ba40adedb98a987bb15a9cc1f0a62b (patch) | |
tree | 6cab016f0073bbe4d5d627e24e82527811a768f9 /drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | |
parent | 6b5084ccfcd4d43d31c6124968dcc537ea265994 (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.c | 91 |
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 | ||
1507 | static struct drm_encoder * | ||
1508 | amdgpu_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 | |||
1531 | static 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 | |||
1542 | static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector, | ||
1543 | struct drm_display_mode *mode) | ||
1544 | { | ||
1545 | return MODE_OK; | ||
1546 | } | ||
1547 | |||
1548 | int amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode) | ||
1549 | { | ||
1550 | return 0; | ||
1551 | } | ||
1552 | |||
1553 | static enum drm_connector_status | ||
1554 | |||
1555 | amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force) | ||
1556 | { | ||
1557 | return connector_status_connected; | ||
1558 | } | ||
1559 | |||
1560 | int amdgpu_connector_virtual_set_property(struct drm_connector *connector, | ||
1561 | struct drm_property *property, | ||
1562 | uint64_t val) | ||
1563 | { | ||
1564 | return 0; | ||
1565 | } | ||
1566 | |||
1567 | static void amdgpu_connector_virtual_force(struct drm_connector *connector) | ||
1568 | { | ||
1569 | return; | ||
1570 | } | ||
1571 | |||
1572 | static 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 | |||
1578 | static 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 | |||
1507 | void | 1587 | void |
1508 | amdgpu_connector_add(struct amdgpu_device *adev, | 1588 | amdgpu_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 | ||