Re: [PATCH 2/9] drm/aspeed: replace struct drm_simple_display_pipe with regular atomic helpers
"Ze Huang" <[email protected]> Mon, 06 Jul 2026 21:32:03 +0800
| Newsgroups | org.ozlabs.lists.linux-aspeed,dev.linux.lists.imx,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <[email protected]> |
On Mon Jul 6, 2026 at 4:31 PM CST, Thomas Zimmermann wrote: > Hi, > > common points from my arcgpu review applied here as well. See below for > a new other things. > > Am 04.07.26 um 20:31 schrieb Ze Huang: >> Replace simple display pipe with explicit plane, CRTC and encoder >> objects. Move callbacks to plane and CRTC helpers, with vblank handling >> through drm_crtc_funcs. >> >> This removes intermediate simple-pipe layer and uses standard atomic >> helper wiring. >> >> Signed-off-by: Ze Huang <[email protected]> >> --- >> drivers/gpu/drm/aspeed/aspeed_gfx.h | 5 +- >> drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c | 156 +++++++++++++++++++++++-------- >> drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 3 +- >> 3 files changed, 123 insertions(+), 41 deletions(-) >> >> diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx.h b/drivers/gpu/drm/aspeed/aspeed_gfx.h >> index 4e6a442c3886..a34811564c0d 100644 >> --- a/drivers/gpu/drm/aspeed/aspeed_gfx.h >> +++ b/drivers/gpu/drm/aspeed/aspeed_gfx.h >> @@ -2,7 +2,6 @@ >> /* Copyright 2018 IBM Corporation */ >> >> #include <drm/drm_device.h> >> -#include <drm/drm_simple_kms_helper.h> >> >> struct aspeed_gfx { >> struct drm_device drm; >> @@ -17,7 +16,9 @@ struct aspeed_gfx { >> u32 throd_val; >> u32 scan_line_max; >> >> - struct drm_simple_display_pipe pipe; >> + struct drm_plane plane; >> + struct drm_crtc crtc; >> + struct drm_encoder encoder; >> struct drm_connector connector; >> }; >> #define to_aspeed_gfx(x) container_of(x, struct aspeed_gfx, drm) >> diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c >> index 7877a57b8e26..3294795c31c4 100644 >> --- a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c >> +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c >> @@ -5,6 +5,8 @@ >> #include <linux/reset.h> >> #include <linux/regmap.h> >> >> +#include <drm/drm_atomic.h> >> +#include <drm/drm_atomic_helper.h> >> #include <drm/drm_device.h> >> #include <drm/drm_fb_dma_helper.h> >> #include <drm/drm_fourcc.h> >> @@ -12,20 +14,13 @@ >> #include <drm/drm_gem_atomic_helper.h> >> #include <drm/drm_gem_dma_helper.h> >> #include <drm/drm_panel.h> >> -#include <drm/drm_simple_kms_helper.h> >> #include <drm/drm_vblank.h> >> >> #include "aspeed_gfx.h" >> >> -static struct aspeed_gfx * >> -drm_pipe_to_aspeed_gfx(struct drm_simple_display_pipe *pipe) >> -{ >> - return container_of(pipe, struct aspeed_gfx, pipe); >> -} >> - > > Please create a new helper > > struct drm_aspeed_gfx *to_aspeed_gfx(drm_device *drm) > > that does the upcast. > Will do >> static int aspeed_gfx_set_pixel_fmt(struct aspeed_gfx *priv, u32 *bpp) >> { >> - struct drm_crtc *crtc = &priv->pipe.crtc; >> + struct drm_crtc *crtc = &priv->crtc; >> struct drm_device *drm = crtc->dev; >> const u32 format = crtc->primary->state->fb->format->format; >> u32 ctrl1; >> @@ -79,7 +74,7 @@ static void aspeed_gfx_disable_controller(struct aspeed_gfx *priv) >> >> static void aspeed_gfx_crtc_mode_set_nofb(struct aspeed_gfx *priv) >> { >> - struct drm_display_mode *m = &priv->pipe.crtc.state->adjusted_mode; >> + struct drm_display_mode *m = &priv->crtc.state->adjusted_mode; >> u32 ctrl1, d_offset, t_count, bpp; >> int err; >> >> @@ -139,33 +134,31 @@ static void aspeed_gfx_crtc_mode_set_nofb(struct aspeed_gfx *priv) >> writel(priv->throd_val, priv->base + CRT_THROD); >> } >> >> -static void aspeed_gfx_pipe_enable(struct drm_simple_display_pipe *pipe, >> - struct drm_crtc_state *crtc_state, >> - struct drm_plane_state *plane_state) >> +static void aspeed_gfx_crtc_helper_atomic_enable(struct drm_crtc *crtc, >> + struct drm_atomic_commit *state) > > Please see my comment on arcgpu for the new naming of 'state'. > OK >> { >> - struct aspeed_gfx *priv = drm_pipe_to_aspeed_gfx(pipe); >> - struct drm_crtc *crtc = &pipe->crtc; >> + struct aspeed_gfx *priv = container_of(crtc, struct aspeed_gfx, crtc); > > Please use your helper to_aspeed_gfx(crtc->dev) to do the upcast. > Here any in other places. > OK >> >> aspeed_gfx_crtc_mode_set_nofb(priv); >> aspeed_gfx_enable_controller(priv); >> drm_crtc_vblank_on(crtc); >> } >> >> -static void aspeed_gfx_pipe_disable(struct drm_simple_display_pipe *pipe) >> +static void aspeed_gfx_crtc_helper_atomic_disable(struct drm_crtc *crtc, >> + struct drm_atomic_commit *state) >> { >> - struct aspeed_gfx *priv = drm_pipe_to_aspeed_gfx(pipe); >> - struct drm_crtc *crtc = &pipe->crtc; >> + struct aspeed_gfx *priv = container_of(crtc, struct aspeed_gfx, crtc); > > Another upcast issue > Acknowledged >> >> drm_crtc_vblank_off(crtc); >> aspeed_gfx_disable_controller(priv); >> } >> >> -static void aspeed_gfx_pipe_update(struct drm_simple_display_pipe *pipe, >> - struct drm_plane_state *plane_state) >> +static void aspeed_gfx_plane_helper_atomic_update(struct drm_plane *plane, >> + struct drm_atomic_commit *state) >> { >> - struct aspeed_gfx *priv = drm_pipe_to_aspeed_gfx(pipe); >> - struct drm_crtc *crtc = &pipe->crtc; >> - struct drm_framebuffer *fb = pipe->plane.state->fb; >> + struct aspeed_gfx *priv = container_of(plane, struct aspeed_gfx, plane); > > to_aspeed_gfx(plane->dev) > Acknowledged >> + struct drm_crtc *crtc = &priv->crtc; >> + struct drm_framebuffer *fb = plane->state->fb; >> struct drm_pending_vblank_event *event; >> struct drm_gem_dma_object *gem; >> >> @@ -190,9 +183,9 @@ static void aspeed_gfx_pipe_update(struct drm_simple_display_pipe *pipe, >> writel(gem->dma_addr, priv->base + CRT_ADDR); >> } >> >> -static int aspeed_gfx_enable_vblank(struct drm_simple_display_pipe *pipe) >> +static int aspeed_gfx_crtc_enable_vblank(struct drm_crtc *crtc) >> { >> - struct aspeed_gfx *priv = drm_pipe_to_aspeed_gfx(pipe); >> + struct aspeed_gfx *priv = container_of(crtc, struct aspeed_gfx, crtc); >> u32 reg = readl(priv->base + CRT_CTRL1); >> >> /* Clear pending VBLANK IRQ */ >> @@ -204,9 +197,9 @@ static int aspeed_gfx_enable_vblank(struct drm_simple_display_pipe *pipe) >> return 0; >> } >> >> -static void aspeed_gfx_disable_vblank(struct drm_simple_display_pipe *pipe) >> +static void aspeed_gfx_crtc_disable_vblank(struct drm_crtc *crtc) >> { >> - struct aspeed_gfx *priv = drm_pipe_to_aspeed_gfx(pipe); >> + struct aspeed_gfx *priv = container_of(crtc, struct aspeed_gfx, crtc); >> u32 reg = readl(priv->base + CRT_CTRL1); >> >> reg &= ~CRT_CTRL_VERTICAL_INTR_EN; >> @@ -216,12 +209,75 @@ static void aspeed_gfx_disable_vblank(struct drm_simple_display_pipe *pipe) >> writel(reg | CRT_CTRL_VERTICAL_INTR_STS, priv->base + CRT_CTRL1); >> } >> >> -static const struct drm_simple_display_pipe_funcs aspeed_gfx_funcs = { >> - .enable = aspeed_gfx_pipe_enable, >> - .disable = aspeed_gfx_pipe_disable, >> - .update = aspeed_gfx_pipe_update, >> - .enable_vblank = aspeed_gfx_enable_vblank, >> - .disable_vblank = aspeed_gfx_disable_vblank, >> +static int aspeed_gfx_plane_helper_atomic_check(struct drm_plane *plane, >> + struct drm_atomic_commit *state) >> +{ >> + struct drm_plane_state *plane_state = drm_atomic_get_new_plane_state(state, plane); >> + struct drm_crtc *crtc = plane_state->crtc; >> + struct drm_crtc_state *crtc_state = NULL; >> + int ret; >> + >> + if (crtc) >> + crtc_state = drm_atomic_get_new_crtc_state(state, crtc); >> + >> + ret = drm_atomic_helper_check_plane_state(plane_state, crtc_state, >> + DRM_PLANE_NO_SCALING, >> + DRM_PLANE_NO_SCALING, >> + false, false); >> + return ret; >> +} > > Return directly. > OK >> + >> +static const struct drm_plane_helper_funcs aspeed_gfx_plane_helper_funcs = { >> + .prepare_fb = drm_gem_plane_helper_prepare_fb, >> + .atomic_check = aspeed_gfx_plane_helper_atomic_check, >> + .atomic_update = aspeed_gfx_plane_helper_atomic_update, >> +}; >> + >> +static const struct drm_plane_funcs aspeed_gfx_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, >> +}; >> + >> +static int aspeed_gfx_crtc_helper_atomic_check(struct drm_crtc *crtc, >> + struct drm_atomic_commit *state) >> +{ >> + struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); >> + int ret; >> + >> + if (!crtc_state->enable) >> + goto out; >> + >> + ret = drm_atomic_helper_check_crtc_primary_plane(crtc_state); >> + if (ret) >> + return ret; >> + >> +out: >> + return drm_atomic_add_affected_planes(state, crtc); >> +} > > See arcpgu on a possible style improvement. > Will do, thanks > Best regards > Thomas > [ ... ]