Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:23:17 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/amdgpu: files.amdgpu
        src/sys/external/bsd/drm2/dist/drm/amd/amdgpu: amdgpu_irq.c
            amdgpu_ras.c
        src/sys/external/bsd/drm2/dist/drm/scheduler: sched_entity.c
            sched_fence.c sched_main.c
        src/sys/external/bsd/drm2/dist/include/drm: gpu_scheduler.h
        src/sys/external/bsd/drm2/drm: files.drmkms
        src/sys/external/bsd/drm2/include/linux: sched.h

Log Message:
amdgpu: Stub out irq domain stuff with a finer grain.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/external/bsd/drm2/amdgpu/files.amdgpu
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c \
    src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c \
    src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h
cvs rdiff -u -r1.68 -r1.69 src/sys/external/bsd/drm2/drm/files.drmkms
cvs rdiff -u -r1.19 -r1.20 src/sys/external/bsd/drm2/include/linux/sched.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/amdgpu/files.amdgpu
diff -u src/sys/external/bsd/drm2/amdgpu/files.amdgpu:1.23 src/sys/external/bsd/drm2/amdgpu/files.amdgpu:1.24
--- src/sys/external/bsd/drm2/amdgpu/files.amdgpu:1.23	Sun Dec 19 12:22:48 2021
+++ src/sys/external/bsd/drm2/amdgpu/files.amdgpu	Sun Dec 19 12:23:16 2021
@@ -1,9 +1,9 @@
-#	$NetBSD: files.amdgpu,v 1.23 2021/12/19 12:22:48 riastradh Exp $
+#	$NetBSD: files.amdgpu,v 1.24 2021/12/19 12:23:16 riastradh Exp $
 
 version	20180827
 
 define	amdgpufbbus	{ }
-device	amdgpu: drmkms, drmkms_pci, drmkms_ttm, amdgpufbbus, firmload
+device	amdgpu: drmkms, drmkms_pci, drmkms_ttm, drmsched, amdgpufbbus, firmload
 attach	amdgpu at pci
 
 defflag	opt_amdgpu_cik.h AMDGPU_CIK

Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c:1.6 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c:1.6	Sun Dec 19 12:02:39 2021
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_irq.c	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: amdgpu_irq.c,v 1.6 2021/12/19 12:02:39 riastradh Exp $	*/
+/*	$NetBSD: amdgpu_irq.c,v 1.7 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2008 Advanced Micro Devices, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_irq.c,v 1.6 2021/12/19 12:02:39 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_irq.c,v 1.7 2021/12/19 12:23:16 riastradh Exp $");
 
 #include <linux/irq.h>
 #include <linux/pci.h>
@@ -610,7 +610,7 @@ bool amdgpu_irq_enabled(struct amdgpu_de
 	return !!atomic_read(&src->enabled_types[type]);
 }
 
-#ifndef __NetBSD__		/* XXX amdgpu irq */
+#ifndef __NetBSD__		/* XXX amdgpu irq domain */
 
 /* XXX: Generic IRQ handling */
 static void amdgpu_irq_mask(struct irq_data *irqd)
@@ -659,6 +659,8 @@ static const struct irq_domain_ops amdgp
 	.map = amdgpu_irqdomain_map,
 };
 
+#endif	/* __NetBSD__ */
+
 /**
  * amdgpu_irq_add_domain - create a linear IRQ domain
  *
@@ -672,12 +674,14 @@ static const struct irq_domain_ops amdgp
  */
 int amdgpu_irq_add_domain(struct amdgpu_device *adev)
 {
+#ifndef __NetBSD__		/* XXX amdgpu irq domain */
 	adev->irq.domain = irq_domain_add_linear(NULL, AMDGPU_MAX_IRQ_SRC_ID,
 						 &amdgpu_hw_irqdomain_ops, adev);
 	if (!adev->irq.domain) {
 		DRM_ERROR("GPU irq add domain failed\n");
 		return -ENODEV;
 	}
+#endif
 
 	return 0;
 }
@@ -692,10 +696,12 @@ int amdgpu_irq_add_domain(struct amdgpu_
  */
 void amdgpu_irq_remove_domain(struct amdgpu_device *adev)
 {
+#ifndef __NetBSD__		/* XXX amdgpu irq domain */
 	if (adev->irq.domain) {
 		irq_domain_remove(adev->irq.domain);
 		adev->irq.domain = NULL;
 	}
+#endif
 }
 
 /**
@@ -713,9 +719,11 @@ void amdgpu_irq_remove_domain(struct amd
  */
 unsigned amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned src_id)
 {
+#ifdef __NetBSD__		/* XXX amdgpu irq domain */
+	return 0;
+#else
 	adev->irq.virq[src_id] = irq_create_mapping(adev->irq.domain, src_id);
 
 	return adev->irq.virq[src_id];
-}
-
 #endif
+}

Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c:1.3 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c:1.3	Sun Dec 19 12:21:29 2021
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ras.c	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: amdgpu_ras.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $	*/
+/*	$NetBSD: amdgpu_ras.c,v 1.4 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2018 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
  *
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_ras.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_ras.c,v 1.4 2021/12/19 12:23:16 riastradh Exp $");
 
 #include <linux/debugfs.h>
 #include <linux/list.h>
@@ -1006,9 +1006,12 @@ static int amdgpu_ras_sysfs_remove_featu
 	return 0;
 }
 
+#endif	/* __NetBSD__ */
+
 int amdgpu_ras_sysfs_create(struct amdgpu_device *adev,
 		struct ras_fs_if *head)
 {
+#ifndef __NetBSD__
 	struct ras_manager *obj = amdgpu_ras_find_obj(adev, &head->head);
 
 	if (!obj || obj->attr_inuse)
@@ -1037,6 +1040,7 @@ int amdgpu_ras_sysfs_create(struct amdgp
 	}
 
 	obj->attr_inuse = 1;
+#endif
 
 	return 0;
 }
@@ -1044,6 +1048,7 @@ int amdgpu_ras_sysfs_create(struct amdgp
 int amdgpu_ras_sysfs_remove(struct amdgpu_device *adev,
 		struct ras_common_if *head)
 {
+#ifndef __NetBSD__		/* XXX amdgpu sysfs */
 	struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
 
 	if (!obj || !obj->attr_inuse)
@@ -1054,12 +1059,14 @@ int amdgpu_ras_sysfs_remove(struct amdgp
 				"ras");
 	obj->attr_inuse = 0;
 	put_obj(obj);
+#endif	/* __NetBSD__ */
 
 	return 0;
 }
 
 static int amdgpu_ras_sysfs_remove_all(struct amdgpu_device *adev)
 {
+#ifndef __NetBSD__
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 	struct ras_manager *obj, *tmp;
 
@@ -1068,10 +1075,10 @@ static int amdgpu_ras_sysfs_remove_all(s
 	}
 
 	amdgpu_ras_sysfs_remove_feature_node(adev);
+#endif
 
 	return 0;
 }
-#endif	/* __NetBSD__ */
 /* sysfs end */
 
 /**
@@ -1117,9 +1124,12 @@ static void amdgpu_ras_debugfs_create_ct
 				&con->reboot);
 }
 
+#endif	/* __NetBSD__ */
+
 void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
 		struct ras_fs_if *head)
 {
+#ifndef __NetBSD__		/* XXX amdgpu debugfs */
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 	struct ras_manager *obj = amdgpu_ras_find_obj(adev, &head->head);
 
@@ -1135,11 +1145,13 @@ void amdgpu_ras_debugfs_create(struct am
 	obj->ent = debugfs_create_file(obj->fs_data.debugfs_name,
 				       S_IWUGO | S_IRUGO, con->dir, obj,
 				       &amdgpu_ras_debugfs_ops);
+#endif
 }
 
 void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
 		struct ras_common_if *head)
 {
+#ifndef __NetBSD__		/* XXX amdgpu debugfs */
 	struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
 
 	if (!obj || !obj->ent)
@@ -1148,10 +1160,12 @@ void amdgpu_ras_debugfs_remove(struct am
 	debugfs_remove(obj->ent);
 	obj->ent = NULL;
 	put_obj(obj);
+#endif	/* __NetBSD__ */
 }
 
 static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
 {
+#ifndef __NetBSD__
 	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 	struct ras_manager *obj, *tmp;
 
@@ -1161,8 +1175,8 @@ static void amdgpu_ras_debugfs_remove_al
 
 	debugfs_remove_recursive(con->dir);
 	con->dir = NULL;
+#endif
 }
-#endif	/* __NetBSD__ */
 /* debugfs end */
 
 /* ras fs */
@@ -1179,10 +1193,8 @@ static int amdgpu_ras_fs_init(struct amd
 
 static int amdgpu_ras_fs_fini(struct amdgpu_device *adev)
 {
-#ifndef __NetBSD__		/* XXX amdgpu debugfs sysfs */
 	amdgpu_ras_debugfs_remove_all(adev);
 	amdgpu_ras_sysfs_remove_all(adev);
-#endif
 	return 0;
 }
 /* ras fs end */

Index: src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c
diff -u src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c:1.2 src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c:1.2	Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/scheduler/sched_entity.c	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched_entity.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $	*/
+/*	$NetBSD: sched_entity.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2015 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sched_entity.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sched_entity.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $");
 
 #include <linux/kthread.h>
 #include <linux/slab.h>
@@ -97,7 +97,7 @@ EXPORT_SYMBOL(drm_sched_entity_init);
  */
 static bool drm_sched_entity_is_idle(struct drm_sched_entity *entity)
 {
-	rmb(); /* for list_empty to work without lock */
+	assert_spin_locked(&entity->rq->sched->job_list_lock);
 
 	if (list_empty(&entity->list) ||
 	    spsc_queue_count(&entity->job_queue) == 0)
@@ -171,13 +171,24 @@ drm_sched_entity_get_free_sched(struct d
 long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout)
 {
 	struct drm_gpu_scheduler *sched;
+#ifdef __NetBSD__
+	struct proc *last_user;
+#else
 	struct task_struct *last_user;
+#endif
 	long ret = timeout;
 
 	if (!entity->rq)
 		return 0;
 
 	sched = entity->rq->sched;
+#ifdef __NetBSD__
+	spin_lock(&sched->job_list_lock);
+	DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &sched->job_scheduled,
+	    &sched->job_list_lock,
+	    drm_sched_entity_is_idle(entity));
+	spin_unlock(&sched->job_list_lock);
+#else
 	/**
 	 * The client will not queue more IBs during this fini, consume existing
 	 * queued IBs or discard them on SIGKILL
@@ -192,11 +203,19 @@ long drm_sched_entity_flush(struct drm_s
 		wait_event_killable(sched->job_scheduled,
 				    drm_sched_entity_is_idle(entity));
 	}
+#endif
 
 	/* For killed process disable any more IBs enqueue right now */
+#ifdef __NetBSD__
+	last_user = cmpxchg(&entity->last_user, curproc, NULL);
+	if ((!last_user || last_user == curproc) &&
+	    (curproc->p_sflag & PS_WEXIT))
+#else
 	last_user = cmpxchg(&entity->last_user, current->group_leader, NULL);
 	if ((!last_user || last_user == current->group_leader) &&
-	    (current->flags & PF_EXITING) && (current->exit_code == SIGKILL)) {
+	    (current->flags & PF_EXITING) && (current->exit_code == SIGKILL))
+#endif
+	{
 		spin_lock(&entity->rq_lock);
 		entity->stopped = true;
 		drm_sched_rq_remove_entity(entity->rq, entity);
@@ -348,7 +367,9 @@ static void drm_sched_entity_wakeup(stru
 		container_of(cb, struct drm_sched_entity, cb);
 
 	drm_sched_entity_clear_dep(f, cb);
+	spin_lock(&entity->rq->sched->job_list_lock);
 	drm_sched_wakeup(entity->rq->sched);
+	spin_unlock(&entity->rq->sched->job_list_lock);
 }
 
 /**
@@ -504,7 +525,11 @@ void drm_sched_entity_push_job(struct dr
 
 	trace_drm_sched_job(sched_job, entity);
 	atomic_inc(&entity->rq->sched->score);
+#ifdef __NetBSD__
+	WRITE_ONCE(entity->last_user, curproc);
+#else
 	WRITE_ONCE(entity->last_user, current->group_leader);
+#endif
 	first = spsc_queue_push(&entity->job_queue, &sched_job->queue_node);
 
 	/* first job wakes up scheduler */
@@ -519,7 +544,9 @@ void drm_sched_entity_push_job(struct dr
 		}
 		drm_sched_rq_add_entity(entity->rq, entity);
 		spin_unlock(&entity->rq_lock);
+		spin_lock(&entity->rq->sched->job_list_lock);
 		drm_sched_wakeup(entity->rq->sched);
+		spin_unlock(&entity->rq->sched->job_list_lock);
 	}
 }
 EXPORT_SYMBOL(drm_sched_entity_push_job);
Index: src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c
diff -u src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c:1.2 src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c:1.2	Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/scheduler/sched_fence.c	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched_fence.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $	*/
+/*	$NetBSD: sched_fence.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2015 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sched_fence.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sched_fence.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $");
 
 #include <linux/kthread.h>
 #include <linux/module.h>
@@ -36,6 +36,11 @@ __KERNEL_RCSID(0, "$NetBSD: sched_fence.
 
 static struct kmem_cache *sched_fence_slab;
 
+#ifdef __NetBSD__		/* XXX module init/fini */
+#define	__init
+#define	__exit
+#endif
+
 static int __init drm_sched_fence_slab_init(void)
 {
 	sched_fence_slab = kmem_cache_create(
@@ -185,3 +190,23 @@ module_exit(drm_sched_fence_slab_fini);
 
 MODULE_DESCRIPTION("DRM GPU scheduler");
 MODULE_LICENSE("GPL and additional rights");
+
+#ifdef __NetBSD__
+MODULE(MODULE_CLASS_MISC, drmsched, "drmsched");
+static int
+drmsched_modcmd(modcmd_t cmd, void *arg)
+{
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		return drm_sched_fence_slab_init();
+	case MODULE_CMD_FINI:
+		drm_sched_fence_slab_fini();
+		return 0;
+	case MODULE_CMD_AUTOUNLOAD:
+		return EBUSY;
+	default:
+		return ENOTTY;
+	}
+}
+#endif
Index: src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c
diff -u src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c:1.2 src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c:1.2	Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched_main.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $	*/
+/*	$NetBSD: sched_main.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2015 Advanced Micro Devices, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sched_main.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sched_main.c,v 1.3 2021/12/19 12:23:16 riastradh Exp $");
 
 #include <linux/kthread.h>
 #include <linux/wait.h>
@@ -235,6 +235,11 @@ EXPORT_SYMBOL(drm_sched_fault);
  */
 unsigned long drm_sched_suspend_timeout(struct drm_gpu_scheduler *sched)
 {
+#ifdef __NetBSD__
+	/* XXX Currently nothing uses the return value.  */
+	cancel_delayed_work(&sched->work_tdr);
+	return -123456789;
+#else
 	unsigned long sched_timeout, now = jiffies;
 
 	sched_timeout = sched->work_tdr.timer.expires;
@@ -248,6 +253,7 @@ unsigned long drm_sched_suspend_timeout(
 		return sched_timeout - now;
 	else
 		return sched->timeout;
+#endif
 }
 EXPORT_SYMBOL(drm_sched_suspend_timeout);
 
@@ -617,8 +623,10 @@ static bool drm_sched_ready(struct drm_g
  */
 void drm_sched_wakeup(struct drm_gpu_scheduler *sched)
 {
+	assert_spin_locked(&sched->job_list_lock);
 	if (drm_sched_ready(sched))
-		wake_up_interruptible(&sched->wake_up_worker);
+		DRM_SPIN_WAKEUP_ONE(&sched->wake_up_worker,
+		    &sched->job_list_lock);
 }
 
 /**
@@ -667,7 +675,9 @@ static void drm_sched_process_job(struct
 	trace_drm_sched_process_job(s_fence);
 
 	drm_sched_fence_finished(s_fence);
-	wake_up_interruptible(&sched->wake_up_worker);
+	spin_lock(&sched->job_list_lock);
+	DRM_SPIN_WAKEUP_ONE(&sched->wake_up_worker, &sched->job_list_lock);
+	spin_unlock(&sched->job_list_lock);
 }
 
 /**
@@ -751,11 +761,14 @@ static int drm_sched_main(void *param)
 		struct dma_fence *fence;
 		struct drm_sched_job *cleanup_job = NULL;
 
-		wait_event_interruptible(sched->wake_up_worker,
-					 (cleanup_job = drm_sched_get_cleanup_job(sched)) ||
-					 (!drm_sched_blocked(sched) &&
-					  (entity = drm_sched_select_entity(sched))) ||
-					 kthread_should_stop());
+		spin_lock(&sched->job_list_lock);
+		DRM_SPIN_WAIT_UNTIL(r, &sched->wake_up_worker,
+		    &sched->job_list_lock,
+		    ((cleanup_job = drm_sched_get_cleanup_job(sched)) ||
+			(!drm_sched_blocked(sched) &&
+			    (entity = drm_sched_select_entity(sched))) ||
+			kthread_should_stop()));
+		spin_unlock(&sched->job_list_lock);
 
 		if (cleanup_job) {
 			sched->ops->free_job(cleanup_job);
@@ -798,7 +811,10 @@ static int drm_sched_main(void *param)
 			drm_sched_process_job(NULL, &sched_job->cb);
 		}
 
-		wake_up(&sched->job_scheduled);
+		spin_lock(&sched->job_list_lock);
+		DRM_SPIN_WAKEUP_ONE(&sched->job_scheduled,
+		    &sched->job_list_lock);
+		spin_unlock(&sched->job_list_lock);
 	}
 	return 0;
 }
@@ -831,8 +847,8 @@ int drm_sched_init(struct drm_gpu_schedu
 	for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_MAX; i++)
 		drm_sched_rq_init(sched, &sched->sched_rq[i]);
 
-	init_waitqueue_head(&sched->wake_up_worker);
-	init_waitqueue_head(&sched->job_scheduled);
+	DRM_INIT_WAITQUEUE(&sched->wake_up_worker, "drmschedw");
+	DRM_INIT_WAITQUEUE(&sched->job_scheduled, "drmschedj");
 	INIT_LIST_HEAD(&sched->ring_mirror_list);
 	spin_lock_init(&sched->job_list_lock);
 	atomic_set(&sched->hw_rq_count, 0);
@@ -863,8 +879,11 @@ EXPORT_SYMBOL(drm_sched_init);
  */
 void drm_sched_fini(struct drm_gpu_scheduler *sched)
 {
-	if (sched->thread)
+	if (sched->thread) {
+		spin_lock(&sched->job_list_lock);
 		kthread_stop(sched->thread);
+		spin_unlock(&sched->job_list_lock);
+	}
 
 	sched->ready = false;
 }

Index: src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h:1.3 src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h:1.4
--- src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h:1.3	Sun Dec 19 10:59:03 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/gpu_scheduler.h	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gpu_scheduler.h,v 1.3 2021/12/19 10:59:03 riastradh Exp $	*/
+/*	$NetBSD: gpu_scheduler.h,v 1.4 2021/12/19 12:23:16 riastradh Exp $	*/
 
 /*
  * Copyright 2015 Advanced Micro Devices, Inc.
@@ -100,7 +100,11 @@ struct drm_sched_entity {
 	struct dma_fence_cb		cb;
 	atomic_t			*guilty;
 	struct dma_fence                *last_scheduled;
+#ifdef __NetBSD__
+	struct proc			*last_user;
+#else
 	struct task_struct		*last_user;
+#endif
 	bool 				stopped;
 	struct completion		entity_idle;
 };
@@ -278,13 +282,8 @@ struct drm_gpu_scheduler {
 	long				timeout;
 	const char			*name;
 	struct drm_sched_rq		sched_rq[DRM_SCHED_PRIORITY_MAX];
-#ifdef __NetBSD__
 	drm_waitqueue_t			wake_up_worker;
 	drm_waitqueue_t			job_scheduled;
-#else
-	wait_queue_head_t		wake_up_worker;
-	wait_queue_head_t		job_scheduled;
-#endif
 	atomic_t			hw_rq_count;
 	atomic64_t			job_id_count;
 	struct delayed_work		work_tdr;

Index: src/sys/external/bsd/drm2/drm/files.drmkms
diff -u src/sys/external/bsd/drm2/drm/files.drmkms:1.68 src/sys/external/bsd/drm2/drm/files.drmkms:1.69
--- src/sys/external/bsd/drm2/drm/files.drmkms:1.68	Sun Dec 19 11:53:41 2021
+++ src/sys/external/bsd/drm2/drm/files.drmkms	Sun Dec 19 12:23:16 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.drmkms,v 1.68 2021/12/19 11:53:41 riastradh Exp $
+#	$NetBSD: files.drmkms,v 1.69 2021/12/19 12:23:16 riastradh Exp $
 
 version	20180827
 
@@ -91,6 +91,12 @@ file	external/bsd/drm2/dist/drm/drm_lega
 file	external/bsd/drm2/dist/drm/drm_lock.c		drmums
 file	external/bsd/drm2/drm/drm_scatter.c		drmums
 
+# GPU scheduler
+define	drmsched: drmkms
+file	external/bsd/drm2/dist/drm/scheduler/sched_entity.c	drmkms & drmsched
+file	external/bsd/drm2/dist/drm/scheduler/sched_fence.c	drmkms & drmsched
+file	external/bsd/drm2/dist/drm/scheduler/sched_main.c	drmkms & drmsched
+
 # Generated from drm2netbsd.
 #file	external/bsd/drm2/dist/drm/drm_agpsupport.c	drmkms	# drmkms_pci
 file	external/bsd/drm2/dist/drm/drm_atomic.c	drmkms

Index: src/sys/external/bsd/drm2/include/linux/sched.h
diff -u src/sys/external/bsd/drm2/include/linux/sched.h:1.19 src/sys/external/bsd/drm2/include/linux/sched.h:1.20
--- src/sys/external/bsd/drm2/include/linux/sched.h:1.19	Sun Dec 19 11:49:12 2021
+++ src/sys/external/bsd/drm2/include/linux/sched.h	Sun Dec 19 12:23:17 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched.h,v 1.19 2021/12/19 11:49:12 riastradh Exp $	*/
+/*	$NetBSD: sched.h,v 1.20 2021/12/19 12:23:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -36,7 +36,9 @@
 
 #include <sys/cdefs.h>
 #include <sys/kernel.h>
+#include <sys/lwp.h>
 #include <sys/proc.h>
+#include <sys/sched.h>
 
 #include <asm/barrier.h>
 #include <asm/param.h>
@@ -116,4 +118,18 @@ signal_pending_state(int state, struct p
 	return sigispending(curlwp, 0);
 }
 
+static inline void
+sched_setscheduler(struct proc *p, int class, struct sched_param *param)
+{
+
+	KASSERT(p == curproc);
+	KASSERT(class == SCHED_FIFO);
+	KASSERT(param->sched_priority == 1);
+
+	lwp_lock(curlwp);
+	curlwp->l_class = class;
+	lwp_changepri(curlwp, PRI_KERNEL_RT);
+	lwp_unlock(curlwp);
+}
+
 #endif  /* _LINUX_SCHED_H_ */

Reply via email to