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

drm/mgag200: Remove BMC output

Mgag200's BMC connector tracks the status of an underlying physical
connector and updates the BMC status accordingly. This functionality
works around GNOME's settings app, which cannot handle multiple
outputs on the same CRTC.

The workaround is now obsolete as the VGA-BMC connector handles BMC
support internally. Hence, remove the driver's code and the BMC output
entirely.

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

-140
-102
drivers/gpu/drm/mgag200/mgag200_bmc.c
··· 9 9 10 10 #include "mgag200_drv.h" 11 11 12 - static struct mgag200_bmc_connector *to_mgag200_bmc_connector(struct drm_connector *connector) 13 - { 14 - return container_of(connector, struct mgag200_bmc_connector, base); 15 - } 16 - 17 12 void mgag200_bmc_stop_scanout(struct mga_device *mdev) 18 13 { 19 14 u8 tmp; ··· 96 101 tmp = RREG8(DAC_DATA); 97 102 tmp &= ~0x10; 98 103 WREG_DAC(MGA1064_GEN_IO_DATA, tmp); 99 - } 100 - 101 - static const struct drm_encoder_funcs mgag200_bmc_encoder_funcs = { 102 - .destroy = drm_encoder_cleanup, 103 - }; 104 - 105 - static int mgag200_bmc_connector_helper_detect_ctx(struct drm_connector *connector, 106 - struct drm_modeset_acquire_ctx *ctx, 107 - bool force) 108 - { 109 - struct mgag200_bmc_connector *bmc_connector = to_mgag200_bmc_connector(connector); 110 - struct drm_connector *physical_connector = bmc_connector->physical_connector; 111 - 112 - /* 113 - * Most user-space compositors cannot handle more than one connected 114 - * connector per CRTC. Hence, we only mark the BMC as connected if the 115 - * physical connector is disconnected. If the physical connector's status 116 - * is connected or unknown, the BMC remains disconnected. This has no 117 - * effect on the output of the BMC. 118 - * 119 - * FIXME: Remove this logic once user-space compositors can handle more 120 - * than one connector per CRTC. The BMC should always be connected. 121 - */ 122 - 123 - if (physical_connector && physical_connector->status == connector_status_disconnected) 124 - return connector_status_connected; 125 - 126 - return connector_status_disconnected; 127 - } 128 - 129 - static int mgag200_bmc_connector_helper_get_modes(struct drm_connector *connector) 130 - { 131 - struct drm_device *dev = connector->dev; 132 - struct mga_device *mdev = to_mga_device(dev); 133 - const struct mgag200_device_info *minfo = mdev->info; 134 - 135 - return drm_add_modes_noedid(connector, minfo->max_hdisplay, minfo->max_vdisplay); 136 - } 137 - 138 - static const struct drm_connector_helper_funcs mgag200_bmc_connector_helper_funcs = { 139 - .get_modes = mgag200_bmc_connector_helper_get_modes, 140 - .detect_ctx = mgag200_bmc_connector_helper_detect_ctx, 141 - }; 142 - 143 - static const struct drm_connector_funcs mgag200_bmc_connector_funcs = { 144 - .reset = drm_atomic_helper_connector_reset, 145 - .fill_modes = drm_helper_probe_single_connector_modes, 146 - .destroy = drm_connector_cleanup, 147 - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 148 - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 149 - }; 150 - 151 - static int mgag200_bmc_connector_init(struct drm_device *dev, 152 - struct mgag200_bmc_connector *bmc_connector, 153 - struct drm_connector *physical_connector) 154 - { 155 - struct drm_connector *connector = &bmc_connector->base; 156 - int ret; 157 - 158 - ret = drm_connector_init(dev, connector, &mgag200_bmc_connector_funcs, 159 - DRM_MODE_CONNECTOR_VIRTUAL); 160 - if (ret) 161 - return ret; 162 - drm_connector_helper_add(connector, &mgag200_bmc_connector_helper_funcs); 163 - 164 - bmc_connector->physical_connector = physical_connector; 165 - 166 - return 0; 167 - } 168 - 169 - int mgag200_bmc_output_init(struct mga_device *mdev, struct drm_connector *physical_connector) 170 - { 171 - struct drm_device *dev = &mdev->base; 172 - struct drm_crtc *crtc = &mdev->crtc; 173 - struct drm_encoder *encoder; 174 - struct mgag200_bmc_connector *bmc_connector; 175 - struct drm_connector *connector; 176 - int ret; 177 - 178 - encoder = &mdev->output.bmc.encoder; 179 - ret = drm_encoder_init(dev, encoder, &mgag200_bmc_encoder_funcs, 180 - DRM_MODE_ENCODER_VIRTUAL, NULL); 181 - if (ret) 182 - return ret; 183 - encoder->possible_crtcs = drm_crtc_mask(crtc); 184 - 185 - bmc_connector = &mdev->output.bmc.bmc_connector; 186 - ret = mgag200_bmc_connector_init(dev, bmc_connector, physical_connector); 187 - if (ret) 188 - return ret; 189 - connector = &bmc_connector->base; 190 - 191 - ret = drm_connector_attach_encoder(connector, encoder); 192 - if (ret) 193 - return ret; 194 - 195 - return 0; 196 104 }
-10
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 188 188 return container_of(base, struct mgag200_crtc_state, base); 189 189 } 190 190 191 - struct mgag200_bmc_connector { 192 - struct drm_connector base; 193 - struct drm_connector *physical_connector; 194 - }; 195 - 196 191 enum mga_type { 197 192 G200_PCI, 198 193 G200_AGP, ··· 278 283 struct drm_encoder encoder; 279 284 struct drm_connector connector; 280 285 } vga; 281 - struct { 282 - struct drm_encoder encoder; 283 - struct mgag200_bmc_connector bmc_connector; 284 - } bmc; 285 286 } output; 286 287 }; 287 288 ··· 437 446 /* mgag200_bmc.c */ 438 447 void mgag200_bmc_stop_scanout(struct mga_device *mdev); 439 448 void mgag200_bmc_start_scanout(struct mga_device *mdev); 440 - int mgag200_bmc_output_init(struct mga_device *mdev, struct drm_connector *physical_connector); 441 449 442 450 #endif /* __MGAG200_DRV_H__ */
-4
drivers/gpu/drm/mgag200/mgag200_g200eh.c
··· 219 219 if (ret) 220 220 return ret; 221 221 222 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 223 - if (ret) 224 - return ret; 225 - 226 222 return 0; 227 223 } 228 224
-4
drivers/gpu/drm/mgag200/mgag200_g200eh3.c
··· 123 123 if (ret) 124 124 return ret; 125 125 126 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 127 - if (ret) 128 - return ret; 129 - 130 126 return 0; 131 127 } 132 128
-4
drivers/gpu/drm/mgag200/mgag200_g200er.c
··· 259 259 if (ret) 260 260 return ret; 261 261 262 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 263 - if (ret) 264 - return ret; 265 - 266 262 return 0; 267 263 } 268 264
-4
drivers/gpu/drm/mgag200/mgag200_g200ev.c
··· 260 260 if (ret) 261 261 return ret; 262 262 263 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 264 - if (ret) 265 - return ret; 266 - 267 263 return 0; 268 264 } 269 265
-4
drivers/gpu/drm/mgag200/mgag200_g200ew3.c
··· 132 132 if (ret) 133 133 return ret; 134 134 135 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 136 - if (ret) 137 - return ret; 138 - 139 135 return 0; 140 136 } 141 137
-4
drivers/gpu/drm/mgag200/mgag200_g200se.c
··· 391 391 if (ret) 392 392 return ret; 393 393 394 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 395 - if (ret) 396 - return ret; 397 - 398 394 return 0; 399 395 } 400 396
-4
drivers/gpu/drm/mgag200/mgag200_g200wb.c
··· 266 266 if (ret) 267 267 return ret; 268 268 269 - ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector); 270 - if (ret) 271 - return ret; 272 - 273 269 return 0; 274 270 } 275 271