All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.