Message ID | 6dadef3b48986dea873322976b81ac92d7a3cb79.1531570020.git.hamohammed.sa@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Jul 14, 2018 at 03:22:36PM +0300, Haneen Mohammed wrote: > Subclass CRTC state struct to enable storing driver's private > state. This patch only adds the base drm_crtc_state struct and > the atomic functions that handle it. > > Signed-off-by: Haneen Mohammed <hamohammed.sa@gmail.com> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Sean Paul <seanpaul@chromium.org> > --- > drivers/gpu/drm/vkms/vkms_crtc.c | 53 ++++++++++++++++++++++++++++++-- > drivers/gpu/drm/vkms/vkms_drv.h | 11 +++++++ > 2 files changed, 61 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c > index 875fca662ac0..26babb85ca77 100644 > --- a/drivers/gpu/drm/vkms/vkms_crtc.c > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c > @@ -64,13 +64,60 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, > return true; > } > > +static void vkms_atomic_crtc_reset(struct drm_crtc *crtc) > +{ > + struct vkms_crtc_state *vkms_state = NULL; > + > + if (crtc->state) { > + vkms_state = to_vkms_crtc_state(crtc->state); > + __drm_atomic_helper_crtc_destroy_state(crtc->state); > + kfree(vkms_state); > + crtc->state = NULL; > + } > + > + vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL); > + if (!vkms_state) > + return; > + > + crtc->state = &vkms_state->base; > + crtc->state->crtc = crtc; > +} > + > +static struct drm_crtc_state * > +vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc) > +{ > + struct vkms_crtc_state *vkms_state; > + > + if (WARN_ON(!crtc->state)) > + return NULL; > + > + vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL); > + if (!vkms_state) > + return NULL; > + > + __drm_atomic_helper_crtc_duplicate_state(crtc, &vkms_state->base); > + > + return &vkms_state->base; > +} > + > +static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc, > + struct drm_crtc_state *state) > +{ > + struct vkms_crtc_state *vkms_state; > + > + vkms_state = to_vkms_crtc_state(state); > + > + __drm_atomic_helper_crtc_destroy_state(state); > + kfree(vkms_state); > +} > + > static const struct drm_crtc_funcs vkms_crtc_funcs = { > .set_config = drm_atomic_helper_set_config, > .destroy = drm_crtc_cleanup, > .page_flip = drm_atomic_helper_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, > + .reset = vkms_atomic_crtc_reset, > + .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state, > + .atomic_destroy_state = vkms_atomic_crtc_destroy_state, > .enable_vblank = vkms_enable_vblank, > .disable_vblank = vkms_disable_vblank, > }; > diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h > index 855e1ea8bc35..bf811d0ec349 100644 > --- a/drivers/gpu/drm/vkms/vkms_drv.h > +++ b/drivers/gpu/drm/vkms/vkms_drv.h > @@ -20,6 +20,14 @@ static const u32 vkms_formats[] = { > DRM_FORMAT_XRGB8888, > }; > > +/** > + * vkms_crtc_state - Driver specific CRTC state > + * @base: base CRTC state > + */ > +struct vkms_crtc_state { > + struct drm_crtc_state base; > +}; > + > struct vkms_output { > struct drm_crtc crtc; > struct drm_encoder encoder; > @@ -52,6 +60,9 @@ struct vkms_gem_object { > #define drm_gem_to_vkms_gem(target)\ > container_of(target, struct vkms_gem_object, gem) > > +#define to_vkms_crtc_state(target)\ > + container_of(target, struct vkms_crtc_state, base) > + > /* CRTC */ > int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, > struct drm_plane *primary, struct drm_plane *cursor); > -- > 2.17.1 >
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 875fca662ac0..26babb85ca77 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -64,13 +64,60 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, return true; } +static void vkms_atomic_crtc_reset(struct drm_crtc *crtc) +{ + struct vkms_crtc_state *vkms_state = NULL; + + if (crtc->state) { + vkms_state = to_vkms_crtc_state(crtc->state); + __drm_atomic_helper_crtc_destroy_state(crtc->state); + kfree(vkms_state); + crtc->state = NULL; + } + + vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL); + if (!vkms_state) + return; + + crtc->state = &vkms_state->base; + crtc->state->crtc = crtc; +} + +static struct drm_crtc_state * +vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc) +{ + struct vkms_crtc_state *vkms_state; + + if (WARN_ON(!crtc->state)) + return NULL; + + vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL); + if (!vkms_state) + return NULL; + + __drm_atomic_helper_crtc_duplicate_state(crtc, &vkms_state->base); + + return &vkms_state->base; +} + +static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc, + struct drm_crtc_state *state) +{ + struct vkms_crtc_state *vkms_state; + + vkms_state = to_vkms_crtc_state(state); + + __drm_atomic_helper_crtc_destroy_state(state); + kfree(vkms_state); +} + static const struct drm_crtc_funcs vkms_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .destroy = drm_crtc_cleanup, .page_flip = drm_atomic_helper_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, + .reset = vkms_atomic_crtc_reset, + .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state, + .atomic_destroy_state = vkms_atomic_crtc_destroy_state, .enable_vblank = vkms_enable_vblank, .disable_vblank = vkms_disable_vblank, }; diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 855e1ea8bc35..bf811d0ec349 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -20,6 +20,14 @@ static const u32 vkms_formats[] = { DRM_FORMAT_XRGB8888, }; +/** + * vkms_crtc_state - Driver specific CRTC state + * @base: base CRTC state + */ +struct vkms_crtc_state { + struct drm_crtc_state base; +}; + struct vkms_output { struct drm_crtc crtc; struct drm_encoder encoder; @@ -52,6 +60,9 @@ struct vkms_gem_object { #define drm_gem_to_vkms_gem(target)\ container_of(target, struct vkms_gem_object, gem) +#define to_vkms_crtc_state(target)\ + container_of(target, struct vkms_crtc_state, base) + /* CRTC */ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, struct drm_plane *primary, struct drm_plane *cursor);