Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [Medium] drm/vkms: missing connector atomic_create_state breaks 
DRM_MODE_ATOMIC_RESET
--

commit dd5905026f6d7cc05c849f79e8c81bca404953ae
Author: Maxime Ripard <[email protected]>

drm/vkms: Add driver-specific plane property for testing

This commit adds a driver-specific "vkms-test-do-not-use-in-prod" range
property to vkms planes to allow userspace to test DRM_MODE_ATOMIC_RESET
without interfering with standard compositor properties.

> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
> b/drivers/gpu/drm/vkms/vkms_plane.c
> index fd3d34dcf0fe5..42513cb462ace 100644
> --- a/drivers/gpu/drm/vkms/vkms_plane.c
> +++ b/drivers/gpu/drm/vkms/vkms_plane.c

[ ... ]

> @@ -85,7 +92,9 @@ static void vkms_plane_destroy_state(struct drm_plane 
> *plane,
>  
>  static struct drm_plane_state *vkms_plane_create_state(struct drm_plane 
> *plane)
>  {
> +     struct vkms_plane *vkms_plane = to_vkms_plane(plane);
>       struct vkms_plane_state *vkms_state;
> +     u64 val;
>  
>       vkms_state = kzalloc_obj(*vkms_state);
>       if (!vkms_state) {
> @@ -95,14 +104,53 @@ static struct drm_plane_state 
> *vkms_plane_create_state(struct drm_plane *plane)
>  
>       __drm_gem_shadow_plane_state_init(plane, &vkms_state->base);
>  
> +     if (!drm_object_property_get_default_value(&plane->base,
> +                                                
> vkms_plane->vkms_test_do_not_use_property,
> +                                                &val))
> +             vkms_state->vkms_test_do_not_use_value = val;

[Severity: Medium]
As reported by Sashiko on v6 [1], can vkms_plane_create_state() actually be
reached via DRM_MODE_ATOMIC_RESET while vkms connectors do not implement
atomic_create_state?

When userspace queries DRM_CAP_ATOMIC_RESET in drm_getcap() or submits an
atomic commit with DRM_MODE_ATOMIC_RESET in drm_mode_atomic_ioctl(),
drm_atomic_implements_create_state() and
drm_atomic_commit_fill_with_defaults() check all connectors on the device:

drivers/gpu/drm/drm_atomic.c:drm_atomic_implements_create_state() {
    ...
        drm_connector_list_iter_begin(dev, &conn_iter);
        drm_for_each_connector_iter(connector, &conn_iter) {
                if (!connector->funcs->atomic_create_state) {
                        drm_connector_list_iter_end(&conn_iter);
                        return false;
                }
        }
        drm_connector_list_iter_end(&conn_iter);
    ...
}

In vkms, both connector function tables still set .reset instead of
.atomic_create_state:

drivers/gpu/drm/vkms/vkms_connector.c:
static const struct drm_connector_funcs vkms_connector_funcs = {
        .detect = vkms_connector_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .reset = drm_atomic_helper_connector_reset,
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};

drivers/gpu/drm/vkms/vkms_writeback.c:
static const struct drm_connector_funcs vkms_wb_connector_funcs = {
        .fill_modes = drm_helper_probe_single_connector_modes,
        .reset = drm_atomic_helper_connector_reset,
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};

Because every valid vkms device requires at least one connector,
drm_atomic_implements_create_state() returns false and DRM_MODE_ATOMIC_RESET
commits fail with -EOPNOTSUPP before vkms_plane_create_state() can be invoked.

Should vkms_connector_funcs and vkms_wb_connector_funcs also be converted to
use .atomic_create_state = drm_atomic_helper_connector_create_state so this
property can be used to test DRM_MODE_ATOMIC_RESET?

[1] 
https://lore.kernel.org/r/[email protected]

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=16

Reply via email to