drm: verisilicon: subclass drm_plane_state

Create a subclass of drm_plane_state to store hardware-specific state
information (e.g. hardware plane format settings) in the future.

Signed-off-by: Icenowy Zheng <zhengxingda@iscas.ac.cn>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patch.msgid.link/20260331060126.1291966-3-zhengxingda@iscas.ac.cn
This commit is contained in:
Icenowy Zheng 2026-03-31 14:01:24 +08:00 committed by Thomas Zimmermann
parent 2c23455d5a
commit 1a2e375480
3 changed files with 60 additions and 3 deletions

View File

@ -6,9 +6,11 @@
#include <linux/errno.h>
#include <linux/printk.h>
#include <drm/drm_atomic_state_helper.h>
#include <drm/drm_fb_dma_helper.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_print.h>
#include "vs_plane.h"
@ -124,3 +126,44 @@ dma_addr_t vs_fb_get_dma_addr(struct drm_framebuffer *fb,
return dma_addr;
}
struct drm_plane_state *vs_plane_duplicate_state(struct drm_plane *plane)
{
struct vs_plane_state *vs_state;
if (drm_WARN_ON(plane->dev, !plane->state))
return NULL;
vs_state = kzalloc_obj(*vs_state, GFP_KERNEL);
if (!vs_state)
return NULL;
__drm_atomic_helper_plane_duplicate_state(plane, &vs_state->base);
return &vs_state->base;
}
void vs_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state)
{
__drm_atomic_helper_plane_destroy_state(state);
kfree(state);
}
/* Called during init to allocate the plane's atomic state. */
void vs_plane_reset(struct drm_plane *plane)
{
struct vs_plane_state *vs_state;
if (plane->state) {
__drm_atomic_helper_plane_destroy_state(plane->state);
kfree(plane->state);
plane->state = NULL;
}
vs_state = kzalloc_obj(*vs_state, GFP_KERNEL);
if (!vs_state)
return;
__drm_atomic_helper_plane_reset(plane, &vs_state->base);
}

View File

@ -63,10 +63,24 @@ struct vs_format {
bool uv_swizzle;
};
struct vs_plane_state {
struct drm_plane_state base;
};
static inline struct vs_plane_state *to_vs_plane_state(struct drm_plane_state *state)
{
return container_of(state, struct vs_plane_state, base);
}
int drm_format_to_vs_format(u32 drm_format, struct vs_format *vs_format);
dma_addr_t vs_fb_get_dma_addr(struct drm_framebuffer *fb,
const struct drm_rect *src_rect);
struct drm_plane_state *vs_plane_duplicate_state(struct drm_plane *plane);
void vs_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state);
void vs_plane_reset(struct drm_plane *plane);
struct drm_plane *vs_primary_plane_init(struct drm_device *dev, struct vs_dc *dc);
#endif /* _VS_PLANE_H_ */

View File

@ -145,10 +145,10 @@ static const struct drm_plane_helper_funcs vs_primary_plane_helper_funcs = {
};
static const struct drm_plane_funcs vs_primary_plane_funcs = {
.atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
.atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
.atomic_destroy_state = vs_plane_destroy_state,
.atomic_duplicate_state = vs_plane_duplicate_state,
.disable_plane = drm_atomic_helper_disable_plane,
.reset = drm_atomic_helper_plane_reset,
.reset = vs_plane_reset,
.update_plane = drm_atomic_helper_update_plane,
};