Lines Matching +full:uart +full:- +full:routing

10  *     http://www.apache.org/licenses/LICENSE-2.0
41 #include "console-mux.h"
43 #include "console-server.h"
60 " --config <FILE>\tUse FILE for configuration\n" in usage()
61 " --console-id <NAME>\tUse NAME in the UNIX domain socket address\n" in usage()
68 return p->fd == -1 && p->events == 0 && p->revents == ~0; in console_server_pollfd_reclaimable()
74 for (size_t i = 0; i < server->capacity_pollfds; i++) { in console_server_find_released_pollfd()
75 struct pollfd *p = &server->pollfds[i]; in console_server_find_released_pollfd()
80 return -1; in console_server_find_released_pollfd()
83 // returns the index of that pollfd in server->pollfds
84 // we cannot return a pointer because 'realloc' may move server->pollfds
94 const size_t newcap = server->capacity_pollfds + 1; in console_server_request_pollfd()
96 struct pollfd *newarr = reallocarray(server->pollfds, newcap, in console_server_request_pollfd()
99 return -1; in console_server_request_pollfd()
101 server->pollfds = newarr; in console_server_request_pollfd()
103 index = (ssize_t)server->capacity_pollfds; in console_server_request_pollfd()
105 server->capacity_pollfds = newcap; in console_server_request_pollfd()
108 pollfd = &server->pollfds[index]; in console_server_request_pollfd()
109 pollfd->fd = fd; in console_server_request_pollfd()
110 pollfd->events = events; in console_server_request_pollfd()
111 pollfd->revents = 0; in console_server_request_pollfd()
119 if (pollfd_index >= server->capacity_pollfds) { in console_server_release_pollfd()
120 return -1; in console_server_release_pollfd()
123 struct pollfd *pfd = &server->pollfds[pollfd_index]; in console_server_release_pollfd()
128 // https://www.man7.org/linux/man-pages/man2/poll.2.html in console_server_release_pollfd()
129 pfd->fd = -1; in console_server_release_pollfd()
130 pfd->events = 0; in console_server_release_pollfd()
131 pfd->revents = ~0; in console_server_release_pollfd()
136 /* populates server->tty.dev and server->tty.sysfs_devnode, using the tty kernel name */
149 server->tty.type = TTY_DEVICE_UNDEFINED; in tty_find_device()
151 assert(server->tty.kname); in tty_find_device()
152 if (!strlen(server->tty.kname)) { in tty_find_device()
154 rc = -1; in tty_find_device()
158 if (server->tty.kname[0] == '/') { in tty_find_device()
159 tty_path_input = strdup(server->tty.kname); in tty_find_device()
161 rc = -1; in tty_find_device()
165 rc = asprintf(&tty_path_input, "/dev/%s", server->tty.kname); in tty_find_device()
175 rc = -1; in tty_find_device()
180 * Allow hooking obmc-console-server up to PTYs for testing in tty_find_device()
182 * https://amboar.github.io/notes/2023/05/02/testing-obmc-console-with-socat.html in tty_find_device()
185 server->tty.type = TTY_DEVICE_PTY; in tty_find_device()
186 server->tty.dev = strdup(server->tty.kname); in tty_find_device()
187 rc = server->tty.dev ? 0 : -1; in tty_find_device()
193 warn("Can't find real name for %s", server->tty.kname); in tty_find_device()
194 rc = -1; in tty_find_device()
207 rc = -1; in tty_find_device()
221 rc = asprintf(&server->tty.dev, "/dev/%s", tty_kname_real); in tty_find_device()
226 // Default to non-VUART in tty_find_device()
227 server->tty.type = TTY_DEVICE_UART; in tty_find_device()
229 /* Arbitrarily pick an attribute to differentiate UART vs VUART */ in tty_find_device()
239 server->tty.type = TTY_DEVICE_VUART; in tty_find_device()
240 server->tty.vuart.sysfs_devnode = in tty_find_device()
265 assert(server->tty.type == TTY_DEVICE_VUART); in tty_set_sysfs_attr()
267 if (!server->tty.vuart.sysfs_devnode) { in tty_set_sysfs_attr()
268 return -1; in tty_set_sysfs_attr()
271 rc = asprintf(&path, "%s/%s", server->tty.vuart.sysfs_devnode, name); in tty_set_sysfs_attr()
273 return -1; in tty_set_sysfs_attr()
279 server->tty.kname); in tty_set_sysfs_attr()
280 rc = -1; in tty_set_sysfs_attr()
288 server->tty.kname); in tty_set_sysfs_attr()
305 rc = tcgetattr(server->tty.fd, &termios); in tty_init_termios()
311 if (server->tty.type == TTY_DEVICE_UART && server->tty.uart.baud) { in tty_init_termios()
312 if (cfsetspeed(&termios, server->tty.uart.baud) < 0) { in tty_init_termios()
313 warn("Couldn't set speeds for %s", server->tty.kname); in tty_init_termios()
322 rc = tcsetattr(server->tty.fd, TCSANOW, &termios); in tty_init_termios()
324 warn("Can't set terminal options for %s", server->tty.kname); in tty_init_termios()
333 assert(server->tty.type == TTY_DEVICE_VUART); in tty_init_vuart_io()
335 if (server->tty.vuart.sirq) { in tty_init_vuart_io()
336 tty_set_sysfs_attr(server, "sirq", server->tty.vuart.sirq); in tty_init_vuart_io()
339 if (server->tty.vuart.lpc_addr) { in tty_init_vuart_io()
341 server->tty.vuart.lpc_addr); in tty_init_vuart_io()
347 server->tty.fd = open(server->tty.dev, O_RDWR); in tty_init_io()
348 if (server->tty.fd <= 0) { in tty_init_io()
349 warn("Can't open tty %s", server->tty.dev); in tty_init_io()
350 return -1; in tty_init_io()
356 fcntl(server->tty.fd, F_SETFL, FNDELAY); in tty_init_io()
361 console_server_request_pollfd(server, server->tty.fd, POLLIN); in tty_init_io()
364 return -1; in tty_init_io()
367 server->tty_pollfd_index = (size_t)index; in tty_init_io()
378 assert(server->tty.type == TTY_DEVICE_VUART); in tty_init_vuart()
380 val = config_get_value(config, "lpc-address"); in tty_init_vuart()
385 warn("Cannot interpret 'lpc-address' value as an unsigned long: '%s'", in tty_init_vuart()
387 return -1; in tty_init_vuart()
392 return -1; in tty_init_vuart()
395 server->tty.vuart.lpc_addr = (uint16_t)parsed; in tty_init_vuart()
398 return -1; in tty_init_vuart()
415 server->tty.vuart.sirq = (int)parsed; in tty_init_vuart()
431 server->tty.kname = tty_arg; in tty_init()
432 } else if ((val = config_get_value(config, "upstream-tty"))) { in tty_init()
433 server->tty.kname = val; in tty_init()
436 return -1; in tty_init()
444 switch (server->tty.type) { in tty_init()
456 if (config_parse_baud(&server->tty.uart.baud, val)) { in tty_init()
466 return -1; in tty_init()
474 if (server->tty_pollfd_index < server->capacity_pollfds) { in tty_fini()
475 console_server_release_pollfd(server, server->tty_pollfd_index); in tty_fini()
476 server->tty_pollfd_index = SIZE_MAX; in tty_fini()
479 if (server->tty.type == TTY_DEVICE_VUART) { in tty_fini()
480 free(server->tty.vuart.sysfs_devnode); in tty_fini()
483 free(server->tty.dev); in tty_fini()
491 return -1; in write_to_path()
495 rc = -1; in write_to_path()
499 rc = -1; in write_to_path()
506 "/sys/bus/platform/drivers/aspeed-uart-routing/*.uart-routing"
519 muxcfg = config_get_value(config, "aspeed-uart-routing"); in uart_routing_init()
527 warn("Couldn't find uart-routing driver directory, cannot apply config"); in uart_routing_init()
531 warnx("Found %zd uart-routing driver directories, cannot apply config", in uart_routing_init()
539 * just use one (worst-case) size for all of them -- +2 for a trailing in uart_routing_init()
548 warnx("Out of memory applying uart routing config"); in uart_routing_init()
558 warnx("Invalid syntax in aspeed uart config: '%s' not applied", in uart_routing_init()
571 strncmp(sink, "uart", strlen("uart")) != 0) { in uart_routing_init()
572 warnx("Skipping invalid uart routing name '%s' (must be ioN or uartN)", in uart_routing_init()
579 warn("Failed to apply uart-routing config '%s:%s'", in uart_routing_init()
594 return write_buf_to_fd(console->server->tty.fd, data, len); in console_data_out()
604 console->console_id = config_resolve_console_id(config, console_id); in set_socket_info()
607 len = console_socket_path(console->socket_name, console->console_id); in set_socket_info()
614 console->socket_name_len = len; in set_socket_info()
621 /* NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp) */ in handlers_init()
624 /* NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp) */ in handlers_init()
629 n_types = __stop_handlers - __start_handlers; in handlers_init()
630 console->handlers = calloc(n_types, sizeof(struct handler *)); in handlers_init()
631 if (!console->handlers) { in handlers_init()
644 if (!type->init || !type->fini) { in handlers_init()
647 type->name); in handlers_init()
650 handler = type->init(type, console, config); in handlers_init()
653 console->console_id, type->name, handler ? "" : "in"); in handlers_init()
656 handler->type = type; in handlers_init()
657 console->handlers[j++] = handler; in handlers_init()
661 console->n_handlers = j; in handlers_init()
669 for (i = 0; i < console->n_handlers; i++) { in handlers_fini()
670 handler = console->handlers[i]; in handlers_fini()
671 handler->type->fini(handler); in handlers_fini()
674 free(console->handlers); in handlers_fini()
675 console->handlers = NULL; in handlers_fini()
676 console->n_handlers = 0; in handlers_fini()
694 tv->tv_sec = t.tv_sec; in get_current_time()
695 tv->tv_usec = t.tv_nsec / 1000; in get_current_time()
704 return ringbuffer_consumer_register(console->rb, poll_fn, data); in console_ringbuffer_consumer_register()
717 console->server, fd, (short)(events & 0x7fff)); in console_poller_register()
725 poller->remove = false; in console_poller_register()
726 poller->handler = handler; in console_poller_register()
727 poller->event_fn = poller_fn; in console_poller_register()
728 poller->timeout_fn = timeout_fn; in console_poller_register()
729 timerclear(&poller->timeout); in console_poller_register()
730 poller->data = data; in console_poller_register()
731 poller->pollfd_index = index; in console_poller_register()
734 n = console->n_pollers++; in console_poller_register()
739 /* NOLINTBEGIN(bugprone-sizeof-expression) */ in console_poller_register()
740 console->pollers = reallocarray(console->pollers, console->n_pollers, in console_poller_register()
741 sizeof(*console->pollers)); in console_poller_register()
743 /* NOLINTEND(bugprone-sizeof-expression) */ in console_poller_register()
745 console->pollers[n] = poller; in console_poller_register()
755 for (i = 0; i < console->n_pollers; i++) { in console_poller_unregister()
756 if (console->pollers[i] == poller) { in console_poller_unregister()
761 assert(i < console->n_pollers); in console_poller_unregister()
763 console->n_pollers--; in console_poller_unregister()
771 /* NOLINTBEGIN(bugprone-sizeof-expression) */ in console_poller_unregister()
772 memmove(&console->pollers[i], &console->pollers[i + 1], in console_poller_unregister()
773 sizeof(*console->pollers) * (console->n_pollers - i)); in console_poller_unregister()
775 if (console->n_pollers == 0) { in console_poller_unregister()
776 free(console->pollers); in console_poller_unregister()
777 console->pollers = NULL; in console_poller_unregister()
779 console->pollers = reallocarray(console->pollers, in console_poller_unregister()
780 console->n_pollers, in console_poller_unregister()
781 sizeof(*console->pollers)); in console_poller_unregister()
783 /* NOLINTEND(bugprone-sizeof-expression) */ in console_poller_unregister()
785 console_server_release_pollfd(console->server, poller->pollfd_index); in console_poller_unregister()
793 console->server->pollfds[poller->pollfd_index].events = in console_poller_set_events()
808 timeradd(&now, tv, &poller->timeout); in console_poller_set_timeout()
820 for (i = 0; i < console->n_pollers; i++) { in get_poll_timeout()
821 poller = console->pollers[i]; in get_poll_timeout()
823 if (poller->timeout_fn && timerisset(&poller->timeout) && in get_poll_timeout()
825 (earliest && timercmp(&poller->timeout, earliest, <)))) { in get_poll_timeout()
828 earliest = &poller->timeout; in get_poll_timeout()
843 return -1; in get_poll_timeout()
858 * in-step, calling any pollers that we've found revents for. in call_pollers()
860 for (i = 0; i < console->n_pollers; i++) { in call_pollers()
861 poller = console->pollers[i]; in call_pollers()
862 pollfd = &console->server->pollfds[poller->pollfd_index]; in call_pollers()
863 if (pollfd->fd < 0) { in call_pollers()
871 if (pollfd->revents) { in call_pollers()
872 prc = poller->event_fn(poller->handler, pollfd->revents, in call_pollers()
873 poller->data); in call_pollers()
875 rc = -1; in call_pollers()
877 poller->remove = true; in call_pollers()
881 if ((prc == POLLER_OK) && poller->timeout_fn && in call_pollers()
882 timerisset(&poller->timeout) && in call_pollers()
883 timercmp(&poller->timeout, cur_time, <=)) { in call_pollers()
888 timerclear(&poller->timeout); in call_pollers()
889 prc = poller->timeout_fn(poller->handler, poller->data); in call_pollers()
891 rc = -1; in call_pollers()
893 poller->remove = true; in call_pollers()
905 for (i = 0; i < console->n_pollers; i++) { in call_pollers()
906 poller = console->pollers[i]; in call_pollers()
907 if (poller->remove) { in call_pollers()
933 if (console->rb->size < buf_size) { in run_console_per_console()
936 return -1; in run_console_per_console()
941 return -1; in run_console_per_console()
947 return -1; in run_console_per_console()
963 return -1; in run_console_iteration()
966 timeout = get_poll_timeout(server->active, &tv); in run_console_iteration()
968 rc = poll(server->pollfds, server->capacity_pollfds, (int)timeout); in run_console_iteration()
972 return -1; in run_console_iteration()
980 return -1; in run_console_iteration()
984 if (server->pollfds[server->tty_pollfd_index].revents) { in run_console_iteration()
985 rc = read(server->tty.fd, buf, sizeof(buf)); in run_console_iteration()
988 return -1; in run_console_iteration()
991 rc = ringbuffer_queue(server->active->rb, buf, rc); in run_console_iteration()
993 return -1; in run_console_iteration()
999 &(server->pollfds[server->dbus_pollfd_index]); in run_console_iteration()
1000 if (dbus_pollfd->revents) { in run_console_iteration()
1001 sd_bus_process(server->bus, NULL); in run_console_iteration()
1004 for (size_t i = 0; i < server->n_consoles; i++) { in run_console_iteration()
1005 struct console *console = server->consoles[i]; in run_console_iteration()
1009 return -1; in run_console_iteration()
1021 if (server->n_consoles == 0) { in run_server()
1023 return -1; in run_server()
1035 return rc ? -1 : 0; in run_server()
1040 { "console-id", required_argument, 0, 'i' },
1057 console->server = server; in console_init()
1058 console->console_id = console_id; in console_init()
1061 config_get_section_value(config, console_id, "ringbuffer-size"); in console_init()
1064 buffer_size_str = config_get_value(config, "ringbuffer-size"); in console_init()
1070 warn("Invalid ringbuffer-size. Default to %zukB", in console_init()
1075 console->rb = ringbuffer_init(buffer_size); in console_init()
1076 if (!console->rb) { in console_init()
1101 free(console->rb); in console_init()
1111 ringbuffer_fini(console->rb); in console_fini()
1112 free(console->pollers); in console_fini()
1126 struct console **tmp = reallocarray(server->consoles, in console_server_add_console()
1127 server->n_consoles + 1, in console_server_add_console()
1130 warnx("could not realloc server->consoles"); in console_server_add_console()
1131 return -1; in console_server_add_console()
1133 server->consoles = tmp; in console_server_add_console()
1138 return -1; in console_server_add_console()
1141 server->consoles[server->n_consoles++] = console; in console_server_add_console()
1153 const int nsections = config_count_sections(server->config); in console_server_add_consoles()
1161 rc = console_server_add_console(server, server->config, in console_server_add_consoles()
1170 config_get_section_name(server->config, i); in console_server_add_consoles()
1177 rc = console_server_add_console(server, server->config, in console_server_add_consoles()
1185 config_get_value(server->config, "active-console"); in console_server_add_consoles()
1187 return server->consoles[0]; in console_server_add_consoles()
1190 printf("setting console-id '%s' as the initially active console\n", in console_server_add_consoles()
1193 for (size_t i = 0; i < server->n_consoles; i++) { in console_server_add_consoles()
1194 struct console *console = server->consoles[i]; in console_server_add_consoles()
1196 if (strcmp(console->console_id, initially_active) == 0) { in console_server_add_consoles()
1201 warnx("'active-console' '%s' not found among console ids\n", in console_server_add_consoles()
1214 server->tty_pollfd_index = -1; in console_server_init()
1216 server->config = config_init(config_filename); in console_server_init()
1217 if (server->config == NULL) { in console_server_init()
1218 return -1; in console_server_init()
1223 return -1; in console_server_init()
1226 uart_routing_init(server->config); in console_server_init()
1228 rc = tty_init(server, server->config, config_tty_kname); in console_server_init()
1231 return -1; in console_server_init()
1237 return -1; in console_server_init()
1243 return -1; in console_server_init()
1248 return -1; in console_server_init()
1256 for (size_t i = 0; i < server->n_consoles; i++) { in console_server_fini()
1257 console_fini(server->consoles[i]); in console_server_fini()
1260 free(server->consoles); in console_server_fini()
1263 free(server->pollfds); in console_server_fini()
1265 config_fini(server->config); in console_server_fini()
1281 if (c == -1) { in main()