* [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.