Message ID | 20240710084609.354578-3-tzimmermann@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/mgag200: Control VIDRST and BMC from CRTC | expand |
On 10/07/2024 10:42, Thomas Zimmermann wrote: > The callbacks disable_vidrst and enable_vidrst are obsolete. Remove > the fields from struct mgag200_device_funcs. Instead call their > implementations directly of the field 'has_vidrst' has been set in > struct mgag200_device_info. > > Also change the logic slightly. The BMC used to start and stop scanout > during the CRTC's atomic_enable and atomic_disable. Plane updates were > done while the BMC scanned out the display. Now only stop once in > atomic_disable at the beginning of a modeset and then restart the > scanout at the end of a modeset in atomic_enable. While the modeset > takes place, the BMC does not scanout at all. Thanks, it looks good to me. Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > drivers/gpu/drm/mgag200/mgag200_drv.h | 12 ------------ > drivers/gpu/drm/mgag200/mgag200_g200er.c | 7 ++----- > drivers/gpu/drm/mgag200/mgag200_g200ev.c | 7 ++----- > drivers/gpu/drm/mgag200/mgag200_g200ew3.c | 2 -- > drivers/gpu/drm/mgag200/mgag200_g200se.c | 7 ++----- > drivers/gpu/drm/mgag200/mgag200_g200wb.c | 2 -- > drivers/gpu/drm/mgag200/mgag200_mode.c | 15 ++++----------- > 7 files changed, 10 insertions(+), 42 deletions(-) > > diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h > index 4b75613de882..4a46c8c006c8 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_drv.h > +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h > @@ -247,18 +247,6 @@ struct mgag200_device_info { > } > > struct mgag200_device_funcs { > - /* > - * Disables an external reset source (i.e., BMC) before programming > - * a new display mode. > - */ > - void (*disable_vidrst)(struct mga_device *mdev); > - > - /* > - * Enables an external reset source (i.e., BMC) after programming > - * a new display mode. > - */ > - void (*enable_vidrst)(struct mga_device *mdev); > - > /* > * Validate that the given state can be programmed into PIXPLLC. On > * success, the calculated parameters should be stored in the CRTC's > diff --git a/drivers/gpu/drm/mgag200/mgag200_g200er.c b/drivers/gpu/drm/mgag200/mgag200_g200er.c > index abfbed6ec390..b3bb3e9fb0d1 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_g200er.c > +++ b/drivers/gpu/drm/mgag200/mgag200_g200er.c > @@ -191,9 +191,6 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc, > struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); > const struct drm_format_info *format = mgag200_crtc_state->format; > > - if (funcs->disable_vidrst) > - funcs->disable_vidrst(mdev); > - > mgag200_set_format_regs(mdev, format); > mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); > > @@ -209,8 +206,8 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc, > > mgag200_enable_display(mdev); > > - if (funcs->enable_vidrst) > - funcs->enable_vidrst(mdev); > + if (mdev->info->has_vidrst) > + mgag200_bmc_enable_vidrst(mdev); > } > > static const struct drm_crtc_helper_funcs mgag200_g200er_crtc_helper_funcs = { > diff --git a/drivers/gpu/drm/mgag200/mgag200_g200ev.c b/drivers/gpu/drm/mgag200/mgag200_g200ev.c > index acc99999e2b5..3ac0a508e2c5 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_g200ev.c > +++ b/drivers/gpu/drm/mgag200/mgag200_g200ev.c > @@ -192,9 +192,6 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc, > struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); > const struct drm_format_info *format = mgag200_crtc_state->format; > > - if (funcs->disable_vidrst) > - funcs->disable_vidrst(mdev); > - > mgag200_set_format_regs(mdev, format); > mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); > > @@ -210,8 +207,8 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc, > > mgag200_enable_display(mdev); > > - if (funcs->enable_vidrst) > - funcs->enable_vidrst(mdev); > + if (mdev->info->has_vidrst) > + mgag200_bmc_enable_vidrst(mdev); > } > > static const struct drm_crtc_helper_funcs mgag200_g200ev_crtc_helper_funcs = { > diff --git a/drivers/gpu/drm/mgag200/mgag200_g200ew3.c b/drivers/gpu/drm/mgag200/mgag200_g200ew3.c > index 839401e8b465..265f3e95830a 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_g200ew3.c > +++ b/drivers/gpu/drm/mgag200/mgag200_g200ew3.c > @@ -146,8 +146,6 @@ static const struct mgag200_device_info mgag200_g200ew3_device_info = > MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, 0, 1, false); > > static const struct mgag200_device_funcs mgag200_g200ew3_device_funcs = { > - .disable_vidrst = mgag200_bmc_disable_vidrst, > - .enable_vidrst = mgag200_bmc_enable_vidrst, > .pixpllc_atomic_check = mgag200_g200ew3_pixpllc_atomic_check, > .pixpllc_atomic_update = mgag200_g200wb_pixpllc_atomic_update, // same as G200WB > }; > diff --git a/drivers/gpu/drm/mgag200/mgag200_g200se.c b/drivers/gpu/drm/mgag200/mgag200_g200se.c > index be4e124102c6..7a8099eb100c 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_g200se.c > +++ b/drivers/gpu/drm/mgag200/mgag200_g200se.c > @@ -323,9 +323,6 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc, > struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); > const struct drm_format_info *format = mgag200_crtc_state->format; > > - if (funcs->disable_vidrst) > - funcs->disable_vidrst(mdev); > - > mgag200_set_format_regs(mdev, format); > mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); > > @@ -341,8 +338,8 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc, > > mgag200_enable_display(mdev); > > - if (funcs->enable_vidrst) > - funcs->enable_vidrst(mdev); > + if (mdev->info->has_vidrst) > + mgag200_bmc_enable_vidrst(mdev); > } > > static const struct drm_crtc_helper_funcs mgag200_g200se_crtc_helper_funcs = { > diff --git a/drivers/gpu/drm/mgag200/mgag200_g200wb.c b/drivers/gpu/drm/mgag200/mgag200_g200wb.c > index 835df0f4fc13..e25477347c3e 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_g200wb.c > +++ b/drivers/gpu/drm/mgag200/mgag200_g200wb.c > @@ -280,8 +280,6 @@ static const struct mgag200_device_info mgag200_g200wb_device_info = > MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, 0, 1, false); > > static const struct mgag200_device_funcs mgag200_g200wb_device_funcs = { > - .disable_vidrst = mgag200_bmc_disable_vidrst, > - .enable_vidrst = mgag200_bmc_enable_vidrst, > .pixpllc_atomic_check = mgag200_g200wb_pixpllc_atomic_check, > .pixpllc_atomic_update = mgag200_g200wb_pixpllc_atomic_update, > }; > diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c > index e746f365fecf..fcc10723d385 100644 > --- a/drivers/gpu/drm/mgag200/mgag200_mode.c > +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c > @@ -657,9 +657,6 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_ > struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); > const struct drm_format_info *format = mgag200_crtc_state->format; > > - if (funcs->disable_vidrst) > - funcs->disable_vidrst(mdev); > - > mgag200_set_format_regs(mdev, format); > mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); > > @@ -673,22 +670,18 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_ > > mgag200_enable_display(mdev); > > - if (funcs->enable_vidrst) > - funcs->enable_vidrst(mdev); > + if (mdev->info->has_vidrst) > + mgag200_bmc_enable_vidrst(mdev); > } > > void mgag200_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *old_state) > { > struct mga_device *mdev = to_mga_device(crtc->dev); > - const struct mgag200_device_funcs *funcs = mdev->funcs; > > - if (funcs->disable_vidrst) > - funcs->disable_vidrst(mdev); > + if (mdev->info->has_vidrst) > + mgag200_bmc_disable_vidrst(mdev); > > mgag200_disable_display(mdev); > - > - if (funcs->enable_vidrst) > - funcs->enable_vidrst(mdev); > } > > void mgag200_crtc_reset(struct drm_crtc *crtc)
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h index 4b75613de882..4a46c8c006c8 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.h +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h @@ -247,18 +247,6 @@ struct mgag200_device_info { } struct mgag200_device_funcs { - /* - * Disables an external reset source (i.e., BMC) before programming - * a new display mode. - */ - void (*disable_vidrst)(struct mga_device *mdev); - - /* - * Enables an external reset source (i.e., BMC) after programming - * a new display mode. - */ - void (*enable_vidrst)(struct mga_device *mdev); - /* * Validate that the given state can be programmed into PIXPLLC. On * success, the calculated parameters should be stored in the CRTC's diff --git a/drivers/gpu/drm/mgag200/mgag200_g200er.c b/drivers/gpu/drm/mgag200/mgag200_g200er.c index abfbed6ec390..b3bb3e9fb0d1 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200er.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200er.c @@ -191,9 +191,6 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); const struct drm_format_info *format = mgag200_crtc_state->format; - if (funcs->disable_vidrst) - funcs->disable_vidrst(mdev); - mgag200_set_format_regs(mdev, format); mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); @@ -209,8 +206,8 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_enable_display(mdev); - if (funcs->enable_vidrst) - funcs->enable_vidrst(mdev); + if (mdev->info->has_vidrst) + mgag200_bmc_enable_vidrst(mdev); } static const struct drm_crtc_helper_funcs mgag200_g200er_crtc_helper_funcs = { diff --git a/drivers/gpu/drm/mgag200/mgag200_g200ev.c b/drivers/gpu/drm/mgag200/mgag200_g200ev.c index acc99999e2b5..3ac0a508e2c5 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200ev.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200ev.c @@ -192,9 +192,6 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); const struct drm_format_info *format = mgag200_crtc_state->format; - if (funcs->disable_vidrst) - funcs->disable_vidrst(mdev); - mgag200_set_format_regs(mdev, format); mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); @@ -210,8 +207,8 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_enable_display(mdev); - if (funcs->enable_vidrst) - funcs->enable_vidrst(mdev); + if (mdev->info->has_vidrst) + mgag200_bmc_enable_vidrst(mdev); } static const struct drm_crtc_helper_funcs mgag200_g200ev_crtc_helper_funcs = { diff --git a/drivers/gpu/drm/mgag200/mgag200_g200ew3.c b/drivers/gpu/drm/mgag200/mgag200_g200ew3.c index 839401e8b465..265f3e95830a 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200ew3.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200ew3.c @@ -146,8 +146,6 @@ static const struct mgag200_device_info mgag200_g200ew3_device_info = MGAG200_DEVICE_INFO_INIT(2048, 2048, 0, true, 0, 1, false); static const struct mgag200_device_funcs mgag200_g200ew3_device_funcs = { - .disable_vidrst = mgag200_bmc_disable_vidrst, - .enable_vidrst = mgag200_bmc_enable_vidrst, .pixpllc_atomic_check = mgag200_g200ew3_pixpllc_atomic_check, .pixpllc_atomic_update = mgag200_g200wb_pixpllc_atomic_update, // same as G200WB }; diff --git a/drivers/gpu/drm/mgag200/mgag200_g200se.c b/drivers/gpu/drm/mgag200/mgag200_g200se.c index be4e124102c6..7a8099eb100c 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200se.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200se.c @@ -323,9 +323,6 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); const struct drm_format_info *format = mgag200_crtc_state->format; - if (funcs->disable_vidrst) - funcs->disable_vidrst(mdev); - mgag200_set_format_regs(mdev, format); mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); @@ -341,8 +338,8 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc, mgag200_enable_display(mdev); - if (funcs->enable_vidrst) - funcs->enable_vidrst(mdev); + if (mdev->info->has_vidrst) + mgag200_bmc_enable_vidrst(mdev); } static const struct drm_crtc_helper_funcs mgag200_g200se_crtc_helper_funcs = { diff --git a/drivers/gpu/drm/mgag200/mgag200_g200wb.c b/drivers/gpu/drm/mgag200/mgag200_g200wb.c index 835df0f4fc13..e25477347c3e 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200wb.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200wb.c @@ -280,8 +280,6 @@ static const struct mgag200_device_info mgag200_g200wb_device_info = MGAG200_DEVICE_INFO_INIT(1280, 1024, 31877, true, 0, 1, false); static const struct mgag200_device_funcs mgag200_g200wb_device_funcs = { - .disable_vidrst = mgag200_bmc_disable_vidrst, - .enable_vidrst = mgag200_bmc_enable_vidrst, .pixpllc_atomic_check = mgag200_g200wb_pixpllc_atomic_check, .pixpllc_atomic_update = mgag200_g200wb_pixpllc_atomic_update, }; diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index e746f365fecf..fcc10723d385 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -657,9 +657,6 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_ struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state); const struct drm_format_info *format = mgag200_crtc_state->format; - if (funcs->disable_vidrst) - funcs->disable_vidrst(mdev); - mgag200_set_format_regs(mdev, format); mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); @@ -673,22 +670,18 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_ mgag200_enable_display(mdev); - if (funcs->enable_vidrst) - funcs->enable_vidrst(mdev); + if (mdev->info->has_vidrst) + mgag200_bmc_enable_vidrst(mdev); } void mgag200_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *old_state) { struct mga_device *mdev = to_mga_device(crtc->dev); - const struct mgag200_device_funcs *funcs = mdev->funcs; - if (funcs->disable_vidrst) - funcs->disable_vidrst(mdev); + if (mdev->info->has_vidrst) + mgag200_bmc_disable_vidrst(mdev); mgag200_disable_display(mdev); - - if (funcs->enable_vidrst) - funcs->enable_vidrst(mdev); } void mgag200_crtc_reset(struct drm_crtc *crtc)
The callbacks disable_vidrst and enable_vidrst are obsolete. Remove the fields from struct mgag200_device_funcs. Instead call their implementations directly of the field 'has_vidrst' has been set in struct mgag200_device_info. Also change the logic slightly. The BMC used to start and stop scanout during the CRTC's atomic_enable and atomic_disable. Plane updates were done while the BMC scanned out the display. Now only stop once in atomic_disable at the beginning of a modeset and then restart the scanout at the end of a modeset in atomic_enable. While the modeset takes place, the BMC does not scanout at all. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/mgag200/mgag200_drv.h | 12 ------------ drivers/gpu/drm/mgag200/mgag200_g200er.c | 7 ++----- drivers/gpu/drm/mgag200/mgag200_g200ev.c | 7 ++----- drivers/gpu/drm/mgag200/mgag200_g200ew3.c | 2 -- drivers/gpu/drm/mgag200/mgag200_g200se.c | 7 ++----- drivers/gpu/drm/mgag200/mgag200_g200wb.c | 2 -- drivers/gpu/drm/mgag200/mgag200_mode.c | 15 ++++----------- 7 files changed, 10 insertions(+), 42 deletions(-)