Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mgag200: vga-bmc: Control BMC scanout from encoder

Move calls to stop and start BMC scanout from CRTC helpers to the
VGA-BMC encoder's atomic_disable and atomic_enable. Makes the BMC
scanout transparent to the CRTC.

DRM's atomic helpers call an encoder's atomic_disable and atomic_enable
helpers for all enabled encoders. The BMC stops scanning out the VGA
signal if modeset disables the VGA encoder, and starts scanning out
if the modeset enables the VGA encoder.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240805130622.63458-5-tzimmermann@suse.de

+20 -15
-3
drivers/gpu/drm/mgag200/mgag200_g200er.c
··· 207 207 208 208 mgag200_enable_display(mdev); 209 209 210 - if (mdev->info->sync_bmc) 211 - mgag200_bmc_start_scanout(mdev); 212 - 213 210 drm_crtc_vblank_on(crtc); 214 211 } 215 212
-3
drivers/gpu/drm/mgag200/mgag200_g200ev.c
··· 208 208 209 209 mgag200_enable_display(mdev); 210 210 211 - if (mdev->info->sync_bmc) 212 - mgag200_bmc_start_scanout(mdev); 213 - 214 211 drm_crtc_vblank_on(crtc); 215 212 } 216 213
-3
drivers/gpu/drm/mgag200/mgag200_g200se.c
··· 339 339 340 340 mgag200_enable_display(mdev); 341 341 342 - if (mdev->info->sync_bmc) 343 - mgag200_bmc_start_scanout(mdev); 344 - 345 342 drm_crtc_vblank_on(crtc); 346 343 } 347 344
-6
drivers/gpu/drm/mgag200/mgag200_mode.c
··· 693 693 694 694 mgag200_enable_display(mdev); 695 695 696 - if (mdev->info->sync_bmc) 697 - mgag200_bmc_start_scanout(mdev); 698 - 699 696 drm_crtc_vblank_on(crtc); 700 697 } 701 698 ··· 701 704 struct mga_device *mdev = to_mga_device(crtc->dev); 702 705 703 706 drm_crtc_vblank_off(crtc); 704 - 705 - if (mdev->info->sync_bmc) 706 - mgag200_bmc_stop_scanout(mdev); 707 707 708 708 mgag200_disable_display(mdev); 709 709 }
+20
drivers/gpu/drm/mgag200/mgag200_vga_bmc.c
··· 8 8 #include "mgag200_ddc.h" 9 9 #include "mgag200_drv.h" 10 10 11 + static void mgag200_vga_bmc_encoder_atomic_disable(struct drm_encoder *encoder, 12 + struct drm_atomic_state *state) 13 + { 14 + struct mga_device *mdev = to_mga_device(encoder->dev); 15 + 16 + if (mdev->info->sync_bmc) 17 + mgag200_bmc_stop_scanout(mdev); 18 + } 19 + 20 + static void mgag200_vga_bmc_encoder_atomic_enable(struct drm_encoder *encoder, 21 + struct drm_atomic_state *state) 22 + { 23 + struct mga_device *mdev = to_mga_device(encoder->dev); 24 + 25 + if (mdev->info->sync_bmc) 26 + mgag200_bmc_start_scanout(mdev); 27 + } 28 + 11 29 static int mgag200_vga_bmc_encoder_atomic_check(struct drm_encoder *encoder, 12 30 struct drm_crtc_state *new_crtc_state, 13 31 struct drm_connector_state *new_connector_state) ··· 39 21 } 40 22 41 23 static const struct drm_encoder_helper_funcs mgag200_dac_encoder_helper_funcs = { 24 + .atomic_disable = mgag200_vga_bmc_encoder_atomic_disable, 25 + .atomic_enable = mgag200_vga_bmc_encoder_atomic_enable, 42 26 .atomic_check = mgag200_vga_bmc_encoder_atomic_check, 43 27 }; 44 28