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