[PATCH 06/10] drm/gma500: Move GTT resume logic out of psb_gtt_init()

Thomas Zimmermann tzimmermann at suse.de
Tue Mar 8 19:40:10 UTC 2022


Hi

Am 08.03.22 um 13:07 schrieb Patrik Jakobsson:
> On Tue, Mar 8, 2022 at 9:48 AM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>>
>> Hi Sam and Patrik
>>
>> Am 07.03.22 um 22:02 schrieb Patrik Jakobsson:
>>> On Mon, Mar 7, 2022 at 8:07 PM Sam Ravnborg <sam at ravnborg.org> wrote:
>>>>
>>>> Hi Thomas,
>>>>
>>>> One comment below.
>>>>
>>>> On Sun, Mar 06, 2022 at 09:36:15PM +0100, Thomas Zimmermann wrote:
>>>>> The current implementation of psb_gtt_init() also does resume
>>>>> handling. Move the resume code into its own helper.
>>>>>
>>>>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
>>>>> ---
>>>>>    drivers/gpu/drm/gma500/gtt.c     | 122 ++++++++++++++++++++++++++-----
>>>>>    drivers/gpu/drm/gma500/gtt.h     |   2 +-
>>>>>    drivers/gpu/drm/gma500/psb_drv.c |   2 +-
>>>>>    3 files changed, 104 insertions(+), 22 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c
>>>>> index acd50ee26b03..43ad3ec38c80 100644
>>>>> --- a/drivers/gpu/drm/gma500/gtt.c
>>>>> +++ b/drivers/gpu/drm/gma500/gtt.c
>>>>> @@ -209,7 +209,7 @@ static void psb_gtt_populate_resources(struct drm_psb_private *pdev)
>>>>>         drm_dbg(dev, "Restored %u of %u gtt ranges (%u KB)", restored, total, (size / 1024));
>>>>>    }
>>>>>
>>>>> -int psb_gtt_init(struct drm_device *dev, int resume)
>>>>> +int psb_gtt_init(struct drm_device *dev)
>>>>>    {
>>>>>         struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>>>>>         struct pci_dev *pdev = to_pci_dev(dev->dev);
>>>>> @@ -218,10 +218,8 @@ int psb_gtt_init(struct drm_device *dev, int resume)
>>>>>         struct psb_gtt *pg;
>>>>>         int ret = 0;
>>>>>
>>>>> -     if (!resume) {
>>>>> -             mutex_init(&dev_priv->gtt_mutex);
>>>>> -             mutex_init(&dev_priv->mmap_mutex);
>>>>> -     }
>>>>> +     mutex_init(&dev_priv->gtt_mutex);
>>>>> +     mutex_init(&dev_priv->mmap_mutex);
>>>>>
>>>>>         pg = &dev_priv->gtt;
>>>>>
>>>>> @@ -290,13 +288,6 @@ int psb_gtt_init(struct drm_device *dev, int resume)
>>>>>         dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n",
>>>>>                         dev_priv->stolen_base, vram_stolen_size / 1024);
>>>>>
>>>>> -     if (resume && (gtt_pages != pg->gtt_pages) &&
>>>>> -         (stolen_size != pg->stolen_size)) {
>>>>> -             dev_err(dev->dev, "GTT resume error.\n");
>>>>> -             ret = -EINVAL;
>>>>> -             goto out_err;
>>>>> -     }
>>>>> -
>>>>>         pg->gtt_pages = gtt_pages;
>>>>>         pg->stolen_size = stolen_size;
>>>>>         dev_priv->vram_stolen_size = vram_stolen_size;
>>>>> @@ -304,19 +295,14 @@ int psb_gtt_init(struct drm_device *dev, int resume)
>>>>>         /*
>>>>>          *      Map the GTT and the stolen memory area
>>>>>          */
>>>>> -     if (!resume)
>>>>> -             dev_priv->gtt_map = ioremap(pg->gtt_phys_start,
>>>>> -                                             gtt_pages << PAGE_SHIFT);
>>>>> +     dev_priv->gtt_map = ioremap(pg->gtt_phys_start, gtt_pages << PAGE_SHIFT);
>>>>>         if (!dev_priv->gtt_map) {
>>>>>                 dev_err(dev->dev, "Failure to map gtt.\n");
>>>>>                 ret = -ENOMEM;
>>>>>                 goto out_err;
>>>>>         }
>>>>>
>>>>> -     if (!resume)
>>>>> -             dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base,
>>>>> -                                              stolen_size);
>>>>> -
>>>>> +     dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size);
>>>>>         if (!dev_priv->vram_addr) {
>>>>>                 dev_err(dev->dev, "Failure to map stolen base.\n");
>>>>>                 ret = -ENOMEM;
>>>>> @@ -333,11 +319,107 @@ int psb_gtt_init(struct drm_device *dev, int resume)
>>>>>         return ret;
>>>>>    }
>>>>>
>>>> The below is a lot of duplicated complex code.
>>>> Can you add one more helper for this?
>>>
>>
>> That makes a lot of sense.
>>
>>> I was thinking the same but figured it would be an easy follow up
>>> patch. But sure, why not fix it here already.
>>>
>>> While at it, the gtt enable/disable code could be put in helpers as well.
>>
>> Patrik, do you know why the code re-reads all these values during
>> resume? Do the values change?  The driver never seems to do anything
>> with the updated values. For example, it doesn't update the GTT mapping
>> if gtt_phys_start changes.  Can we remove all that code from the resume
>> function?
> 
> In theory these values can change if you hibernate, make changes in
> the bios and then resume. I think I've seen bioses that can change the
> stolen size and/or aperture size. Not sure if that would also change
> the value in eg. pge_ctl or the size of the gtt. I would have to do
> some testing on real hardware to figure this out.
> But as you say, the above scenario is already broken. For the time
> being, can we perhaps just fail gracefully?

Ah, thanks for the explanation. I'll leave the current logic as-is.

Best regards
Thomas


-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20220308/32828894/attachment-0001.sig>


More information about the dri-devel mailing list