[PATCH 11/14] drm/amdgpu: Add DRM_MODE_CONNECTOR_VIRTUAL connector in amdgpu_connector_add.
Alex Deucher
alexdeucher at gmail.com
Fri Aug 5 18:35:31 UTC 2016
On Fri, Aug 5, 2016 at 2:36 AM, Emily Deng <Emily.Deng at amd.com> wrote:
> For virtual display feature, add one connector type in amdgpu_connector_add.
>
> Signed-off-by: Emily Deng <Emily.Deng at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 91 ++++++++++++++++++++++++++
> 1 file changed, 91 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> index cb07da4..e0fff49 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 = {
> .force = amdgpu_connector_dvi_force,
> };
>
> +static struct drm_encoder *
> +amdgpu_connector_virtual_encoder(struct drm_connector *connector)
> +{
> + int enc_id = connector->encoder_ids[0];
> + struct drm_encoder *encoder;
> + int i;
> + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
> + if (connector->encoder_ids[i] == 0)
> + break;
> +
> + encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
> + if (!encoder)
> + continue;
> +
> + if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
> + return encoder;
> + }
> +
> + /* pick the first one */
> + if (enc_id)
> + return drm_encoder_find(connector->dev, enc_id);
> + return NULL;
> +}
> +
> +static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector)
> +{
> + struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
> +
> + if (encoder) {
> + amdgpu_connector_add_common_modes(encoder, connector);
> + }
> +
> + return 0;
> +}
> +
> +static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector,
> + struct drm_display_mode *mode)
> +{
> + return MODE_OK;
> +}
> +
> +int amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode)
> +{
> + return 0;
> +}
> +
> +static enum drm_connector_status
> +
> +amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force)
> +{
> + return connector_status_connected;
> +}
> +
> +int amdgpu_connector_virtual_set_property(struct drm_connector *connector,
> + struct drm_property *property,
> + uint64_t val)
> +{
> + return 0;
> +}
> +
> +static void amdgpu_connector_virtual_force(struct drm_connector *connector)
> +{
> + return;
> +}
> +
> +static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = {
> + .get_modes = amdgpu_connector_virtual_get_modes,
> + .mode_valid = amdgpu_connector_virtual_mode_valid,
> + .best_encoder = amdgpu_connector_virtual_encoder,
> +};
> +
> +static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = {
> + .dpms = amdgpu_connector_virtual_dpms,
> + .detect = amdgpu_connector_virtual_detect,
> + .fill_modes = drm_helper_probe_single_connector_modes,
> + .set_property = amdgpu_connector_virtual_set_property,
> + .destroy = amdgpu_connector_destroy,
> + .force = amdgpu_connector_virtual_force,
> +};
> +
> void
> amdgpu_connector_add(struct amdgpu_device *adev,
> uint32_t connector_id,
> @@ -1889,6 +1969,17 @@ amdgpu_connector_add(struct amdgpu_device *adev,
> connector->interlace_allowed = false;
> connector->doublescan_allowed = false;
> break;
> + case DRM_MODE_CONNECTOR_VIRTUAL:
> + amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
> + if (!amdgpu_dig_connector)
> + goto failed;
> + amdgpu_connector->con_priv = amdgpu_dig_connector;
> + drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type);
> + drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs);
> + subpixel_order = SubPixelHorizontalRGB;
> + connector->interlace_allowed = false;
> + connector->doublescan_allowed = false;
> + break;
> }
> }
>
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list