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: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/d67849c62a8d8ace1a0af455998b588798a4c45f.1561491964.git.rodrigosiqueiramelo@gmail.com
This commit is contained in:
@@ -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,
|
|||||||
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 = {
|
|||||||
.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)
|
|||||||
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 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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,
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user