aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch183
1 files changed, 0 insertions, 183 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch
deleted file mode 100644
index fc2d887f..00000000
--- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1604-drm-amdkfd-Fixed-a-kfd-driver-and-FW-sync-issue.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-From dd94a9a0309ff7824f975eebd2d7ab4c8c6771f1 Mon Sep 17 00:00:00 2001
-From: ozeng <oak.zeng@amd.com>
-Date: Fri, 17 Feb 2017 16:48:37 -0600
-Subject: [PATCH 1604/4131] drm/amdkfd: Fixed a kfd driver and FW sync issue
-
-In update_queue(), previously mqd is updated by kfd driver
-while queue is still mapped to hqd. When queue is mapped,
-mqd is owned by FW and clobbered during driver update.
-
-Queue is unmapped first and mapped again after mqd update.
-
-Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
-
-Change-Id: I27d72750ec3419e91945e240f5637fb974db8b9a
----
- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 95 ++++++++++++++--------
- 1 file changed, 63 insertions(+), 32 deletions(-)
-
-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 fc38dca..d1edbfc 100644
---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
-+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
-@@ -50,6 +50,8 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm,
- enum kfd_unmap_queues_filter filter,
- uint32_t filter_param, bool reset);
-
-+static int map_queues_cpsch(struct device_queue_manager *dqm);
-+
- static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
- struct queue *q,
- struct qcm_process_device *qpd);
-@@ -404,6 +406,13 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
- return retval;
- }
-
-+static bool is_queue_nocpsch(struct device_queue_manager *dqm, struct queue *q)
-+{
-+ return (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS &&
-+ (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
-+ q->properties.type == KFD_QUEUE_TYPE_SDMA));
-+}
-+
- static int update_queue(struct device_queue_manager *dqm, struct queue *q)
- {
- int retval;
-@@ -437,33 +446,45 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q)
- q->properties.queue_address != 0);
-
- /* save previous activity state for counters */
-- if (q->properties.is_active)
-- prev_active = true;
-+ prev_active = q->properties.is_active;
-
-+ /* HWS mode, unmap first to own mqd */
-+ if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) {
-+ retval = unmap_queues_cpsch(dqm,
-+ KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
-+ false);
-+ if (retval != 0) {
-+ pr_err("unmap queue failed");
-+ goto out_unlock;
-+ }
-+ } else if (is_queue_nocpsch(dqm, q) && prev_active == true) {
-+ retval = mqd->destroy_mqd(mqd, q->mqd,
-+ KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN,
-+ KFD_UNMAP_LATENCY_MS, q->pipe, q->queue);
-+ if (retval != 0) {
-+ pr_err("destroy mqd failed");
-+ goto out_unlock;
-+ }
-+ }
-
- retval = mqd->update_mqd(mqd, q->mqd, &q->properties);
-- if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS &&
-- (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
-- q->properties.type == KFD_QUEUE_TYPE_SDMA)) {
-+
-+ if (is_queue_nocpsch(dqm, q)) {
- if (q->properties.is_active)
- retval = mqd->load_mqd(mqd, q->mqd, q->pipe, q->queue,
- &q->properties, q->process->mm);
-- else if (prev_active)
-- retval = mqd->destroy_mqd(mqd, q->mqd,
-- KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN,
-- KFD_UNMAP_LATENCY_MS, q->pipe, q->queue);
- }
- /*
-- * check active state vs. the previous state
-- * and modify counter accordingly
-- */
-+ * check active state vs. the previous state
-+ * and modify counter accordingly
-+ */
- if ((q->properties.is_active) && (!prev_active))
- dqm->queue_count++;
- else if ((!q->properties.is_active) && (prev_active))
- dqm->queue_count--;
-
- if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS)
-- retval = execute_queues_cpsch(dqm, false);
-+ retval = map_queues_cpsch(dqm);
-
- out_unlock:
- mutex_unlock(&dqm->lock);
-@@ -518,9 +539,7 @@ int process_evict_queues(struct device_queue_manager *dqm,
- q->properties.is_evicted = true;
-
- retval = mqd->update_mqd(mqd, q->mqd, &q->properties);
-- if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS &&
-- (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
-- q->properties.type == KFD_QUEUE_TYPE_SDMA) &&
-+ if (is_queue_nocpsch(dqm, q) &&
- q->properties.is_evicted)
- retval = mqd->destroy_mqd(mqd, q->mqd,
- KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN,
-@@ -1128,6 +1147,31 @@ static int unmap_sdma_queues(struct device_queue_manager *dqm,
- }
-
- /* dqm->lock mutex has to be locked before calling this function */
-+static int map_queues_cpsch(struct device_queue_manager *dqm)
-+{
-+ int retval;
-+
-+ if (dqm->queue_count <= 0 || dqm->processes_count <= 0) {
-+ retval = 0;
-+ return retval;
-+ }
-+
-+ if (dqm->active_runlist) {
-+ retval = 0;
-+ return retval;
-+ }
-+
-+ retval = pm_send_runlist(&dqm->packets, &dqm->queues);
-+ if (retval != 0) {
-+ pr_err("failed to execute runlist");
-+ return retval;
-+ }
-+ dqm->active_runlist = true;
-+
-+ return retval;
-+}
-+
-+/* dqm->lock mutex has to be locked before calling this function */
- static int unmap_queues_cpsch(struct device_queue_manager *dqm,
- enum kfd_unmap_queues_filter filter,
- uint32_t filter_param, bool reset)
-@@ -1180,6 +1224,8 @@ static int execute_queues_cpsch(struct device_queue_manager *dqm,
-
- BUG_ON(!dqm);
-
-+ pr_debug("In function %s\n", __func__);
-+
- filter = static_queues_included ?
- KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES :
- KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES;
-@@ -1190,22 +1236,7 @@ static int execute_queues_cpsch(struct device_queue_manager *dqm,
- return retval;
- }
-
-- if (dqm->queue_count <= 0 || dqm->processes_count <= 0) {
-- retval = 0;
-- return retval;
-- }
--
-- if (dqm->active_runlist) {
-- retval = 0;
-- return retval;
-- }
--
-- retval = pm_send_runlist(&dqm->packets, &dqm->queues);
-- if (retval != 0) {
-- pr_err("kfd: failed to execute runlist");
-- return retval;
-- }
-- dqm->active_runlist = true;
-+ retval = map_queues_cpsch(dqm);
-
- return retval;
- }
---
-2.7.4
-