Message ID | e0e6bfa4b6f3cdbf76da945dc7923f91a24a0ac3.1526439491.git.rodrigosiqueiramelo@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, May 16, 2018 at 12:07:12AM -0300, Rodrigo Siqueira wrote: > This commit adds a single and simple virtual encoder to VKMS. > > Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> Doesn't this break bisection, i.e. between patch 1&2 vkms looks broken (because the encoder is missing)? If so probably better to merge this into patch 1. -Daniel > --- > drivers/gpu/drm/vkms/vkms_display.c | 25 +++++++++++++++++++++++++ > drivers/gpu/drm/vkms/vkms_drv.h | 2 ++ > 2 files changed, 27 insertions(+) > > diff --git a/drivers/gpu/drm/vkms/vkms_display.c b/drivers/gpu/drm/vkms/vkms_display.c > index b20b41f9590b..d6702128b5f7 100644 > --- a/drivers/gpu/drm/vkms/vkms_display.c > +++ b/drivers/gpu/drm/vkms/vkms_display.c > @@ -44,11 +44,16 @@ static const struct drm_connector_funcs vkms_connector_funcs = { > .destroy = vkms_connector_destroy, > }; > > +static const struct drm_encoder_funcs vkms_encoder_funcs = { > + .destroy = drm_encoder_cleanup, > +}; > + > static int vkms_output_init(struct vkms_device *vkmsdev) > { > struct vkms_output *output = &vkmsdev->output; > struct drm_device *dev = &vkmsdev->drm; > struct drm_connector *connector = &output->connector; > + struct drm_encoder *encoder = &output->encoder; > struct drm_crtc *crtc = &output->crtc; > struct drm_plane *primary; > int ret; > @@ -78,10 +83,30 @@ static int vkms_output_init(struct vkms_device *vkmsdev) > goto err_connector_register; > } > > + ret = drm_encoder_init(dev, encoder, &vkms_encoder_funcs, > + DRM_MODE_ENCODER_VIRTUAL, NULL); > + if (ret) { > + DRM_ERROR("Failed to init encoder\n"); > + goto err_encoder; > + } > + encoder->possible_crtcs = 1; > + > + ret = drm_mode_connector_attach_encoder(connector, encoder); > + if (ret) { > + DRM_ERROR("Failed to attach connector to encoder\n"); > + goto err_attach; > + } > + > drm_mode_config_reset(dev); > > return 0; > > +err_attach: > + drm_encoder_cleanup(encoder); > + > +err_encoder: > + drm_connector_unregister(connector); > + > err_connector_register: > drm_connector_cleanup(connector); > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h > index 292bdea9c785..933eedc5b25b 100644 > --- a/drivers/gpu/drm/vkms/vkms_drv.h > +++ b/drivers/gpu/drm/vkms/vkms_drv.h > @@ -3,6 +3,7 @@ > > #include <drm/drmP.h> > #include <drm/drm.h> > +#include <drm/drm_encoder.h> > > static const u32 vkms_formats[] = { > DRM_FORMAT_XRGB8888, > @@ -17,6 +18,7 @@ static const u32 vkms_formats[] = { > > struct vkms_output { > struct drm_crtc crtc; > + struct drm_encoder encoder; > struct drm_connector connector; > }; > > -- > 2.17.0 >
diff --git a/drivers/gpu/drm/vkms/vkms_display.c b/drivers/gpu/drm/vkms/vkms_display.c index b20b41f9590b..d6702128b5f7 100644 --- a/drivers/gpu/drm/vkms/vkms_display.c +++ b/drivers/gpu/drm/vkms/vkms_display.c @@ -44,11 +44,16 @@ static const struct drm_connector_funcs vkms_connector_funcs = { .destroy = vkms_connector_destroy, }; +static const struct drm_encoder_funcs vkms_encoder_funcs = { + .destroy = drm_encoder_cleanup, +}; + static int vkms_output_init(struct vkms_device *vkmsdev) { struct vkms_output *output = &vkmsdev->output; struct drm_device *dev = &vkmsdev->drm; struct drm_connector *connector = &output->connector; + struct drm_encoder *encoder = &output->encoder; struct drm_crtc *crtc = &output->crtc; struct drm_plane *primary; int ret; @@ -78,10 +83,30 @@ static int vkms_output_init(struct vkms_device *vkmsdev) goto err_connector_register; } + ret = drm_encoder_init(dev, encoder, &vkms_encoder_funcs, + DRM_MODE_ENCODER_VIRTUAL, NULL); + if (ret) { + DRM_ERROR("Failed to init encoder\n"); + goto err_encoder; + } + encoder->possible_crtcs = 1; + + ret = drm_mode_connector_attach_encoder(connector, encoder); + if (ret) { + DRM_ERROR("Failed to attach connector to encoder\n"); + goto err_attach; + } + drm_mode_config_reset(dev); return 0; +err_attach: + drm_encoder_cleanup(encoder); + +err_encoder: + drm_connector_unregister(connector); + err_connector_register: drm_connector_cleanup(connector); diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 292bdea9c785..933eedc5b25b 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -3,6 +3,7 @@ #include <drm/drmP.h> #include <drm/drm.h> +#include <drm/drm_encoder.h> static const u32 vkms_formats[] = { DRM_FORMAT_XRGB8888, @@ -17,6 +18,7 @@ static const u32 vkms_formats[] = { struct vkms_output { struct drm_crtc crtc; + struct drm_encoder encoder; struct drm_connector connector; };
This commit adds a single and simple virtual encoder to VKMS. Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> --- drivers/gpu/drm/vkms/vkms_display.c | 25 +++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_drv.h | 2 ++ 2 files changed, 27 insertions(+)