Message ID | 20200429124830.27475-6-noralf@tronnes.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Generic USB Display driver | expand |
Hi Noralf. On Wed, Apr 29, 2020 at 02:48:25PM +0200, Noralf Trønnes wrote: > Add a way for client to check the configuration before comitting. > > Signed-off-by: Noralf Trønnes <noralf@tronnes.org> Two small ntis. With these addressed: Reviewed-by: Sam Ravnborg <sam@ravnborg.org> > --- > drivers/gpu/drm/drm_client_modeset.c | 35 ++++++++++++++++++++++++---- > include/drm/drm_client.h | 1 + > 2 files changed, 32 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c > index 7443114bd713..177158ff2a40 100644 > --- a/drivers/gpu/drm/drm_client_modeset.c > +++ b/drivers/gpu/drm/drm_client_modeset.c > @@ -966,7 +966,7 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation) > } > EXPORT_SYMBOL(drm_client_rotation); > > -static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active) > +static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check) > { > struct drm_device *dev = client->dev; > struct drm_plane *plane; > @@ -1033,7 +1033,10 @@ static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool > } > } > > - ret = drm_atomic_commit(state); > + if (check) > + ret = drm_atomic_check_only(state); > + else > + ret = drm_atomic_commit(state); > > out_state: > if (ret == -EDEADLK) > @@ -1094,6 +1097,30 @@ static int drm_client_modeset_commit_legacy(struct drm_client_dev *client) > return ret; > } > > +/** > + * drm_client_modeset_check() - Check CRTC configuration This part of the comment does not match the description below. > + * @client: DRM client > + * > + * Check modeset configuration. > + * > + * Returns: > + * Zero on success or negative error code on failure. > + */ > +int drm_client_modeset_check(struct drm_client_dev *client) > +{ > + int ret; > + > + if (!drm_drv_uses_atomic_modeset(client->dev)) > + return 0; If client does not use atomic the check should fail - no? > + > + mutex_lock(&client->modeset_mutex); > + ret = drm_client_modeset_commit_atomic(client, true, true); > + mutex_unlock(&client->modeset_mutex); > + > + return ret; > +} > +EXPORT_SYMBOL(drm_client_modeset_check); > + > /** > * drm_client_modeset_commit_locked() - Force commit CRTC configuration > * @client: DRM client > @@ -1112,7 +1139,7 @@ int drm_client_modeset_commit_locked(struct drm_client_dev *client) > > mutex_lock(&client->modeset_mutex); > if (drm_drv_uses_atomic_modeset(dev)) > - ret = drm_client_modeset_commit_atomic(client, true); > + ret = drm_client_modeset_commit_atomic(client, true, false); > else > ret = drm_client_modeset_commit_legacy(client); > mutex_unlock(&client->modeset_mutex); > @@ -1188,7 +1215,7 @@ int drm_client_modeset_dpms(struct drm_client_dev *client, int mode) > > mutex_lock(&client->modeset_mutex); > if (drm_drv_uses_atomic_modeset(dev)) > - ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON); > + ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false); > else > drm_client_modeset_dpms_legacy(client, mode); > mutex_unlock(&client->modeset_mutex); > diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h > index 6ef5364d6dfb..b6ffa4863e45 100644 > --- a/include/drm/drm_client.h > +++ b/include/drm/drm_client.h > @@ -164,6 +164,7 @@ int drm_client_modeset_create(struct drm_client_dev *client); > void drm_client_modeset_free(struct drm_client_dev *client); > int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height); > bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation); > +int drm_client_modeset_check(struct drm_client_dev *client); > int drm_client_modeset_commit_locked(struct drm_client_dev *client); > int drm_client_modeset_commit(struct drm_client_dev *client); > int drm_client_modeset_dpms(struct drm_client_dev *client, int mode); > -- > 2.23.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Den 03.05.2020 10.03, skrev Sam Ravnborg: > Hi Noralf. > > On Wed, Apr 29, 2020 at 02:48:25PM +0200, Noralf Trønnes wrote: >> Add a way for client to check the configuration before comitting. >> >> Signed-off-by: Noralf Trønnes <noralf@tronnes.org> > Two small ntis. With these addressed: > Reviewed-by: Sam Ravnborg <sam@ravnborg.org> >> --- >> drivers/gpu/drm/drm_client_modeset.c | 35 ++++++++++++++++++++++++---- >> include/drm/drm_client.h | 1 + >> 2 files changed, 32 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c >> index 7443114bd713..177158ff2a40 100644 >> --- a/drivers/gpu/drm/drm_client_modeset.c >> +++ b/drivers/gpu/drm/drm_client_modeset.c >> @@ -966,7 +966,7 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation) >> } >> EXPORT_SYMBOL(drm_client_rotation); >> >> -static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active) >> +static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check) >> { >> struct drm_device *dev = client->dev; >> struct drm_plane *plane; >> @@ -1033,7 +1033,10 @@ static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool >> } >> } >> >> - ret = drm_atomic_commit(state); >> + if (check) >> + ret = drm_atomic_check_only(state); >> + else >> + ret = drm_atomic_commit(state); >> >> out_state: >> if (ret == -EDEADLK) >> @@ -1094,6 +1097,30 @@ static int drm_client_modeset_commit_legacy(struct drm_client_dev *client) >> return ret; >> } >> >> +/** >> + * drm_client_modeset_check() - Check CRTC configuration > This part of the comment does not match the description below. > > >> + * @client: DRM client >> + * >> + * Check modeset configuration. >> + * >> + * Returns: >> + * Zero on success or negative error code on failure. >> + */ >> +int drm_client_modeset_check(struct drm_client_dev *client) >> +{ >> + int ret; >> + >> + if (!drm_drv_uses_atomic_modeset(client->dev)) >> + return 0; > If client does not use atomic the check should fail - no? Returning an error here would result in the client not working with non-atomic drivers which AFAIK doesn't have a way to check the state before hand. The client have to commit the state/configuration to find out if it is good. Noralf. > >> + >> + mutex_lock(&client->modeset_mutex); >> + ret = drm_client_modeset_commit_atomic(client, true, true); >> + mutex_unlock(&client->modeset_mutex); >> + >> + return ret; >> +} >> +EXPORT_SYMBOL(drm_client_modeset_check); >> + >> /** >> * drm_client_modeset_commit_locked() - Force commit CRTC configuration >> * @client: DRM client >> @@ -1112,7 +1139,7 @@ int drm_client_modeset_commit_locked(struct drm_client_dev *client) >> >> mutex_lock(&client->modeset_mutex); >> if (drm_drv_uses_atomic_modeset(dev)) >> - ret = drm_client_modeset_commit_atomic(client, true); >> + ret = drm_client_modeset_commit_atomic(client, true, false); >> else >> ret = drm_client_modeset_commit_legacy(client); >> mutex_unlock(&client->modeset_mutex); >> @@ -1188,7 +1215,7 @@ int drm_client_modeset_dpms(struct drm_client_dev *client, int mode) >> >> mutex_lock(&client->modeset_mutex); >> if (drm_drv_uses_atomic_modeset(dev)) >> - ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON); >> + ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false); >> else >> drm_client_modeset_dpms_legacy(client, mode); >> mutex_unlock(&client->modeset_mutex); >> diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h >> index 6ef5364d6dfb..b6ffa4863e45 100644 >> --- a/include/drm/drm_client.h >> +++ b/include/drm/drm_client.h >> @@ -164,6 +164,7 @@ int drm_client_modeset_create(struct drm_client_dev *client); >> void drm_client_modeset_free(struct drm_client_dev *client); >> int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height); >> bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation); >> +int drm_client_modeset_check(struct drm_client_dev *client); >> int drm_client_modeset_commit_locked(struct drm_client_dev *client); >> int drm_client_modeset_commit(struct drm_client_dev *client); >> int drm_client_modeset_dpms(struct drm_client_dev *client, int mode); >> -- >> 2.23.0 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c index 7443114bd713..177158ff2a40 100644 --- a/drivers/gpu/drm/drm_client_modeset.c +++ b/drivers/gpu/drm/drm_client_modeset.c @@ -966,7 +966,7 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation) } EXPORT_SYMBOL(drm_client_rotation); -static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active) +static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check) { struct drm_device *dev = client->dev; struct drm_plane *plane; @@ -1033,7 +1033,10 @@ static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool } } - ret = drm_atomic_commit(state); + if (check) + ret = drm_atomic_check_only(state); + else + ret = drm_atomic_commit(state); out_state: if (ret == -EDEADLK) @@ -1094,6 +1097,30 @@ static int drm_client_modeset_commit_legacy(struct drm_client_dev *client) return ret; } +/** + * drm_client_modeset_check() - Check CRTC configuration + * @client: DRM client + * + * Check modeset configuration. + * + * Returns: + * Zero on success or negative error code on failure. + */ +int drm_client_modeset_check(struct drm_client_dev *client) +{ + int ret; + + if (!drm_drv_uses_atomic_modeset(client->dev)) + return 0; + + mutex_lock(&client->modeset_mutex); + ret = drm_client_modeset_commit_atomic(client, true, true); + mutex_unlock(&client->modeset_mutex); + + return ret; +} +EXPORT_SYMBOL(drm_client_modeset_check); + /** * drm_client_modeset_commit_locked() - Force commit CRTC configuration * @client: DRM client @@ -1112,7 +1139,7 @@ int drm_client_modeset_commit_locked(struct drm_client_dev *client) mutex_lock(&client->modeset_mutex); if (drm_drv_uses_atomic_modeset(dev)) - ret = drm_client_modeset_commit_atomic(client, true); + ret = drm_client_modeset_commit_atomic(client, true, false); else ret = drm_client_modeset_commit_legacy(client); mutex_unlock(&client->modeset_mutex); @@ -1188,7 +1215,7 @@ int drm_client_modeset_dpms(struct drm_client_dev *client, int mode) mutex_lock(&client->modeset_mutex); if (drm_drv_uses_atomic_modeset(dev)) - ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON); + ret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false); else drm_client_modeset_dpms_legacy(client, mode); mutex_unlock(&client->modeset_mutex); diff --git a/include/drm/drm_client.h b/include/drm/drm_client.h index 6ef5364d6dfb..b6ffa4863e45 100644 --- a/include/drm/drm_client.h +++ b/include/drm/drm_client.h @@ -164,6 +164,7 @@ int drm_client_modeset_create(struct drm_client_dev *client); void drm_client_modeset_free(struct drm_client_dev *client); int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height); bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation); +int drm_client_modeset_check(struct drm_client_dev *client); int drm_client_modeset_commit_locked(struct drm_client_dev *client); int drm_client_modeset_commit(struct drm_client_dev *client); int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);
Add a way for client to check the configuration before comitting. Signed-off-by: Noralf Trønnes <noralf@tronnes.org> --- drivers/gpu/drm/drm_client_modeset.c | 35 ++++++++++++++++++++++++---- include/drm/drm_client.h | 1 + 2 files changed, 32 insertions(+), 4 deletions(-)