diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1464-drm-amd-Update-kgd_kfd-interface-for-resuming-SDMA-q.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1464-drm-amd-Update-kgd_kfd-interface-for-resuming-SDMA-q.patch | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1464-drm-amd-Update-kgd_kfd-interface-for-resuming-SDMA-q.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1464-drm-amd-Update-kgd_kfd-interface-for-resuming-SDMA-q.patch new file mode 100644 index 00000000..f1875446 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1464-drm-amd-Update-kgd_kfd-interface-for-resuming-SDMA-q.patch @@ -0,0 +1,265 @@ +From 628e974e6cab609fb32dcf10eb953ea70a8ff0d9 Mon Sep 17 00:00:00 2001 +From: Felix Kuehling <Felix.Kuehling@amd.com> +Date: Thu, 30 Jun 2016 00:10:44 -0400 +Subject: [PATCH 1464/4131] drm/amd: Update kgd_kfd interface for resuming SDMA + queues + +Add wptr and mm parameters to hqd_sdma_load and pass these parameters +from device_queue_manager through the mqd_manager. Remove the unused +page_table_base parameter from hqd_load while working on the interface. + +SDMA doesn't support polling while the engine believes it's idle. The +driver must update the wptr. The new parameters will be used for looking +up the updated value from the specified mm when SDMA queues are resumed +after being disabled. + +Change-Id: Iff5e36596246b95ef36f579c620601c7122e3813 +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 12 ++++++------ + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 12 ++++++------ + drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 10 +++++----- + drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 2 +- + drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 3 +-- + drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 10 +++++----- + drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 8 ++++---- + drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 9 +++++---- + 8 files changed, 33 insertions(+), 33 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +index cec4d67..a67c20a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +@@ -104,12 +104,12 @@ static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid, u + static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, uint32_t hpd_size, uint64_t hpd_gpu_addr); + static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id); + static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base); ++ uint32_t queue_id, uint32_t __user *wptr); + static int kgd_hqd_dump(struct kgd_dev *kgd, + uint32_t pipe_id, uint32_t queue_id, + uint32_t (**dump)[2], uint32_t *n_regs); +-static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd); ++static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd, ++ uint32_t __user *wptr, struct mm_struct *mm); + static int kgd_hqd_sdma_dump(struct kgd_dev *kgd, + uint32_t engine_id, uint32_t queue_id, + uint32_t (**dump)[2], uint32_t *n_regs); +@@ -351,8 +351,7 @@ static inline struct cik_sdma_rlc_registers *get_sdma_mqd(void *mqd) + } + + static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base) ++ uint32_t queue_id, uint32_t __user *wptr) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + struct cik_mqd *m; +@@ -461,7 +460,8 @@ static int kgd_hqd_dump(struct kgd_dev *kgd, + return 0; + } + +-static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd) ++static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd, ++ uint32_t __user *wptr, struct mm_struct *mm) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + struct cik_sdma_rlc_registers *m; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +index 473b924..7d71727 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +@@ -81,12 +81,12 @@ static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, + uint32_t hpd_size, uint64_t hpd_gpu_addr); + static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id); + static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base); ++ uint32_t queue_id, uint32_t __user *wptr); + static int kgd_hqd_dump(struct kgd_dev *kgd, + uint32_t pipe_id, uint32_t queue_id, + uint32_t (**dump)[2], uint32_t *n_regs); +-static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd); ++static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd, ++ uint32_t __user *wptr, struct mm_struct *mm); + static int kgd_hqd_sdma_dump(struct kgd_dev *kgd, + uint32_t engine_id, uint32_t queue_id, + uint32_t (**dump)[2], uint32_t *n_regs); +@@ -346,8 +346,7 @@ static inline struct vi_sdma_mqd *get_sdma_mqd(void *mqd) + } + + static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base) ++ uint32_t queue_id, uint32_t __user *wptr) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + struct vi_mqd *m; +@@ -459,7 +458,8 @@ static int kgd_hqd_dump(struct kgd_dev *kgd, + return 0; + } + +-static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd) ++static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd, ++ uint32_t __user *wptr, struct mm_struct *mm) + { + struct amdgpu_device *adev = get_amdgpu_device(kgd); + struct vi_sdma_mqd *m; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +index 41a184c..9fbbeee 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -304,7 +304,7 @@ static int create_compute_queue_nocpsch(struct device_queue_manager *dqm, + + retval = mqd->load_mqd(mqd, q->mqd, q->pipe, + q->queue, (uint32_t __user *) q->properties.write_ptr, +- qpd->page_table_base); ++ q->process->mm); + if (retval != 0) { + deallocate_hqd(dqm, q); + mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); +@@ -423,7 +423,8 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q) + if (q->properties.is_active) + retval = mqd->load_mqd(mqd, q->mqd, q->pipe, + q->queue, +- (uint32_t __user *)q->properties.write_ptr, 0); ++ (uint32_t __user *)q->properties.write_ptr, ++ q->process->mm); + else if (prev_active) + retval = mqd->destroy_mqd(mqd, q->mqd, + KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN, +@@ -551,7 +552,7 @@ int process_restore_queues(struct device_queue_manager *dqm, + q->pipe, + q->queue, + (uint32_t __user *)q->properties.write_ptr, +- 0); ++ q->process->mm); + dqm->queue_count++; + } + } +@@ -777,8 +778,7 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, + return retval; + } + +- retval = mqd->load_mqd(mqd, q->mqd, 0, +- 0, NULL, 0); ++ retval = mqd->load_mqd(mqd, q->mqd, 0, 0, NULL, NULL); + if (retval != 0) { + deallocate_sdma_queue(dqm, q->sdma_id); + mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +index fc4d8b2..90a26fa 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +@@ -143,7 +143,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev, + kq->queue->pipe = KFD_CIK_HIQ_PIPE; + kq->queue->queue = KFD_CIK_HIQ_QUEUE; + kq->mqd->load_mqd(kq->mqd, kq->queue->mqd, kq->queue->pipe, +- kq->queue->queue, NULL, 0); ++ kq->queue->queue, NULL, NULL); + } else { + /* allocate fence for DIQ */ + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h +index 574684f..4be3267 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h +@@ -67,8 +67,7 @@ struct mqd_manager { + + int (*load_mqd)(struct mqd_manager *mm, void *mqd, + uint32_t pipe_id, uint32_t queue_id, +- uint32_t __user *wptr, +- uint32_t page_table_base); ++ uint32_t __user *wptr, struct mm_struct *mms); + + int (*update_mqd)(struct mqd_manager *mm, void *mqd, + struct queue_properties *q); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c +index e565bee..1badce1 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c +@@ -208,18 +208,18 @@ static void uninit_mqd_sdma(struct mqd_manager *mm, void *mqd, + } + + static int load_mqd(struct mqd_manager *mm, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base) ++ uint32_t queue_id, uint32_t __user *wptr, ++ struct mm_struct *mms) + { + return mm->dev->kfd2kgd->hqd_load +- (mm->dev->kgd, mqd, pipe_id, queue_id, wptr, page_table_base); ++ (mm->dev->kgd, mqd, pipe_id, queue_id, wptr); + } + + static int load_mqd_sdma(struct mqd_manager *mm, void *mqd, + uint32_t pipe_id, uint32_t queue_id, +- uint32_t __user *wptr, uint32_t page_table_base) ++ uint32_t __user *wptr, struct mm_struct *mms) + { +- return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd); ++ return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd, wptr, mms); + } + + static int __update_mqd(struct mqd_manager *mm, void *mqd, +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +index 25c1269..d78964c 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +@@ -171,10 +171,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, + + static int load_mqd(struct mqd_manager *mm, void *mqd, + uint32_t pipe_id, uint32_t queue_id, +- uint32_t __user *wptr, uint32_t page_table_base) ++ uint32_t __user *wptr, struct mm_struct *mms) + { + return mm->dev->kfd2kgd->hqd_load +- (mm->dev->kgd, mqd, pipe_id, queue_id, wptr, page_table_base); ++ (mm->dev->kgd, mqd, pipe_id, queue_id, wptr); + } + + static int __update_mqd(struct mqd_manager *mm, void *mqd, +@@ -362,9 +362,9 @@ static void uninit_mqd_sdma(struct mqd_manager *mm, void *mqd, + + static int load_mqd_sdma(struct mqd_manager *mm, void *mqd, + uint32_t pipe_id, uint32_t queue_id, +- uint32_t __user *wptr, uint32_t page_table_base) ++ uint32_t __user *wptr, struct mm_struct *mms) + { +- return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd); ++ return mm->dev->kfd2kgd->hqd_sdma_load(mm->dev->kgd, mqd, wptr, mms); + } + + static int update_mqd_sdma(struct mqd_manager *mm, void *mqd, +diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +index b981589..3db537b 100644 +--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +@@ -170,7 +170,8 @@ struct kgd2kfd_shared_resources { + * sceduling mode. + * + * @hqd_sdma_load: Loads the SDMA mqd structure to a H/W SDMA hqd slot. +- * used only for no HWS mode. ++ * used only for no HWS mode. If mm is passed in, its mmap_sem must be ++ * read-locked. + * + * @hqd_dump: Dumps CPC HQD registers to an array of address-value pairs. + * Array is allocated with kmalloc, needs to be freed with kfree by caller. +@@ -247,10 +248,10 @@ struct kfd2kgd_calls { + + + int (*hqd_load)(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, +- uint32_t queue_id, uint32_t __user *wptr, +- uint32_t page_table_base); ++ uint32_t queue_id, uint32_t __user *wptr); + +- int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd); ++ int (*hqd_sdma_load)(struct kgd_dev *kgd, void *mqd, ++ uint32_t __user *wptr, struct mm_struct *mm); + + int (*hqd_dump)(struct kgd_dev *kgd, + uint32_t pipe_id, uint32_t queue_id, +-- +2.7.4 + |