From: Chunming Zhou <David1.Zhou-5C7GfCeVMHo@public.gmane.org>
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Cc: Chunming Zhou <David1.Zhou-5C7GfCeVMHo@public.gmane.org>
Subject: [PATCH 05/10] drm/amdgpu: shadow gart table support
Date: Tue, 2 Aug 2016 16:00:35 +0800 [thread overview]
Message-ID: <1470124840-26170-6-git-send-email-David1.Zhou@amd.com> (raw)
In-Reply-To: <1470124840-26170-1-git-send-email-David1.Zhou-5C7GfCeVMHo@public.gmane.org>
allocate gart shadow bo, and using shadow bo to backup gart table.
Change-Id: Ib2beae9cea1ad1314c57f0fcdcc254816f39b9b2
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu.h | 3 ++
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 47 +++++++++++++++++++++++++++++++-
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 15 ++++++++++
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 16 +++++++++++
4 files changed, 80 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 419a33b..2985578d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -638,6 +638,7 @@ struct amdgpu_gart {
dma_addr_t table_addr;
struct amdgpu_bo *robj;
void *ptr;
+ void *shadow_ptr;
unsigned num_gpu_pages;
unsigned num_cpu_pages;
unsigned table_size;
@@ -655,6 +656,8 @@ int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev);
void amdgpu_gart_table_vram_free(struct amdgpu_device *adev);
int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev);
void amdgpu_gart_table_vram_unpin(struct amdgpu_device *adev);
+int amdgpu_gart_table_vram_shadow_pin(struct amdgpu_device *adev);
+void amdgpu_gart_table_vram_shadow_unpin(struct amdgpu_device *adev);
int amdgpu_gart_init(struct amdgpu_device *adev);
void amdgpu_gart_fini(struct amdgpu_device *adev);
int amdgpu_gart_late_init(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index c1f226b..b306684 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -248,6 +248,9 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, unsigned offset,
for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
t, page_base, flags);
+ if (amdgpu_vm_need_backup(adev) && adev->gart.robj->shadow)
+ amdgpu_gart_set_pte_pde(adev, adev->gart.shadow_ptr,
+ t, page_base, flags);
page_base += AMDGPU_GPU_PAGE_SIZE;
}
}
@@ -293,6 +296,9 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
page_base = dma_addr[i];
for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
amdgpu_gart_set_pte_pde(adev, adev->gart.ptr, t, page_base, flags);
+ if (amdgpu_vm_need_backup(adev) && adev->gart.robj->shadow)
+ amdgpu_gart_set_pte_pde(adev, adev->gart.shadow_ptr,
+ t, page_base, flags);
page_base += AMDGPU_GPU_PAGE_SIZE;
}
}
@@ -364,6 +370,46 @@ void amdgpu_gart_fini(struct amdgpu_device *adev)
amdgpu_dummy_page_fini(adev);
}
+int amdgpu_gart_table_vram_shadow_pin(struct amdgpu_device *adev)
+{
+ uint64_t gpu_addr;
+ int r;
+
+ if (!adev->gart.robj->shadow)
+ return -EINVAL;
+
+ r = amdgpu_bo_reserve(adev->gart.robj->shadow, false);
+ if (unlikely(r != 0))
+ return r;
+ r = amdgpu_bo_pin(adev->gart.robj->shadow,
+ AMDGPU_GEM_DOMAIN_GTT, &gpu_addr);
+ if (r) {
+ amdgpu_bo_unreserve(adev->gart.robj->shadow);
+ return r;
+ }
+ r = amdgpu_bo_kmap(adev->gart.robj->shadow, &adev->gart.shadow_ptr);
+ if (r)
+ amdgpu_bo_unpin(adev->gart.robj->shadow);
+ amdgpu_bo_unreserve(adev->gart.robj->shadow);
+ return r;
+}
+
+void amdgpu_gart_table_vram_shadow_unpin(struct amdgpu_device *adev)
+{
+ int r;
+
+ if (adev->gart.robj->shadow == NULL)
+ return;
+
+ r = amdgpu_bo_reserve(adev->gart.robj->shadow, false);
+ if (likely(r == 0)) {
+ amdgpu_bo_kunmap(adev->gart.robj->shadow);
+ amdgpu_bo_unpin(adev->gart.robj->shadow);
+ amdgpu_bo_unreserve(adev->gart.robj->shadow);
+ adev->gart.shadow_ptr = NULL;
+ }
+}
+
int amdgpu_gart_late_init(struct amdgpu_device *adev)
{
struct amd_sched_rq *rq;
@@ -372,7 +418,6 @@ int amdgpu_gart_late_init(struct amdgpu_device *adev)
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_RECOVER];
return amd_sched_entity_init(&ring->sched, &adev->gart.recover_entity,
rq, amdgpu_sched_jobs);
-
}
void amdgpu_gart_late_fini(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 0771c04..5470a28 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -589,7 +589,21 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
(unsigned)(adev->mc.gtt_size >> 20),
(unsigned long long)adev->gart.table_addr);
adev->gart.ready = true;
+ if (amdgpu_vm_need_backup(adev) && adev->gart.robj) {
+ r = amdgpu_bo_create_shadow(adev, adev->gart.table_size,
+ PAGE_SIZE, adev->gart.robj);
+ if (r)
+ goto err;
+ r = amdgpu_gart_table_vram_shadow_pin(adev);
+ if (r)
+ goto err;
+ }
+
return 0;
+err:
+ amdgpu_gart_table_vram_unpin(adev);
+
+ return r;
}
static int gmc_v7_0_gart_init(struct amdgpu_device *adev)
@@ -634,6 +648,7 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev)
WREG32(mmVM_L2_CNTL, tmp);
WREG32(mmVM_L2_CNTL2, 0);
amdgpu_gart_table_vram_unpin(adev);
+ amdgpu_gart_table_vram_shadow_unpin(adev);
}
/**
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index c26bee9..6c2b5de 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -704,7 +704,22 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
(unsigned)(adev->mc.gtt_size >> 20),
(unsigned long long)adev->gart.table_addr);
adev->gart.ready = true;
+
+ if (amdgpu_vm_need_backup(adev) && adev->gart.robj) {
+ r = amdgpu_bo_create_shadow(adev, adev->gart.table_size,
+ PAGE_SIZE, adev->gart.robj);
+ if (r)
+ goto err;
+ r = amdgpu_gart_table_vram_shadow_pin(adev);
+ if (r)
+ goto err;
+ }
+
return 0;
+err:
+ amdgpu_gart_table_vram_unpin(adev);
+
+ return r;
}
static int gmc_v8_0_gart_init(struct amdgpu_device *adev)
@@ -749,6 +764,7 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)
WREG32(mmVM_L2_CNTL, tmp);
WREG32(mmVM_L2_CNTL2, 0);
amdgpu_gart_table_vram_unpin(adev);
+ amdgpu_gart_table_vram_shadow_unpin(adev);
}
/**
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
next prev parent reply other threads:[~2016-08-02 8:00 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-02 8:00 [PATCH 00/10] GART table recovery Chunming Zhou
[not found] ` <1470124840-26170-1-git-send-email-David1.Zhou-5C7GfCeVMHo@public.gmane.org>
2016-08-02 8:00 ` [PATCH 01/10] drm/amdgpu: make need_backup generic Chunming Zhou
2016-08-02 8:00 ` [PATCH 02/10] drm/amdgpu: implement gart late_init/fini Chunming Zhou
2016-08-02 8:00 ` [PATCH 03/10] drm/amdgpu: add gart_late_init/fini to gmc V7/8 Chunming Zhou
2016-08-02 8:00 ` [PATCH 04/10] drm/amdgpu: abstract amdgpu_bo_create_shadow Chunming Zhou
2016-08-02 8:00 ` Chunming Zhou [this message]
2016-08-02 8:00 ` [PATCH 06/10] drm/amdgpu: make recover_bo_from_shadow be generic Chunming Zhou
2016-08-02 8:00 ` [PATCH 07/10] drm/amdgpu: implement gart recovery Chunming Zhou
2016-08-02 8:00 ` [PATCH 08/10] drm/amdgpu: recover gart table first when full reset Chunming Zhou
2016-08-02 8:00 ` [PATCH 09/10] drm/amdgpu: sync gart table before initialization completed Chunming Zhou
2016-08-02 8:00 ` [PATCH 10/10] drm/amdgpu: fix memory leak of sched fence Chunming Zhou
2016-08-02 15:15 ` [PATCH 00/10] GART table recovery Christian König
[not found] ` <f1b6c786-7e9c-ff61-1de9-299bc4daed15-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-03 1:33 ` zhoucm1
2016-08-03 14:01 ` Christian König
[not found] ` <54bb3255-2dda-f6ad-3682-8e4396ec932a-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-04 3:35 ` zhoucm1
[not found] ` <57A2B810.6050209-5C7GfCeVMHo@public.gmane.org>
2016-08-04 9:58 ` Christian König
[not found] ` <077bb11d-957d-c6f2-2f87-248fbc19304a-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-18 8:50 ` zhoucm1
[not found] ` <57B576BB.4030400-5C7GfCeVMHo@public.gmane.org>
2016-08-18 9:03 ` Christian König
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=1470124840-26170-6-git-send-email-David1.Zhou@amd.com \
--to=david1.zhou-5c7gfcevmho@public.gmane.org \
--cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@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.