Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 27 07:43:07 UTC 2018

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev: clk.h
        src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk:
            nouveau_nvkm_subdev_clk_base.c

Log Message:
Convert nouveau clk to condition variables.

Not totally sure that the activity in nvkm_pstate_work that must
happen atomically with wakeup is kosher under a spin lock, but we'll
see.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev/clk.h
cvs rdiff -u -r1.2 -r1.3 \
    
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c

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/dist/drm/nouveau/include/nvkm/subdev/clk.h
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev/clk.h:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev/clk.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev/clk.h:1.2	Mon Aug 27 04:58:30 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvkm/subdev/clk.h	Mon Aug 27 07:43:06 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: clk.h,v 1.2 2018/08/27 04:58:30 riastradh Exp $	*/
+/*	$NetBSD: clk.h,v 1.3 2018/08/27 07:43:06 riastradh Exp $	*/
 
 #ifndef __NVKM_CLK_H__
 #define __NVKM_CLK_H__
@@ -83,7 +83,12 @@ struct nvkm_clk {
 	int state_nr;
 
 	struct work_struct work;
+#ifdef __NetBSD__
+	drm_waitqueue_t wait;
+	spinlock_t lock;
+#else
 	wait_queue_head_t wait;
+#endif
 	atomic_t waiting;
 
 	struct nvkm_notify pwrsrc_ntfy;

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c:1.2	Mon Aug 27 04:58:33 2018
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/clk/nouveau_nvkm_subdev_clk_base.c	Mon Aug 27 07:43:06 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_nvkm_subdev_clk_base.c,v 1.2 2018/08/27 04:58:33 riastradh Exp $	*/
+/*	$NetBSD: nouveau_nvkm_subdev_clk_base.c,v 1.3 2018/08/27 07:43:06 riastradh Exp $	*/
 
 /*
  * Copyright 2013 Red Hat Inc.
@@ -24,7 +24,7 @@
  * Authors: Ben Skeggs
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_clk_base.c,v 1.2 2018/08/27 04:58:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_clk_base.c,v 1.3 2018/08/27 07:43:06 riastradh Exp $");
 
 #include "priv.h"
 
@@ -212,8 +212,12 @@ nvkm_pstate_work(struct work_struct *wor
 	struct nvkm_subdev *subdev = &clk->subdev;
 	int pstate;
 
-	if (!atomic_xchg(&clk->waiting, 0))
+	spin_lock(&clk->lock);
+	if (!atomic_xchg(&clk->waiting, 0)) {
+		spin_unlock(&clk->lock);
 		return;
+	}
+
 	clk->pwrsrc = power_supply_is_system_supplied();
 
 	nvkm_trace(subdev, "P %d PWR %d U(AC) %d U(DC) %d A %d T %d D %d\n",
@@ -238,7 +242,12 @@ nvkm_pstate_work(struct work_struct *wor
 		}
 	}
 
+#ifdef __NetBSD__
+	DRM_SPIN_WAKEUP_ALL(&clk->wait, &clk->lock);
+#else
 	wake_up_all(&clk->wait);
+#endif
+	spin_unlock(&clk->lock);
 	nvkm_notify_get(&clk->pwrsrc_ntfy);
 }
 
@@ -247,8 +256,18 @@ nvkm_pstate_calc(struct nvkm_clk *clk, b
 {
 	atomic_set(&clk->waiting, 1);
 	schedule_work(&clk->work);
-	if (wait)
+	if (wait) {
+#ifdef __NetBSD__
+		int ret;
+		spin_lock(&clk->lock);
+		DRM_SPIN_WAIT_NOINTR_UNTIL(ret, &clk->wait, &clk->lock,
+		    !atomic_read(&clk->waiting));
+		spin_unlock(&clk->lock);
+		KASSERT(ret == 0);
+#else
 		wait_event(clk->wait, !atomic_read(&clk->waiting));
+#endif
+	}
 	return 0;
 }
 
@@ -546,6 +565,11 @@ nvkm_clk_dtor(struct nvkm_subdev *subdev
 		nvkm_pstate_del(pstate);
 	}
 
+#ifdef __NetBSD__
+	DRM_DESTROY_WAITQUEUE(&clk->wait);
+	spin_lock_destroy(&clk->lock);
+#endif
+
 	return clk;
 }
 
@@ -572,7 +596,12 @@ nvkm_clk_ctor(const struct nvkm_clk_func
 	clk->allow_reclock = allow_reclock;
 
 	INIT_WORK(&clk->work, nvkm_pstate_work);
+#ifdef __NetBSD__
+	spin_lock_init(&clk->lock);
+	DRM_INIT_WAITQUEUE(&clk->wait, "nvclk");
+#else
 	init_waitqueue_head(&clk->wait);
+#endif
 	atomic_set(&clk->waiting, 0);
 
 	/* If no pstates are provided, try and fetch them from the BIOS */

Reply via email to