drm/amd: Update kgd_kfd interface for resuming SDMA queues
authorFelix Kuehling <Felix.Kuehling@amd.com>
Wed, 1 Nov 2017 23:21:58 +0000 (19:21 -0400)
committerOded Gabbay <oded.gabbay@gmail.com>
Wed, 1 Nov 2017 23:21:58 +0000 (19:21 -0400)
Add wptr and mm parameters to hqd_sdma_load and pass these parameters
from device_queue_manager through the mqd_manager.

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.

Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
drivers/gpu/drm/amd/include/kgd_kfd_interface.h

index 1e3e9be7d77ecf29883cf0ec5d5874f0cb67bd64..a55d7948075bdfd0fc44c54d941d7e4f1ee75f0e 100644 (file)
@@ -105,7 +105,8 @@ 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 wptr_shift, uint32_t wptr_mask,
                        struct mm_struct *mm);
-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 bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
                                uint32_t pipe_id, uint32_t queue_id);
 
@@ -375,7 +376,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
        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;
index 056929b8ccd04e29403ecb401b335aa1ea8d754a..1017ff51c957c073367dea825e3964dbf21eb477 100644 (file)
@@ -64,7 +64,8 @@ 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 wptr_shift, uint32_t wptr_mask,
                        struct mm_struct *mm);
-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 bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
                uint32_t pipe_id, uint32_t queue_id);
 static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
@@ -358,7 +359,8 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,
        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)
 {
        return 0;
 }
index 4728fad3fd7425ca2e0ef2fbb805dc145d078df7..ea02bfa3bda3ddb92ad37c9a00a4ecab975aa607 100644 (file)
@@ -160,7 +160,9 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
                         uint32_t pipe_id, uint32_t queue_id,
                         struct queue_properties *p, 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,
+                                              (uint32_t __user *)p->write_ptr,
+                                              mms);
 }
 
 static int update_mqd(struct mqd_manager *mm, void *mqd,
index f516fd10e6ba7469856a59d039a8e1d715251a0e..c6d4e64531c71fdea21a477868e1fe7f0a093a1c 100644 (file)
@@ -184,7 +184,8 @@ struct kfd2kgd_calls {
                        uint32_t wptr_shift, uint32_t wptr_mask,
                        struct mm_struct *mm);
 
-       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);
 
        bool (*hqd_is_occupied)(struct kgd_dev *kgd, uint64_t queue_address,
                                uint32_t pipe_id, uint32_t queue_id);