drm/mgag200: Remove BMC output
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 5 Aug 2024 13:06:01 +0000 (15:06 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 9 Aug 2024 06:13:48 +0000 (08:13 +0200)
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
drivers/gpu/drm/mgag200/mgag200_bmc.c
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_g200eh.c
drivers/gpu/drm/mgag200/mgag200_g200eh3.c
drivers/gpu/drm/mgag200/mgag200_g200er.c
drivers/gpu/drm/mgag200/mgag200_g200ev.c
drivers/gpu/drm/mgag200/mgag200_g200ew3.c
drivers/gpu/drm/mgag200/mgag200_g200se.c
drivers/gpu/drm/mgag200/mgag200_g200wb.c

index 45e35dffb3ea864972527fab93e854c11b2394f4..a689c71ff1653d621e1ec197aba9b96cdd9ae1b6 100644 (file)
@@ -9,11 +9,6 @@
 
 #include "mgag200_drv.h"
 
-static struct mgag200_bmc_connector *to_mgag200_bmc_connector(struct drm_connector *connector)
-{
-       return container_of(connector, struct mgag200_bmc_connector, base);
-}
-
 void mgag200_bmc_stop_scanout(struct mga_device *mdev)
 {
        u8 tmp;
@@ -102,100 +97,3 @@ void mgag200_bmc_start_scanout(struct mga_device *mdev)
        tmp &= ~0x10;
        WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
 }
-
-static const struct drm_encoder_funcs mgag200_bmc_encoder_funcs = {
-       .destroy = drm_encoder_cleanup,
-};
-
-static int mgag200_bmc_connector_helper_detect_ctx(struct drm_connector *connector,
-                                                  struct drm_modeset_acquire_ctx *ctx,
-                                                  bool force)
-{
-       struct mgag200_bmc_connector *bmc_connector = to_mgag200_bmc_connector(connector);
-       struct drm_connector *physical_connector = bmc_connector->physical_connector;
-
-       /*
-        * Most user-space compositors cannot handle more than one connected
-        * connector per CRTC. Hence, we only mark the BMC as connected if the
-        * physical connector is disconnected. If the physical connector's status
-        * is connected or unknown, the BMC remains disconnected. This has no
-        * effect on the output of the BMC.
-        *
-        * FIXME: Remove this logic once user-space compositors can handle more
-        *        than one connector per CRTC. The BMC should always be connected.
-        */
-
-       if (physical_connector && physical_connector->status == connector_status_disconnected)
-               return connector_status_connected;
-
-       return connector_status_disconnected;
-}
-
-static int mgag200_bmc_connector_helper_get_modes(struct drm_connector *connector)
-{
-       struct drm_device *dev = connector->dev;
-       struct mga_device *mdev = to_mga_device(dev);
-       const struct mgag200_device_info *minfo = mdev->info;
-
-       return drm_add_modes_noedid(connector, minfo->max_hdisplay, minfo->max_vdisplay);
-}
-
-static const struct drm_connector_helper_funcs mgag200_bmc_connector_helper_funcs = {
-       .get_modes = mgag200_bmc_connector_helper_get_modes,
-       .detect_ctx = mgag200_bmc_connector_helper_detect_ctx,
-};
-
-static const struct drm_connector_funcs mgag200_bmc_connector_funcs = {
-       .reset = drm_atomic_helper_connector_reset,
-       .fill_modes = drm_helper_probe_single_connector_modes,
-       .destroy = drm_connector_cleanup,
-       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static int mgag200_bmc_connector_init(struct drm_device *dev,
-                                     struct mgag200_bmc_connector *bmc_connector,
-                                     struct drm_connector *physical_connector)
-{
-       struct drm_connector *connector = &bmc_connector->base;
-       int ret;
-
-       ret = drm_connector_init(dev, connector, &mgag200_bmc_connector_funcs,
-                                DRM_MODE_CONNECTOR_VIRTUAL);
-       if (ret)
-               return ret;
-       drm_connector_helper_add(connector, &mgag200_bmc_connector_helper_funcs);
-
-       bmc_connector->physical_connector = physical_connector;
-
-       return 0;
-}
-
-int mgag200_bmc_output_init(struct mga_device *mdev, struct drm_connector *physical_connector)
-{
-       struct drm_device *dev = &mdev->base;
-       struct drm_crtc *crtc = &mdev->crtc;
-       struct drm_encoder *encoder;
-       struct mgag200_bmc_connector *bmc_connector;
-       struct drm_connector *connector;
-       int ret;
-
-       encoder = &mdev->output.bmc.encoder;
-       ret = drm_encoder_init(dev, encoder, &mgag200_bmc_encoder_funcs,
-                              DRM_MODE_ENCODER_VIRTUAL, NULL);
-       if (ret)
-               return ret;
-       encoder->possible_crtcs = drm_crtc_mask(crtc);
-
-       bmc_connector = &mdev->output.bmc.bmc_connector;
-       ret = mgag200_bmc_connector_init(dev, bmc_connector, physical_connector);
-       if (ret)
-               return ret;
-       connector = &bmc_connector->base;
-
-       ret = drm_connector_attach_encoder(connector, encoder);
-       if (ret)
-               return ret;
-
-       return 0;
-}
index 1301d3066a49aadf1b17817d6d9d5a869acb090a..4760ba92871bb129c386411f327d611372771404 100644 (file)
@@ -188,11 +188,6 @@ static inline struct mgag200_crtc_state *to_mgag200_crtc_state(struct drm_crtc_s
        return container_of(base, struct mgag200_crtc_state, base);
 }
 
-struct mgag200_bmc_connector {
-       struct drm_connector base;
-       struct drm_connector *physical_connector;
-};
-
 enum mga_type {
        G200_PCI,
        G200_AGP,
@@ -283,10 +278,6 @@ struct mga_device {
                        struct drm_encoder encoder;
                        struct drm_connector connector;
                } vga;
-               struct {
-                       struct drm_encoder encoder;
-                       struct mgag200_bmc_connector bmc_connector;
-               } bmc;
        } output;
 };
 
@@ -446,6 +437,5 @@ int mgag200_vga_output_init(struct mga_device *mdev);
 /* mgag200_bmc.c */
 void mgag200_bmc_stop_scanout(struct mga_device *mdev);
 void mgag200_bmc_start_scanout(struct mga_device *mdev);
-int mgag200_bmc_output_init(struct mga_device *mdev, struct drm_connector *physical_connector);
 
 #endif                         /* __MGAG200_DRV_H__ */
index 1824c0e59c030ea93b04c17b3f6ba256daf8fdd0..09ced65c1d2fbb32febed5096aa892a1c756fe13 100644 (file)
@@ -219,10 +219,6 @@ static int mgag200_g200eh_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index 9cb2a165e4607b15bb313db75dbac231b996647c..5daa469137bd30add967f790bd66dccc65e5fdd3 100644 (file)
@@ -123,10 +123,6 @@ static int mgag200_g200eh3_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index b99b308a7e5454b06356ad5a17d13683edd5752e..09cfffafe1306cb5ce5932b89742ca742fbef129 100644 (file)
@@ -259,10 +259,6 @@ static int mgag200_g200er_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index 717e4357adcca3937e2dd9b2e3bf6d6f85683ca6..3d48baa91d8b73ded496bd97abbabad147c222a6 100644 (file)
@@ -260,10 +260,6 @@ static int mgag200_g200ev_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index 7a2806be2d2ef38cda282239931d9744a0c3632f..dabc778e64e8e5a9eb1bcc314e427948345c8d66 100644 (file)
@@ -132,10 +132,6 @@ static int mgag200_g200ew3_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index 0db7e14e3328d067b55898596e09717d0a8a13d8..9dcbe830427180076ad5ae76ac6837f4dade0722 100644 (file)
@@ -391,10 +391,6 @@ static int mgag200_g200se_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }
 
index cb971ca5e3064f0920cc43f04cca23f299467210..83a24aedbf2f3bd477dc6e81dce5e0f341f6b1c3 100644 (file)
@@ -266,10 +266,6 @@ static int mgag200_g200wb_pipeline_init(struct mga_device *mdev)
        if (ret)
                return ret;
 
-       ret = mgag200_bmc_output_init(mdev, &mdev->output.vga.connector);
-       if (ret)
-               return ret;
-
        return 0;
 }