From owner-p4-projects@FreeBSD.ORG Mon Sep 1 16:49:21 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 470B516A4DF; Mon, 1 Sep 2003 16:49:21 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E2BB016A4DF for ; Mon, 1 Sep 2003 16:49:20 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4ED144400D for ; Mon, 1 Sep 2003 16:49:20 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h81NnK0U008283 for ; Mon, 1 Sep 2003 16:49:20 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h81NnJtr008280 for perforce@freebsd.org; Mon, 1 Sep 2003 16:49:19 -0700 (PDT) Date: Mon, 1 Sep 2003 16:49:19 -0700 (PDT) Message-Id: <200309012349.h81NnJtr008280@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 37343 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Sep 2003 23:49:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=37343 Change 37343 by marcel@marcel_nfs on 2003/09/01 16:48:34 Icing on the cake: Check the device parameters for the channel number. It's now save to move the console from ttya to ttyb, provided you have a getty(8) on the UART or boot single-user of course :-) Affected files ... .. //depot/projects/uart/dev/uart/uart_cpu_sparc64.c#9 edit Differences ... ==== //depot/projects/uart/dev/uart/uart_cpu_sparc64.c#9 (text+ko) ==== @@ -42,14 +42,30 @@ static struct bus_space_tag bst_store[3]; +static int +uart_cpu_channel(char *dev) +{ + char alias[64]; + phandle_t aliases; + int len; + + strcpy(alias, dev); + if ((aliases = OF_finddevice("/aliases")) != -1) + OF_getprop(aliases, dev, alias, sizeof(alias)); + len = strlen(alias); + if (len < 2 || alias[len - 2] != ':' || alias[len - 1] < 'a' || + alias[len - 1] > 'b') + return (0); + return (alias[len - 1] - 'a'); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { - char buffer[64]; - phandle_t chosen, consin, consout, options; - ihandle_t stdin, stdout; + char buf[32], dev[32]; + phandle_t input, options, output; bus_addr_t addr; - int baud, bits, error, space, stop; + int baud, bits, ch, error, space, stop; char flag, par; /* @@ -57,81 +73,73 @@ * the console is an UART of course. Note that we enforce that both * stdin and stdout are selected. For weird configurations, use * ofw_console(4). + * Note that the currently active console (ie /chosen/stdout and + * /chosen/stdin) may not be the same as the device selected in the + * environment (ie /options/output-device and /options/input-device) + * because the user may have changed the environment. In that case + * I would assume that the user expects that FreeBSD uses the new + * console setting. There's choice choice, really. */ - if ((chosen = OF_finddevice("/chosen")) == -1) + if ((options = OF_finddevice("/options")) == -1) return (ENXIO); - if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1) + if (OF_getprop(options, "input-device", dev, sizeof(dev)) == -1) return (ENXIO); - if (OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1) + if ((input = OF_finddevice(dev)) == -1) return (ENXIO); - if ((consin = OF_instance_to_package(stdin)) == -1) + if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1) return (ENXIO); - if ((consout = OF_instance_to_package(stdout)) == -1) - return (ENXIO); - if (devtype == UART_DEV_CONSOLE) { - if (consin != consout) + if (strcmp(buf, "serial")) + return (ENODEV); + if (devtype == UART_DEV_KEYBOARD) { + if (OF_getprop(input, "keyboard", buf, sizeof(buf)) == -1) + return (ENXIO); + } else if (devtype == UART_DEV_CONSOLE) { + if (OF_getprop(options, "output-device", buf, sizeof(buf)) + == -1) + return (ENXIO); + if ((output = OF_finddevice(buf)) == -1) return (ENXIO); - } else if (devtype == UART_DEV_KEYBOARD) { - if (OF_getprop(consin, "keyboard", buffer, - sizeof(buffer)) == -1) + if (input != output) return (ENXIO); - } - if (OF_getprop(consin, "device_type", buffer, sizeof(buffer)) == -1) - return (ENXIO); - if (strcmp(buffer, "serial")) - return (ENXIO); + } else + return (ENODEV); - error = OF_decode_addr(consin, &space, &addr); + error = OF_decode_addr(input, &space, &addr); if (error) return (error); - /* Fill in the device info. */ - di->bas.bst = &bst_store[devtype]; - di->bas.bsh = sparc64_fake_bustag(space, addr, di->bas.bst); + /* Get the device class. */ + if (OF_getprop(input, "name", buf, sizeof(buf)) == -1) + return (ENXIO); di->bas.regshft = 0; di->bas.rclk = 0; - - /* Get the device class. */ - if (OF_getprop(consin, "name", buffer, sizeof(buffer)) == -1) - return (ENXIO); - if (!strcmp(buffer, "se")) + if (!strcmp(buf, "se")) { di->ops = uart_sab82532_ops; - else if (!strcmp(buffer, "su") || !strcmp(buffer, "su_pnp")) - di->ops = uart_ns8250_ops; - else if (!strcmp(buffer, "zs")) { + addr += 64 * uart_cpu_channel(dev); + } else if (!strcmp(buf, "zs")) { di->ops = uart_z8530_ops; di->bas.regshft = 1; - di->bas.bsh += 4; - } else + ch = uart_cpu_channel(dev); + addr += 4 - 4 * ch; + } else if (!strcmp(buf, "su") || !strcmp(buf, "su_pnp")) + di->ops = uart_ns8250_ops; + else return (ENXIO); - /* - * Get the line settings. This is tricky because the settings are - * stored under some (possibly) random alias as a property of - * /options and we don't even know if they apply to the currently - * selected device. We simply assume 9600,n,8,1 if something wrong. - * Note that we always return success from here on. - */ + /* Fill in the device info. */ + di->bas.bst = &bst_store[devtype]; + di->bas.bsh = sparc64_fake_bustag(space, addr, di->bas.bst); + + /* Get the line settings. */ di->baudrate = 9600; di->databits = 8; di->stopbits = 1; di->parity = UART_PARITY_NONE; - - if ((options = OF_finddevice("/options")) == -1) + snprintf(buf, sizeof(buf), "%s-mode", dev); + if (OF_getprop(options, buf, buf, sizeof(buf)) == -1) return (0); - if (OF_getprop(options, "output-device", buffer, sizeof(buffer)) == -1) - return (0); - if ((consout = OF_finddevice(buffer)) == -1) - return (0); - if (consout != consin) - return (0); - if (sizeof(buffer) - strlen(buffer) < 6) - return (0); - strcat(buffer, "-mode"); - if (OF_getprop(options, buffer, buffer, sizeof(buffer)) == -1) - return (0); - if (sscanf(buffer, "%d,%d,%c,%d,%c", &baud, &bits, &par, &stop, - &flag) != 5) + if (sscanf(buf, "%d,%d,%c,%d,%c", &baud, &bits, &par, &stop, &flag) + != 5) return (0); di->baudrate = baud; di->databits = bits;