Module Name:    src
Committed By:   martin
Date:           Sat Feb  3 14:17:03 UTC 2024

Modified Files:
        src/sys/dev/pci [netbsd-10]: agp_i810.c

Log Message:
Pull up following revision(s) (requested by riastradh in ticket #574):

        sys/dev/pci/agp_i810.c: revision 1.126

agp_i810(4): Use ipi(9) for chipset flush on all CPUs, not xcall(9).

i915 now calls into this with a spin lock held, so we have to use
ipi(9), which spin-waits for the other CPUs to complete, rather than
xcall(9), which may sleep-wait.

Fortunately, this is just to execute WBINVD on x86 (and if this code
ever runs on other architectures, which it probably doesn't, it'll be
a similar barrier instruction), so spinning to wait for that on all
CPUs isn't too costly.

PR kern/57878


To generate a diff of this commit:
cvs rdiff -u -r1.125 -r1.125.4.1 src/sys/dev/pci/agp_i810.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/dev/pci/agp_i810.c
diff -u src/sys/dev/pci/agp_i810.c:1.125 src/sys/dev/pci/agp_i810.c:1.125.4.1
--- src/sys/dev/pci/agp_i810.c:1.125	Sun Jul 17 10:10:45 2022
+++ src/sys/dev/pci/agp_i810.c	Sat Feb  3 14:17:03 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: agp_i810.c,v 1.125 2022/07/17 10:10:45 riastradh Exp $	*/
+/*	$NetBSD: agp_i810.c,v 1.125.4.1 2024/02/03 14:17:03 martin Exp $	*/
 
 /*-
  * Copyright (c) 2000 Doug Rabson
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: agp_i810.c,v 1.125 2022/07/17 10:10:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: agp_i810.c,v 1.125.4.1 2024/02/03 14:17:03 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -180,7 +180,7 @@ agp_i810_post_gtt_entry(struct agp_i810_
 }
 
 static void
-agp_flush_cache_xc(void *a __unused, void *b __unused)
+agp_flush_cache_ipi(void *cookie __unused)
 {
 
 	agp_flush_cache();
@@ -204,11 +204,19 @@ agp_i810_chipset_flush(struct agp_i810_s
 		 * XXX Come to think of it, do these chipsets appear in
 		 * any multi-CPU systems?
 		 */
-		if (cold)
+		if (cold) {
 			agp_flush_cache();
-		else
-			xc_wait(xc_broadcast(0, &agp_flush_cache_xc,
-				NULL, NULL));
+		} else {
+			/*
+			 * Caller may hold a spin lock, so use ipi(9)
+			 * rather than xcall(9) here.
+			 */
+			ipi_msg_t msg = { .func = agp_flush_cache_ipi };
+			kpreempt_disable();
+			ipi_broadcast(&msg, /*skip_self*/false);
+			ipi_wait(&msg);
+			kpreempt_enable();
+		}
 		WRITE4(AGP_I830_HIC, READ4(AGP_I830_HIC) | __BIT(31));
 		while (ISSET(READ4(AGP_I830_HIC), __BIT(31))) {
 			if (timo-- == 0)

Reply via email to