From: "Christian König" <ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Emily Deng <Emily.Deng-5C7GfCeVMHo@public.gmane.org>,
amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: Re: [PATCH 1/2] drm/amdgpu/sriov: For sriov runtime, use kiq to do invalidate tlb
Date: Wed, 15 Aug 2018 15:09:15 +0200 [thread overview]
Message-ID: <3eaecc82-314a-e630-e10d-42630f0ccb61@gmail.com> (raw)
In-Reply-To: <1534337675-25039-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
Am 15.08.2018 um 14:54 schrieb Emily Deng:
> To avoid the tlb flush not interrupted by world switch, use kiq and one
> command to do tlb invalidate.
>
> v2:
> Add firmware version checking.
>
> v3:
> Refine the code, and move the firmware
> checking into gfx_v9_0_ring_emit_reg_write_reg_wait.
>
> v4:
> Change the name amdgpu_kiq_invalidate_tlb to amdgpu_kiq_reg_write_reg_wait.
> Remove the in_interrupt.
> Refine code.
>
> SWDEV-161497
>
> Signed-off-by: Emily Deng <Emily.Deng@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 +++
> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 3 --
> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 15 +++++++-
> drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 60 ++++++++++++++++++++++++++++++++
> 4 files changed, 78 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 6265b88..19ef7711 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -212,6 +212,10 @@ enum amdgpu_kiq_irq {
> AMDGPU_CP_KIQ_IRQ_LAST
> };
>
> +#define MAX_KIQ_REG_WAIT 5000 /* in usecs, 5ms */
> +#define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */
> +#define MAX_KIQ_REG_TRY 20
> +
> int amdgpu_device_ip_set_clockgating_state(void *dev,
> enum amd_ip_block_type block_type,
> enum amd_clockgating_state state);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> index 21adb1b6..3885636 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> @@ -22,9 +22,6 @@
> */
>
> #include "amdgpu.h"
> -#define MAX_KIQ_REG_WAIT 5000 /* in usecs, 5ms */
> -#define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */
> -#define MAX_KIQ_REG_TRY 20
>
> uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev)
> {
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index 76d979e..e010166 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -4348,8 +4348,21 @@ static void gfx_v9_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,
> uint32_t ref, uint32_t mask)
> {
> int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
> + struct amdgpu_device *adev = ring->adev;
> + bool fw_version_ok = false;
>
> - if (amdgpu_sriov_vf(ring->adev))
> + if (ring->funcs->type == AMDGPU_RING_TYPE_GFX) {
> + if ((adev->gfx.me_fw_version >= 0x0000009c) && (adev->gfx.me_feature_version >= 42)
> + && (adev->gfx.pfp_fw_version >= 0x000000b1) && (adev->gfx.pfp_feature_version >= 42))
> + fw_version_ok = true;
The indentation here is wrong and the && belongs at the end of the line.
> + } else {
> + if ((adev->gfx.mec_fw_version >= 0x00000193) && (adev->gfx.mec_feature_version >= 42))
> + fw_version_ok = true;
> + }
> +
> + fw_version_ok = (adev->asic_type == CHIP_VEGA10) ? fw_version_ok : false;
> +
> + if (amdgpu_sriov_vf(adev) && fw_version_ok)
Please squash the second patch into this one. The goal is to use the
same code path on both SRIOV and bare metal.
I would rather separate our this change into a patch and then make the
TLB invalidation the second patch.
> gfx_v9_0_wait_reg_mem(ring, usepfp, 0, 1, reg0, reg1,
> ref, mask, 0x20);
> else
> diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> index ed467de..9726c7e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
> @@ -311,6 +311,59 @@ static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid)
> return req;
> }
>
> +signed long amdgpu_kiq_reg_write_reg_wait(struct amdgpu_device *adev, struct amdgpu_vmhub *hub,
> + unsigned eng, u32 req, uint32_t vmid)
That is still specialized, e.g. you assume that you work with a VMHUB
here instead of specifying the registers, req and value separately.
> +{
> + signed long r, cnt = 0;
> + unsigned long flags;
> + uint32_t seq;
> + struct amdgpu_kiq *kiq = &adev->gfx.kiq;
> + struct amdgpu_ring *ring = &kiq->ring;
> +
> + if (!ring->ready) {
> + return -EINVAL;
> + }
Please drop the {} here.
Christian.
> +
> + spin_lock_irqsave(&kiq->ring_lock, flags);
> +
> + amdgpu_ring_alloc(ring, 32);
> + amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req + eng,
> + hub->vm_inv_eng0_ack + eng,
> + req, 1 << vmid);
> + amdgpu_fence_emit_polling(ring, &seq);
> + amdgpu_ring_commit(ring);
> + spin_unlock_irqrestore(&kiq->ring_lock, flags);
> +
> + r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
> +
> + /* don't wait anymore for gpu reset case because this way may
> + * block gpu_recover() routine forever, e.g. this virt_kiq_rreg
> + * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will
> + * never return if we keep waiting in virt_kiq_rreg, which cause
> + * gpu_recover() hang there.
> + *
> + * also don't wait anymore for IRQ context
> + * */
> + if (r < 1 && (adev->in_gpu_reset || in_interrupt()))
> + goto failed_kiq;
> +
> + might_sleep();
> +
> + while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
> + msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
> + r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
> + }
> +
> + if (cnt > MAX_KIQ_REG_TRY)
> + goto failed_kiq;
> +
> + return 0;
> +
> +failed_kiq:
> + pr_err("failed to invalidate tlb with kiq\n");
> + return r;
> +}
> +
> /*
> * GART
> * VMID 0 is the physical GPU addresses as used by the kernel.
> @@ -332,6 +385,7 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev,
> /* Use register 17 for GART */
> const unsigned eng = 17;
> unsigned i, j;
> + int r;
>
> spin_lock(&adev->gmc.invalidate_lock);
>
> @@ -339,6 +393,12 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev,
> struct amdgpu_vmhub *hub = &adev->vmhub[i];
> u32 tmp = gmc_v9_0_get_invalidate_req(vmid);
>
> + if (amdgpu_sriov_vf(adev)) {
> + r = amdgpu_kiq_reg_write_reg_wait(adev, hub, eng, tmp, vmid);
> + if (!r)
> + continue;
> + }
> +
> WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp);
>
> /* Busy wait for ACK.*/
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
next prev parent reply other threads:[~2018-08-15 13:09 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-15 12:54 [PATCH 1/2] drm/amdgpu/sriov: For sriov runtime, use kiq to do invalidate tlb Emily Deng
[not found] ` <1534337675-25039-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
2018-08-15 12:54 ` [PATCH 2/2] drm/amdgpu: For bare metal, " Emily Deng
2018-08-15 13:09 ` Christian König [this message]
-- strict thread matches above, loose matches on Subject: below --
2018-08-15 9:52 [PATCH 1/2] drm/amdgpu/sriov: For sriov runtime, " Emily Deng
2018-08-15 9:48 Emily Deng
[not found] ` <1534326508-17477-1-git-send-email-Emily.Deng-5C7GfCeVMHo@public.gmane.org>
2018-08-15 10:50 ` Christian König
[not found] ` <5f51ffa1-1e84-dacf-840c-76bd9cbb282b-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-08-15 11:08 ` Deng, Emily
[not found] ` <CY4PR12MB112541E31A354E9E94BE2FCF8F3F0-rpdhrqHFk07v2MZdTKcfDgdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2018-08-15 11:14 ` Christian König
[not found] ` <8a5bff61-c03f-856a-3f0e-3497b2bd0ba8-5C7GfCeVMHo@public.gmane.org>
2018-08-15 11:24 ` Deng, Emily
2018-08-15 13:56 ` Zhu, Rex
[not found] ` <BYAPR12MB27755A475CE994215D964F04FB3F0-ZGDeBxoHBPmJeBUhB162ZQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2018-08-15 14:13 ` Alex Deucher
[not found] ` <CADnq5_Pu4kxrjUK8e--EjLR55hE-eeb89KosZXajN-u3ZU2ZMA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-08-16 5:41 ` Zhu, Rex
[not found] ` <BYAPR12MB27754BF4F6A7F1560D93DE01FB3E0-ZGDeBxoHBPmJeBUhB162ZQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2018-08-16 6:24 ` Zhu, Rex
[not found] ` <BYAPR12MB2775F83981EF5557A7613128FB3E0-ZGDeBxoHBPmJeBUhB162ZQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2018-08-16 7:33 ` Deng, Emily
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=3eaecc82-314a-e630-e10d-42630f0ccb61@gmail.com \
--to=ckoenig.leichtzumerken-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=Emily.Deng-5C7GfCeVMHo@public.gmane.org \
--cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=christian.koenig-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.