Commit d1f8f0d1 authored by Oak Zeng's avatar Oak Zeng Committed by Alex Deucher

drm/amdkfd: Move non-sdma mqd allocation out of init_mqd

This is preparation work to introduce more mqd allocation
scheme
Signed-off-by: default avatarOak Zeng <ozeng@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e73390d1
...@@ -66,6 +66,19 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd, ...@@ -66,6 +66,19 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
m->compute_static_thread_mgmt_se3); m->compute_static_thread_mgmt_se3);
} }
static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
struct queue_properties *q)
{
struct kfd_mem_obj *mqd_mem_obj;
if (kfd_gtt_sa_allocate(kfd, sizeof(struct cik_mqd),
&mqd_mem_obj))
return NULL;
return mqd_mem_obj;
}
static int init_mqd(struct mqd_manager *mm, void **mqd, static int init_mqd(struct mqd_manager *mm, void **mqd,
struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr, struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
struct queue_properties *q) struct queue_properties *q)
...@@ -73,11 +86,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, ...@@ -73,11 +86,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
uint64_t addr; uint64_t addr;
struct cik_mqd *m; struct cik_mqd *m;
int retval; int retval;
struct kfd_dev *kfd = mm->dev;
retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct cik_mqd), *mqd_mem_obj = allocate_mqd(kfd, q);
mqd_mem_obj); if (!*mqd_mem_obj)
if (retval != 0)
return -ENOMEM; return -ENOMEM;
m = (struct cik_mqd *) (*mqd_mem_obj)->cpu_ptr; m = (struct cik_mqd *) (*mqd_mem_obj)->cpu_ptr;
......
...@@ -67,38 +67,53 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd, ...@@ -67,38 +67,53 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
m->compute_static_thread_mgmt_se3); m->compute_static_thread_mgmt_se3);
} }
static int init_mqd(struct mqd_manager *mm, void **mqd, static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr, struct queue_properties *q)
struct queue_properties *q)
{ {
int retval; int retval;
uint64_t addr; struct kfd_mem_obj *mqd_mem_obj = NULL;
struct v9_mqd *m;
struct kfd_dev *kfd = mm->dev;
*mqd_mem_obj = NULL;
/* From V9, for CWSR, the control stack is located on the next page /* From V9, for CWSR, the control stack is located on the next page
* boundary after the mqd, we will use the gtt allocation function * boundary after the mqd, we will use the gtt allocation function
* instead of sub-allocation function. * instead of sub-allocation function.
*/ */
if (kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) { if (kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) {
*mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL); mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_NOIO);
if (!*mqd_mem_obj) if (!mqd_mem_obj)
return -ENOMEM; return NULL;
retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->kgd, retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->kgd,
ALIGN(q->ctl_stack_size, PAGE_SIZE) + ALIGN(q->ctl_stack_size, PAGE_SIZE) +
ALIGN(sizeof(struct v9_mqd), PAGE_SIZE), ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
&((*mqd_mem_obj)->gtt_mem), &(mqd_mem_obj->gtt_mem),
&((*mqd_mem_obj)->gpu_addr), &(mqd_mem_obj->gpu_addr),
(void *)&((*mqd_mem_obj)->cpu_ptr), true); (void *)&(mqd_mem_obj->cpu_ptr), true);
} else } else {
retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd), retval = kfd_gtt_sa_allocate(kfd, sizeof(struct v9_mqd),
mqd_mem_obj); &mqd_mem_obj);
}
if (retval) { if (retval) {
kfree(*mqd_mem_obj); kfree(mqd_mem_obj);
return -ENOMEM; return NULL;
} }
return mqd_mem_obj;
}
static int init_mqd(struct mqd_manager *mm, void **mqd,
struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
struct queue_properties *q)
{
int retval;
uint64_t addr;
struct v9_mqd *m;
struct kfd_dev *kfd = mm->dev;
*mqd_mem_obj = allocate_mqd(kfd, q);
if (!*mqd_mem_obj)
return -ENOMEM;
m = (struct v9_mqd *) (*mqd_mem_obj)->cpu_ptr; m = (struct v9_mqd *) (*mqd_mem_obj)->cpu_ptr;
addr = (*mqd_mem_obj)->gpu_addr; addr = (*mqd_mem_obj)->gpu_addr;
......
...@@ -68,6 +68,18 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd, ...@@ -68,6 +68,18 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
m->compute_static_thread_mgmt_se3); m->compute_static_thread_mgmt_se3);
} }
static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
struct queue_properties *q)
{
struct kfd_mem_obj *mqd_mem_obj;
if (kfd_gtt_sa_allocate(kfd, sizeof(struct vi_mqd),
&mqd_mem_obj))
return NULL;
return mqd_mem_obj;
}
static int init_mqd(struct mqd_manager *mm, void **mqd, static int init_mqd(struct mqd_manager *mm, void **mqd,
struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr, struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
struct queue_properties *q) struct queue_properties *q)
...@@ -75,10 +87,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, ...@@ -75,10 +87,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
int retval; int retval;
uint64_t addr; uint64_t addr;
struct vi_mqd *m; struct vi_mqd *m;
struct kfd_dev *kfd = mm->dev;
retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct vi_mqd), *mqd_mem_obj = allocate_mqd(kfd, q);
mqd_mem_obj); if (!*mqd_mem_obj)
if (retval != 0)
return -ENOMEM; return -ENOMEM;
m = (struct vi_mqd *) (*mqd_mem_obj)->cpu_ptr; m = (struct vi_mqd *) (*mqd_mem_obj)->cpu_ptr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment