mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
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.
This commit is contained in:
parent
52a522a283
commit
dce533f390
1 changed files with 23 additions and 10 deletions
|
|
@ -34,6 +34,7 @@ __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>
|
||||
|
|
@ -98,10 +99,25 @@ uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
|
|||
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;
|
||||
struct uart_class *class;
|
||||
phandle_t node, chosen;
|
||||
pcell_t shift, br, rclk;
|
||||
|
|
@ -111,7 +127,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||
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)
|
||||
|
|
@ -125,14 +141,11 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
|
|||
*/
|
||||
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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue