* [PATCH] drm/amdgpu: add enumerate for PDB/PTB
@ 2017-12-13 7:19 Chunming Zhou
[not found] ` <20171213071907.7091-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Chunming Zhou @ 2017-12-13 7:19 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w, Chunming Zhou
Change-Id: Ic1f39d3bc853e9e4259d3e03a22920eda822eec5
Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 69 +++++++++++++++++++++++++---------
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 14 +++++++
2 files changed, 66 insertions(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 709587d8a77f..fc858ddf9319 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -148,12 +148,29 @@ struct amdgpu_prt_cb {
static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
unsigned level)
{
- if (level != adev->vm_manager.num_level)
- return 9 * (adev->vm_manager.num_level - level - 1) +
+ unsigned shift = 0xff;
+
+ switch (level) {
+ case AMDGPU_VM_PDB2:
+ case AMDGPU_VM_PDB1:
+ case AMDGPU_VM_PDB0:
+ shift = 9 * (adev->vm_manager.last_level - level - 1) +
adev->vm_manager.block_size;
- else
- /* For the page tables on the leaves */
- return 0;
+ break;
+ case AMDGPU_VM_PTB:
+ if (adev->vm_manager.last_level == AMDGPU_VM_PTB)
+ shift = 0;
+ else
+ shift = adev->vm_manager.block_size;
+ break;
+ case AMDGPU_VM_SUBPTB:
+ shift = 0;
+ break;
+ default:
+ dev_err(adev->dev, "the level%d isn't supported.\n", level);
+ }
+
+ return shift;
}
/**
@@ -166,12 +183,13 @@ static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
unsigned level)
{
- unsigned shift = amdgpu_vm_level_shift(adev, 0);
+ unsigned shift = amdgpu_vm_level_shift(adev,
+ adev->vm_manager.root_level);
- if (level == 0)
+ if (level == adev->vm_manager.root_level)
/* For the root directory */
return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift;
- else if (level != adev->vm_manager.num_level)
+ else if (level != adev->vm_manager.last_level)
/* Everything in between */
return 512;
else
@@ -385,7 +403,7 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
spin_unlock(&vm->status_lock);
}
- if (level < adev->vm_manager.num_level) {
+ if (level < adev->vm_manager.last_level) {
uint64_t sub_saddr = (pt_idx == from) ? saddr : 0;
uint64_t sub_eaddr = (pt_idx == to) ? eaddr :
((1 << shift) - 1);
@@ -431,7 +449,8 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
saddr /= AMDGPU_GPU_PAGE_SIZE;
eaddr /= AMDGPU_GPU_PAGE_SIZE;
- return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0);
+ return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr,
+ adev->vm_manager.root_level);
}
/**
@@ -1247,7 +1266,8 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,
return 0;
error:
- amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
+ amdgpu_vm_invalidate_level(adev, vm, &vm->root,
+ adev->vm_manager.root_level);
amdgpu_job_free(job);
return r;
}
@@ -1266,7 +1286,7 @@ void amdgpu_vm_get_entry(struct amdgpu_pte_update_params *p, uint64_t addr,
struct amdgpu_vm_pt **entry,
struct amdgpu_vm_pt **parent)
{
- unsigned level = 0;
+ unsigned level = p->adev->vm_manager.root_level;
*parent = NULL;
*entry = &p->vm->root;
@@ -1278,7 +1298,7 @@ void amdgpu_vm_get_entry(struct amdgpu_pte_update_params *p, uint64_t addr,
addr &= (1ULL << shift) - 1;
}
- if (level != p->adev->vm_manager.num_level)
+ if (level != p->adev->vm_manager.last_level)
*entry = NULL;
}
@@ -1320,7 +1340,7 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
return;
entry->huge = !!(flags & AMDGPU_PDE_PTE);
- amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.num_level - 1,
+ amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.last_level - 1,
&dst, &flags);
if (use_cpu_update) {
@@ -1636,7 +1656,8 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
error_free:
amdgpu_job_free(job);
- amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
+ amdgpu_vm_invalidate_level(adev, vm, &vm->root,
+ adev->vm_manager.root_level);
return r;
}
@@ -2552,7 +2573,20 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
tmp >>= amdgpu_vm_block_size - 9;
tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1;
adev->vm_manager.num_level = min(max_level, (unsigned)tmp);
-
+ switch (adev->vm_manager.num_level) {
+ case 3:
+ adev->vm_manager.root_level = AMDGPU_VM_PDB2;
+ break;
+ case 2:
+ adev->vm_manager.root_level = AMDGPU_VM_PDB1;
+ break;
+ case 1:
+ adev->vm_manager.root_level = AMDGPU_VM_PDB0;
+ break;
+ default:
+ dev_err(adev->dev, "VMPT only supports 2~4+1 levels\n");
+ }
+ adev->vm_manager.last_level = AMDGPU_VM_PTB;
/* block size depends on vm size and hw setup*/
if (amdgpu_vm_block_size != -1)
adev->vm_manager.block_size =
@@ -2782,7 +2816,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
if (r) {
dev_err(adev->dev, "Leaking page tables because BO reservation failed\n");
} else {
- amdgpu_vm_free_levels(adev, &vm->root, 0);
+ amdgpu_vm_free_levels(adev, &vm->root,
+ adev->vm_manager.root_level);
amdgpu_bo_unreserve(root);
}
amdgpu_bo_unref(&root);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index e52bf980669f..9d5b2ce5e527 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -120,6 +120,18 @@ struct amdgpu_bo_list_entry;
#define AMDGPU_VM_USE_CPU_FOR_GFX (1 << 0)
#define AMDGPU_VM_USE_CPU_FOR_COMPUTE (1 << 1)
+/* VMPT level enumerate, and the hiberachy is:
+ * PDB2->PDB1->PDB0->PTB->SUBPTB
+ */
+enum amdgpu_vm_level {
+ AMDGPU_VM_PDB2,
+ AMDGPU_VM_PDB1,
+ AMDGPU_VM_PDB0,
+ AMDGPU_VM_PTB,
+ AMDGPU_VM_SUBPTB,
+ AMDGPU_VM_LEVELS
+};
+
/* base structure for tracking BO usage in a VM */
struct amdgpu_vm_bo_base {
/* constant after initialization */
@@ -236,6 +248,8 @@ struct amdgpu_vm_manager {
uint32_t num_level;
uint32_t block_size;
uint32_t fragment_size;
+ uint32_t root_level;
+ uint32_t last_level;
/* vram base address for page table entry */
u64 vram_base_offset;
/* vm pte handling */
--
2.14.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amdgpu: add enumerate for PDB/PTB
[not found] ` <20171213071907.7091-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
@ 2017-12-13 18:33 ` Christian König
[not found] ` <ffddb43c-ec74-81f7-355c-c02155bb9b87-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Christian König @ 2017-12-13 18:33 UTC (permalink / raw)
To: Chunming Zhou, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Am 13.12.2017 um 08:19 schrieb Chunming Zhou:
> Change-Id: Ic1f39d3bc853e9e4259d3e03a22920eda822eec5
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
You dropped reversing the ordering and replaced that with noting the
root level separately? Nifty idea.
Just please drop AMDGPU_VM_SUBPTB, translate further is something we
hopefully will only use the first and last time for Raven.
So I would like to keep that completely transparent to the VM code and
do the patching in the GMC specific implementation for Raven.
Christian.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 69 +++++++++++++++++++++++++---------
> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 14 +++++++
> 2 files changed, 66 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index 709587d8a77f..fc858ddf9319 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@ -148,12 +148,29 @@ struct amdgpu_prt_cb {
> static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
> unsigned level)
> {
> - if (level != adev->vm_manager.num_level)
> - return 9 * (adev->vm_manager.num_level - level - 1) +
> + unsigned shift = 0xff;
> +
> + switch (level) {
> + case AMDGPU_VM_PDB2:
> + case AMDGPU_VM_PDB1:
> + case AMDGPU_VM_PDB0:
> + shift = 9 * (adev->vm_manager.last_level - level - 1) +
> adev->vm_manager.block_size;
> - else
> - /* For the page tables on the leaves */
> - return 0;
> + break;
> + case AMDGPU_VM_PTB:
> + if (adev->vm_manager.last_level == AMDGPU_VM_PTB)
> + shift = 0;
> + else
> + shift = adev->vm_manager.block_size;
> + break;
> + case AMDGPU_VM_SUBPTB:
> + shift = 0;
> + break;
> + default:
> + dev_err(adev->dev, "the level%d isn't supported.\n", level);
> + }
> +
> + return shift;
> }
>
> /**
> @@ -166,12 +183,13 @@ static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
> static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
> unsigned level)
> {
> - unsigned shift = amdgpu_vm_level_shift(adev, 0);
> + unsigned shift = amdgpu_vm_level_shift(adev,
> + adev->vm_manager.root_level);
>
> - if (level == 0)
> + if (level == adev->vm_manager.root_level)
> /* For the root directory */
> return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift;
> - else if (level != adev->vm_manager.num_level)
> + else if (level != adev->vm_manager.last_level)
> /* Everything in between */
> return 512;
> else
> @@ -385,7 +403,7 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
> spin_unlock(&vm->status_lock);
> }
>
> - if (level < adev->vm_manager.num_level) {
> + if (level < adev->vm_manager.last_level) {
> uint64_t sub_saddr = (pt_idx == from) ? saddr : 0;
> uint64_t sub_eaddr = (pt_idx == to) ? eaddr :
> ((1 << shift) - 1);
> @@ -431,7 +449,8 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
> saddr /= AMDGPU_GPU_PAGE_SIZE;
> eaddr /= AMDGPU_GPU_PAGE_SIZE;
>
> - return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0);
> + return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr,
> + adev->vm_manager.root_level);
> }
>
> /**
> @@ -1247,7 +1266,8 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,
> return 0;
>
> error:
> - amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
> + amdgpu_vm_invalidate_level(adev, vm, &vm->root,
> + adev->vm_manager.root_level);
> amdgpu_job_free(job);
> return r;
> }
> @@ -1266,7 +1286,7 @@ void amdgpu_vm_get_entry(struct amdgpu_pte_update_params *p, uint64_t addr,
> struct amdgpu_vm_pt **entry,
> struct amdgpu_vm_pt **parent)
> {
> - unsigned level = 0;
> + unsigned level = p->adev->vm_manager.root_level;
>
> *parent = NULL;
> *entry = &p->vm->root;
> @@ -1278,7 +1298,7 @@ void amdgpu_vm_get_entry(struct amdgpu_pte_update_params *p, uint64_t addr,
> addr &= (1ULL << shift) - 1;
> }
>
> - if (level != p->adev->vm_manager.num_level)
> + if (level != p->adev->vm_manager.last_level)
> *entry = NULL;
> }
>
> @@ -1320,7 +1340,7 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
> return;
> entry->huge = !!(flags & AMDGPU_PDE_PTE);
>
> - amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.num_level - 1,
> + amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.last_level - 1,
> &dst, &flags);
>
> if (use_cpu_update) {
> @@ -1636,7 +1656,8 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
>
> error_free:
> amdgpu_job_free(job);
> - amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
> + amdgpu_vm_invalidate_level(adev, vm, &vm->root,
> + adev->vm_manager.root_level);
> return r;
> }
>
> @@ -2552,7 +2573,20 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
> tmp >>= amdgpu_vm_block_size - 9;
> tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1;
> adev->vm_manager.num_level = min(max_level, (unsigned)tmp);
> -
> + switch (adev->vm_manager.num_level) {
> + case 3:
> + adev->vm_manager.root_level = AMDGPU_VM_PDB2;
> + break;
> + case 2:
> + adev->vm_manager.root_level = AMDGPU_VM_PDB1;
> + break;
> + case 1:
> + adev->vm_manager.root_level = AMDGPU_VM_PDB0;
> + break;
> + default:
> + dev_err(adev->dev, "VMPT only supports 2~4+1 levels\n");
> + }
> + adev->vm_manager.last_level = AMDGPU_VM_PTB;
> /* block size depends on vm size and hw setup*/
> if (amdgpu_vm_block_size != -1)
> adev->vm_manager.block_size =
> @@ -2782,7 +2816,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
> if (r) {
> dev_err(adev->dev, "Leaking page tables because BO reservation failed\n");
> } else {
> - amdgpu_vm_free_levels(adev, &vm->root, 0);
> + amdgpu_vm_free_levels(adev, &vm->root,
> + adev->vm_manager.root_level);
> amdgpu_bo_unreserve(root);
> }
> amdgpu_bo_unref(&root);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> index e52bf980669f..9d5b2ce5e527 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
> @@ -120,6 +120,18 @@ struct amdgpu_bo_list_entry;
> #define AMDGPU_VM_USE_CPU_FOR_GFX (1 << 0)
> #define AMDGPU_VM_USE_CPU_FOR_COMPUTE (1 << 1)
>
> +/* VMPT level enumerate, and the hiberachy is:
> + * PDB2->PDB1->PDB0->PTB->SUBPTB
> + */
> +enum amdgpu_vm_level {
> + AMDGPU_VM_PDB2,
> + AMDGPU_VM_PDB1,
> + AMDGPU_VM_PDB0,
> + AMDGPU_VM_PTB,
> + AMDGPU_VM_SUBPTB,
> + AMDGPU_VM_LEVELS
> +};
> +
> /* base structure for tracking BO usage in a VM */
> struct amdgpu_vm_bo_base {
> /* constant after initialization */
> @@ -236,6 +248,8 @@ struct amdgpu_vm_manager {
> uint32_t num_level;
> uint32_t block_size;
> uint32_t fragment_size;
> + uint32_t root_level;
> + uint32_t last_level;
> /* vram base address for page table entry */
> u64 vram_base_offset;
> /* vm pte handling */
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amdgpu: add enumerate for PDB/PTB
[not found] ` <ffddb43c-ec74-81f7-355c-c02155bb9b87-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2017-12-14 6:23 ` Chunming Zhou
0 siblings, 0 replies; 3+ messages in thread
From: Chunming Zhou @ 2017-12-14 6:23 UTC (permalink / raw)
To: christian.koenig-5C7GfCeVMHo, Chunming Zhou,
amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On 2017年12月14日 02:33, Christian König wrote:
> Am 13.12.2017 um 08:19 schrieb Chunming Zhou:
>> Change-Id: Ic1f39d3bc853e9e4259d3e03a22920eda822eec5
>> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
>
> You dropped reversing the ordering and replaced that with noting the
> root level separately? Nifty idea.
Yes.
>
> Just please drop AMDGPU_VM_SUBPTB, translate further is something we
> hopefully will only use the first and last time for Raven.
dropped, please review the v2.
>
> So I would like to keep that completely transparent to the VM code and
> do the patching in the GMC specific implementation for Raven.
go ahead, you can send your 2+1 patch again based on enumerate.
Regards,
David Zhou
>
> Christian.
>
>> ---
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 69
>> +++++++++++++++++++++++++---------
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 14 +++++++
>> 2 files changed, 66 insertions(+), 17 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> index 709587d8a77f..fc858ddf9319 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> @@ -148,12 +148,29 @@ struct amdgpu_prt_cb {
>> static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
>> unsigned level)
>> {
>> - if (level != adev->vm_manager.num_level)
>> - return 9 * (adev->vm_manager.num_level - level - 1) +
>> + unsigned shift = 0xff;
>> +
>> + switch (level) {
>> + case AMDGPU_VM_PDB2:
>> + case AMDGPU_VM_PDB1:
>> + case AMDGPU_VM_PDB0:
>> + shift = 9 * (adev->vm_manager.last_level - level - 1) +
>> adev->vm_manager.block_size;
>> - else
>> - /* For the page tables on the leaves */
>> - return 0;
>> + break;
>> + case AMDGPU_VM_PTB:
>> + if (adev->vm_manager.last_level == AMDGPU_VM_PTB)
>> + shift = 0;
>> + else
>> + shift = adev->vm_manager.block_size;
>> + break;
>> + case AMDGPU_VM_SUBPTB:
>> + shift = 0;
>> + break;
>> + default:
>> + dev_err(adev->dev, "the level%d isn't supported.\n", level);
>> + }
>> +
>> + return shift;
>> }
>> /**
>> @@ -166,12 +183,13 @@ static unsigned amdgpu_vm_level_shift(struct
>> amdgpu_device *adev,
>> static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
>> unsigned level)
>> {
>> - unsigned shift = amdgpu_vm_level_shift(adev, 0);
>> + unsigned shift = amdgpu_vm_level_shift(adev,
>> + adev->vm_manager.root_level);
>> - if (level == 0)
>> + if (level == adev->vm_manager.root_level)
>> /* For the root directory */
>> return round_up(adev->vm_manager.max_pfn, 1 << shift) >>
>> shift;
>> - else if (level != adev->vm_manager.num_level)
>> + else if (level != adev->vm_manager.last_level)
>> /* Everything in between */
>> return 512;
>> else
>> @@ -385,7 +403,7 @@ static int amdgpu_vm_alloc_levels(struct
>> amdgpu_device *adev,
>> spin_unlock(&vm->status_lock);
>> }
>> - if (level < adev->vm_manager.num_level) {
>> + if (level < adev->vm_manager.last_level) {
>> uint64_t sub_saddr = (pt_idx == from) ? saddr : 0;
>> uint64_t sub_eaddr = (pt_idx == to) ? eaddr :
>> ((1 << shift) - 1);
>> @@ -431,7 +449,8 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
>> saddr /= AMDGPU_GPU_PAGE_SIZE;
>> eaddr /= AMDGPU_GPU_PAGE_SIZE;
>> - return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr,
>> eaddr, 0);
>> + return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr,
>> + adev->vm_manager.root_level);
>> }
>> /**
>> @@ -1247,7 +1266,8 @@ int amdgpu_vm_update_directories(struct
>> amdgpu_device *adev,
>> return 0;
>> error:
>> - amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
>> + amdgpu_vm_invalidate_level(adev, vm, &vm->root,
>> + adev->vm_manager.root_level);
>> amdgpu_job_free(job);
>> return r;
>> }
>> @@ -1266,7 +1286,7 @@ void amdgpu_vm_get_entry(struct
>> amdgpu_pte_update_params *p, uint64_t addr,
>> struct amdgpu_vm_pt **entry,
>> struct amdgpu_vm_pt **parent)
>> {
>> - unsigned level = 0;
>> + unsigned level = p->adev->vm_manager.root_level;
>> *parent = NULL;
>> *entry = &p->vm->root;
>> @@ -1278,7 +1298,7 @@ void amdgpu_vm_get_entry(struct
>> amdgpu_pte_update_params *p, uint64_t addr,
>> addr &= (1ULL << shift) - 1;
>> }
>> - if (level != p->adev->vm_manager.num_level)
>> + if (level != p->adev->vm_manager.last_level)
>> *entry = NULL;
>> }
>> @@ -1320,7 +1340,7 @@ static void
>> amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
>> return;
>> entry->huge = !!(flags & AMDGPU_PDE_PTE);
>> - amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.num_level
>> - 1,
>> + amdgpu_gart_get_vm_pde(p->adev, p->adev->vm_manager.last_level - 1,
>> &dst, &flags);
>> if (use_cpu_update) {
>> @@ -1636,7 +1656,8 @@ static int amdgpu_vm_bo_update_mapping(struct
>> amdgpu_device *adev,
>> error_free:
>> amdgpu_job_free(job);
>> - amdgpu_vm_invalidate_level(adev, vm, &vm->root, 0);
>> + amdgpu_vm_invalidate_level(adev, vm, &vm->root,
>> + adev->vm_manager.root_level);
>> return r;
>> }
>> @@ -2552,7 +2573,20 @@ void amdgpu_vm_adjust_size(struct
>> amdgpu_device *adev, uint32_t vm_size,
>> tmp >>= amdgpu_vm_block_size - 9;
>> tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1;
>> adev->vm_manager.num_level = min(max_level, (unsigned)tmp);
>> -
>> + switch (adev->vm_manager.num_level) {
>> + case 3:
>> + adev->vm_manager.root_level = AMDGPU_VM_PDB2;
>> + break;
>> + case 2:
>> + adev->vm_manager.root_level = AMDGPU_VM_PDB1;
>> + break;
>> + case 1:
>> + adev->vm_manager.root_level = AMDGPU_VM_PDB0;
>> + break;
>> + default:
>> + dev_err(adev->dev, "VMPT only supports 2~4+1 levels\n");
>> + }
>> + adev->vm_manager.last_level = AMDGPU_VM_PTB;
>> /* block size depends on vm size and hw setup*/
>> if (amdgpu_vm_block_size != -1)
>> adev->vm_manager.block_size =
>> @@ -2782,7 +2816,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm)
>> if (r) {
>> dev_err(adev->dev, "Leaking page tables because BO
>> reservation failed\n");
>> } else {
>> - amdgpu_vm_free_levels(adev, &vm->root, 0);
>> + amdgpu_vm_free_levels(adev, &vm->root,
>> + adev->vm_manager.root_level);
>> amdgpu_bo_unreserve(root);
>> }
>> amdgpu_bo_unref(&root);
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> index e52bf980669f..9d5b2ce5e527 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> @@ -120,6 +120,18 @@ struct amdgpu_bo_list_entry;
>> #define AMDGPU_VM_USE_CPU_FOR_GFX (1 << 0)
>> #define AMDGPU_VM_USE_CPU_FOR_COMPUTE (1 << 1)
>> +/* VMPT level enumerate, and the hiberachy is:
>> + * PDB2->PDB1->PDB0->PTB->SUBPTB
>> + */
>> +enum amdgpu_vm_level {
>> + AMDGPU_VM_PDB2,
>> + AMDGPU_VM_PDB1,
>> + AMDGPU_VM_PDB0,
>> + AMDGPU_VM_PTB,
>> + AMDGPU_VM_SUBPTB,
>> + AMDGPU_VM_LEVELS
>> +};
>> +
>> /* base structure for tracking BO usage in a VM */
>> struct amdgpu_vm_bo_base {
>> /* constant after initialization */
>> @@ -236,6 +248,8 @@ struct amdgpu_vm_manager {
>> uint32_t num_level;
>> uint32_t block_size;
>> uint32_t fragment_size;
>> + uint32_t root_level;
>> + uint32_t last_level;
>> /* vram base address for page table entry */
>> u64 vram_base_offset;
>> /* vm pte handling */
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-12-14 6:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-13 7:19 [PATCH] drm/amdgpu: add enumerate for PDB/PTB Chunming Zhou
[not found] ` <20171213071907.7091-1-david1.zhou-5C7GfCeVMHo@public.gmane.org>
2017-12-13 18:33 ` Christian König
[not found] ` <ffddb43c-ec74-81f7-355c-c02155bb9b87-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-12-14 6:23 ` Chunming Zhou
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.