All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Deucher <alexdeucher-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Andrey Grodzovsky <andrey.grodzovsky-5C7GfCeVMHo@public.gmane.org>
Cc: Alex Deucher <alexander.deucher-5C7GfCeVMHo@public.gmane.org>,
	"Ranjbar, Ramin" <ramin.ranjbar-5C7GfCeVMHo@public.gmane.org>,
	Huang Rui <ray.huang-5C7GfCeVMHo@public.gmane.org>,
	Christian Koenig <christian.koenig-5C7GfCeVMHo@public.gmane.org>,
	amd-gfx list
	<amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>
Subject: Re: [PATCH v4 2/2] drm/amdgpu: Free VGA stolen memory as soon as possible.
Date: Thu, 12 Apr 2018 00:32:17 -0400	[thread overview]
Message-ID: <CADnq5_PssA-Cz5q1Z-na88REbLn6pzz5T2eby12LUoyTj5F9dQ@mail.gmail.com> (raw)
In-Reply-To: <1523506110-14002-2-git-send-email-andrey.grodzovsky-5C7GfCeVMHo@public.gmane.org>

On Thu, Apr 12, 2018 at 12:08 AM, Andrey Grodzovsky
<andrey.grodzovsky@amd.com> wrote:
> Reserved VRAM is used to avoid overriding pre OS FB.
> Once our display stack takes over we don't need the reserved
> VRAM anymore.
>
> v2:
> Remove comment, we know actually why we need to reserve the stolen VRAM.
> Fix return type for amdgpu_ttm_late_init.
> v3:
> Return 0 in amdgpu_bo_late_init, rebase on changes to previous patch
> v4:
> Don't release stolen memory for GMC9 ASICs untill GART corruption
> on S3 resume is resolved.
>
> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

Looks like you used the original version of this patch as well.
Updated version here:
https://patchwork.freedesktop.org/patch/215567/
more comments below.

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |  7 +++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c    |  8 ++++++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h    |  1 +
>  drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c      |  2 ++
>  drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c      |  2 ++
>  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c      |  2 ++
>  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c      | 14 ++++++++++----
>  8 files changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index 9e23d6f..a160ef0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -852,6 +852,13 @@ int amdgpu_bo_init(struct amdgpu_device *adev)
>         return amdgpu_ttm_init(adev);
>  }
>
> +int amdgpu_bo_late_init(struct amdgpu_device *adev)
> +{
> +       amdgpu_ttm_late_init(adev);
> +
> +       return 0;
> +}
> +
>  void amdgpu_bo_fini(struct amdgpu_device *adev)
>  {
>         amdgpu_ttm_fini(adev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 3bee133..1e9fe85 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -251,6 +251,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
>  int amdgpu_bo_unpin(struct amdgpu_bo *bo);
>  int amdgpu_bo_evict_vram(struct amdgpu_device *adev);
>  int amdgpu_bo_init(struct amdgpu_device *adev);
> +int amdgpu_bo_late_init(struct amdgpu_device *adev);
>  void amdgpu_bo_fini(struct amdgpu_device *adev);
>  int amdgpu_bo_fbdev_mmap(struct amdgpu_bo *bo,
>                                 struct vm_area_struct *vma);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 0555821..7a608cf 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1517,14 +1517,18 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>         return 0;
>  }
>
> +void amdgpu_ttm_late_init(struct amdgpu_device *adev)
> +{
> +       if (adev->gmc.stolen_size)

no need to check for NULL here.  amdgpu_bo_free_kernel() will do the
right thing even if stolen_vga_memory is NULL.

> +               amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
> +}
> +
>  void amdgpu_ttm_fini(struct amdgpu_device *adev)
>  {
>         if (!adev->mman.initialized)
>                 return;
>
>         amdgpu_ttm_debugfs_fini(adev);
> -       if (adev->gmc.stolen_size)
> -               amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
>         amdgpu_ttm_fw_reserve_vram_fini(adev);
>         if (adev->mman.aper_base_kaddr)
>                 iounmap(adev->mman.aper_base_kaddr);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index 6ea7de8..e969c87 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -77,6 +77,7 @@ uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man);
>  uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man);
>
>  int amdgpu_ttm_init(struct amdgpu_device *adev);
> +void amdgpu_ttm_late_init(struct amdgpu_device *adev);
>  void amdgpu_ttm_fini(struct amdgpu_device *adev);
>  void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev,
>                                         bool enable);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> index 63f0b65..4a8f9bd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
> @@ -819,6 +819,8 @@ static int gmc_v6_0_late_init(void *handle)
>  {
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> +       amdgpu_bo_late_init(adev);
> +
>         if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
>                 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>         else
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> index 2deb5c9..189fdf9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
> @@ -958,6 +958,8 @@ static int gmc_v7_0_late_init(void *handle)
>  {
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> +       amdgpu_bo_late_init(adev);
> +
>         if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
>                 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>         else
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> index 04b00df..19e153f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
> @@ -1049,6 +1049,8 @@ static int gmc_v8_0_late_init(void *handle)
>  {
>         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
>
> +       amdgpu_bo_late_init(adev);
> +
>         if (amdgpu_vm_fault_stop != AMDGPU_VM_FAULT_STOP_ALWAYS)
>                 return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
>         else
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index 252a6c69..099e3ce5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -659,6 +659,16 @@ static int gmc_v9_0_late_init(void *handle)
>         unsigned i;
>         int r;
>
> +       /*
> +        * TODO:
> +        * Currently there is a bug where some memory client outside
> +        * of the driver writes to first 8M of VRAM on S3 resume,
> +        * this overrides GART which by default gets placed in first 8M and
> +        * causes VM_FAULTS once GTT is accessed.
> +        * Keep the stolen memory reservation until this solved.
> +        */
> +       /* amdgpu_bo_late_init(adev); /
> +

We still need to free this somewhere.  I'd suggest calling it in
gmc_v9_0_sw_fini() and add a comment there about moving it when we fix
the issue.

>         for(i = 0; i < adev->num_rings; ++i) {
>                 struct amdgpu_ring *ring = adev->rings[i];
>                 unsigned vmhub = ring->funcs->vmhub;
> @@ -884,10 +894,6 @@ static int gmc_v9_0_sw_init(void *handle)
>          */
>         adev->gmc.mc_mask = 0xffffffffffffULL; /* 48 bit MC */
>
> -       /*
> -        * It needs to reserve 8M stolen memory for vega10
> -        * TODO: Figure out how to avoid that...
> -        */
>         adev->gmc.stolen_size = gmc_v9_0_get_vbios_fb_size(adev);

We may also just want to return 8MB or 9MB temporarily in
gmc_v9_0_get_vbios_fb_size until we sort out the root cause of the S3
issue otherwise we're potentially wasting a lot more memory.

Alex


>
>         /* set DMA mask + need_dma32 flags.
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2018-04-12  4:32 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-12  4:08 [PATCH v4 1/2] drm/amdgpu/gmc: steal the appropriate amount of vram for fw hand-over Andrey Grodzovsky
     [not found] ` <1523506110-14002-1-git-send-email-andrey.grodzovsky-5C7GfCeVMHo@public.gmane.org>
2018-04-12  4:08   ` [PATCH v4 2/2] drm/amdgpu: Free VGA stolen memory as soon as possible Andrey Grodzovsky
     [not found]     ` <1523506110-14002-2-git-send-email-andrey.grodzovsky-5C7GfCeVMHo@public.gmane.org>
2018-04-12  4:32       ` Alex Deucher [this message]
     [not found]         ` <CADnq5_PssA-Cz5q1Z-na88REbLn6pzz5T2eby12LUoyTj5F9dQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-12 11:17           ` Andrey Grodzovsky
     [not found]             ` <9abad4d7-8ca7-30fa-6bb7-cadb4ae01799-5C7GfCeVMHo@public.gmane.org>
2018-04-12 13:33               ` Alex Deucher
     [not found]                 ` <CADnq5_OrReLdTq6-K9ohDXRG7GDUd5MofoMpyOCUTwH2oufosw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-12 14:33                   ` Michel Dänzer
     [not found]                     ` <5968a37a-a89c-2c08-dfc4-dd6bc49f29be-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-12 14:58                       ` Andrey Grodzovsky
     [not found]                         ` <21a9adee-bec8-f86f-92a3-fcfca185458f-5C7GfCeVMHo@public.gmane.org>
2018-04-12 15:10                           ` Michel Dänzer
     [not found]                             ` <cf801752-d1e7-f8de-3312-c7b4677dcf49-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-12 19:59                               ` Andrey Grodzovsky
2018-04-12  4:16   ` [PATCH v4 1/2] drm/amdgpu/gmc: steal the appropriate amount of vram for fw hand-over Alex Deucher
     [not found]     ` <CADnq5_Nw0Cwh-pg9==CWLRC2E709b2S8LEWMd93Eo+ZRfZ7GCQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-04-12  4:25       ` Andrey Grodzovsky
     [not found]         ` <5e42d9cf-2581-14e1-80fd-0378323617c5-5C7GfCeVMHo@public.gmane.org>
2018-04-12  7:49           ` Michel Dänzer
2018-04-12  9:09           ` Huang Rui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CADnq5_PssA-Cz5q1Z-na88REbLn6pzz5T2eby12LUoyTj5F9dQ@mail.gmail.com \
    --to=alexdeucher-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=alexander.deucher-5C7GfCeVMHo@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=andrey.grodzovsky-5C7GfCeVMHo@public.gmane.org \
    --cc=christian.koenig-5C7GfCeVMHo@public.gmane.org \
    --cc=ramin.ranjbar-5C7GfCeVMHo@public.gmane.org \
    --cc=ray.huang-5C7GfCeVMHo@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.