[PATCH] drm/komeda: Take over EFI framebuffer properly
Steven Price
steven.price at arm.com
Wed Mar 15 11:15:28 UTC 2023
On 15/03/2023 11:10, Liviu Dudau wrote:
> 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.
Ah right, fair enough. Patrik pinged me privately too to look at this
and so I did a brief review and this looks like it solves a real issue.
But I agree if this can be solved without d71 knowing about kms that
would be much better. It's good to know the conversation is happening!
Thanks,
Steve
> 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_*/
>>
>
More information about the dri-devel
mailing list