All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator
@ 2013-07-12 21:51 alexdeucher
  2013-07-12 21:51 ` [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K alexdeucher
  2013-07-15  9:06 ` [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator Christian König
  0 siblings, 2 replies; 4+ messages in thread
From: alexdeucher @ 2013-07-12 21:51 UTC (permalink / raw)
  To: dri-devel; +Cc: Alex Deucher

From: Alex Deucher <alexander.deucher@amd.com>

There are cases where we need more than 4k alignment.  No
functional change with this commit.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h        |    1 +
 drivers/gpu/drm/radeon/radeon_gart.c   |    1 +
 drivers/gpu/drm/radeon/radeon_object.h |    2 +-
 drivers/gpu/drm/radeon/radeon_ring.c   |    1 +
 drivers/gpu/drm/radeon/radeon_sa.c     |    7 ++++---
 5 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 6fe4b1c..39d2ce6 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -455,6 +455,7 @@ struct radeon_sa_manager {
 	uint64_t		gpu_addr;
 	void			*cpu_ptr;
 	uint32_t		domain;
+	uint32_t		align;
 };
 
 struct radeon_sa_bo;
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 43ec4a4..5ce190b 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -467,6 +467,7 @@ int radeon_vm_manager_init(struct radeon_device *rdev)
 		size *= 2;
 		r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager,
 					      RADEON_GPU_PAGE_ALIGN(size),
+					      RADEON_GPU_PAGE_SIZE,
 					      RADEON_GEM_DOMAIN_VRAM);
 		if (r) {
 			dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n",
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 91519a5..49c82c4 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -174,7 +174,7 @@ static inline void * radeon_sa_bo_cpu_addr(struct radeon_sa_bo *sa_bo)
 
 extern int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 				     struct radeon_sa_manager *sa_manager,
-				     unsigned size, u32 domain);
+				     unsigned size, u32 align, u32 domain);
 extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
 				      struct radeon_sa_manager *sa_manager);
 extern int radeon_sa_bo_manager_start(struct radeon_device *rdev,
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 5f1c51a..fb5ea62 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -224,6 +224,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
 	}
 	r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
 				      RADEON_IB_POOL_SIZE*64*1024,
+				      RADEON_GPU_PAGE_SIZE,
 				      RADEON_GEM_DOMAIN_GTT);
 	if (r) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index 0abe5a9..f0bac68 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -49,7 +49,7 @@ static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager);
 
 int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 			      struct radeon_sa_manager *sa_manager,
-			      unsigned size, u32 domain)
+			      unsigned size, u32 align, u32 domain)
 {
 	int i, r;
 
@@ -57,13 +57,14 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 	sa_manager->bo = NULL;
 	sa_manager->size = size;
 	sa_manager->domain = domain;
+	sa_manager->align = align;
 	sa_manager->hole = &sa_manager->olist;
 	INIT_LIST_HEAD(&sa_manager->olist);
 	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
 		INIT_LIST_HEAD(&sa_manager->flist[i]);
 	}
 
-	r = radeon_bo_create(rdev, size, RADEON_GPU_PAGE_SIZE, true,
+	r = radeon_bo_create(rdev, size, align, true,
 			     domain, NULL, &sa_manager->bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
@@ -317,7 +318,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
 	unsigned tries[RADEON_NUM_RINGS];
 	int i, r;
 
-	BUG_ON(align > RADEON_GPU_PAGE_SIZE);
+	BUG_ON(align > sa_manager->align);
 	BUG_ON(size > sa_manager->size);
 
 	*sa_bo = kmalloc(sizeof(struct radeon_sa_bo), GFP_KERNEL);
-- 
1.7.7.5

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K
  2013-07-12 21:51 [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator alexdeucher
@ 2013-07-12 21:51 ` alexdeucher
  2013-07-18 16:39   ` Jerome Glisse
  2013-07-15  9:06 ` [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator Christian König
  1 sibling, 1 reply; 4+ messages in thread
From: alexdeucher @ 2013-07-12 21:51 UTC (permalink / raw)
  To: dri-devel; +Cc: Alex Deucher

From: Alex Deucher <alexander.deucher@amd.com>

Covers requirements of all current asics.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/radeon/radeon.h      |    5 +++++
 drivers/gpu/drm/radeon/radeon_gart.c |   12 ++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 39d2ce6..875af79 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -784,6 +784,11 @@ struct radeon_mec {
 /* number of entries in page table */
 #define RADEON_VM_PTE_COUNT (1 << RADEON_VM_BLOCK_SIZE)
 
+/* PTBs (Page Table Blocks) need to be aligned to 32K */
+#define RADEON_VM_PTB_ALIGN_SIZE   32768
+#define RADEON_VM_PTB_ALIGN_MASK (RADEON_VM_PTB_ALIGN_SIZE - 1)
+#define RADEON_VM_PTB_ALIGN(a) (((a) + RADEON_VM_PTB_ALIGN_MASK) & ~RADEON_VM_PTB_ALIGN_MASK)
+
 struct radeon_vm {
 	struct list_head		list;
 	struct list_head		va;
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 5ce190b..d9d31a3 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -466,8 +466,8 @@ int radeon_vm_manager_init(struct radeon_device *rdev)
 		size += rdev->vm_manager.max_pfn * 8;
 		size *= 2;
 		r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager,
-					      RADEON_GPU_PAGE_ALIGN(size),
-					      RADEON_GPU_PAGE_SIZE,
+					      RADEON_VM_PTB_ALIGN(size),
+					      RADEON_VM_PTB_ALIGN_SIZE,
 					      RADEON_GEM_DOMAIN_VRAM);
 		if (r) {
 			dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n",
@@ -621,10 +621,10 @@ int radeon_vm_alloc_pt(struct radeon_device *rdev, struct radeon_vm *vm)
 	}
 
 retry:
-	pd_size = RADEON_GPU_PAGE_ALIGN(radeon_vm_directory_size(rdev));
+	pd_size = RADEON_VM_PTB_ALIGN(radeon_vm_directory_size(rdev));
 	r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
 			     &vm->page_directory, pd_size,
-			     RADEON_GPU_PAGE_SIZE, false);
+			     RADEON_VM_PTB_ALIGN_SIZE, false);
 	if (r == -ENOMEM) {
 		r = radeon_vm_evict(rdev, vm);
 		if (r)
@@ -953,8 +953,8 @@ static int radeon_vm_update_pdes(struct radeon_device *rdev,
 retry:
 		r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
 				     &vm->page_tables[pt_idx],
-				     RADEON_VM_PTE_COUNT * 8,
-				     RADEON_GPU_PAGE_SIZE, false);
+				     RADEON_VM_PTB_ALIGN(RADEON_VM_PTE_COUNT * 8),
+				     RADEON_VM_PTB_ALIGN_SIZE, false);
 
 		if (r == -ENOMEM) {
 			r = radeon_vm_evict(rdev, vm);
-- 
1.7.7.5

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator
  2013-07-12 21:51 [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator alexdeucher
  2013-07-12 21:51 ` [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K alexdeucher
@ 2013-07-15  9:06 ` Christian König
  1 sibling, 0 replies; 4+ messages in thread
From: Christian König @ 2013-07-15  9:06 UTC (permalink / raw)
  To: alexdeucher; +Cc: Alex Deucher, dri-devel

Am 12.07.2013 23:51, schrieb alexdeucher@gmail.com:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> There are cases where we need more than 4k alignment.  No
> functional change with this commit.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

This series is: Reviewed-by: Christian König <christian.koenig@amd.com>

Out of curiosity: Where did you find that info? I looked for it quite a 
bit while working on page table directories and couldn't find anything.

Christian.

> ---
>   drivers/gpu/drm/radeon/radeon.h        |    1 +
>   drivers/gpu/drm/radeon/radeon_gart.c   |    1 +
>   drivers/gpu/drm/radeon/radeon_object.h |    2 +-
>   drivers/gpu/drm/radeon/radeon_ring.c   |    1 +
>   drivers/gpu/drm/radeon/radeon_sa.c     |    7 ++++---
>   5 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 6fe4b1c..39d2ce6 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -455,6 +455,7 @@ struct radeon_sa_manager {
>   	uint64_t		gpu_addr;
>   	void			*cpu_ptr;
>   	uint32_t		domain;
> +	uint32_t		align;
>   };
>   
>   struct radeon_sa_bo;
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
> index 43ec4a4..5ce190b 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -467,6 +467,7 @@ int radeon_vm_manager_init(struct radeon_device *rdev)
>   		size *= 2;
>   		r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager,
>   					      RADEON_GPU_PAGE_ALIGN(size),
> +					      RADEON_GPU_PAGE_SIZE,
>   					      RADEON_GEM_DOMAIN_VRAM);
>   		if (r) {
>   			dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n",
> diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
> index 91519a5..49c82c4 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.h
> +++ b/drivers/gpu/drm/radeon/radeon_object.h
> @@ -174,7 +174,7 @@ static inline void * radeon_sa_bo_cpu_addr(struct radeon_sa_bo *sa_bo)
>   
>   extern int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   				     struct radeon_sa_manager *sa_manager,
> -				     unsigned size, u32 domain);
> +				     unsigned size, u32 align, u32 domain);
>   extern void radeon_sa_bo_manager_fini(struct radeon_device *rdev,
>   				      struct radeon_sa_manager *sa_manager);
>   extern int radeon_sa_bo_manager_start(struct radeon_device *rdev,
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 5f1c51a..fb5ea62 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -224,6 +224,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
>   	}
>   	r = radeon_sa_bo_manager_init(rdev, &rdev->ring_tmp_bo,
>   				      RADEON_IB_POOL_SIZE*64*1024,
> +				      RADEON_GPU_PAGE_SIZE,
>   				      RADEON_GEM_DOMAIN_GTT);
>   	if (r) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index 0abe5a9..f0bac68 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -49,7 +49,7 @@ static void radeon_sa_bo_try_free(struct radeon_sa_manager *sa_manager);
>   
>   int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   			      struct radeon_sa_manager *sa_manager,
> -			      unsigned size, u32 domain)
> +			      unsigned size, u32 align, u32 domain)
>   {
>   	int i, r;
>   
> @@ -57,13 +57,14 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   	sa_manager->bo = NULL;
>   	sa_manager->size = size;
>   	sa_manager->domain = domain;
> +	sa_manager->align = align;
>   	sa_manager->hole = &sa_manager->olist;
>   	INIT_LIST_HEAD(&sa_manager->olist);
>   	for (i = 0; i < RADEON_NUM_RINGS; ++i) {
>   		INIT_LIST_HEAD(&sa_manager->flist[i]);
>   	}
>   
> -	r = radeon_bo_create(rdev, size, RADEON_GPU_PAGE_SIZE, true,
> +	r = radeon_bo_create(rdev, size, align, true,
>   			     domain, NULL, &sa_manager->bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
> @@ -317,7 +318,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
>   	unsigned tries[RADEON_NUM_RINGS];
>   	int i, r;
>   
> -	BUG_ON(align > RADEON_GPU_PAGE_SIZE);
> +	BUG_ON(align > sa_manager->align);
>   	BUG_ON(size > sa_manager->size);
>   
>   	*sa_bo = kmalloc(sizeof(struct radeon_sa_bo), GFP_KERNEL);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K
  2013-07-12 21:51 ` [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K alexdeucher
@ 2013-07-18 16:39   ` Jerome Glisse
  0 siblings, 0 replies; 4+ messages in thread
From: Jerome Glisse @ 2013-07-18 16:39 UTC (permalink / raw)
  To: alexdeucher; +Cc: Alex Deucher, dri-devel

On Fri, Jul 12, 2013 at 5:51 PM,  <alexdeucher@gmail.com> wrote:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> Covers requirements of all current asics.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
>  drivers/gpu/drm/radeon/radeon.h      |    5 +++++
>  drivers/gpu/drm/radeon/radeon_gart.c |   12 ++++++------
>  2 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 39d2ce6..875af79 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -784,6 +784,11 @@ struct radeon_mec {
>  /* number of entries in page table */
>  #define RADEON_VM_PTE_COUNT (1 << RADEON_VM_BLOCK_SIZE)
>
> +/* PTBs (Page Table Blocks) need to be aligned to 32K */
> +#define RADEON_VM_PTB_ALIGN_SIZE   32768
> +#define RADEON_VM_PTB_ALIGN_MASK (RADEON_VM_PTB_ALIGN_SIZE - 1)
> +#define RADEON_VM_PTB_ALIGN(a) (((a) + RADEON_VM_PTB_ALIGN_MASK) & ~RADEON_VM_PTB_ALIGN_MASK)
> +
>  struct radeon_vm {
>         struct list_head                list;
>         struct list_head                va;
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
> index 5ce190b..d9d31a3 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -466,8 +466,8 @@ int radeon_vm_manager_init(struct radeon_device *rdev)
>                 size += rdev->vm_manager.max_pfn * 8;
>                 size *= 2;
>                 r = radeon_sa_bo_manager_init(rdev, &rdev->vm_manager.sa_manager,
> -                                             RADEON_GPU_PAGE_ALIGN(size),
> -                                             RADEON_GPU_PAGE_SIZE,
> +                                             RADEON_VM_PTB_ALIGN(size),
> +                                             RADEON_VM_PTB_ALIGN_SIZE,
>                                               RADEON_GEM_DOMAIN_VRAM);
>                 if (r) {
>                         dev_err(rdev->dev, "failed to allocate vm bo (%dKB)\n",
> @@ -621,10 +621,10 @@ int radeon_vm_alloc_pt(struct radeon_device *rdev, struct radeon_vm *vm)
>         }
>
>  retry:
> -       pd_size = RADEON_GPU_PAGE_ALIGN(radeon_vm_directory_size(rdev));
> +       pd_size = RADEON_VM_PTB_ALIGN(radeon_vm_directory_size(rdev));
>         r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
>                              &vm->page_directory, pd_size,
> -                            RADEON_GPU_PAGE_SIZE, false);
> +                            RADEON_VM_PTB_ALIGN_SIZE, false);
>         if (r == -ENOMEM) {
>                 r = radeon_vm_evict(rdev, vm);
>                 if (r)
> @@ -953,8 +953,8 @@ static int radeon_vm_update_pdes(struct radeon_device *rdev,
>  retry:
>                 r = radeon_sa_bo_new(rdev, &rdev->vm_manager.sa_manager,
>                                      &vm->page_tables[pt_idx],
> -                                    RADEON_VM_PTE_COUNT * 8,
> -                                    RADEON_GPU_PAGE_SIZE, false);
> +                                    RADEON_VM_PTB_ALIGN(RADEON_VM_PTE_COUNT * 8),
> +                                    RADEON_VM_PTB_ALIGN_SIZE, false);

You sure this part is needed ? Each pde contains 512 pte so needs
512*8bytes=4kbytes With that align it suddenly need 32kbytes for each
pde but only 4k of this 32k will be use right ?

Cheers,
Jerome

>
>                 if (r == -ENOMEM) {
>                         r = radeon_vm_evict(rdev, vm);
> --
> 1.7.7.5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-07-18 16:39 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-12 21:51 [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator alexdeucher
2013-07-12 21:51 ` [PATCH 2/2] drm/radeon: align VM PTBs (Page Table Blocks) to 32K alexdeucher
2013-07-18 16:39   ` Jerome Glisse
2013-07-15  9:06 ` [PATCH 1/2] drm/radeon: allow selection of alignment in the sub-allocator Christian König

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.