diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 13:58:11 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 13:58:11 +0300 |
| commit | 091463c1057f50b47156a138d7d1dbd09494a6d5 (patch) | |
| tree | 954bc11974362f5a856a20e6d7d8b0b451d35fa5 /common/debug.c | |
| parent | d2ff961a2a08229e1f2245e8dba9b2275016133c (diff) | |
| download | kmi-091463c1057f50b47156a138d7d1dbd09494a6d5.tar.gz kmi-091463c1057f50b47156a138d7d1dbd09494a6d5.zip | |
Moved some functions to common/
Diffstat (limited to 'common/debug.c')
| -rw-r--r-- | common/debug.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/common/debug.c b/common/debug.c index c82377c..523ae7b 100644 --- a/common/debug.c +++ b/common/debug.c @@ -1,6 +1,8 @@ #include <apos/types.h> #include <apos/debug.h> #include <apos/bits.h> +#include <apos/pmem.h> +#include <libfdt.h> #include <stdarg.h> #ifdef DEBUG @@ -56,6 +58,36 @@ static void __putchar(char c) port->data = c; } +static enum serial_dev_t serial_dev_enum(const char *dev_name) +{ + if (strncmp("ns16550", dev_name, 7) == 0) + return NS16550A; + + return -1; +} + +struct dbg_info_t dbg_from_fdt(void *fdt) +{ + int chosen_offset = fdt_path_offset(fdt, "/chosen"); + const char *stdout = fdt_getprop(fdt, chosen_offset, "stdout-path", NULL); + + int stdout_offset = fdt_path_offset(fdt, stdout); + + /* get serial device type */ + const char *dev_name = (const char *)fdt_getprop(fdt, stdout_offset, + "compatible", NULL); + + enum serial_dev_t dev = serial_dev_enum(dev_name); + + /* get serial device address */ + struct cell_info_t ci = get_reginfo(fdt, stdout); + void *reg_ptr = (void *)fdt_getprop(fdt, stdout_offset, "reg", NULL); + + void *dbg_ptr = (void *)(paddr_t)fdt_load_int_ptr(ci.addr_cells, reg_ptr); + + return (struct dbg_info_t){dbg_ptr, dev}; +} + void dbg_init(void *pt, enum serial_dev_t dev) { switch (dev) { |
