Skip to content

Commit

Permalink
drm/vkms: Subclass plane state
Browse files Browse the repository at this point in the history
Subclass plane state struct to enable storing driver's private
state. This patch only adds the base drm_plane_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed <[email protected]>
Reviewed-by: Sean Paul <[email protected]>
Signed-off-by: Sean Paul <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/c35c512c8987a7255aac94a9eb985d2dd3e6c90d.1533171495.git.hamohammed.sa@gmail.com
  • Loading branch information
haneensa authored and atseanpaul committed Aug 3, 2018
1 parent 570913e commit 3e77c4d
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 3 deletions.
11 changes: 11 additions & 0 deletions drivers/gpu/drm/vkms/vkms_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB8888,
};

/**
* vkms_plane_state - Driver specific plane state
* @base: base plane state
*/
struct vkms_plane_state {
struct drm_plane_state base;
};

/**
* vkms_crtc_state - Driver specific CRTC state
* @base: base CRTC state
Expand Down Expand Up @@ -63,6 +71,9 @@ struct vkms_gem_object {
#define to_vkms_crtc_state(target)\
container_of(target, struct vkms_crtc_state, base)

#define to_vkms_plane_state(target)\
container_of(target, struct vkms_plane_state, base)

/* CRTC */
int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
struct drm_plane *primary, struct drm_plane *cursor);
Expand Down
47 changes: 44 additions & 3 deletions drivers/gpu/drm/vkms/vkms_plane.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,54 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>

static struct drm_plane_state *
vkms_plane_duplicate_state(struct drm_plane *plane)
{
struct vkms_plane_state *vkms_state;

vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
if (!vkms_state)
return NULL;

__drm_atomic_helper_plane_duplicate_state(plane,
&vkms_state->base);

return &vkms_state->base;
}

static void vkms_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *old_state)
{
struct vkms_plane_state *vkms_state = to_vkms_plane_state(old_state);

__drm_atomic_helper_plane_destroy_state(old_state);
kfree(vkms_state);
}

static void vkms_plane_reset(struct drm_plane *plane)
{
struct vkms_plane_state *vkms_state;

if (plane->state)
vkms_plane_destroy_state(plane, plane->state);

vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
if (!vkms_state) {
DRM_ERROR("Cannot allocate vkms_plane_state\n");
return;
}

plane->state = &vkms_state->base;
plane->state->plane = plane;
}

static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane = drm_atomic_helper_update_plane,
.disable_plane = drm_atomic_helper_disable_plane,
.destroy = drm_plane_cleanup,
.reset = drm_atomic_helper_plane_reset,
.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
.reset = vkms_plane_reset,
.atomic_duplicate_state = vkms_plane_duplicate_state,
.atomic_destroy_state = vkms_plane_destroy_state,
};

static void vkms_primary_plane_update(struct drm_plane *plane,
Expand Down

0 comments on commit 3e77c4d

Please sign in to comment.