Author: mhorne
Date: Wed Dec  2 21:01:52 2020
New Revision: 368284
URL: https://svnweb.freebsd.org/changeset/base/368284

Log:
  uart: allow UART_DEV_DBGPORT for fdt consoles
  
  Allow fdt devices to be used as debug ports for gdb(4).
  
  A debug console can be specified with the "freebsd,debug-path" property
  in the device tree's /chosen node, or using the environment variable
  hw.fdt.dbgport.
  
  The device should be specified by its name in the device tree, for
  example hw.fdt.dbgport="serial2".
  
  PR:           251053
  Submitted by: Dmitry Salychev <d...@mcusim.org>
  Submitted by:   stevek (original patch, D5986)
  Reviewed by:  andrew, mhorne
  Differential Revision:        https://reviews.freebsd.org/D27422

Modified:
  head/sys/dev/uart/uart_bus_fdt.c
  head/sys/dev/uart/uart_cpu_arm64.c
  head/sys/dev/uart/uart_cpu_fdt.c
  head/sys/dev/uart/uart_cpu_fdt.h

Modified: head/sys/dev/uart/uart_bus_fdt.c
==============================================================================
--- head/sys/dev/uart/uart_bus_fdt.c    Wed Dec  2 20:54:03 2020        
(r368283)
+++ head/sys/dev/uart/uart_bus_fdt.c    Wed Dec  2 21:01:52 2020        
(r368284)
@@ -175,26 +175,39 @@ uart_fdt_find_by_node(phandle_t node, int class_list)
 int
 uart_cpu_fdt_probe(struct uart_class **classp, bus_space_tag_t *bst,
     bus_space_handle_t *bsh, int *baud, u_int *rclk, u_int *shiftp,
-    u_int *iowidthp)
+    u_int *iowidthp, const int devtype)
 {
        const char *propnames[] = {"stdout-path", "linux,stdout-path", "stdout",
            "stdin-path", "stdin", NULL};
+       const char *propnames_dbgport[] = {"freebsd,debug-path", NULL};
        const char **name;
        struct uart_class *class;
        phandle_t node, chosen;
        pcell_t br, clk, shift, iowidth;
-       char *cp;
+       char *cp = NULL;
        int err;
 
        /* Has the user forced a specific device node? */
-       cp = kern_getenv("hw.fdt.console");
+       switch (devtype) {
+       case UART_DEV_DBGPORT:
+               cp = kern_getenv("hw.fdt.dbgport");
+               name = propnames_dbgport;
+               break;
+       case UART_DEV_CONSOLE:
+               cp = kern_getenv("hw.fdt.console");
+               name = propnames;
+               break;
+       default:
+               return (ENXIO);
+       }
+
        if (cp == NULL) {
                /*
-                * Retrieve /chosen/std{in,out}.
+                * Retrieve a node from /chosen.
                 */
                node = -1;
                if ((chosen = OF_finddevice("/chosen")) != -1) {
-                       for (name = propnames; *name != NULL; name++) {
+                       for (; *name != NULL; name++) {
                                if (phandle_chosen_propdev(chosen, *name,
                                    &node) == 0)
                                        break;

Modified: head/sys/dev/uart/uart_cpu_arm64.c
==============================================================================
--- head/sys/dev/uart/uart_cpu_arm64.c  Wed Dec  2 20:54:03 2020        
(r368283)
+++ head/sys/dev/uart/uart_cpu_arm64.c  Wed Dec  2 21:01:52 2020        
(r368284)
@@ -100,15 +100,11 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
        if (uart_cpu_acpi_spcr(devtype, di) == 0)
                return (0);
 #endif
-
-       if (devtype != UART_DEV_CONSOLE)
-               return (ENXIO);
-
        err = ENXIO;
 #ifdef FDT
        if (err != 0) {
                err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk,
-                   &shift, &iowidth);
+                   &shift, &iowidth, devtype);
        }
 #endif
        if (err != 0)

Modified: head/sys/dev/uart/uart_cpu_fdt.c
==============================================================================
--- head/sys/dev/uart/uart_cpu_fdt.c    Wed Dec  2 20:54:03 2020        
(r368283)
+++ head/sys/dev/uart/uart_cpu_fdt.c    Wed Dec  2 21:01:52 2020        
(r368284)
@@ -87,10 +87,8 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
        if (!err)
                return (0);
 
-       if (devtype != UART_DEV_CONSOLE)
-               return (ENXIO);
-
-       err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk, &shift, 
&iowidth);
+       err = uart_cpu_fdt_probe(&class, &bst, &bsh, &br, &rclk,
+           &shift, &iowidth, devtype);
        if (err != 0)
                return (err);
 

Modified: head/sys/dev/uart/uart_cpu_fdt.h
==============================================================================
--- head/sys/dev/uart/uart_cpu_fdt.h    Wed Dec  2 20:54:03 2020        
(r368283)
+++ head/sys/dev/uart/uart_cpu_fdt.h    Wed Dec  2 21:01:52 2020        
(r368284)
@@ -51,7 +51,7 @@ SET_DECLARE(uart_fdt_class_set, struct ofw_compat_data
        DATA_SET(uart_fdt_class_set, data)
 
 int uart_cpu_fdt_probe(struct uart_class **, bus_space_tag_t *,
-    bus_space_handle_t *, int *, u_int *, u_int *, u_int *);
+    bus_space_handle_t *, int *, u_int *, u_int *, u_int *, const int);
 int uart_fdt_get_clock(phandle_t node, pcell_t *cell);
 int uart_fdt_get_shift(phandle_t node, pcell_t *cell);
 int uart_fdt_get_io_width(phandle_t node, pcell_t *cell);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to