aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch203
1 files changed, 203 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch
new file mode 100644
index 00000000..482cf4c3
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4618-drm-amdgpu-fix-documentation-of-amdgpu_mn.c-v2.patch
@@ -0,0 +1,203 @@
+From 2bb424e80da086b42ea6f6f00a8a7ab1b2fd63d1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Tue, 5 Jun 2018 11:47:43 +0200
+Subject: [PATCH 4618/5725] drm/amdgpu: fix documentation of amdgpu_mn.c v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+And wire it up as well.
+
+v2: improve the wording, fix label mismatch
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c | 74 ++++++++++++++++++++++++++--------
+ 1 file changed, 58 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
+index 211539f..7aaef93 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
+@@ -28,6 +28,21 @@
+ * Christian König <christian.koenig@amd.com>
+ */
+
++/**
++ * DOC: MMU Notifier
++ *
++ * For coherent userptr handling registers an MMU notifier to inform the driver
++ * about updates on the page tables of a process.
++ *
++ * When somebody tries to invalidate the page tables we block the update until
++ * all operations on the pages in question are completed, then those pages are
++ * marked as accessed and also dirty if it wasn't a read only access.
++ *
++ * New command submissions using the userptrs in question are delayed until all
++ * page table invalidation are completed and we once more see a coherent process
++ * address space.
++ */
++
+ #include <linux/firmware.h>
+ #include <linux/module.h>
+ #include <linux/mmu_notifier.h>
+@@ -38,6 +53,21 @@
+ #include "amdgpu.h"
+ #include "amdgpu_amdkfd.h"
+
++/**
++ * struct amdgpu_mn
++ *
++ * @adev: amdgpu device pointer
++ * @mm: process address space
++ * @mn: MMU notifier structur
++ * @work: destrution work item
++ * @node: hash table node to find structure by adev and mn
++ * @lock: rw semaphore protecting the notifier nodes
++ * @objects: interval tree containing amdgpu_mn_nodes
++ * @read_lock: mutex for recursive locking of @lock
++ * @recursion: depth of recursion
++ *
++ * Data for each amdgpu device and process address space.
++ */
+ struct amdgpu_mn {
+ /* constant after initialisation */
+ struct amdgpu_device *adev;
+@@ -62,13 +92,21 @@ struct amdgpu_mn {
+ atomic_t recursion;
+ };
+
++/**
++ * struct amdgpu_mn_node
++ *
++ * @it: interval node defining start-last of the affected address range
++ * @bos: list of all BOs in the affected address range
++ *
++ * Manages all BOs which are affected of a certain range of address space.
++ */
+ struct amdgpu_mn_node {
+ struct interval_tree_node it;
+ struct list_head bos;
+ };
+
+ /**
+- * amdgpu_mn_destroy - destroy the amn
++ * amdgpu_mn_destroy - destroy the MMU notifier
+ *
+ * @work: previously sheduled work item
+ *
+@@ -106,7 +144,7 @@ static void amdgpu_mn_destroy(struct work_struct *work)
+ * amdgpu_mn_release - callback to notify about mm destruction
+ *
+ * @mn: our notifier
+- * @mn: the mm this callback is about
++ * @mm: the mm this callback is about
+ *
+ * Shedule a work item to lazy destroy our notifier.
+ */
+@@ -114,13 +152,16 @@ static void amdgpu_mn_release(struct mmu_notifier *mn,
+ struct mm_struct *mm)
+ {
+ struct amdgpu_mn *amn = container_of(mn, struct amdgpu_mn, mn);
++
+ INIT_WORK(&amn->work, amdgpu_mn_destroy);
+ schedule_work(&amn->work);
+ }
+
+
+ /**
+- * amdgpu_mn_lock - take the write side lock for this mn
++ * amdgpu_mn_lock - take the write side lock for this notifier
++ *
++ * @mn: our notifier
+ */
+ void amdgpu_mn_lock(struct amdgpu_mn *mn)
+ {
+@@ -129,7 +170,9 @@ void amdgpu_mn_lock(struct amdgpu_mn *mn)
+ }
+
+ /**
+- * amdgpu_mn_unlock - drop the write side lock for this mn
++ * amdgpu_mn_unlock - drop the write side lock for this notifier
++ *
++ * @mn: our notifier
+ */
+ void amdgpu_mn_unlock(struct amdgpu_mn *mn)
+ {
+@@ -138,11 +181,9 @@ void amdgpu_mn_unlock(struct amdgpu_mn *mn)
+ }
+
+ /**
+- * amdgpu_mn_read_lock - take the amn read lock
++ * amdgpu_mn_read_lock - take the read side lock for this notifier
+ *
+ * @amn: our notifier
+- *
+- * Take the amn read side lock.
+ */
+ static void amdgpu_mn_read_lock(struct amdgpu_mn *amn)
+ {
+@@ -153,11 +194,9 @@ static void amdgpu_mn_read_lock(struct amdgpu_mn *amn)
+ }
+
+ /**
+- * amdgpu_mn_read_unlock - drop the amn read lock
++ * amdgpu_mn_read_unlock - drop the read side lock for this notifier
+ *
+ * @amn: our notifier
+- *
+- * Drop the amn read side lock.
+ */
+ static void amdgpu_mn_read_unlock(struct amdgpu_mn *amn)
+ {
+@@ -169,9 +208,11 @@ static void amdgpu_mn_read_unlock(struct amdgpu_mn *amn)
+ * amdgpu_mn_invalidate_node - unmap all BOs of a node
+ *
+ * @node: the node with the BOs to unmap
++ * @start: start of address range affected
++ * @end: end of address range affected
+ *
+- * We block for all BOs and unmap them by move them
+- * into system domain again.
++ * Block for operations on BOs to finish and mark pages as accessed and
++ * potentially dirty.
+ */
+ static void amdgpu_mn_invalidate_node(struct amdgpu_mn_node *node,
+ unsigned long start,
+@@ -198,12 +239,12 @@ static void amdgpu_mn_invalidate_node(struct amdgpu_mn_node *node,
+ * amdgpu_mn_invalidate_range_start_gfx - callback to notify about mm change
+ *
+ * @mn: our notifier
+- * @mn: the mm this callback is about
++ * @mm: the mm this callback is about
+ * @start: start of updated range
+ * @end: end of updated range
+ *
+- * We block for all BOs between start and end to be idle and
+- * unmap them by move them into system domain again.
++ * Block for operations on BOs to finish and mark pages as accessed and
++ * potentially dirty.
+ */
+ static void amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn,
+ struct mm_struct *mm,
+@@ -233,7 +274,7 @@ static void amdgpu_mn_invalidate_range_start_gfx(struct mmu_notifier *mn,
+ * amdgpu_mn_invalidate_range_end_gfx - callback to notify about mm change
+ *
+ * @mn: our notifier
+- * @mn: the mm this callback is about
++ * @mm: the mm this callback is about
+ * @start: start of updated range
+ * @end: end of updated range
+ *
+@@ -488,6 +529,7 @@ void amdgpu_mn_unregister(struct amdgpu_bo *bo)
+
+ if (list_empty(head)) {
+ struct amdgpu_mn_node *node;
++
+ node = container_of(head, struct amdgpu_mn_node, bos);
+ interval_tree_remove(&node->it, &amn->objects);
+ kfree(node);
+--
+2.7.4
+