Commit e9d85f73 authored by Rodrigo Siqueira's avatar Rodrigo Siqueira

drm/vkms: Avoid assigning 0 for possible_crtc

When vkms invoke drm_universal_plane_init(), it sets 0 for
possible_crtcs parameter which means that planes can't be attached to
any CRTC. It currently works due to some safeguard in the drm_crtc file;
however, it is possible to identify the problem by trying to append a
second connector. This patch fixes this issue by modifying
vkms_plane_init() to accept an index parameter which makes the code a
little bit more flexible and avoid set zero to possible_crtcs.
Signed-off-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/d67849c62a8d8ace1a0af455998b588798a4c45f.1561491964.git.rodrigosiqueiramelo@gmail.com
parent 4f5368b5
...@@ -127,7 +127,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev) ...@@ -127,7 +127,7 @@ static int vkms_modeset_init(struct vkms_device *vkmsdev)
dev->mode_config.preferred_depth = 24; dev->mode_config.preferred_depth = 24;
dev->mode_config.helper_private = &vkms_mode_config_helpers; dev->mode_config.helper_private = &vkms_mode_config_helpers;
return vkms_output_init(vkmsdev); return vkms_output_init(vkmsdev, 0);
} }
static int __init vkms_init(void) static int __init vkms_init(void)
......
...@@ -115,10 +115,10 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, ...@@ -115,10 +115,10 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
int *max_error, ktime_t *vblank_time, int *max_error, ktime_t *vblank_time,
bool in_vblank_irq); bool in_vblank_irq);
int vkms_output_init(struct vkms_device *vkmsdev); int vkms_output_init(struct vkms_device *vkmsdev, int index);
struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev, struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
enum drm_plane_type type); enum drm_plane_type type, int index);
/* Gem stuff */ /* Gem stuff */
struct drm_gem_object *vkms_gem_create(struct drm_device *dev, struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
......
...@@ -35,7 +35,7 @@ static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = { ...@@ -35,7 +35,7 @@ static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = {
.get_modes = vkms_conn_get_modes, .get_modes = vkms_conn_get_modes,
}; };
int vkms_output_init(struct vkms_device *vkmsdev) int vkms_output_init(struct vkms_device *vkmsdev, int index)
{ {
struct vkms_output *output = &vkmsdev->output; struct vkms_output *output = &vkmsdev->output;
struct drm_device *dev = &vkmsdev->drm; struct drm_device *dev = &vkmsdev->drm;
...@@ -45,12 +45,12 @@ int vkms_output_init(struct vkms_device *vkmsdev) ...@@ -45,12 +45,12 @@ int vkms_output_init(struct vkms_device *vkmsdev)
struct drm_plane *primary, *cursor = NULL; struct drm_plane *primary, *cursor = NULL;
int ret; int ret;
primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY); primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY, index);
if (IS_ERR(primary)) if (IS_ERR(primary))
return PTR_ERR(primary); return PTR_ERR(primary);
if (enable_cursor) { if (enable_cursor) {
cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR); cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index);
if (IS_ERR(cursor)) { if (IS_ERR(cursor)) {
ret = PTR_ERR(cursor); ret = PTR_ERR(cursor);
goto err_cursor; goto err_cursor;
......
...@@ -176,7 +176,7 @@ static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = { ...@@ -176,7 +176,7 @@ static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
}; };
struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev, struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
enum drm_plane_type type) enum drm_plane_type type, int index)
{ {
struct drm_device *dev = &vkmsdev->drm; struct drm_device *dev = &vkmsdev->drm;
const struct drm_plane_helper_funcs *funcs; const struct drm_plane_helper_funcs *funcs;
...@@ -198,7 +198,7 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev, ...@@ -198,7 +198,7 @@ struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
funcs = &vkms_primary_helper_funcs; funcs = &vkms_primary_helper_funcs;
} }
ret = drm_universal_plane_init(dev, plane, 0, ret = drm_universal_plane_init(dev, plane, 1 << index,
&vkms_plane_funcs, &vkms_plane_funcs,
formats, nformats, formats, nformats,
NULL, type, NULL); NULL, type, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment