svn commit: r265973 - stable/10/sys/dev/uart

Ian Lepore ian at FreeBSD.org
Tue May 13 19:09:01 UTC 2014


Author: ian
Date: Tue May 13 19:09:00 2014
New Revision: 265973
URL: http://svnweb.freebsd.org/changeset/base/265973

Log:
  MFC r257111, r257144, r257157, r257183
  
    Test UARTs physical address instead of virtual.
  
    Be a bit more flexible in how we find the console from the properties on
    /chosen, following the list of allowed console properties in ePAPR. Also
    do not require that stdin be defined and equal to stdout: stdin is
    nonstandard (for ePAPR) and console in an unexpected place is after all
    better than no console.

Modified:
  stable/10/sys/dev/uart/uart_cpu_fdt.c

Modified: stable/10/sys/dev/uart/uart_cpu_fdt.c
==============================================================================
--- stable/10/sys/dev/uart/uart_cpu_fdt.c	Tue May 13 18:24:02 2014	(r265972)
+++ stable/10/sys/dev/uart/uart_cpu_fdt.c	Tue May 13 19:09:00 2014	(r265973)
@@ -36,6 +36,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/bus.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
+#include <sys/systm.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
 
 #include <machine/bus.h>
 #include <machine/fdt.h>
@@ -88,13 +92,34 @@ int
 uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
 {
 
-	return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+	if (b1->bst != b2->bst)
+		return (0);
+	if (pmap_kextract(b1->bsh) == 0)
+		return (0);
+	if (pmap_kextract(b2->bsh) == 0)
+		return (0);
+	return ((pmap_kextract(b1->bsh) == pmap_kextract(b2->bsh)) ? 1 : 0);
+}
+
+static int
+phandle_chosen_propdev(phandle_t chosen, const char *name, phandle_t *node)
+{
+	char buf[64];
+
+	if (OF_getprop(chosen, name, buf, sizeof(buf)) <= 0)
+		return (ENXIO);
+	if ((*node = OF_finddevice(buf)) == -1)
+		return (ENXIO);
+	
+	return (0);
 }
 
 int
 uart_cpu_getdev(int devtype, struct uart_devinfo *di)
 {
-	char buf[64];
+	const char *propnames[] = {"stdout-path", "linux,stdout-path", "stdout",
+	    "stdin-path", "stdin", NULL};
+	const char **name;
 	const struct ofw_compat_data *cd;
 	struct uart_class *class;
 	phandle_t node, chosen;
@@ -105,7 +130,7 @@ uart_cpu_getdev(int devtype, struct uart
 	uart_bus_space_mem = fdtbus_bs_tag;
 	uart_bus_space_io = NULL;
 
-	/* Allow overriding the FDT uning the environment. */
+	/* Allow overriding the FDT using the environment. */
 	class = &uart_ns8250_class;
 	err = uart_getenv(devtype, di, class);
 	if (!err)
@@ -119,14 +144,11 @@ uart_cpu_getdev(int devtype, struct uart
 	 */
 	if ((chosen = OF_finddevice("/chosen")) == -1)
 		return (ENXIO);
-	if (OF_getprop(chosen, "stdin", buf, sizeof(buf)) <= 0)
-		return (ENXIO);
-	if ((node = OF_finddevice(buf)) == -1)
-		return (ENXIO);
-	if (OF_getprop(chosen, "stdout", buf, sizeof(buf)) <= 0)
-		return (ENXIO);
-	if (OF_finddevice(buf) != node)
-		/* Only stdin == stdout is supported. */
+	for (name = propnames; *name != NULL; name++) {
+		if (phandle_chosen_propdev(chosen, *name, &node) == 0)
+			break;
+	}
+	if (*name == NULL)
 		return (ENXIO);
 	/*
 	 * Retrieve serial attributes.


More information about the svn-src-all mailing list