[PATCH] drm/komeda: Take over EFI framebuffer properly
Liviu Dudau
liviu.dudau at arm.com
Wed Mar 15 11:10:44 UTC 2023
On Wed, Mar 15, 2023 at 09:34:37AM +0000, Steven Price wrote:
> 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>
Hi Steven,
Patrik contacted me privately and made me aware of the patch. I had a discussion
with him about the layering violation (d71 knowing about kms) and we came to the
conclusion that an additional patch is needed to re-order some code before this
one can go in. Patrik and/or I need to revive a test environment to check that
patch.
Best regards,
Liviu
>
> > ---
> > 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_*/
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
More information about the dri-devel
mailing list