[PATCH] drm/komeda: Take over EFI framebuffer properly
Steven Price
steven.price at arm.com
Wed Mar 15 09:34:37 UTC 2023
On 13/03/2023 10:22, patrik.berglund at arm.com wrote:
> From: Patrik Berglund <patrik.berglund at arm.com>
>
> The Arm Morello board EDK2 port already provides an EFI GOP display for
> Ceti/Cetus (Komeda) with more boards incoming.
> However, once the Komeda driver probes and takes over the hardware,
> it should take over the logical framebuffer as well, otherwise,
> the now-defunct GOP device hangs around and virtual console output
> inevitably disappears into the wrong place most of the time.
>
> We'll do this right before doing the SRST because that is the point
> when the GOP will stop working.
> The GOP might also fail because the encoder driver do things but this
> is better than nothing.
>
> Signed-off-by: Patrik Berglund <patrik.berglund at arm.com>
+CC the maintainers.
Looks right to me, hdlcd has something very similar.
Reviewed-by: Steven Price <steven.price at arm.com>
> ---
> drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c | 12 ++++++++++++
> drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 6 ++++++
> drivers/gpu/drm/arm/display/komeda/komeda_kms.h | 1 +
> 3 files changed, 19 insertions(+)
>
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index 6c56f5662bc7..72035af9bc5f 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -8,6 +8,7 @@
> #include <drm/drm_blend.h>
> #include <drm/drm_print.h>
> #include "d71_dev.h"
> +#include "komeda_kms.h"
> #include "malidp_io.h"
>
> static u64 get_lpu_event(struct d71_pipeline *d71_pipeline)
> @@ -310,6 +311,17 @@ static int d71_reset(struct d71_dev *d71)
> u32 __iomem *gcu = d71->gcu_addr;
> int ret;
>
> + /*
> + * If we are already running, the most likely reason is that the EFI left
> + * us running (GOP), so make sure to take over from simple framebuffer
> + * drivers.
> + */
> + if (malidp_read32(gcu, BLK_STATUS) & GCU_STATUS_ACTIVE) {
> + ret = komeda_kms_remove_framebuffers();
> + if (ret)
> + return ret;
> + }
> +
> malidp_write32(gcu, BLK_CONTROL, GCU_CONTROL_SRST);
>
> ret = dp_wait_cond(!(malidp_read32(gcu, BLK_CONTROL) & GCU_CONTROL_SRST),
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> index 62dc64550793..12af409aeabb 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> @@ -7,6 +7,7 @@
> #include <linux/component.h>
> #include <linux/interrupt.h>
>
> +#include <drm/drm_aperture.h>
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_drv.h>
> @@ -349,3 +350,8 @@ void komeda_kms_detach(struct komeda_kms_dev *kms)
> komeda_kms_cleanup_private_objs(kms);
> drm->dev_private = NULL;
> }
> +
> +int komeda_kms_remove_framebuffers(void)
> +{
> + return drm_aperture_remove_framebuffers(false, &komeda_kms_driver);
> +}
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> index 3a872c292091..1a43707ed68f 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.h
> @@ -187,5 +187,6 @@ void komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc,
>
> struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev);
> void komeda_kms_detach(struct komeda_kms_dev *kms);
> +int komeda_kms_remove_framebuffers(void);
>
> #endif /*_KOMEDA_KMS_H_*/
More information about the dri-devel
mailing list