[PATCH 05/14] drm/bochs: atomic: switch planes to atomic, wire up helpers.
Oleksandr Andrushchenko
andr2000 at gmail.com
Thu Dec 20 12:14:26 UTC 2018
On 12/19/18 1:51 PM, Gerd Hoffmann wrote:
> Conversion to atomic modesetting, step three.
> Wire up atomic helpers. Switch planes to atomic.
>
> We are late to the party, the transitional helpers are gone,
> so this can't be splitted into smaller steps any more.
>
> Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
> ---
> drivers/gpu/drm/bochs/bochs_fbdev.c | 3 ++
> drivers/gpu/drm/bochs/bochs_kms.c | 70 +++++++++++++++++++++++++++++++++++--
> 2 files changed, 70 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
> index dd3c7df267..d9f3d42999 100644
> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
> @@ -6,6 +6,7 @@
> */
>
> #include "bochs.h"
> +#include <drm/drm_atomic_helper.h>
> #include <drm/drm_gem_framebuffer_helper.h>
>
> /* ---------------------------------------------------------------------- */
> @@ -149,6 +150,8 @@ bochs_gem_fb_create(struct drm_device *dev, struct drm_file *file,
>
> const struct drm_mode_config_funcs bochs_mode_funcs = {
> .fb_create = bochs_gem_fb_create,
> + .atomic_check = drm_atomic_helper_check,
> + .atomic_commit = drm_atomic_helper_commit,
> };
>
> int bochs_fbdev_init(struct bochs_device *bochs)
> diff --git a/drivers/gpu/drm/bochs/bochs_kms.c b/drivers/gpu/drm/bochs/bochs_kms.c
> index 18b705fb0b..aa3ba0377a 100644
> --- a/drivers/gpu/drm/bochs/bochs_kms.c
> +++ b/drivers/gpu/drm/bochs/bochs_kms.c
> @@ -6,7 +6,9 @@
> */
>
> #include "bochs.h"
> +#include <drm/drm_atomic_helper.h>
> #include <drm/drm_plane_helper.h>
> +#include <drm/drm_atomic_uapi.h>
>
> static int defx = 1024;
> static int defy = 768;
> @@ -113,7 +115,7 @@ static int bochs_crtc_page_flip(struct drm_crtc *crtc,
> struct drm_framebuffer *old_fb = crtc->primary->fb;
> unsigned long irqflags;
>
> - crtc->primary->fb = fb;
> + drm_atomic_set_fb_for_plane(crtc->primary->state, fb);
Taking into account that crtc->primary access goes away in the series:
Reviewed-by: Oleksandr Andrushchenko <oleksandr_andrushchenko at epam.com>
> bochs_crtc_mode_set_base(crtc, 0, 0, old_fb);
> if (event) {
> spin_lock_irqsave(&bochs->dev->event_lock, irqflags);
> @@ -151,6 +153,9 @@ static const struct drm_crtc_funcs bochs_crtc_funcs = {
> .set_config = drm_crtc_helper_set_config,
> .destroy = drm_crtc_cleanup,
> .page_flip = bochs_crtc_page_flip,
> + .reset = drm_atomic_helper_crtc_reset,
> + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> + .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
> };
>
> static const struct drm_crtc_helper_funcs bochs_helper_funcs = {
> @@ -169,6 +174,59 @@ static const uint32_t bochs_formats[] = {
> DRM_FORMAT_BGRX8888,
> };
>
> +static void bochs_plane_atomic_update(struct drm_plane *plane,
> + struct drm_plane_state *old_state)
> +{
> + struct bochs_device *bochs = plane->dev->dev_private;
> + struct bochs_bo *bo;
> +
> + if (!plane->state->fb)
> + return;
> + bo = gem_to_bochs_bo(plane->state->fb->obj[0]);
> + bochs_hw_setbase(bochs,
> + plane->state->crtc_x,
> + plane->state->crtc_y,
> + bo->bo.offset);
> + bochs_hw_setformat(bochs, plane->state->fb->format);
> +}
> +
> +static int bochs_plane_prepare_fb(struct drm_plane *plane,
> + struct drm_plane_state *new_state)
> +{
> + struct bochs_bo *bo;
> +
> + if (!new_state->fb)
> + return 0;
> + bo = gem_to_bochs_bo(new_state->fb->obj[0]);
> + return bochs_bo_pin(bo, TTM_PL_FLAG_VRAM, NULL);
> +}
> +
> +static void bochs_plane_cleanup_fb(struct drm_plane *plane,
> + struct drm_plane_state *old_state)
> +{
> + struct bochs_bo *bo;
> +
> + if (!old_state->fb)
> + return;
> + bo = gem_to_bochs_bo(old_state->fb->obj[0]);
> + bochs_bo_unpin(bo);
> +}
> +
> +static const struct drm_plane_helper_funcs bochs_plane_helper_funcs = {
> + .atomic_update = bochs_plane_atomic_update,
> + .prepare_fb = bochs_plane_prepare_fb,
> + .cleanup_fb = bochs_plane_cleanup_fb,
> +};
> +
> +static const struct drm_plane_funcs bochs_plane_funcs = {
> + .update_plane = drm_atomic_helper_update_plane,
> + .disable_plane = drm_atomic_helper_disable_plane,
> + .destroy = drm_primary_helper_destroy,
> + .reset = drm_atomic_helper_plane_reset,
> + .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
> + .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
> +};
> +
> static struct drm_plane *bochs_primary_plane(struct drm_device *dev)
> {
> struct drm_plane *primary;
> @@ -181,16 +239,17 @@ static struct drm_plane *bochs_primary_plane(struct drm_device *dev)
> }
>
> ret = drm_universal_plane_init(dev, primary, 0,
> - &drm_primary_helper_funcs,
> + &bochs_plane_funcs,
> bochs_formats,
> ARRAY_SIZE(bochs_formats),
> NULL,
> DRM_PLANE_TYPE_PRIMARY, NULL);
> if (ret) {
> kfree(primary);
> - primary = NULL;
> + return NULL;
> }
>
> + drm_plane_helper_add(primary, &bochs_plane_helper_funcs);
> return primary;
> }
>
> @@ -275,6 +334,9 @@ static const struct drm_connector_funcs bochs_connector_connector_funcs = {
> .dpms = drm_helper_connector_dpms,
> .fill_modes = drm_helper_probe_single_connector_modes,
> .destroy = drm_connector_cleanup,
> + .reset = drm_atomic_helper_connector_reset,
> + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> static void bochs_connector_init(struct drm_device *dev)
> @@ -318,6 +380,8 @@ int bochs_kms_init(struct bochs_device *bochs)
> drm_connector_attach_encoder(&bochs->connector,
> &bochs->encoder);
>
> + drm_mode_config_reset(bochs->dev);
> +
> return 0;
> }
>
More information about the dri-devel
mailing list