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_ */