Subject: Re: question concerning serial console setup

From: Jeff Harrell <[email-masked]>
Date: Sun, 16 Jan 2000 20:41:38 -0700

Conrad Parker wrote:

> On Wed, Dec 29, 1999 at 12:23:07PM -0700, Jeff Harrell wrote:
> > I wonder if anybody might have some information concerning the setup of
> > a serial console device
> > on the MIPS/Linux platform.  I have been looking at the sgi (indy)
> > source code to determine how to
> > setup a serial console device.  The file arch/mips/sgi/kernel/setup.c
> > contains a call to "console_setup"
> > passing the parameters "ttys0" and NULL.  I have had some trouble
> > locating the routine that this is
> > actually calling (file, directory?).  It looks like there is a version
> > in printk.c and in one of  the char drivers (serial167.c).
> > These do not seem like the correct routines.
>
> the version in serial167.c is commented out and looks like it was once
> there only as a placeholder.
>
> console_setup() in printk.c is the correct one, but it doesn't do everything
> you want. It simply determines which of the possible consoles is the system
> ("preferred") console. Normally this is called via parse_options in
> init/main.c so you can set it on booting by passing the kernel parameter
> console=blah, but it can be called any time before the kernel calls
> console_init() (which it does immediately after calling parse_options, in
> order to get the console up asap). If you've configured the kernel to run a
> serial console, console_init() (which is in drivers/char/tty_io.c) will call
> serial_console_init().
>

Hmmm....strange I tried to use console_setup  in the same way that  setup.c
called
it in ../arch/mips/sgi/kernel/setup.c and ran into linker problems.  It looks
like
setup_console is defined statically (sp?) in printk.c.

Here is how it is called in setup.c:

     #if defined(CONFIG_SERIAL_CONSOLE) || defined(CONFIG_PROM_CONSOLE)
     extern void console_setup(char *, int *);
     #endif
     ...
     ....
     #ifdef CONFIG_SERIAL_CONSOLE
      /* ARCS console environment variable is set to "g?" for
       * graphics console, it is set to "d" for the first serial
       * line and "d2" for the second serial line.
       */
      ctype = prom_getenv("console");
      if(*ctype == 'd') {
       if(*(ctype+1)=='2')
        console_setup ("ttyS1", NULL);
       else
        console_setup ("ttyS0", NULL);
      }

Here is how it looks in printk.c:

     static int __init console_setup(char *str)
     { .....

I guess I am seeing the error that I would expect to see,  i.e.,  the linker
gives me an
undefined reference.  Any ideas how this worked in the sgi code?

>
> For the SGI/MIPS, (the code you're looking at in
> arch/mips/sgi/kernel/setup.c) the choice of serial console can be
> determined by querying the prom settings, so rather than forcing this to be
> a boot parameter the correct console is set up at runtime. (If I'm not
> mistaken, this can still be overriden by passing a kernel parameter, as
> this bit of setup is called way before init/main.c calls parse_options()).
> However, you don't need to call console_setup() in your platform setup
> routine -- it's only done here for convenience.

Unfortunately I am working on an embedded platform, only using this code
as a starting point for our design.  If possible I would like to initialize the

console w/o the use of command line parameters.

Any insight that you can provide would be greatly appreciated.

Thanks,
Jeff

--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jeff Harrell                    Work:  (801) 619-6104
Broadband Access group/TI
[email-masked]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

---

From: Ralf Baechle <[email-masked]>
Date: Mon, 17 Jan 2000 05:06:02 +0100

On Sun, Jan 16, 2000 at 08:41:38PM -0700, Jeff Harrell wrote:

> as a starting point for our design.  If possible I would like to initialize
> the console w/o the use of command line parameters.

A simple solution is to hardwire the commmand line in arch/mips/kernel/setup.c.

  Ralf

---

From: "Andrew R. Baker" <[email-masked]>
Date: Mon, 17 Jan 2000 19:56:42 -0600 (CST)

> arch/mips/kernel/setup.c.

I have some hackish code that queries the prom enviroment and edits the
commandline to reflect the appropriate console.  If that is worthwhile to
have available I will dig up a diff.

-Andrew

---

From: Ralf Baechle <[email-masked]>
Date: Tue, 18 Jan 2000 03:14:19 +0100

> have available I will dig up a diff.

Have you considered hacking kerne/printk.c:console_setup() instead?
There is already some SPARC code there.

  Ralf

---

From: "Andrew R. Baker" <[email-masked]>
Date: Mon, 17 Jan 2000 20:47:38 -0600 (CST)

> There is already some SPARC code there.

The code in kernel/printk.c seems to be only involved in normalizing the
names of the serial ports.  What I needed was to get the console
enviroment setting from the prom.  I don't like the idea of putting prom
code into kernel/printk.c.  Here is the code I used (from
arch/mips/arc/cmdline.c):

        /* get the console enviroment variable into the command line.
         * But only if the console parameter wasn't entered by the user.
         * Is this a bad thing to do here?
         * -Andrew
         */
        if(console_option == 0) 
        {
                console = prom_getenv("console");
                strcpy(cp, "console=");
                cp += strlen("console=");
                strcpy(cp, console);
                cp += strlen(console);
                *cp++ = ' ';
        }

I don't like the way it messes with the passed commandline.  However, we
could read the value into some other variable and let kernel/printk.c pick
it up from there.  

-Andrew