* The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 18:55 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 18:55 UTC (permalink / raw) To: linux-mips Hi, I am porting MIPS Linux on a new platform and my kernel crashes after console is switched from early console to the new real console (8250.c) I see messages displayed using the new console like "Freeing prom memory: 956k freed" (this is the last message I have) so the new console is up and running. My problem is that the new console doesn't display printk() messages. The early console displays all printk() messages. What do I need to set at compiling time that the new console to display printk() messages like early console? Thanks, Andrei ^ permalink raw reply [flat|nested] 17+ messages in thread
* The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 18:55 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 18:55 UTC (permalink / raw) To: linux-mips Hi, I am porting MIPS Linux on a new platform and my kernel crashes after console is switched from early console to the new real console (8250.c) I see messages displayed using the new console like "Freeing prom memory: 956k freed" (this is the last message I have) so the new console is up and running. My problem is that the new console doesn't display printk() messages. The early console displays all printk() messages. What do I need to set at compiling time that the new console to display printk() messages like early console? Thanks, Andrei ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: The new "real" console doesn't display printk() messages like "early" console! 2010-11-18 18:55 ` Ardelean, Andrei (?) @ 2010-11-18 19:20 ` Sergei Shtylyov 2010-11-18 20:04 ` Ardelean, Andrei -1 siblings, 1 reply; 17+ messages in thread From: Sergei Shtylyov @ 2010-11-18 19:20 UTC (permalink / raw) To: Ardelean, Andrei; +Cc: linux-mips Hello. Ardelean, Andrei wrote: > I am porting MIPS Linux on a new platform and my kernel crashes after > console is switched from early console to the new real console (8250.c) > I see messages displayed using the new console like "Freeing prom > memory: 956k freed" (this is the last message I have) so the new console > is up and running. > My problem is that the new console doesn't display printk() messages. > The early console displays all printk() messages. > What do I need to set at compiling time that the new console to display > printk() messages like early console? Have you specified "console=ttyS<n>,<baudrate> as the kernel parameter? > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 20:04 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 20:04 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: linux-mips Hi Sergei, I specified that when the bootloader calls the kernel and I did see that the baudrate is correct and I have some messages but when the system is crashing I cannot see printk messages. For instance, I step with JTAG and I can see that printk(KERNEL_WARNING "unable to open initial console") is called but on the terminal I cannot see the message. The same, die() is called but there is no messages on UART terminal. Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Thursday, November 18, 2010 2:21 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Hello. Ardelean, Andrei wrote: > I am porting MIPS Linux on a new platform and my kernel crashes after > console is switched from early console to the new real console (8250.c) > I see messages displayed using the new console like "Freeing prom > memory: 956k freed" (this is the last message I have) so the new console > is up and running. > My problem is that the new console doesn't display printk() messages. > The early console displays all printk() messages. > What do I need to set at compiling time that the new console to display > printk() messages like early console? Have you specified "console=ttyS<n>,<baudrate> as the kernel parameter? > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 20:04 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 20:04 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: linux-mips Hi Sergei, I specified that when the bootloader calls the kernel and I did see that the baudrate is correct and I have some messages but when the system is crashing I cannot see printk messages. For instance, I step with JTAG and I can see that printk(KERNEL_WARNING "unable to open initial console") is called but on the terminal I cannot see the message. The same, die() is called but there is no messages on UART terminal. Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Thursday, November 18, 2010 2:21 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Hello. Ardelean, Andrei wrote: > I am porting MIPS Linux on a new platform and my kernel crashes after > console is switched from early console to the new real console (8250.c) > I see messages displayed using the new console like "Freeing prom > memory: 956k freed" (this is the last message I have) so the new console > is up and running. > My problem is that the new console doesn't display printk() messages. > The early console displays all printk() messages. > What do I need to set at compiling time that the new console to display > printk() messages like early console? Have you specified "console=ttyS<n>,<baudrate> as the kernel parameter? > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: The new "real" console doesn't display printk() messages like "early" console! 2010-11-18 20:04 ` Ardelean, Andrei (?) @ 2010-11-18 21:21 ` Ricardo Mendoza 2010-11-18 22:01 ` Ardelean, Andrei -1 siblings, 1 reply; 17+ messages in thread From: Ricardo Mendoza @ 2010-11-18 21:21 UTC (permalink / raw) To: Ardelean, Andrei; +Cc: linux-mips On Thu, Nov 18, 2010 at 8:04 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > I specified that when the bootloader calls the kernel and I did see that > the baudrate is correct and I have some messages but when the system is > crashing I cannot see printk messages. For instance, I step with JTAG > and I can see that printk(KERNEL_WARNING "unable to open initial > console") is called but on the terminal I cannot see the message. The > same, die() is called but there is no messages on UART terminal. You say you are porting to a new system, perhaps you didn't set up your 8250 platform device. Most boards will have an example for you in the tree. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 22:01 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 22:01 UTC (permalink / raw) To: Ricardo Mendoza; +Cc: linux-mips Hi Ricardo, I implemented serial platform driver taking as model serial.c from cavium-octeon. Here is my code: /* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2004-2007 Cavium Networks */ #include <linux/console.h> #include <linux/module.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/serial.h> #include <linux/serial_8250.h> #include <linux/serial_reg.h> #include <linux/tty.h> #include <asm/time.h> #include <sys_defs.h> #ifdef CONFIG_GDB_CONSOLE #define DEBUG_UART 0 #else #define DEBUG_UART 1 #endif unsigned int gd_serial_in(struct uart_port *up, int offset) { int rv = inl((unsigned int)(up->membase + (offset << 2))); if (offset == UART_IIR && (rv & 0xf) == 7) { /* Busy interrupt, read the USR (39) and try again. */ inl((unsigned int)(up->membase + (39 << 2))); rv = inl((unsigned int)(up->membase + (offset << 2))); } return rv; } void gd_serial_out(struct uart_port *up, int offset, int value) { outl( value & 0xff, (unsigned int)(up->membase + (offset << 2))); } /* * Allocated in .bss, so it is all zeroed. */ #define GD_MAX_UARTS 1 static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; static struct platform_device gd_uart8250_device = { .name = "serial8250", .id = PLAT8250_DEV_PLATFORM, .dev = { .platform_data = gd_uart8250_data, }, }; static void __init gd_uart_set_common(struct plat_serial8250_port *p) { p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; p->type = PORT_GD; p->iotype = UPIO_MEM; p->regshift = 2; /* I/O addresses are every 4 bytes */ p->uartclk = UART_CLK; p->serial_in = gd_serial_in; p->serial_out = gd_serial_out; } static int __init gd_serial_init(void) { int enable_uart0; struct plat_serial8250_port *p; enable_uart0 = 1; p = gd_uart8250_data; if (enable_uart0) { /* Add a ttyS device for hardware uart 0 */ gd_uart_set_common(p); p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; p->irq = MIPSCPU_INT_UART; p++; } return platform_device_register(&gd_uart8250_device); } device_initcall(gd_serial_init); ------------------------------------------------------------------------ ----------------------- Thanks, Andrei -----Original Message----- From: mendoza.ricardo@gmail.com [mailto:mendoza.ricardo@gmail.com] On Behalf Of Ricardo Mendoza Sent: Thursday, November 18, 2010 4:21 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! On Thu, Nov 18, 2010 at 8:04 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > I specified that when the bootloader calls the kernel and I did see that > the baudrate is correct and I have some messages but when the system is > crashing I cannot see printk messages. For instance, I step with JTAG > and I can see that printk(KERNEL_WARNING "unable to open initial > console") is called but on the terminal I cannot see the message. The > same, die() is called but there is no messages on UART terminal. You say you are porting to a new system, perhaps you didn't set up your 8250 platform device. Most boards will have an example for you in the tree. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-18 22:01 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-18 22:01 UTC (permalink / raw) To: Ricardo Mendoza; +Cc: linux-mips Hi Ricardo, I implemented serial platform driver taking as model serial.c from cavium-octeon. Here is my code: /* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2004-2007 Cavium Networks */ #include <linux/console.h> #include <linux/module.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/serial.h> #include <linux/serial_8250.h> #include <linux/serial_reg.h> #include <linux/tty.h> #include <asm/time.h> #include <sys_defs.h> #ifdef CONFIG_GDB_CONSOLE #define DEBUG_UART 0 #else #define DEBUG_UART 1 #endif unsigned int gd_serial_in(struct uart_port *up, int offset) { int rv = inl((unsigned int)(up->membase + (offset << 2))); if (offset == UART_IIR && (rv & 0xf) == 7) { /* Busy interrupt, read the USR (39) and try again. */ inl((unsigned int)(up->membase + (39 << 2))); rv = inl((unsigned int)(up->membase + (offset << 2))); } return rv; } void gd_serial_out(struct uart_port *up, int offset, int value) { outl( value & 0xff, (unsigned int)(up->membase + (offset << 2))); } /* * Allocated in .bss, so it is all zeroed. */ #define GD_MAX_UARTS 1 static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; static struct platform_device gd_uart8250_device = { .name = "serial8250", .id = PLAT8250_DEV_PLATFORM, .dev = { .platform_data = gd_uart8250_data, }, }; static void __init gd_uart_set_common(struct plat_serial8250_port *p) { p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; p->type = PORT_GD; p->iotype = UPIO_MEM; p->regshift = 2; /* I/O addresses are every 4 bytes */ p->uartclk = UART_CLK; p->serial_in = gd_serial_in; p->serial_out = gd_serial_out; } static int __init gd_serial_init(void) { int enable_uart0; struct plat_serial8250_port *p; enable_uart0 = 1; p = gd_uart8250_data; if (enable_uart0) { /* Add a ttyS device for hardware uart 0 */ gd_uart_set_common(p); p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; p->irq = MIPSCPU_INT_UART; p++; } return platform_device_register(&gd_uart8250_device); } device_initcall(gd_serial_init); ------------------------------------------------------------------------ ----------------------- Thanks, Andrei -----Original Message----- From: mendoza.ricardo@gmail.com [mailto:mendoza.ricardo@gmail.com] On Behalf Of Ricardo Mendoza Sent: Thursday, November 18, 2010 4:21 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! On Thu, Nov 18, 2010 at 8:04 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > I specified that when the bootloader calls the kernel and I did see that > the baudrate is correct and I have some messages but when the system is > crashing I cannot see printk messages. For instance, I step with JTAG > and I can see that printk(KERNEL_WARNING "unable to open initial > console") is called but on the terminal I cannot see the message. The > same, die() is called but there is no messages on UART terminal. You say you are porting to a new system, perhaps you didn't set up your 8250 platform device. Most boards will have an example for you in the tree. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: The new "real" console doesn't display printk() messages like "early" console! 2010-11-18 22:01 ` Ardelean, Andrei (?) @ 2010-11-18 23:58 ` Ricardo Mendoza 2010-11-19 14:04 ` Ardelean, Andrei -1 siblings, 1 reply; 17+ messages in thread From: Ricardo Mendoza @ 2010-11-18 23:58 UTC (permalink / raw) To: Ardelean, Andrei; +Cc: linux-mips On Thu, Nov 18, 2010 at 10:01 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > Hi Ricardo, > > I implemented serial platform driver taking as model serial.c from > cavium-octeon. > > Here is my code: > > ... Why use the Octeon code which has platform specific bits that might have nothing to do with your platform? Build up from the simple ones. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-19 14:04 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-19 14:04 UTC (permalink / raw) To: Ricardo Mendoza; +Cc: linux-mips Hi Ricardo, I used Octeon just as a model, I added my own PORT_GD and my own serial_in/out driver functions which work well, I have some messages on the screen. My problem is that I can see messages like "Freeing unused kernel memory..." but I cannot see printk() error/warning/debug messages, like the messages printed by die(). Thanks, Andrei -----Original Message----- From: mendoza.ricardo@gmail.com [mailto:mendoza.ricardo@gmail.com] On Behalf Of Ricardo Mendoza Sent: Thursday, November 18, 2010 6:58 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! On Thu, Nov 18, 2010 at 10:01 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > Hi Ricardo, > > I implemented serial platform driver taking as model serial.c from > cavium-octeon. > > Here is my code: > > ... Why use the Octeon code which has platform specific bits that might have nothing to do with your platform? Build up from the simple ones. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-19 14:04 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-19 14:04 UTC (permalink / raw) To: Ricardo Mendoza; +Cc: linux-mips Hi Ricardo, I used Octeon just as a model, I added my own PORT_GD and my own serial_in/out driver functions which work well, I have some messages on the screen. My problem is that I can see messages like "Freeing unused kernel memory..." but I cannot see printk() error/warning/debug messages, like the messages printed by die(). Thanks, Andrei -----Original Message----- From: mendoza.ricardo@gmail.com [mailto:mendoza.ricardo@gmail.com] On Behalf Of Ricardo Mendoza Sent: Thursday, November 18, 2010 6:58 PM To: Ardelean, Andrei Cc: linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! On Thu, Nov 18, 2010 at 10:01 PM, Ardelean, Andrei <Andrei.Ardelean@idt.com> wrote: > Hi Ricardo, > > I implemented serial platform driver taking as model serial.c from > cavium-octeon. > > Here is my code: > > ... Why use the Octeon code which has platform specific bits that might have nothing to do with your platform? Build up from the simple ones. Ricardo ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: The new "real" console doesn't display printk() messages like "early" console! 2010-11-18 22:01 ` Ardelean, Andrei (?) (?) @ 2010-11-19 16:08 ` Sergei Shtylyov 2010-11-22 16:37 ` Ardelean, Andrei 2010-11-22 20:51 ` Ardelean, Andrei -1 siblings, 2 replies; 17+ messages in thread From: Sergei Shtylyov @ 2010-11-19 16:08 UTC (permalink / raw) To: Ardelean, Andrei; +Cc: Ricardo Mendoza, linux-mips Ardelean, Andrei wrote: > Hi Ricardo, > I implemented serial platform driver taking as model serial.c from > cavium-octeon. I think you should really have used something simpler as an example. > Here is my code: > /* > * This file is subject to the terms and conditions of the GNU General > Public > * License. See the file "COPYING" in the main directory of this > archive > * for more details. > * > * Copyright (C) 2004-2007 Cavium Networks > */ > > #include <linux/console.h> > #include <linux/module.h> > #include <linux/init.h> > #include <linux/platform_device.h> > #include <linux/serial.h> > #include <linux/serial_8250.h> > #include <linux/serial_reg.h> > #include <linux/tty.h> > #include <asm/time.h> > #include <sys_defs.h> > > > #ifdef CONFIG_GDB_CONSOLE This is never defined for MIPS. And there shouldn't be such dependencies. > #define DEBUG_UART 0 > #else > #define DEBUG_UART 1 > #endif > > unsigned int gd_serial_in(struct uart_port *up, int offset) > { > int rv = inl((unsigned int)(up->membase + (offset << 2))); Should be an empty line here. > if (offset == UART_IIR && (rv & 0xf) == 7) { Are you sure this Octeon specific quirk also allpies to your UART? > /* Busy interrupt, read the USR (39) and try again. */ > inl((unsigned int)(up->membase + (39 << 2))); > rv = inl((unsigned int)(up->membase + (offset << 2))); > } > return rv; > } > > void gd_serial_out(struct uart_port *up, int offset, int value) > { > outl( value & 0xff, (unsigned int)(up->membase + (offset << No spaces allowed after (. > 2))); > } > > /* > * Allocated in .bss, so it is all zeroed. > */ > #define GD_MAX_UARTS 1 Then how DEBUG_UART can be 1? > static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; > static struct platform_device gd_uart8250_device = { > .name = "serial8250", > .id = PLAT8250_DEV_PLATFORM, > .dev = { > .platform_data = gd_uart8250_data, Where is 'gd_uart8250_data'? > }, > }; > static void __init gd_uart_set_common(struct plat_serial8250_port *p) > { > p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; > p->type = PORT_GD; What is PORT_GD? > p->iotype = UPIO_MEM; Judging from your code, it should be UPIO_MEM32. > p->regshift = 2; /* I/O addresses are every 4 bytes */ > p->uartclk = UART_CLK; > p->serial_in = gd_serial_in; > p->serial_out = gd_serial_out; > } > > static int __init gd_serial_init(void) > { > int enable_uart0; > struct plat_serial8250_port *p; > > enable_uart0 = 1; What's the point in existence of this variable? > p = gd_uart8250_data; > if (enable_uart0) { > /* Add a ttyS device for hardware uart 0 */ > gd_uart_set_common(p); > p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; > p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; Are your UART registers identity mapped to virtual address space? You are not obliged to pass 'membase', unless you have pre-existing mapping but in this case you also need to pass UPF_IOREMAP in 'flags'. > p->irq = MIPSCPU_INT_UART; > p++; > } > return platform_device_register(&gd_uart8250_device); > } > > device_initcall(gd_serial_init); > ------------------------------------------------------------------------ > ----------------------- > > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-22 16:37 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-22 16:37 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: Ricardo Mendoza, linux-mips Hi Sergei, - I will clean up the things you highlighted in the code, they come from octeon code. - Regarding PORT_GD, I added it in driver/serial/8250.c like octeon model: [PORT_OCTEON] = { .name = "OCTEON", .fifo_size = 64, .tx_loadsz = 64, .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, .flags = UART_CAP_FIFO, }, [PORT_GD] = { .name = "GD", .fifo_size = 16, .tx_loadsz = 16, .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, .flags = UART_CAP_FIFO, }, Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Friday, November 19, 2010 11:09 AM To: Ardelean, Andrei Cc: Ricardo Mendoza; linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Ardelean, Andrei wrote: > Hi Ricardo, > I implemented serial platform driver taking as model serial.c from > cavium-octeon. I think you should really have used something simpler as an example. > Here is my code: > /* > * This file is subject to the terms and conditions of the GNU General > Public > * License. See the file "COPYING" in the main directory of this > archive > * for more details. > * > * Copyright (C) 2004-2007 Cavium Networks > */ > > #include <linux/console.h> > #include <linux/module.h> > #include <linux/init.h> > #include <linux/platform_device.h> > #include <linux/serial.h> > #include <linux/serial_8250.h> > #include <linux/serial_reg.h> > #include <linux/tty.h> > #include <asm/time.h> > #include <sys_defs.h> > > > #ifdef CONFIG_GDB_CONSOLE This is never defined for MIPS. And there shouldn't be such dependencies. > #define DEBUG_UART 0 > #else > #define DEBUG_UART 1 > #endif > > unsigned int gd_serial_in(struct uart_port *up, int offset) > { > int rv = inl((unsigned int)(up->membase + (offset << 2))); Should be an empty line here. > if (offset == UART_IIR && (rv & 0xf) == 7) { Are you sure this Octeon specific quirk also allpies to your UART? > /* Busy interrupt, read the USR (39) and try again. */ > inl((unsigned int)(up->membase + (39 << 2))); > rv = inl((unsigned int)(up->membase + (offset << 2))); > } > return rv; > } > > void gd_serial_out(struct uart_port *up, int offset, int value) > { > outl( value & 0xff, (unsigned int)(up->membase + (offset << No spaces allowed after (. > 2))); > } > > /* > * Allocated in .bss, so it is all zeroed. > */ > #define GD_MAX_UARTS 1 Then how DEBUG_UART can be 1? > static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; > static struct platform_device gd_uart8250_device = { > .name = "serial8250", > .id = PLAT8250_DEV_PLATFORM, > .dev = { > .platform_data = gd_uart8250_data, Where is 'gd_uart8250_data'? > }, > }; > static void __init gd_uart_set_common(struct plat_serial8250_port *p) > { > p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; > p->type = PORT_GD; What is PORT_GD? > p->iotype = UPIO_MEM; Judging from your code, it should be UPIO_MEM32. > p->regshift = 2; /* I/O addresses are every 4 bytes */ > p->uartclk = UART_CLK; > p->serial_in = gd_serial_in; > p->serial_out = gd_serial_out; > } > > static int __init gd_serial_init(void) > { > int enable_uart0; > struct plat_serial8250_port *p; > > enable_uart0 = 1; What's the point in existence of this variable? > p = gd_uart8250_data; > if (enable_uart0) { > /* Add a ttyS device for hardware uart 0 */ > gd_uart_set_common(p); > p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; > p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; Are your UART registers identity mapped to virtual address space? You are not obliged to pass 'membase', unless you have pre-existing mapping but in this case you also need to pass UPF_IOREMAP in 'flags'. > p->irq = MIPSCPU_INT_UART; > p++; > } > return platform_device_register(&gd_uart8250_device); > } > > device_initcall(gd_serial_init); > ------------------------------------------------------------------------ > ----------------------- > > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-22 16:37 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-22 16:37 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: Ricardo Mendoza, linux-mips Hi Sergei, - I will clean up the things you highlighted in the code, they come from octeon code. - Regarding PORT_GD, I added it in driver/serial/8250.c like octeon model: [PORT_OCTEON] = { .name = "OCTEON", .fifo_size = 64, .tx_loadsz = 64, .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, .flags = UART_CAP_FIFO, }, [PORT_GD] = { .name = "GD", .fifo_size = 16, .tx_loadsz = 16, .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, .flags = UART_CAP_FIFO, }, Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Friday, November 19, 2010 11:09 AM To: Ardelean, Andrei Cc: Ricardo Mendoza; linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Ardelean, Andrei wrote: > Hi Ricardo, > I implemented serial platform driver taking as model serial.c from > cavium-octeon. I think you should really have used something simpler as an example. > Here is my code: > /* > * This file is subject to the terms and conditions of the GNU General > Public > * License. See the file "COPYING" in the main directory of this > archive > * for more details. > * > * Copyright (C) 2004-2007 Cavium Networks > */ > > #include <linux/console.h> > #include <linux/module.h> > #include <linux/init.h> > #include <linux/platform_device.h> > #include <linux/serial.h> > #include <linux/serial_8250.h> > #include <linux/serial_reg.h> > #include <linux/tty.h> > #include <asm/time.h> > #include <sys_defs.h> > > > #ifdef CONFIG_GDB_CONSOLE This is never defined for MIPS. And there shouldn't be such dependencies. > #define DEBUG_UART 0 > #else > #define DEBUG_UART 1 > #endif > > unsigned int gd_serial_in(struct uart_port *up, int offset) > { > int rv = inl((unsigned int)(up->membase + (offset << 2))); Should be an empty line here. > if (offset == UART_IIR && (rv & 0xf) == 7) { Are you sure this Octeon specific quirk also allpies to your UART? > /* Busy interrupt, read the USR (39) and try again. */ > inl((unsigned int)(up->membase + (39 << 2))); > rv = inl((unsigned int)(up->membase + (offset << 2))); > } > return rv; > } > > void gd_serial_out(struct uart_port *up, int offset, int value) > { > outl( value & 0xff, (unsigned int)(up->membase + (offset << No spaces allowed after (. > 2))); > } > > /* > * Allocated in .bss, so it is all zeroed. > */ > #define GD_MAX_UARTS 1 Then how DEBUG_UART can be 1? > static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; > static struct platform_device gd_uart8250_device = { > .name = "serial8250", > .id = PLAT8250_DEV_PLATFORM, > .dev = { > .platform_data = gd_uart8250_data, Where is 'gd_uart8250_data'? > }, > }; > static void __init gd_uart_set_common(struct plat_serial8250_port *p) > { > p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; > p->type = PORT_GD; What is PORT_GD? > p->iotype = UPIO_MEM; Judging from your code, it should be UPIO_MEM32. > p->regshift = 2; /* I/O addresses are every 4 bytes */ > p->uartclk = UART_CLK; > p->serial_in = gd_serial_in; > p->serial_out = gd_serial_out; > } > > static int __init gd_serial_init(void) > { > int enable_uart0; > struct plat_serial8250_port *p; > > enable_uart0 = 1; What's the point in existence of this variable? > p = gd_uart8250_data; > if (enable_uart0) { > /* Add a ttyS device for hardware uart 0 */ > gd_uart_set_common(p); > p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; > p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; Are your UART registers identity mapped to virtual address space? You are not obliged to pass 'membase', unless you have pre-existing mapping but in this case you also need to pass UPF_IOREMAP in 'flags'. > p->irq = MIPSCPU_INT_UART; > p++; > } > return platform_device_register(&gd_uart8250_device); > } > > device_initcall(gd_serial_init); > ------------------------------------------------------------------------ > ----------------------- > > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-22 20:51 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-22 20:51 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: Ricardo Mendoza, linux-mips Hi Sergei, " Are your UART registers identity mapped to virtual address space?" My system has DDR memory 0x80000000..0x90000000 (kseg0) and UART is mapped starting with bbf01000 (kseg1). Can you give me some details about your question? I didn't do anything special for the port other than set_io_port_base(GD_PORT_BASE); in gd-init.c Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Friday, November 19, 2010 11:09 AM To: Ardelean, Andrei Cc: Ricardo Mendoza; linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Ardelean, Andrei wrote: > Hi Ricardo, > I implemented serial platform driver taking as model serial.c from > cavium-octeon. I think you should really have used something simpler as an example. > Here is my code: > /* > * This file is subject to the terms and conditions of the GNU General > Public > * License. See the file "COPYING" in the main directory of this > archive > * for more details. > * > * Copyright (C) 2004-2007 Cavium Networks > */ > > #include <linux/console.h> > #include <linux/module.h> > #include <linux/init.h> > #include <linux/platform_device.h> > #include <linux/serial.h> > #include <linux/serial_8250.h> > #include <linux/serial_reg.h> > #include <linux/tty.h> > #include <asm/time.h> > #include <sys_defs.h> > > > #ifdef CONFIG_GDB_CONSOLE This is never defined for MIPS. And there shouldn't be such dependencies. > #define DEBUG_UART 0 > #else > #define DEBUG_UART 1 > #endif > > unsigned int gd_serial_in(struct uart_port *up, int offset) > { > int rv = inl((unsigned int)(up->membase + (offset << 2))); Should be an empty line here. > if (offset == UART_IIR && (rv & 0xf) == 7) { Are you sure this Octeon specific quirk also allpies to your UART? > /* Busy interrupt, read the USR (39) and try again. */ > inl((unsigned int)(up->membase + (39 << 2))); > rv = inl((unsigned int)(up->membase + (offset << 2))); > } > return rv; > } > > void gd_serial_out(struct uart_port *up, int offset, int value) > { > outl( value & 0xff, (unsigned int)(up->membase + (offset << No spaces allowed after (. > 2))); > } > > /* > * Allocated in .bss, so it is all zeroed. > */ > #define GD_MAX_UARTS 1 Then how DEBUG_UART can be 1? > static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; > static struct platform_device gd_uart8250_device = { > .name = "serial8250", > .id = PLAT8250_DEV_PLATFORM, > .dev = { > .platform_data = gd_uart8250_data, Where is 'gd_uart8250_data'? > }, > }; > static void __init gd_uart_set_common(struct plat_serial8250_port *p) > { > p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; > p->type = PORT_GD; What is PORT_GD? > p->iotype = UPIO_MEM; Judging from your code, it should be UPIO_MEM32. > p->regshift = 2; /* I/O addresses are every 4 bytes */ > p->uartclk = UART_CLK; > p->serial_in = gd_serial_in; > p->serial_out = gd_serial_out; > } > > static int __init gd_serial_init(void) > { > int enable_uart0; > struct plat_serial8250_port *p; > > enable_uart0 = 1; What's the point in existence of this variable? > p = gd_uart8250_data; > if (enable_uart0) { > /* Add a ttyS device for hardware uart 0 */ > gd_uart_set_common(p); > p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; > p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; Are your UART registers identity mapped to virtual address space? You are not obliged to pass 'membase', unless you have pre-existing mapping but in this case you also need to pass UPF_IOREMAP in 'flags'. > p->irq = MIPSCPU_INT_UART; > p++; > } > return platform_device_register(&gd_uart8250_device); > } > > device_initcall(gd_serial_init); > ------------------------------------------------------------------------ > ----------------------- > > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: The new "real" console doesn't display printk() messages like "early" console! @ 2010-11-22 20:51 ` Ardelean, Andrei 0 siblings, 0 replies; 17+ messages in thread From: Ardelean, Andrei @ 2010-11-22 20:51 UTC (permalink / raw) To: Sergei Shtylyov; +Cc: Ricardo Mendoza, linux-mips Hi Sergei, " Are your UART registers identity mapped to virtual address space?" My system has DDR memory 0x80000000..0x90000000 (kseg0) and UART is mapped starting with bbf01000 (kseg1). Can you give me some details about your question? I didn't do anything special for the port other than set_io_port_base(GD_PORT_BASE); in gd-init.c Thanks, Andrei -----Original Message----- From: Sergei Shtylyov [mailto:sshtylyov@mvista.com] Sent: Friday, November 19, 2010 11:09 AM To: Ardelean, Andrei Cc: Ricardo Mendoza; linux-mips@linux-mips.org Subject: Re: The new "real" console doesn't display printk() messages like "early" console! Ardelean, Andrei wrote: > Hi Ricardo, > I implemented serial platform driver taking as model serial.c from > cavium-octeon. I think you should really have used something simpler as an example. > Here is my code: > /* > * This file is subject to the terms and conditions of the GNU General > Public > * License. See the file "COPYING" in the main directory of this > archive > * for more details. > * > * Copyright (C) 2004-2007 Cavium Networks > */ > > #include <linux/console.h> > #include <linux/module.h> > #include <linux/init.h> > #include <linux/platform_device.h> > #include <linux/serial.h> > #include <linux/serial_8250.h> > #include <linux/serial_reg.h> > #include <linux/tty.h> > #include <asm/time.h> > #include <sys_defs.h> > > > #ifdef CONFIG_GDB_CONSOLE This is never defined for MIPS. And there shouldn't be such dependencies. > #define DEBUG_UART 0 > #else > #define DEBUG_UART 1 > #endif > > unsigned int gd_serial_in(struct uart_port *up, int offset) > { > int rv = inl((unsigned int)(up->membase + (offset << 2))); Should be an empty line here. > if (offset == UART_IIR && (rv & 0xf) == 7) { Are you sure this Octeon specific quirk also allpies to your UART? > /* Busy interrupt, read the USR (39) and try again. */ > inl((unsigned int)(up->membase + (39 << 2))); > rv = inl((unsigned int)(up->membase + (offset << 2))); > } > return rv; > } > > void gd_serial_out(struct uart_port *up, int offset, int value) > { > outl( value & 0xff, (unsigned int)(up->membase + (offset << No spaces allowed after (. > 2))); > } > > /* > * Allocated in .bss, so it is all zeroed. > */ > #define GD_MAX_UARTS 1 Then how DEBUG_UART can be 1? > static struct plat_serial8250_port gd_uart8250_data[GD_MAX_UARTS + 1]; > static struct platform_device gd_uart8250_device = { > .name = "serial8250", > .id = PLAT8250_DEV_PLATFORM, > .dev = { > .platform_data = gd_uart8250_data, Where is 'gd_uart8250_data'? > }, > }; > static void __init gd_uart_set_common(struct plat_serial8250_port *p) > { > p->flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE; > p->type = PORT_GD; What is PORT_GD? > p->iotype = UPIO_MEM; Judging from your code, it should be UPIO_MEM32. > p->regshift = 2; /* I/O addresses are every 4 bytes */ > p->uartclk = UART_CLK; > p->serial_in = gd_serial_in; > p->serial_out = gd_serial_out; > } > > static int __init gd_serial_init(void) > { > int enable_uart0; > struct plat_serial8250_port *p; > > enable_uart0 = 1; What's the point in existence of this variable? > p = gd_uart8250_data; > if (enable_uart0) { > /* Add a ttyS device for hardware uart 0 */ > gd_uart_set_common(p); > p->membase = (void *) offMCU_UART_THR_OR_RBR_OR_DLL; > p->mapbase = offMCU_UART_THR_OR_RBR_OR_DLL; Are your UART registers identity mapped to virtual address space? You are not obliged to pass 'membase', unless you have pre-existing mapping but in this case you also need to pass UPF_IOREMAP in 'flags'. > p->irq = MIPSCPU_INT_UART; > p++; > } > return platform_device_register(&gd_uart8250_device); > } > > device_initcall(gd_serial_init); > ------------------------------------------------------------------------ > ----------------------- > > Thanks, > Andrei WBR, Sergei ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: The new "real" console doesn't display printk() messages like "early" console! 2010-11-22 20:51 ` Ardelean, Andrei (?) @ 2010-11-22 21:02 ` David Daney -1 siblings, 0 replies; 17+ messages in thread From: David Daney @ 2010-11-22 21:02 UTC (permalink / raw) To: Ardelean, Andrei; +Cc: Sergei Shtylyov, Ricardo Mendoza, linux-mips On 11/22/2010 12:51 PM, Ardelean, Andrei wrote: > Hi Sergei, > > " Are your UART registers identity mapped to virtual address space?" > > My system has DDR memory 0x80000000..0x90000000 (kseg0) and UART is > mapped starting with bbf01000 (kseg1). Can you give me some details > about your question? > > I didn't do anything special for the port other than > set_io_port_base(GD_PORT_BASE); > in gd-init.c > > I think you need to reset your process here. First you should probably get a prom_putchar() function working. Then enable CONFIG_EARLY_PRINTK. That will enable you to debug many things. If need be, you can write a trivial prom_puts() to go with your prom_putchar(). If you have two serial ports available, all the better. Use one for printing debugging information and the other as the port you are trying to debug. Asking people to stare at the thousands of lines of code that make up the serial I/O system and spot the error in your configuration will probably be less fruitful than tracing through it to find the problem. David Daney ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2010-11-22 21:03 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-11-18 18:55 The new "real" console doesn't display printk() messages like "early" console! Ardelean, Andrei 2010-11-18 18:55 ` Ardelean, Andrei 2010-11-18 19:20 ` Sergei Shtylyov 2010-11-18 20:04 ` Ardelean, Andrei 2010-11-18 20:04 ` Ardelean, Andrei 2010-11-18 21:21 ` Ricardo Mendoza 2010-11-18 22:01 ` Ardelean, Andrei 2010-11-18 22:01 ` Ardelean, Andrei 2010-11-18 23:58 ` Ricardo Mendoza 2010-11-19 14:04 ` Ardelean, Andrei 2010-11-19 14:04 ` Ardelean, Andrei 2010-11-19 16:08 ` Sergei Shtylyov 2010-11-22 16:37 ` Ardelean, Andrei 2010-11-22 16:37 ` Ardelean, Andrei 2010-11-22 20:51 ` Ardelean, Andrei 2010-11-22 20:51 ` Ardelean, Andrei 2010-11-22 21:02 ` David Daney
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.