* [U-Boot] [PATCH 0/2] console: Squelch and pre-console buffer
@ 2011-08-29 12:14 Graeme Russ
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
2011-08-29 12:14 ` [U-Boot] [PATCH 2/2] console: Implement pre-console buffer Graeme Russ
0 siblings, 2 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-29 12:14 UTC (permalink / raw)
To: u-boot
This is a more complete followup patch to my original 'Pre-console buffer'
patch. This series includes squelching of all console I/O if
gd->have_console is 0 (console not initialised yet) unless the board is
configured to use the pre-console buffer (in which case console output
prior to the console being initialised is redirected to the buffer - All
console input is still squelched prior to the console being initialised)
If the pre-console buffer is enabled, the buffer is sent to console as
soon as the console is initialised.
Graeme Russ (2):
console: Squelch pre-console output in console functions
console: Implement pre-console buffer
arch/arm/include/asm/global_data.h | 3 +
arch/avr32/include/asm/global_data.h | 3 +
arch/blackfin/include/asm/global_data.h | 3 +
arch/m68k/include/asm/global_data.h | 3 +
arch/microblaze/include/asm/global_data.h | 3 +
arch/mips/include/asm/global_data.h | 3 +
arch/nios2/include/asm/global_data.h | 3 +
arch/powerpc/cpu/mpc5xxx/i2c.c | 30 +++++----------
arch/powerpc/cpu/mpc8xx/i2c.c | 18 +++------
arch/powerpc/include/asm/global_data.h | 3 +
arch/sh/include/asm/global_data.h | 3 +
arch/sparc/include/asm/global_data.h | 4 +-
arch/x86/include/asm/global_data.h | 3 +
common/console.c | 60 +++++++++++++++++++++++++++++
drivers/i2c/ppc4xx_i2c.c | 5 +--
drivers/i2c/soft_i2c.c | 1 -
16 files changed, 110 insertions(+), 38 deletions(-)
--
1.7.5.2.317.g391b14
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions
2011-08-29 12:14 [U-Boot] [PATCH 0/2] console: Squelch and pre-console buffer Graeme Russ
@ 2011-08-29 12:14 ` Graeme Russ
2011-08-30 17:16 ` Mike Frysinger
` (2 more replies)
2011-08-29 12:14 ` [U-Boot] [PATCH 2/2] console: Implement pre-console buffer Graeme Russ
1 sibling, 3 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-29 12:14 UTC (permalink / raw)
To: u-boot
There are some locations in the code which anticipate printf() being called
before the console is ready by squelching printf() on gd->have_console.
Move this squelching into printf(), vprintf(), puts() and putc(). Also
make tstc() and getc() return 0 if console is not yet initialised
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
arch/powerpc/cpu/mpc5xxx/i2c.c | 30 ++++++++++--------------------
arch/powerpc/cpu/mpc8xx/i2c.c | 18 ++++++------------
common/console.c | 18 ++++++++++++++++++
drivers/i2c/ppc4xx_i2c.c | 5 +----
drivers/i2c/soft_i2c.c | 1 -
5 files changed, 35 insertions(+), 37 deletions(-)
diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
index 9fb330f..f9d293b 100644
--- a/arch/powerpc/cpu/mpc5xxx/i2c.c
+++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
@@ -332,8 +332,7 @@ static int mpc_get_fdr(int speed)
if (gd->flags & GD_FLG_RELOC) {
fdr = divider;
} else {
- if (gd->have_console)
- printf("%ld kHz, ", best_speed / 1000);
+ printf("%ld kHz, ", best_speed / 1000);
return divider;
}
}
@@ -374,34 +373,29 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
xaddr[3] = addr & 0xFF;
if (wait_for_bb()) {
- if (gd->have_console)
- printf("i2c_read: bus is busy\n");
+ printf("i2c_read: bus is busy\n");
goto Done;
}
mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
if (do_address(chip, 0)) {
- if (gd->have_console)
- printf("i2c_read: failed to address chip\n");
+ printf("i2c_read: failed to address chip\n");
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
- if (gd->have_console)
- printf("i2c_read: send_bytes failed\n");
+ printf("i2c_read: send_bytes failed\n");
goto Done;
}
mpc_reg_out(®s->mcr, I2C_RSTA, I2C_RSTA);
if (do_address(chip, 1)) {
- if (gd->have_console)
- printf("i2c_read: failed to address chip\n");
+ printf("i2c_read: failed to address chip\n");
goto Done;
}
if (receive_bytes(chip, (char *)buf, len)) {
- if (gd->have_console)
- printf("i2c_read: receive_bytes failed\n");
+ printf("i2c_read: receive_bytes failed\n");
goto Done;
}
@@ -423,27 +417,23 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
xaddr[3] = addr & 0xFF;
if (wait_for_bb()) {
- if (gd->have_console)
- printf("i2c_write: bus is busy\n");
+ printf("i2c_write: bus is busy\n");
goto Done;
}
mpc_reg_out(®s->mcr, I2C_STA, I2C_STA);
if (do_address(chip, 0)) {
- if (gd->have_console)
- printf("i2c_write: failed to address chip\n");
+ printf("i2c_write: failed to address chip\n");
goto Done;
}
if (send_bytes(chip, &xaddr[4-alen], alen)) {
- if (gd->have_console)
- printf("i2c_write: send_bytes failed\n");
+ printf("i2c_write: send_bytes failed\n");
goto Done;
}
if (send_bytes(chip, (char *)buf, len)) {
- if (gd->have_console)
- printf("i2c_write: send_bytes failed\n");
+ printf("i2c_write: send_bytes failed\n");
goto Done;
}
diff --git a/arch/powerpc/cpu/mpc8xx/i2c.c b/arch/powerpc/cpu/mpc8xx/i2c.c
index 338caba..1ca51fd 100644
--- a/arch/powerpc/cpu/mpc8xx/i2c.c
+++ b/arch/powerpc/cpu/mpc8xx/i2c.c
@@ -633,22 +633,19 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_read: i2c_send failed (%d)\n", rc);
+ printf("i2c_read: i2c_send failed (%d)\n", rc);
return 1;
}
rc = i2c_receive(&state, chip, 0, I2CF_STOP_COND, len, buffer);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_read: i2c_receive failed (%d)\n", rc);
+ printf("i2c_read: i2c_receive failed (%d)\n", rc);
return 1;
}
rc = i2c_doio(&state);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_read: i2c_doio failed (%d)\n", rc);
+ printf("i2c_read: i2c_doio failed (%d)\n", rc);
return 1;
}
return 0;
@@ -683,22 +680,19 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_write: first i2c_send failed (%d)\n", rc);
+ printf("i2c_write: first i2c_send failed (%d)\n", rc);
return 1;
}
rc = i2c_send(&state, 0, 0, I2CF_STOP_COND, len, buffer);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_write: second i2c_send failed (%d)\n", rc);
+ printf("i2c_write: second i2c_send failed (%d)\n", rc);
return 1;
}
rc = i2c_doio(&state);
if (rc != 0) {
- if (gd->have_console)
- printf("i2c_write: i2c_doio failed (%d)\n", rc);
+ printf("i2c_write: i2c_doio failed (%d)\n", rc);
return 1;
}
return 0;
diff --git a/common/console.c b/common/console.c
index 8c650e0..b23d933 100644
--- a/common/console.c
+++ b/common/console.c
@@ -298,6 +298,9 @@ int getc(void)
return 0;
#endif
+ if (!gd->have_console)
+ return 0;
+
if (gd->flags & GD_FLG_DEVINIT) {
/* Get from the standard input */
return fgetc(stdin);
@@ -314,6 +317,9 @@ int tstc(void)
return 0;
#endif
+ if (!gd->have_console)
+ return 0;
+
if (gd->flags & GD_FLG_DEVINIT) {
/* Test the standard input */
return ftstc(stdin);
@@ -335,6 +341,9 @@ void putc(const char c)
return;
#endif
+ if (!gd->have_console)
+ return;
+
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
fputc(stdout, c);
@@ -356,6 +365,9 @@ void puts(const char *s)
return;
#endif
+ if (!gd->have_console)
+ return;
+
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
fputs(stdout, s);
@@ -371,6 +383,9 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+ if (!gd->have_console)
+ return 0;
+
va_start(args, fmt);
/* For this to work, printbuffer must be larger than
@@ -389,6 +404,9 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+ if (!gd->have_console)
+ return 0;
+
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
*/
diff --git a/drivers/i2c/ppc4xx_i2c.c b/drivers/i2c/ppc4xx_i2c.c
index c1cbe55..53fedd5 100644
--- a/drivers/i2c/ppc4xx_i2c.c
+++ b/drivers/i2c/ppc4xx_i2c.c
@@ -396,10 +396,7 @@ static int ppc4xx_i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer,
#endif
if ((ret = i2c_transfer(read, chip << 1, &xaddr[4 - alen], alen,
buffer, len)) != 0) {
- if (gd->have_console) {
- printf("I2C %s: failed %d\n",
- read ? "read" : "write", ret);
- }
+ printf("I2C %s: failed %d\n", read ? "read" : "write", ret);
return 1;
}
diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
index 9b02e89..36c6114 100644
--- a/drivers/i2c/soft_i2c.c
+++ b/drivers/i2c/soft_i2c.c
@@ -119,7 +119,6 @@ DECLARE_GLOBAL_DATA_PTR;
#ifdef DEBUG_I2C
#define PRINTD(fmt,args...) do { \
- if (gd->have_console) \
printf (fmt ,##args); \
} while (0)
#else
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 2/2] console: Implement pre-console buffer
2011-08-29 12:14 [U-Boot] [PATCH 0/2] console: Squelch and pre-console buffer Graeme Russ
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
@ 2011-08-29 12:14 ` Graeme Russ
2011-08-30 12:49 ` [U-Boot] [PATCH V2] " Graeme Russ
1 sibling, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-08-29 12:14 UTC (permalink / raw)
To: u-boot
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board configuration file must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the first (CONFIG_PRE_CON_BUF_SZ -1)
bytes (need to allow for a null terminator). Any remaining characters are
silently dropped.
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 4 ++-
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 50 ++++++++++++++++++++++++++--
12 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..445aa8b 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -52,7 +52,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
-
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..b3d2a53 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,30 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_SYS_TMP_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx < CONFIG_SYS_TMP_CON_BUF_SZ)
+ buffer[gd->precon_buf_idx++] = c;
+}
+
+void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+void print_pre_console_buffer(void)
+{
+ char *buffer = (char *)CONFIG_SYS_TMP_CON_BUF_ADDR;
+
+ buffer[gd->precon_buf_idx] = 0x00;
+ puts(buffer);
+}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -341,8 +365,12 @@ void putc(const char c)
return;
#endif
- if (!gd->have_console)
+ if (!gd->have_console) {
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ pre_console_putc(c);
+#endif
return;
+ }
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -365,8 +393,12 @@ void puts(const char *s)
return;
#endif
- if (!gd->have_console)
+ if (!gd->have_console) {
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ pre_console_puts(s);
+#endif
return;
+ }
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +415,11 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
- if (!gd->have_console)
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
+ if (!gd->have_console) {
return 0;
+ }
+#endif
va_start(args, fmt);
@@ -404,8 +439,11 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
- if (!gd->have_console)
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
+ if (!gd->have_console) {
return 0;
+ }
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +585,10 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ print_pre_console_buffer();
+#endif
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-29 12:14 ` [U-Boot] [PATCH 2/2] console: Implement pre-console buffer Graeme Russ
@ 2011-08-30 12:49 ` Graeme Russ
2011-08-30 17:19 ` Mike Frysinger
` (2 more replies)
0 siblings, 3 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-30 12:49 UTC (permalink / raw)
To: u-boot
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board configuration file must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
Any earlier characters are silently dropped.
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes Since V1
- Implemented circular buffer
- Trivial code style corrections
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 3 ++
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 49 +++++++++++++++++++++++++++-
12 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..a1e4b44 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -53,6 +53,9 @@ typedef struct global_data {
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..ae87148 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,35 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+#define CIRC_BUF_IDX(idx) ((idx) % CONFIG_PRE_CON_BUF_SZ)
+
+void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+}
+
+void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+void print_pre_console_buffer(void)
+{
+ unsigned long i = 0;
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
+ i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+
+ while (i < gd->precon_buf_idx)
+ putc(buffer[CIRC_BUF_IDX(i++)]);
+}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -341,8 +370,12 @@ void putc(const char c)
return;
#endif
- if (!gd->have_console)
+ if (!gd->have_console) {
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ pre_console_putc(c);
+#endif
return;
+ }
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -365,8 +398,12 @@ void puts(const char *s)
return;
#endif
- if (!gd->have_console)
+ if (!gd->have_console) {
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ pre_console_puts(s);
+#endif
return;
+ }
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +420,10 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
va_start(args, fmt);
@@ -404,8 +443,10 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +588,10 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ print_pre_console_buffer();
+#endif
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
@ 2011-08-30 17:16 ` Mike Frysinger
2011-08-30 19:01 ` Wolfgang Denk
2011-09-21 23:21 ` Simon Glass
2011-10-01 19:54 ` Wolfgang Denk
2 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-30 17:16 UTC (permalink / raw)
To: u-boot
On Monday, August 29, 2011 08:14:05 Graeme Russ wrote:
> --- a/drivers/i2c/soft_i2c.c
> +++ b/drivers/i2c/soft_i2c.c
>
> #ifdef DEBUG_I2C
> #define PRINTD(fmt,args...) do { \
> - if (gd->have_console) \
> printf (fmt ,##args); \
> } while (0)
> #else
the "do {} while (0)" can go away now
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110830/789dee04/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 12:49 ` [U-Boot] [PATCH V2] " Graeme Russ
@ 2011-08-30 17:19 ` Mike Frysinger
2011-08-30 19:45 ` Simon Glass
2011-08-31 12:35 ` [U-Boot] (no subject) Graeme Russ
2 siblings, 0 replies; 50+ messages in thread
From: Mike Frysinger @ 2011-08-30 17:19 UTC (permalink / raw)
To: u-boot
On Tuesday, August 30, 2011 08:49:41 Graeme Russ wrote:
> - if (!gd->have_console)
> + if (!gd->have_console) {
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + pre_console_putc(c);
> +#endif
> return;
> + }
add inline stubs for the pre_console_xxx helpers and you can drop all the
ifdef's through out the rest of the code
#ifdef CONFIG_PRE_CONSOLE_BUFFER
... normal defines for these ...
#else
static inline void pre_console_putc(const char c) {}
static inline void pre_console_puts(const char *s) {}
#endif
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110830/5c468ab6/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions
2011-08-30 17:16 ` Mike Frysinger
@ 2011-08-30 19:01 ` Wolfgang Denk
0 siblings, 0 replies; 50+ messages in thread
From: Wolfgang Denk @ 2011-08-30 19:01 UTC (permalink / raw)
To: u-boot
Dear Mike Frysinger,
In message <201108301316.56595.vapier@gentoo.org> you wrote:
>
> On Monday, August 29, 2011 08:14:05 Graeme Russ wrote:
> > --- a/drivers/i2c/soft_i2c.c
> > +++ b/drivers/i2c/soft_i2c.c
> >=20
> > #ifdef DEBUG_I2C
> > #define PRINTD(fmt,args...) do { \
> > - if (gd->have_console) \
> > printf (fmt ,##args); \
> > } while (0)
> > #else
>
> the "do {} while (0)" can go away now
It is safer to keep it, especially with the if construct.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
There's nothing disgusting about it [the Companion]. It's just
another life form, that's all. You get used to those things.
-- McCoy, "Metamorphosis", stardate 3219.8
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 12:49 ` [U-Boot] [PATCH V2] " Graeme Russ
2011-08-30 17:19 ` Mike Frysinger
@ 2011-08-30 19:45 ` Simon Glass
2011-08-30 19:52 ` Wolfgang Denk
2011-08-31 12:35 ` [U-Boot] (no subject) Graeme Russ
2 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-08-30 19:45 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Tue, Aug 30, 2011 at 5:49 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
>
> To enable this functionality, the board configuration file must define:
> ?- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> ?- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> ?- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
Please can you add these to the README?
Also I wonder if it is safe to have boards setting the buffer address.
Should not arch/xxx/lib/board.c work this out based on
CONFIG_SYS_INIT_SP_ADDR as it does all the other memory areas?
>
> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> Any earlier characters are silently dropped.
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes Since V1
> ?- Implemented circular buffer
> ?- Trivial code style corrections
>
> ?arch/arm/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?arch/avr32/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/blackfin/include/asm/global_data.h ? | ? ?3 ++
> ?arch/m68k/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/microblaze/include/asm/global_data.h | ? ?3 ++
> ?arch/mips/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/nios2/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/powerpc/include/asm/global_data.h ? ?| ? ?3 ++
> ?arch/sh/include/asm/global_data.h ? ? ? ? | ? ?3 ++
> ?arch/sparc/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/x86/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?common/console.c ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 49 +++++++++++++++++++++++++++-
> ?12 files changed, 80 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
> index 4fc51fd..b85b7fe 100644
> --- a/arch/arm/include/asm/global_data.h
> +++ b/arch/arm/include/asm/global_data.h
> @@ -38,6 +38,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? */
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* base address of frame buffer */
> diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
> index 4ef8fc5..5c654bd 100644
> --- a/arch/avr32/include/asm/global_data.h
> +++ b/arch/avr32/include/asm/global_data.h
> @@ -38,6 +38,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? stack_end; ? ? ?/* highest stack address */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address of env struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of env valid? */
> diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
> index eba5e93..f7aa711 100644
> --- a/arch/blackfin/include/asm/global_data.h
> +++ b/arch/blackfin/include/asm/global_data.h
> @@ -45,6 +45,9 @@ typedef struct global_data {
> ? ? ? ?unsigned long board_type;
> ? ? ? ?unsigned long baudrate;
> ? ? ? ?unsigned long have_console; ? ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ram_size; ? ? ? ? ? /* RAM size */
> ? ? ? ?unsigned long env_addr; /* Address ?of Environment struct */
> ? ? ? ?unsigned long env_valid; ? ? ? ?/* Checksum of Environment valid? */
> diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
> index fc486fd..0ba2b43 100644
> --- a/arch/m68k/include/asm/global_data.h
> +++ b/arch/m68k/include/asm/global_data.h
> @@ -57,6 +57,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct ? ? ? */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called ? ? ? ? ? ? */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* Base addr of framebuffer memory */
> ?#endif
> diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
> index 557ad27..6e8537c 100644
> --- a/arch/microblaze/include/asm/global_data.h
> +++ b/arch/microblaze/include/asm/global_data.h
> @@ -39,6 +39,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? */
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* base address of frame buffer */
> diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
> index 271a290..b193517 100644
> --- a/arch/mips/include/asm/global_data.h
> +++ b/arch/mips/include/asm/global_data.h
> @@ -41,6 +41,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
> index 2c4a719..d9f0664 100644
> --- a/arch/nios2/include/asm/global_data.h
> +++ b/arch/nios2/include/asm/global_data.h
> @@ -29,6 +29,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? cpu_clk; ? ? ? ?/* CPU clock in Hz! ? ? ? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid */
> diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
> index a33ca2f..7fcaf38 100644
> --- a/arch/powerpc/include/asm/global_data.h
> +++ b/arch/powerpc/include/asm/global_data.h
> @@ -138,6 +138,9 @@ typedef ? ? struct ?global_data {
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct ? ? ? */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called ? ? ? ? ? ? */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
> ? ? ? ?unsigned int ? ?dp_alloc_base;
> ? ? ? ?unsigned int ? ?dp_alloc_top;
> diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
> index 0c09ba9..1b782fc 100644
> --- a/arch/sh/include/asm/global_data.h
> +++ b/arch/sh/include/asm/global_data.h
> @@ -34,6 +34,9 @@ typedef ? ? ? struct global_data
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? cpu_clk; ? ? ? ?/* CPU clock in Hz! */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid */
> diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
> index 9b14674..a1e4b44 100644
> --- a/arch/sparc/include/asm/global_data.h
> +++ b/arch/sparc/include/asm/global_data.h
> @@ -53,6 +53,9 @@ typedef struct global_data {
> ? ? ? ?unsigned long env_valid; ? ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long have_console; ? ? /* serial_init() was called */
>
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
> ? ? ? ?unsigned long fb_base; ?/* Base address of framebuffer memory ? */
> ?#endif
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index f977dbe..6cf7955 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -40,6 +40,9 @@ typedef ? ? ? struct global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? load_off; ? ? ? /* Load Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> diff --git a/common/console.c b/common/console.c
> index b23d933..ae87148 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -329,6 +329,35 @@ int tstc(void)
> ? ? ? ?return serial_tstc();
> ?}
>
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> +#define CIRC_BUF_IDX(idx) ((idx) % CONFIG_PRE_CON_BUF_SZ)
The division here sticks in the craw, but unless we go with
CONFIG_PRE_CON_BUF_SZ_LOG2 then I don't see an easy way around it, and
since this is serial output we can't honestly claim to worry much
about performance.
> +
> +void pre_console_putc(const char c)
> +{
> + ? ? ? char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
> +
> + ? ? ? buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
> +}
> +
> +void pre_console_puts(const char *s)
> +{
> + ? ? ? while (*s)
> + ? ? ? ? ? ? ? pre_console_putc(*s++);
> +}
> +
> +void print_pre_console_buffer(void)
> +{
> + ? ? ? unsigned long i = 0;
> + ? ? ? char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
> +
> + ? ? ? if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
> + ? ? ? ? ? ? ? i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
Gosh this is clever - perhaps a little comment?
> +
> + ? ? ? while (i < gd->precon_buf_idx)
> + ? ? ? ? ? ? ? putc(buffer[CIRC_BUF_IDX(i++)]);
> +}
> +#endif
> +
> ?void putc(const char c)
> ?{
> ?#ifdef CONFIG_SILENT_CONSOLE
> @@ -341,8 +370,12 @@ void putc(const char c)
> ? ? ? ? ? ? ? ?return;
> ?#endif
>
> - ? ? ? if (!gd->have_console)
> + ? ? ? if (!gd->have_console) {
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? ? ? ? ? pre_console_putc(c);
> +#endif
> ? ? ? ? ? ? ? ?return;
> + ? ? ? }
>
> ? ? ? ?if (gd->flags & GD_FLG_DEVINIT) {
> ? ? ? ? ? ? ? ?/* Send to the standard output */
> @@ -365,8 +398,12 @@ void puts(const char *s)
> ? ? ? ? ? ? ? ?return;
> ?#endif
>
> - ? ? ? if (!gd->have_console)
> + ? ? ? if (!gd->have_console) {
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? ? ? ? ? pre_console_puts(s);
> +#endif
> ? ? ? ? ? ? ? ?return;
> + ? ? ? }
>
> ? ? ? ?if (gd->flags & GD_FLG_DEVINIT) {
> ? ? ? ? ? ? ? ?/* Send to the standard output */
> @@ -383,8 +420,10 @@ int printf(const char *fmt, ...)
> ? ? ? ?uint i;
> ? ? ? ?char printbuffer[CONFIG_SYS_PBSIZE];
>
> +#ifndef CONFIG_PRE_CONSOLE_BUFFER
> ? ? ? ?if (!gd->have_console)
> ? ? ? ? ? ? ? ?return 0;
> +#endif
>
> ? ? ? ?va_start(args, fmt);
>
> @@ -404,8 +443,10 @@ int vprintf(const char *fmt, va_list args)
> ? ? ? ?uint i;
> ? ? ? ?char printbuffer[CONFIG_SYS_PBSIZE];
>
> +#ifndef CONFIG_PRE_CONSOLE_BUFFER
> ? ? ? ?if (!gd->have_console)
> ? ? ? ? ? ? ? ?return 0;
> +#endif
>
> ? ? ? ?/* For this to work, printbuffer must be larger than
> ? ? ? ? * anything we ever want to print.
> @@ -547,6 +588,10 @@ int console_init_f(void)
> ? ? ? ? ? ? ? ?gd->flags |= GD_FLG_SILENT;
> ?#endif
>
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? print_pre_console_buffer();
> +#endif
> +
> ? ? ? ?return 0;
> ?}
>
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 19:45 ` Simon Glass
@ 2011-08-30 19:52 ` Wolfgang Denk
2011-08-30 19:58 ` Mike Frysinger
2011-08-30 20:07 ` Simon Glass
0 siblings, 2 replies; 50+ messages in thread
From: Wolfgang Denk @ 2011-08-30 19:52 UTC (permalink / raw)
To: u-boot
Dear Simon Glass,
In message <CAPnjgZ1fXCCFDcwCWgZD7H-siVEV-H+Ks5TPeiT=nGS743fzcg@mail.gmail.com> you wrote:
>
...
> > +#define CIRC_BUF_IDX(idx) ((idx) % CONFIG_PRE_CON_BUF_SZ)
>
> The division here sticks in the craw, but unless we go with
Does it? Why?
> CONFIG_PRE_CON_BUF_SZ_LOG2 then I don't see an easy way around it, and
> since this is serial output we can't honestly claim to worry much
> about performance.
Please see my previous posting
(http://article.gmane.org/gmane.comp.boot-loaders.u-boot/106810)
I don't think 3 additional addembler instructions really play a big
role here.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Every time history repeats itself the price goes up.
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 19:52 ` Wolfgang Denk
@ 2011-08-30 19:58 ` Mike Frysinger
2011-08-30 20:08 ` Wolfgang Denk
2011-08-30 20:07 ` Simon Glass
1 sibling, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-30 19:58 UTC (permalink / raw)
To: u-boot
On Tuesday, August 30, 2011 15:52:38 Wolfgang Denk wrote:
> Simon Glass wrote:
> > > +#define CIRC_BUF_IDX(idx) ((idx) % CONFIG_PRE_CON_BUF_SZ)
> >
> > The division here sticks in the craw, but unless we go with
>
> Does it? Why?
>
> > CONFIG_PRE_CON_BUF_SZ_LOG2 then I don't see an easy way around it, and
> > since this is serial output we can't honestly claim to worry much
> > about performance.
>
> Please see my previous posting
> (http://article.gmane.org/gmane.comp.boot-loaders.u-boot/106810)
>
> I don't think 3 additional addembler instructions really play a big
> role here.
i'm pretty sure if you define CONFIG_PRE_CON_BUF_SZ as a power of 2 value, you
get nice & simple assembly code. so if the generated code is undesirable,
pick a CONFIG value that is power-of-2 ?
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110830/a22cef35/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 19:52 ` Wolfgang Denk
2011-08-30 19:58 ` Mike Frysinger
@ 2011-08-30 20:07 ` Simon Glass
1 sibling, 0 replies; 50+ messages in thread
From: Simon Glass @ 2011-08-30 20:07 UTC (permalink / raw)
To: u-boot
Hi Wolfgang,
On Tue, Aug 30, 2011 at 12:52 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Simon Glass,
>
> In message <CAPnjgZ1fXCCFDcwCWgZD7H-siVEV-H+Ks5TPeiT=nGS743fzcg@mail.gmail.com> you wrote:
>>
> ...
>> > +#define CIRC_BUF_IDX(idx) ((idx) % CONFIG_PRE_CON_BUF_SZ)
>>
>> The division here sticks in the craw, but unless we go with
>
> Does it? ?Why?
Only because of the division. But as Mike mentions later, the compiler
will avoid it for powers of two. So all is well.
>
>> CONFIG_PRE_CON_BUF_SZ_LOG2 then I don't see an easy way around it, and
>> since this is serial output we can't honestly claim to worry much
>> about performance.
>
> Please see my previous posting
> (http://article.gmane.org/gmane.comp.boot-loaders.u-boot/106810)
>
> I don't think 3 additional addembler instructions really play a big
> role here.
Yes I saw it, thanks.
Regards,
Simon
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> Every time history repeats itself the price goes up.
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 19:58 ` Mike Frysinger
@ 2011-08-30 20:08 ` Wolfgang Denk
2011-08-30 20:18 ` Simon Glass
0 siblings, 1 reply; 50+ messages in thread
From: Wolfgang Denk @ 2011-08-30 20:08 UTC (permalink / raw)
To: u-boot
Dear Mike Frysinger,
In message <201108301558.08010.vapier@gentoo.org> you wrote:
>
> > Please see my previous posting
> > (http://article.gmane.org/gmane.comp.boot-loaders.u-boot/106810)
> >
> > I don't think 3 additional addembler instructions really play a big
> > role here.
>
> i'm pretty sure if you define CONFIG_PRE_CON_BUF_SZ as a power of 2 value, you
> get nice & simple assembly code. so if the generated code is undesirable,
> pick a CONFIG value that is power-of-2 ?
This was the test code I compiled:
---------------------------------------------
#define CONFIG_SYS_TMP_CON_BUF_SZ 1024
int foo(int i)
{
return i & (CONFIG_SYS_TMP_CON_BUF_SZ-1);
}
int bar(int i)
{
return i % CONFIG_SYS_TMP_CON_BUF_SZ;
}
---------------------------------------------
So was actually checking for a power-of-2 value.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"Maintain an awareness for contribution -- to your schedule, your
project, our company." - A Group of Employees
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 20:08 ` Wolfgang Denk
@ 2011-08-30 20:18 ` Simon Glass
2011-08-30 20:57 ` Wolfgang Denk
0 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-08-30 20:18 UTC (permalink / raw)
To: u-boot
Hi Wolfgang,
On Tue, Aug 30, 2011 at 1:08 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Mike Frysinger,
>
> In message <201108301558.08010.vapier@gentoo.org> you wrote:
>>
>> > Please see my previous posting
>> > (http://article.gmane.org/gmane.comp.boot-loaders.u-boot/106810)
>> >
>> > I don't think 3 additional addembler instructions really play a big
>> > role here.
>>
>> i'm pretty sure if you define CONFIG_PRE_CON_BUF_SZ as a power of 2 value, you
>> get nice & simple assembly code. ?so if the generated code is undesirable,
>> pick a CONFIG value that is power-of-2 ?
>
> This was the test code I compiled:
>
> ---------------------------------------------
> #define CONFIG_SYS_TMP_CON_BUF_SZ ? ? ? 1024
>
> int foo(int i)
> {
> ? ? ? ?return i & (CONFIG_SYS_TMP_CON_BUF_SZ-1);
> }
>
> int bar(int i)
> {
> ? ? ? ?return i % CONFIG_SYS_TMP_CON_BUF_SZ;
> }
> ---------------------------------------------
>
> So was actually checking for a power-of-2 value.
In case it is interesting (which may be unlikely) here is the code
generated by my compiler (common code stripped) for your example, and
one I added. It seems that % makes it worry about sign.
#define CONFIG_SYS_TMP_CON_BUF_SZ 1024
int foo(int i)
{
return i & (CONFIG_SYS_TMP_CON_BUF_SZ-1);
14: e1a03b03 lsl r3, r3, #22
18: e1a03b23 lsr r3, r3, #22
}
int bar(int i)
{
return i % CONFIG_SYS_TMP_CON_BUF_SZ;
40: e1a02fc3 asr r2, r3, #31
44: e1a02b22 lsr r2, r2, #22
48: e0833002 add r3, r3, r2
4c: e1a03b03 lsl r3, r3, #22
50: e1a03b23 lsr r3, r3, #22
54: e0623003 rsb r3, r2, r3
}
int lee(int i)
{
return i % (CONFIG_SYS_TMP_CON_BUF_SZ - 1);
7c: e3003803 movw r3, #2051 ; 0x803
80: e3483020 movt r3, #32800 ; 0x8020
84: e0c31293 smull r1, r3, r3, r2
88: e0833002 add r3, r3, r2
8c: e1a014c3 asr r1, r3, #9
90: e1a03fc2 asr r3, r2, #31
94: e0633001 rsb r3, r3, r1
98: e1a01003 mov r1, r3
9c: e1a01501 lsl r1, r1, #10
a0: e0631001 rsb r1, r3, r1
a4: e0613002 rsb r3, r1, r2
}
Regards,
Simon
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> "Maintain an awareness for contribution -- ?to ?your ?schedule, ?your
> project, our company." ? ? ? ? ? ? ? ? ? ? ? ? - A Group of Employees
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 20:18 ` Simon Glass
@ 2011-08-30 20:57 ` Wolfgang Denk
2011-08-30 21:02 ` Simon Glass
0 siblings, 1 reply; 50+ messages in thread
From: Wolfgang Denk @ 2011-08-30 20:57 UTC (permalink / raw)
To: u-boot
Dear Simon Glass,
In message <CAPnjgZ1dQXMVeFk47=Gg5y+TCHG7WTdGk0b1WjSqOBhu2d0xnQ@mail.gmail.com> you wrote:
>
> In case it is interesting (which may be unlikely) here is the code
> generated by my compiler (common code stripped) for your example, and
Which architecture / which compiler is this?
> one I added. It seems that % makes it worry about sign.
Indeed! We should use unsigned numbers here. MUCH better now:
unsigned int ufoo(unsigned int i)
{
return i & (CONFIG_SYS_TMP_CON_BUF_SZ-1);
}
For ARM, BUF_SZ = 1024
mov r0, r0, asl #22
mov r0, r0, lsr #22
For PPC, BUF_SZ = 1024
rlwinm 3,3,0,22,31
The following two entries make no sense, just for completeness:
For ARM, BUF_SZ = 1021 (Note: 1021 is a prime number)
and r0, r0, #1020
For PPC, BUF_SZ = 1021
rlwinm 3,3,0,22,29
unsigned int ubar(unsigned int i)
{
return i % CONFIG_SYS_TMP_CON_BUF_SZ;
}
For ARM, BUF_SZ = 1024
mov r0, r0, asl #22
mov r0, r0, lsr #22
For PPC, BUF_SZ = 1024
rlwinm 3,3,0,22,31
For ARM, BUF_SZ = 1021
ldr r2, .L11
mov ip, r0
umull r1, r3, r2, r0
rsb r1, r3, r0
add r3, r3, r1, lsr #1
mov r3, r3, lsr #9
mov r0, r3, asl #10
sub r0, r0, r3, asl #2
add r0, r0, r3
rsb r0, r0, ip
For PPC, BUF_SZ = 1021
lis 0,0xc0
ori 0,0,36973
mulhwu 0,3,0
subf 9,0,3
srwi 9,9,1
add 0,0,9
srwi 0,0,9
mulli 0,0,1021
subf 3,0,3
So indeed we should use unsigned arithmetics, and try to use
power-of-two sizes where possible.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
You can't evaluate a man by logic alone.
-- McCoy, "I, Mudd", stardate 4513.3
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 20:57 ` Wolfgang Denk
@ 2011-08-30 21:02 ` Simon Glass
2011-08-30 23:00 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-08-30 21:02 UTC (permalink / raw)
To: u-boot
Hi Wolfgang,
On Tue, Aug 30, 2011 at 1:57 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Simon Glass,
>
> In message <CAPnjgZ1dQXMVeFk47=Gg5y+TCHG7WTdGk0b1WjSqOBhu2d0xnQ@mail.gmail.com> you wrote:
>>
>> In case it is interesting (which may be unlikely) here is the code
>> generated by my compiler (common code stripped) for your example, and
>
> Which architecture / which compiler is this?
It was ARM, gcc version 4.4.3.
>
>> one I added. It seems that % makes it worry about sign.
>
> Indeed! ?We should use unsigned numbers here. ?MUCH better now:
>
Yes it is much better. Perhaps an (unsigned) cast in the C code is
better than hoping that the board author uses 1024U or similar.
>
> unsigned int ufoo(unsigned int i)
> {
> ? ? ? ?return i & (CONFIG_SYS_TMP_CON_BUF_SZ-1);
> }
>
> For ARM, BUF_SZ = 1024
>
> ? ? ? ?mov ? ? r0, r0, asl #22
> ? ? ? ?mov ? ? r0, r0, lsr #22
>
> For PPC, BUF_SZ = 1024
>
> ? ? ? ?rlwinm 3,3,0,22,31
>
> The following two entries make no sense, just for completeness:
>
> For ARM, BUF_SZ = 1021 ?(Note: 1021 is a prime number)
>
> ? ? ? ?and ? ? r0, r0, #1020
>
> For PPC, BUF_SZ = 1021
>
> ? ? ? ?rlwinm 3,3,0,22,29
>
>
>
> unsigned int ubar(unsigned int i)
> {
> ? ? ? ?return i % CONFIG_SYS_TMP_CON_BUF_SZ;
> }
>
> For ARM, BUF_SZ = 1024
>
> ? ? ? ?mov ? ? r0, r0, asl #22
> ? ? ? ?mov ? ? r0, r0, lsr #22
>
> For PPC, BUF_SZ = 1024
>
> ? ? ? ?rlwinm 3,3,0,22,31
>
> For ARM, BUF_SZ = 1021
>
> ? ? ? ?ldr ? ? r2, .L11
> ? ? ? ?mov ? ? ip, r0
> ? ? ? ?umull ? r1, r3, r2, r0
> ? ? ? ?rsb ? ? r1, r3, r0
> ? ? ? ?add ? ? r3, r3, r1, lsr #1
> ? ? ? ?mov ? ? r3, r3, lsr #9
> ? ? ? ?mov ? ? r0, r3, asl #10
> ? ? ? ?sub ? ? r0, r0, r3, asl #2
> ? ? ? ?add ? ? r0, r0, r3
> ? ? ? ?rsb ? ? r0, r0, ip
>
> For PPC, BUF_SZ = 1021
>
> ? ? ? ?lis 0,0xc0
> ? ? ? ?ori 0,0,36973
> ? ? ? ?mulhwu 0,3,0
> ? ? ? ?subf 9,0,3
> ? ? ? ?srwi 9,9,1
> ? ? ? ?add 0,0,9
> ? ? ? ?srwi 0,0,9
> ? ? ? ?mulli 0,0,1021
> ? ? ? ?subf 3,0,3
>
>
> So indeed we should use unsigned arithmetics, and try to use
> power-of-two sizes where possible.
>
Yes indeed.
Regards,
Simon
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> You can't evaluate a man by logic alone.
> ? ? ? ?-- McCoy, "I, Mudd", stardate 4513.3
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 21:02 ` Simon Glass
@ 2011-08-30 23:00 ` Graeme Russ
2011-08-30 23:39 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-08-30 23:00 UTC (permalink / raw)
To: u-boot
Hi Simon, Mike, Wolfgang,
On Wed, Aug 31, 2011 at 7:02 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Wolfgang,
>
> On Tue, Aug 30, 2011 at 1:57 PM, Wolfgang Denk <wd@denx.de> wrote:
>> Dear Simon Glass,
>>
>> In message <CAPnjgZ1dQXMVeFk47=Gg5y+TCHG7WTdGk0b1WjSqOBhu2d0xnQ@mail.gmail.com> you wrote:
>>>
>>> In case it is interesting (which may be unlikely) here is the code
>>> generated by my compiler (common code stripped) for your example, and
>>
>> Which architecture / which compiler is this?
>
> It was ARM, gcc version 4.4.3.
>
>>
>>> one I added. It seems that % makes it worry about sign.
>>
>> Indeed! We should use unsigned numbers here. MUCH better now:
>>
>
> Yes it is much better. Perhaps an (unsigned) cast in the C code is
> better than hoping that the board author uses 1024U or similar.
>
[snip]
>>
>>
>> So indeed we should use unsigned arithmetics, and try to use
>> power-of-two sizes where possible.
I'll do another spin (probably not tonight - maybe tomorrow) which covers:
- inline stub functions to reduce #ifdef clutter
- unsigned casting of buffer size
- Documentation in README including the fact that setting the buffer size
to a value which is a power of 2 will provide more optimised code (for
reasonably sane compilers ;))
Now as for the calculation of the buffer address... It could be calculated
dynamically in board.c but this will require another ulong in gd and the
pre-console buffer will be unusable until the calculation is done (and any
inadvertant printf() before this will likely cause some very bad behaviour)
Also, x86 does not do these calculations dynamically and I also think it
might make the pre-buffer console avaialble in early init_f
Getting back to gd for a sec - This patch (like the flagify patch set I
posted before) impacts the structure of gd. Does this trigger in increment
to the API Version? And as observed before, if the structure of gd is
fixed for any given API version, then we have a problem with all the
#ifdef's that are already in gd. If it _is_ the case that the API version
expects a particular fixed structure for gd, then maybe we need to remove
all the #ifdefs from gd - Yes it will lead to a few dead ulongs for a few
boards, but I don't see any practical alternatives. I did think about
looking at doing some kind of CRC on the gd struct (like the generated
asm-offsets), but I could not think of a way to do it)
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 23:00 ` Graeme Russ
@ 2011-08-30 23:39 ` Graeme Russ
2011-08-31 2:46 ` Mike Frysinger
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-08-30 23:39 UTC (permalink / raw)
To: u-boot
Hi Wolfgang
On Wed, Aug 31, 2011 at 9:00 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Simon, Mike, Wolfgang,
>
> On Wed, Aug 31, 2011 at 7:02 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Wolfgang,
>>
>> On Tue, Aug 30, 2011 at 1:57 PM, Wolfgang Denk <wd@denx.de> wrote:
>>> Dear Simon Glass,
>>>
>>> In message <CAPnjgZ1dQXMVeFk47=Gg5y+TCHG7WTdGk0b1WjSqOBhu2d0xnQ@mail.gmail.com> you wrote:
>>>>
[snip]
>
> Getting back to gd for a sec - This patch (like the flagify patch set I
> posted before) impacts the structure of gd. Does this trigger in increment
> to the API Version? And as observed before, if the structure of gd is
> fixed for any given API version, then we have a problem with all the
> #ifdef's that are already in gd. If it _is_ the case that the API version
> expects a particular fixed structure for gd, then maybe we need to remove
> all the #ifdefs from gd - Yes it will lead to a few dead ulongs for a few
> boards, but I don't see any practical alternatives. I did think about
> looking at doing some kind of CRC on the gd struct (like the generated
> asm-offsets), but I could not think of a way to do it)
Another gd related thought - Is it safe to assume that gd will be cleared?
I hope so, as the pre-buffer console assumes gd->precon_buf_idx is
initially zero.
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V2] console: Implement pre-console buffer
2011-08-30 23:39 ` Graeme Russ
@ 2011-08-31 2:46 ` Mike Frysinger
0 siblings, 0 replies; 50+ messages in thread
From: Mike Frysinger @ 2011-08-31 2:46 UTC (permalink / raw)
To: u-boot
On Tuesday, August 30, 2011 19:39:20 Graeme Russ wrote:
> Another gd related thought - Is it safe to assume that gd will be cleared?
> I hope so, as the pre-buffer console assumes gd->precon_buf_idx is
> initially zero.
i'm pretty sure you can. the Blackfin arch certainly memset's it to 0.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110830/e4e17d7a/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] (no subject)
2011-08-30 12:49 ` [U-Boot] [PATCH V2] " Graeme Russ
2011-08-30 17:19 ` Mike Frysinger
2011-08-30 19:45 ` Simon Glass
@ 2011-08-31 12:35 ` Graeme Russ
2011-08-31 12:38 ` Graeme Russ
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
2 siblings, 2 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 12:35 UTC (permalink / raw)
To: u-boot
Date: Mon, 29 Aug 2011 21:04:45 +1000
Subject: [PATCH V3] console: Implement pre-console buffer
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board configuration file must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
Any earlier characters are silently dropped.
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes since V2
- Cast buffer size to unsigned long to help compilers produce tighter
code
- Use inline stub functions to reduce #ifdef clutter
- Add documentation to README
Changes Since V1
- Implemented circular buffer
- Trivial code styl corrections
README | 14 +++++++++
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 3 ++
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 43 +++++++++++++++++++++++++++-
13 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 0886987..170e67b 100644
--- a/README
+++ b/README
@@ -619,6 +619,20 @@ The following options need to be configured:
must be defined, to setup the maximum idle timeout for
the SMC.
+- Pre-Console Buffer:
+ Prior to the console being initialised (i.e. serial UART
+ initialised etc) all console output is silently discarded.
+ Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
+ buffer any console messages prior to the console being
+ initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
+ bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
+ a cicular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
+ bytes are output before the console is initialised, the
+ earlier bytes are discarded.
+
+ 'Sane' compilers will generate smaller code if
+ CONFIG_PRE_CON_BUF_SZ is a power of 2
+
- Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image;
set to -1 to disable autoboot.
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..a1e4b44 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -53,6 +53,9 @@ typedef struct global_data {
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..570196e 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,39 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
+
+void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+}
+
+void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+void print_pre_console_buffer(void)
+{
+ unsigned long i = 0;
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
+ i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+
+ while (i < gd->precon_buf_idx)
+ putc(buffer[CIRC_BUF_IDX(i++)]);
+}
+#else
+static inline void pre_console_putc(const char c) {}
+static inline void pre_console_puts(const char *s) {}
+static inline void print_pre_console_buffer(void) {}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -342,7 +375,7 @@ void putc(const char c)
#endif
if (!gd->have_console)
- return;
+ return pre_console_putc(c);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -366,7 +399,7 @@ void puts(const char *s)
#endif
if (!gd->have_console)
- return;
+ return pre_console_puts(s);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +416,10 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
va_start(args, fmt);
@@ -404,8 +439,10 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +584,8 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+ print_pre_console_buffer();
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] (no subject)
2011-08-31 12:35 ` [U-Boot] (no subject) Graeme Russ
@ 2011-08-31 12:38 ` Graeme Russ
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
1 sibling, 0 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 12:38 UTC (permalink / raw)
To: u-boot
On 31/08/11 22:35, Graeme Russ wrote:
> Date: Mon, 29 Aug 2011 21:04:45 +1000
> Subject: [PATCH V3] console: Implement pre-console buffer
>
Eep - I do not know what happened to the subject...
Let me try again...
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 12:35 ` [U-Boot] (no subject) Graeme Russ
2011-08-31 12:38 ` Graeme Russ
@ 2011-08-31 12:58 ` Graeme Russ
2011-08-31 15:09 ` Mike Frysinger
` (3 more replies)
1 sibling, 4 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 12:58 UTC (permalink / raw)
To: u-boot
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board configuration file must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
Any earlier characters are silently dropped.
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes since V3
- Fixed blank subject caused by gap between the Cc: list and Date:
Changes since V2
- Cast buffer size to unsigned long to help compilers produce tighter
code
- Use inline stub functions to reduce #ifdef clutter
- Add documentation to README
Changes Since V1
- Implemented circular buffer
- Trivial code styl corrections
README | 14 +++++++++
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 3 ++
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 43 +++++++++++++++++++++++++++-
13 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 0886987..170e67b 100644
--- a/README
+++ b/README
@@ -619,6 +619,20 @@ The following options need to be configured:
must be defined, to setup the maximum idle timeout for
the SMC.
+- Pre-Console Buffer:
+ Prior to the console being initialised (i.e. serial UART
+ initialised etc) all console output is silently discarded.
+ Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
+ buffer any console messages prior to the console being
+ initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
+ bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
+ a cicular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
+ bytes are output before the console is initialised, the
+ earlier bytes are discarded.
+
+ 'Sane' compilers will generate smaller code if
+ CONFIG_PRE_CON_BUF_SZ is a power of 2
+
- Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image;
set to -1 to disable autoboot.
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..a1e4b44 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -53,6 +53,9 @@ typedef struct global_data {
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..570196e 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,39 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
+
+void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+}
+
+void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+void print_pre_console_buffer(void)
+{
+ unsigned long i = 0;
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
+ i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+
+ while (i < gd->precon_buf_idx)
+ putc(buffer[CIRC_BUF_IDX(i++)]);
+}
+#else
+static inline void pre_console_putc(const char c) {}
+static inline void pre_console_puts(const char *s) {}
+static inline void print_pre_console_buffer(void) {}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -342,7 +375,7 @@ void putc(const char c)
#endif
if (!gd->have_console)
- return;
+ return pre_console_putc(c);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -366,7 +399,7 @@ void puts(const char *s)
#endif
if (!gd->have_console)
- return;
+ return pre_console_puts(s);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +416,10 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
va_start(args, fmt);
@@ -404,8 +439,10 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +584,8 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+ print_pre_console_buffer();
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
@ 2011-08-31 15:09 ` Mike Frysinger
2011-08-31 21:15 ` Graeme Russ
2011-08-31 16:58 ` Simon Glass
` (2 subsequent siblings)
3 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-31 15:09 UTC (permalink / raw)
To: u-boot
On Wednesday, August 31, 2011 08:58:25 Graeme Russ wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
looks good to me. doesnt apply, but that's because this needs your other gd
rework patch.
Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110831/5f663cb1/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
2011-08-31 15:09 ` Mike Frysinger
@ 2011-08-31 16:58 ` Simon Glass
2011-08-31 19:18 ` Wolfgang Denk
2011-09-01 10:48 ` [U-Boot] [PATCH V5] " Graeme Russ
2011-09-26 22:50 ` [U-Boot] [PATCH V4] " Vadim Bendebury
3 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-08-31 16:58 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
>
> To enable this functionality, the board configuration file must define:
> ?- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> ?- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> ?- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>
> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> Any earlier characters are silently dropped.
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes since V3
> ?- Fixed ?blank subject caused by gap between the Cc: list and Date:
>
> Changes since V2
> ?- Cast buffer size to unsigned long to help compilers produce tighter
> ? code
> ?- Use inline stub functions to reduce #ifdef clutter
> ?- Add documentation to README
>
> Changes Since V1
> ?- Implemented circular buffer
> ?- Trivial code styl corrections
>
> ?README ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 14 +++++++++
> ?arch/arm/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?arch/avr32/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/blackfin/include/asm/global_data.h ? | ? ?3 ++
> ?arch/m68k/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/microblaze/include/asm/global_data.h | ? ?3 ++
> ?arch/mips/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/nios2/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/powerpc/include/asm/global_data.h ? ?| ? ?3 ++
> ?arch/sh/include/asm/global_data.h ? ? ? ? | ? ?3 ++
> ?arch/sparc/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/x86/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?common/console.c ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 43 +++++++++++++++++++++++++++-
> ?13 files changed, 88 insertions(+), 2 deletions(-)
>
> diff --git a/README b/README
> index 0886987..170e67b 100644
> --- a/README
> +++ b/README
> @@ -619,6 +619,20 @@ The following options need to be configured:
> ? ? ? ? ? ? ? ?must be defined, to setup the maximum idle timeout for
> ? ? ? ? ? ? ? ?the SMC.
>
> +- Pre-Console Buffer:
> + ? ? ? ? ? ? ? ?Prior to the console being initialised (i.e. serial UART
> + ? ? ? ? ? ? ? ?initialised etc) all console output is silently discarded.
> + ? ? ? ? ? ? ? ?Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
> + ? ? ? ? ? ? ? ?buffer any console messages prior to the console being
> + ? ? ? ? ? ? ? ?initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
> + ? ? ? ? ? ? ? ?bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
> + ? ? ? ? ? ? ? ?a cicular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
nit: circular. Just a suggestion if you like: you could also offer
guidance for the location of the buffer, something like:
You can place the buffer at the top of memory by adding something like
this in your board config file:
#define CONFIG_PRE_CON_BUF_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \
CONFIG_SYS_INIT_RAM_SIZE - \
CONFIG_PRE_CON_BUF_SZ)
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_PRE_CON_BUF_ADDR - \
GENERATED_GBL_DATA_SIZE)
> + ? ? ? ? ? ? ? ?bytes are output before the console is ?initialised, the
> + ? ? ? ? ? ? ? ?earlier bytes are discarded.
> +
Anyway:
Acked-by: Simon Glass <sjg@chromium.org>
Regards,
Simon
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 16:58 ` Simon Glass
@ 2011-08-31 19:18 ` Wolfgang Denk
2011-08-31 20:05 ` Simon Glass
0 siblings, 1 reply; 50+ messages in thread
From: Wolfgang Denk @ 2011-08-31 19:18 UTC (permalink / raw)
To: u-boot
Dear Simon Glass,
In message <CAPnjgZ1bMkN3xoNCqtg1CLMa=0rgpHsuyHyZg5yOkR3Hk+v+Bw@mail.gmail.com> you wrote:
>
> nit: circular. Just a suggestion if you like: you could also offer
> guidance for the location of the buffer, something like:
>
> You can place the buffer at the top of memory by adding something like
> this in your board config file:
>
> #define CONFIG_PRE_CON_BUF_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \
> CONFIG_SYS_INIT_RAM_SIZE - \
> CONFIG_PRE_CON_BUF_SZ)
> #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_PRE_CON_BUF_ADDR - \
> GENERATED_GBL_DATA_SIZE)
That would only make sense if these were generic options that are used
across all boards and architectures.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If it went on at this rate, in several billion years he'd be rich
beyond his wildest dreams! - Terry Pratchett, _Soul Music_
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 19:18 ` Wolfgang Denk
@ 2011-08-31 20:05 ` Simon Glass
2011-08-31 20:22 ` Mike Frysinger
0 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-08-31 20:05 UTC (permalink / raw)
To: u-boot
Hi Wolfgang,
On Wed, Aug 31, 2011 at 12:18 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Simon Glass,
>
> In message <CAPnjgZ1bMkN3xoNCqtg1CLMa=0rgpHsuyHyZg5yOkR3Hk+v+Bw@mail.gmail.com> you wrote:
>>
>> nit: circular. Just a suggestion if you like: you could also offer
>> guidance for the location of the buffer, something like:
>>
>> You can place the buffer at the top of memory by adding something like
>> this in your board config file:
>>
>> #define CONFIG_PRE_CON_BUF_ADDR ? ? ? ? ? ? ? (CONFIG_SYS_INIT_RAM_ADDR + \
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CONFIG_SYS_INIT_RAM_SIZE - \
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CONFIG_PRE_CON_BUF_SZ)
>> #define CONFIG_SYS_INIT_SP_ADDR ? ? ? ? ? ? ? (CONFIG_PRE_CON_BUF_ADDR - \
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GENERATED_GBL_DATA_SIZE)
>
> That would only make sense if these were generic options that are used
> across all boards and architectures.
Yes ok - its' already decided not to put this code in arch/xxx/board.c
so let's leave this out then.
Regards,
Simon
>
> Best regards,
>
> Wolfgang Denk
>
> --
> DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> If it went on at this rate, in several billion ?years ?he'd ?be ?rich
> beyond his wildest dreams! ? ? ? ? ? ?- Terry Pratchett, _Soul Music_
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 20:05 ` Simon Glass
@ 2011-08-31 20:22 ` Mike Frysinger
2011-08-31 20:26 ` Simon Glass
0 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-31 20:22 UTC (permalink / raw)
To: u-boot
On Wednesday, August 31, 2011 16:05:38 Simon Glass wrote:
> On Wed, Aug 31, 2011 at 12:18 PM, Wolfgang Denk wrote:
> > Simon Glass wrote:
> >> nit: circular. Just a suggestion if you like: you could also offer
> >> guidance for the location of the buffer, something like:
> >>
> >> You can place the buffer at the top of memory by adding something like
> >> this in your board config file:
> >>
> >> #define CONFIG_PRE_CON_BUF_ADDR (CONFIG_SYS_INIT_RAM_ADDR
> >> + \ CONFIG_SYS_INIT_RAM_SIZE - \ CONFIG_PRE_CON_BUF_SZ)
> >> #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_PRE_CON_BUF_ADDR -
> >> \ GENERATED_GBL_DATA_SIZE)
> >
> > That would only make sense if these were generic options that are used
> > across all boards and architectures.
>
> Yes ok - its' already decided not to put this code in arch/xxx/board.c
> so let's leave this out then.
fwiw, i'll probably do that in Blackfin's default arch config.h so that boards
get a sane default that'll work across all Blackfin cpus
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110831/45df982a/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 20:22 ` Mike Frysinger
@ 2011-08-31 20:26 ` Simon Glass
0 siblings, 0 replies; 50+ messages in thread
From: Simon Glass @ 2011-08-31 20:26 UTC (permalink / raw)
To: u-boot
On Wed, Aug 31, 2011 at 1:22 PM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Wednesday, August 31, 2011 16:05:38 Simon Glass wrote:
>> On Wed, Aug 31, 2011 at 12:18 PM, Wolfgang Denk wrote:
>> > Simon Glass wrote:
>> >> nit: circular. Just a suggestion if you like: you could also offer
>> >> guidance for the location of the buffer, something like:
>> >>
>> >> You can place the buffer at the top of memory by adding something like
>> >> this in your board config file:
>> >>
>> >> #define CONFIG_PRE_CON_BUF_ADDR ? ? ? ? ? ? ? (CONFIG_SYS_INIT_RAM_ADDR
>> >> + \ CONFIG_SYS_INIT_RAM_SIZE - \ CONFIG_PRE_CON_BUF_SZ)
>> >> #define CONFIG_SYS_INIT_SP_ADDR ? ? ? ? ? ? ? (CONFIG_PRE_CON_BUF_ADDR -
>> >> \ GENERATED_GBL_DATA_SIZE)
>> >
>> > That would only make sense if these were generic options that are used
>> > across all boards and architectures.
>>
>> Yes ok - its' already decided not to put this code in arch/xxx/board.c
>> so let's leave this out then.
>
> fwiw, i'll probably do that in Blackfin's default arch config.h so that boards
> get a sane default that'll work across all Blackfin cpus
SGTM - this sort of address arithmetic in every board header file is a bit ick.
> -mike
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 15:09 ` Mike Frysinger
@ 2011-08-31 21:15 ` Graeme Russ
2011-08-31 21:33 ` Mike Frysinger
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 21:15 UTC (permalink / raw)
To: u-boot
Hi Mike,
On 01/09/11 01:09, Mike Frysinger wrote:
> On Wednesday, August 31, 2011 08:58:25 Graeme Russ wrote:
>> Allow redirection of console output prior to console initialisation to a
>> temporary buffer.
>
> looks good to me. doesnt apply, but that's because this needs your other gd
> rework patch.
>
> Acked-by: Mike Frysinger <vapier@gentoo.org>
> -mike
It should apply - This patch does not depend on my 'flagify' patch set
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 21:15 ` Graeme Russ
@ 2011-08-31 21:33 ` Mike Frysinger
2011-08-31 21:59 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-31 21:33 UTC (permalink / raw)
To: u-boot
On Wednesday, August 31, 2011 17:15:25 Graeme Russ wrote:
> On 01/09/11 01:09, Mike Frysinger wrote:
> > On Wednesday, August 31, 2011 08:58:25 Graeme Russ wrote:
> >> Allow redirection of console output prior to console initialisation to a
> >> temporary buffer.
> >
> > looks good to me. doesnt apply, but that's because this needs your other
> > gd rework patch.
> >
> > Acked-by: Mike Frysinger <vapier@gentoo.org>
> > -mike
>
> It should apply - This patch does not depend on my 'flagify' patch set
err, yeah, i skipped 1/2 since the subject lost "2/2" but gained "v4" :)
no biggie
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110831/d1f6f175/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 21:33 ` Mike Frysinger
@ 2011-08-31 21:59 ` Graeme Russ
2011-08-31 22:44 ` Mike Frysinger
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 21:59 UTC (permalink / raw)
To: u-boot
Hi Mike
On Thursday, September 1, 2011, Mike Frysinger <vapier@gentoo.org> wrote:
> On Wednesday, August 31, 2011 17:15:25 Graeme Russ wrote:
>> On 01/09/11 01:09, Mike Frysinger wrote:
>> > On Wednesday, August 31, 2011 08:58:25 Graeme Russ wrote:
>> >> Allow redirection of console output prior to console initialisation to
a
>> >> temporary buffer.
>> >
>> > looks good to me. doesnt apply, but that's because this needs your
other
>> > gd rework patch.
>> >
>> > Acked-by: Mike Frysinger <vapier@gentoo.org>
>> > -mike
>>
>> It should apply - This patch does not depend on my 'flagify' patch set
>
> err, yeah, i skipped 1/2 since the subject lost "2/2" but gained "v4" :)
>
> no biggie
So it applies?
Regards
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 21:59 ` Graeme Russ
@ 2011-08-31 22:44 ` Mike Frysinger
2011-08-31 22:51 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-08-31 22:44 UTC (permalink / raw)
To: u-boot
On Wednesday, August 31, 2011 17:59:19 Graeme Russ wrote:
> So it applies?
yep. and even compiles without warnings.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110831/72f3823b/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 22:44 ` Mike Frysinger
@ 2011-08-31 22:51 ` Graeme Russ
0 siblings, 0 replies; 50+ messages in thread
From: Graeme Russ @ 2011-08-31 22:51 UTC (permalink / raw)
To: u-boot
Hi Mike,
On Thu, Sep 1, 2011 at 8:44 AM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Wednesday, August 31, 2011 17:59:19 Graeme Russ wrote:
>> So it applies?
>
> yep. ?and even compiles without warnings.
Ah, but does it work ;)
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
2011-08-31 15:09 ` Mike Frysinger
2011-08-31 16:58 ` Simon Glass
@ 2011-09-01 10:48 ` Graeme Russ
2011-09-01 10:52 ` Graeme Russ
2011-09-26 22:50 ` [U-Boot] [PATCH V4] " Vadim Bendebury
3 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-09-01 10:48 UTC (permalink / raw)
To: u-boot
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board (or arch) must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
Any earlier characters are silently dropped.
---
Changes since V4
- Fixed typo in README
- Made *pre_console* functions in console.c static
- Slight tweak to commit message - Some may choose to set the
configuration defines at the arch level
Changes since V3
- Fixed blank subject caused by gap between the Cc: list and Date:
Changes since V2
- Cast buffer size to unsigned long to help compilers produce tighter
code
- Use inline stub functions to reduce #ifdef clutter
- Add documentation to README
Changes Since V1
- Implemented circular buffer
- Trivial code styl corrections
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
README | 14 +++++++++
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 3 ++
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 43 +++++++++++++++++++++++++++-
13 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 0886987..cf6c01f 100644
--- a/README
+++ b/README
@@ -619,6 +619,20 @@ The following options need to be configured:
must be defined, to setup the maximum idle timeout for
the SMC.
+- Pre-Console Buffer:
+ Prior to the console being initialised (i.e. serial UART
+ initialised etc) all console output is silently discarded.
+ Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
+ buffer any console messages prior to the console being
+ initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
+ bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
+ a circular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
+ bytes are output before the console is initialised, the
+ earlier bytes are discarded.
+
+ 'Sane' compilers will generate smaller code if
+ CONFIG_PRE_CON_BUF_SZ is a power of 2
+
- Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image;
set to -1 to disable autoboot.
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..a1e4b44 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -53,6 +53,9 @@ typedef struct global_data {
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..f17875e 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,39 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
+
+static void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+}
+
+static void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+static void print_pre_console_buffer(void)
+{
+ unsigned long i = 0;
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
+ i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+
+ while (i < gd->precon_buf_idx)
+ putc(buffer[CIRC_BUF_IDX(i++)]);
+}
+#else
+static inline void pre_console_putc(const char c) {}
+static inline void pre_console_puts(const char *s) {}
+static inline void print_pre_console_buffer(void) {}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -342,7 +375,7 @@ void putc(const char c)
#endif
if (!gd->have_console)
- return;
+ return pre_console_putc(c);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -366,7 +399,7 @@ void puts(const char *s)
#endif
if (!gd->have_console)
- return;
+ return pre_console_puts(s);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +416,10 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
va_start(args, fmt);
@@ -404,8 +439,10 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +584,8 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+ print_pre_console_buffer();
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 10:48 ` [U-Boot] [PATCH V5] " Graeme Russ
@ 2011-09-01 10:52 ` Graeme Russ
2011-09-01 14:02 ` Mike Frysinger
` (2 more replies)
0 siblings, 3 replies; 50+ messages in thread
From: Graeme Russ @ 2011-09-01 10:52 UTC (permalink / raw)
To: u-boot
Allow redirection of console output prior to console initialisation to a
temporary buffer.
To enable this functionality, the board (or arch) must define:
- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
Any earlier characters are silently dropped.
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Grrrr - Repost of V5 with an SoB. There has to be a better way of
automating patch updates ;)
Changes since V4
- Fixed typo in README
- Made *pre_console* functions in console.c static
- Slight tweak to commit message - Some may choose to set the
configuration defines at the arch level
Changes since V3
- Fixed blank subject caused by gap between the Cc: list and Date:
Changes since V2
- Cast buffer size to unsigned long to help compilers produce tighter
code
- Use inline stub functions to reduce #ifdef clutter
- Add documentation to README
Changes Since V1
- Implemented circular buffer
- Trivial code styl corrections
---
README | 14 +++++++++
arch/arm/include/asm/global_data.h | 3 ++
arch/avr32/include/asm/global_data.h | 3 ++
arch/blackfin/include/asm/global_data.h | 3 ++
arch/m68k/include/asm/global_data.h | 3 ++
arch/microblaze/include/asm/global_data.h | 3 ++
arch/mips/include/asm/global_data.h | 3 ++
arch/nios2/include/asm/global_data.h | 3 ++
arch/powerpc/include/asm/global_data.h | 3 ++
arch/sh/include/asm/global_data.h | 3 ++
arch/sparc/include/asm/global_data.h | 3 ++
arch/x86/include/asm/global_data.h | 3 ++
common/console.c | 43 +++++++++++++++++++++++++++-
13 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 0886987..cf6c01f 100644
--- a/README
+++ b/README
@@ -619,6 +619,20 @@ The following options need to be configured:
must be defined, to setup the maximum idle timeout for
the SMC.
+- Pre-Console Buffer:
+ Prior to the console being initialised (i.e. serial UART
+ initialised etc) all console output is silently discarded.
+ Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
+ buffer any console messages prior to the console being
+ initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
+ bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
+ a circular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
+ bytes are output before the console is initialised, the
+ earlier bytes are discarded.
+
+ 'Sane' compilers will generate smaller code if
+ CONFIG_PRE_CON_BUF_SZ is a power of 2
+
- Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image;
set to -1 to disable autoboot.
diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b85b7fe 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..5c654bd 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -38,6 +38,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long stack_end; /* highest stack address */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of env struct */
unsigned long env_valid; /* Checksum of env valid? */
diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..f7aa711 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -45,6 +45,9 @@ typedef struct global_data {
unsigned long board_type;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..0ba2b43 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -57,6 +57,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base addr of framebuffer memory */
#endif
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..6e8537c 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -39,6 +39,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..b193517 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -41,6 +41,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..d9f0664 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -29,6 +29,9 @@ typedef struct global_data {
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..7fcaf38 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -138,6 +138,9 @@ typedef struct global_data {
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
unsigned int dp_alloc_base;
unsigned int dp_alloc_top;
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..1b782fc 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -34,6 +34,9 @@ typedef struct global_data
unsigned long baudrate;
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
phys_size_t ram_size; /* RAM size */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..a1e4b44 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -53,6 +53,9 @@ typedef struct global_data {
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
unsigned long fb_base; /* Base address of framebuffer memory */
#endif
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f977dbe..6cf7955 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -40,6 +40,9 @@ typedef struct global_data {
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+ unsigned long precon_buf_idx; /* Pre-Console buffer index */
+#endif
unsigned long reloc_off; /* Relocation Offset */
unsigned long load_off; /* Load Offset */
unsigned long env_addr; /* Address of Environment struct */
diff --git a/common/console.c b/common/console.c
index b23d933..f17875e 100644
--- a/common/console.c
+++ b/common/console.c
@@ -329,6 +329,39 @@ int tstc(void)
return serial_tstc();
}
+#ifdef CONFIG_PRE_CONSOLE_BUFFER
+#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
+
+static void pre_console_putc(const char c)
+{
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
+}
+
+static void pre_console_puts(const char *s)
+{
+ while (*s)
+ pre_console_putc(*s++);
+}
+
+static void print_pre_console_buffer(void)
+{
+ unsigned long i = 0;
+ char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
+
+ if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
+ i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
+
+ while (i < gd->precon_buf_idx)
+ putc(buffer[CIRC_BUF_IDX(i++)]);
+}
+#else
+static inline void pre_console_putc(const char c) {}
+static inline void pre_console_puts(const char *s) {}
+static inline void print_pre_console_buffer(void) {}
+#endif
+
void putc(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
@@ -342,7 +375,7 @@ void putc(const char c)
#endif
if (!gd->have_console)
- return;
+ return pre_console_putc(c);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -366,7 +399,7 @@ void puts(const char *s)
#endif
if (!gd->have_console)
- return;
+ return pre_console_puts(s);
if (gd->flags & GD_FLG_DEVINIT) {
/* Send to the standard output */
@@ -383,8 +416,10 @@ int printf(const char *fmt, ...)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
va_start(args, fmt);
@@ -404,8 +439,10 @@ int vprintf(const char *fmt, va_list args)
uint i;
char printbuffer[CONFIG_SYS_PBSIZE];
+#ifndef CONFIG_PRE_CONSOLE_BUFFER
if (!gd->have_console)
return 0;
+#endif
/* For this to work, printbuffer must be larger than
* anything we ever want to print.
@@ -547,6 +584,8 @@ int console_init_f(void)
gd->flags |= GD_FLG_SILENT;
#endif
+ print_pre_console_buffer();
+
return 0;
}
--
1.7.5.2.317.g391b14
^ permalink raw reply related [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 10:52 ` Graeme Russ
@ 2011-09-01 14:02 ` Mike Frysinger
2011-09-01 18:51 ` Simon Glass
2011-09-21 23:18 ` Simon Glass
2011-10-05 18:50 ` Wolfgang Denk
2 siblings, 1 reply; 50+ messages in thread
From: Mike Frysinger @ 2011-09-01 14:02 UTC (permalink / raw)
To: u-boot
On Thursday, September 01, 2011 06:52:06 Graeme Russ wrote:
> Grrrr - Repost of V5 with an SoB. There has to be a better way of
> automating patch updates ;)
`git commit --amend` ? s-o-b tag should be in the changelog and thus not get
lost during the normal run of things ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110901/f3347ff5/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 14:02 ` Mike Frysinger
@ 2011-09-01 18:51 ` Simon Glass
2011-09-01 23:34 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-09-01 18:51 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Thu, Sep 1, 2011 at 7:02 AM, Mike Frysinger <vapier@gentoo.org> wrote:
> On Thursday, September 01, 2011 06:52:06 Graeme Russ wrote:
>> Grrrr - Repost of V5 with an SoB. There has to be a better way of
>> automating patch updates ;)
>
> `git commit --amend` ? ?s-o-b tag should be in the changelog and thus not get
> lost during the normal run of things ...
> -mike
>
I have a script(TM) which pulls the versions, cover letter, to- and
cc- addresses from the commits. It also runs them through
checkpatch.pl and does its own checks. It makes adding a new version
easier because you just have to update 'Series-version: 2' to
'Series-version: 3' for example. It also collects the change lists
from the various commits and puts them in the cover letter and emails
them out. It's not really U-Boot specific, but it does take a monkey
work out of sending out U-Boot patches.
Perhaps it would help?
Regards,
Simon
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 18:51 ` Simon Glass
@ 2011-09-01 23:34 ` Graeme Russ
2011-09-02 2:41 ` Mike Frysinger
2011-09-02 2:58 ` Simon Glass
0 siblings, 2 replies; 50+ messages in thread
From: Graeme Russ @ 2011-09-01 23:34 UTC (permalink / raw)
To: u-boot
Hi Simon,
On Fri, Sep 2, 2011 at 4:51 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Graeme,
>
> On Thu, Sep 1, 2011 at 7:02 AM, Mike Frysinger <vapier@gentoo.org> wrote:
>> On Thursday, September 01, 2011 06:52:06 Graeme Russ wrote:
>>> Grrrr - Repost of V5 with an SoB. There has to be a better way of
>>> automating patch updates ;)
>>
>> `git commit --amend` ? s-o-b tag should be in the changelog and thus not get
>> lost during the normal run of things ...
>> -mike
>>
>
> I have a script(TM) which pulls the versions, cover letter, to- and
> cc- addresses from the commits. It also runs them through
> checkpatch.pl and does its own checks. It makes adding a new version
> easier because you just have to update 'Series-version: 2' to
> 'Series-version: 3' for example. It also collects the change lists
> from the various commits and puts them in the cover letter and emails
> them out. It's not really U-Boot specific, but it does take a monkey
> work out of sending out U-Boot patches.
>
> Perhaps it would help?
Could you send it through please?
It would be neat if we could grab the Message-ID from get-send-email
and track so that In-Replt-To: can be automatically set for the next
version
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 23:34 ` Graeme Russ
@ 2011-09-02 2:41 ` Mike Frysinger
2011-09-02 2:58 ` Simon Glass
1 sibling, 0 replies; 50+ messages in thread
From: Mike Frysinger @ 2011-09-02 2:41 UTC (permalink / raw)
To: u-boot
On Thursday, September 01, 2011 19:34:51 Graeme Russ wrote:
> It would be neat if we could grab the Message-ID from get-send-email
> and track so that In-Replt-To: can be automatically set for the next
> version
ive always just viewed the raw e-mail (in kmail, just hit "v" to view
everything) and copied & pasted it into git send-email.
but a script that would connect to gmane's nntp interface, fetch the headers,
and then auto d/l the relevant thread and extract the message id would be
pretty cool.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110901/3eddf26d/attachment.pgp
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 23:34 ` Graeme Russ
2011-09-02 2:41 ` Mike Frysinger
@ 2011-09-02 2:58 ` Simon Glass
1 sibling, 0 replies; 50+ messages in thread
From: Simon Glass @ 2011-09-02 2:58 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Thu, Sep 1, 2011 at 4:34 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Simon,
>
> On Fri, Sep 2, 2011 at 4:51 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Graeme,
>>
>> On Thu, Sep 1, 2011 at 7:02 AM, Mike Frysinger <vapier@gentoo.org> wrote:
>>> On Thursday, September 01, 2011 06:52:06 Graeme Russ wrote:
>>>> Grrrr - Repost of V5 with an SoB. There has to be a better way of
>>>> automating patch updates ;)
>>>
>>> `git commit --amend` ? ?s-o-b tag should be in the changelog and thus not get
>>> lost during the normal run of things ...
>>> -mike
>>>
>>
>> I have a script(TM) which pulls the versions, cover letter, to- and
>> cc- addresses from the commits. It also runs them through
>> checkpatch.pl and does its own checks. It makes adding a new version
>> easier because you just have to update 'Series-version: 2' to
>> 'Series-version: 3' for example. It also collects the change lists
>> from the various commits and puts them in the cover letter and emails
>> them out. It's not really U-Boot specific, but it does take a monkey
>> work out of sending out U-Boot patches.
>>
>> Perhaps it would help?
>
> Could you send it through please?
Yes will put it in the queue behind the sandbox patches. It needs a
little clean up. Should I do it as a patch against the tools
directory?
>
> It would be neat if we could grab the Message-ID from get-send-email
> and track so that In-Replt-To: can be automatically set for the next
> version
Should be possible although I haven't anything like that. I do have a
library which filters terminal output as it displays it though, which
might suit for watching git send-email.
Regards,
Simon
>
> Regards,
>
> Graeme
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 10:52 ` Graeme Russ
2011-09-01 14:02 ` Mike Frysinger
@ 2011-09-21 23:18 ` Simon Glass
2011-10-04 5:30 ` Simon Glass
2011-10-05 18:50 ` Wolfgang Denk
2 siblings, 1 reply; 50+ messages in thread
From: Simon Glass @ 2011-09-21 23:18 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Thu, Sep 1, 2011 at 3:52 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
>
> To enable this functionality, the board (or arch) must define:
> ?- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> ?- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> ?- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>
> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> Any earlier characters are silently dropped.
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
I tested this on a Tegra2 Seaboard.
Tested-by: Simon Glass <sjg@chromium.org>
Regards,
Simon
> ---
> Grrrr - Repost of V5 with an SoB. There has to be a better way of
> automating patch updates ;)
>
> Changes since V4
> ?- Fixed typo in README
> ?- Made *pre_console* functions in console.c static
> ?- Slight tweak to commit message - Some may choose to set the
> ? configuration defines at the arch level
>
> Changes since V3
> ?- Fixed ?blank subject caused by gap between the Cc: list and Date:
>
> Changes since V2
> ?- Cast buffer size to unsigned long to help compilers produce tighter
> ? code
> ?- Use inline stub functions to reduce #ifdef clutter
> ?- Add documentation to README
>
> Changes Since V1
> ?- Implemented circular buffer
> ?- Trivial code styl corrections
>
> ---
> ?README ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 14 +++++++++
> ?arch/arm/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?arch/avr32/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/blackfin/include/asm/global_data.h ? | ? ?3 ++
> ?arch/m68k/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/microblaze/include/asm/global_data.h | ? ?3 ++
> ?arch/mips/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/nios2/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/powerpc/include/asm/global_data.h ? ?| ? ?3 ++
> ?arch/sh/include/asm/global_data.h ? ? ? ? | ? ?3 ++
> ?arch/sparc/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/x86/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?common/console.c ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 43 +++++++++++++++++++++++++++-
> ?13 files changed, 88 insertions(+), 2 deletions(-)
>
> diff --git a/README b/README
> index 0886987..cf6c01f 100644
[snip]
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
2011-08-30 17:16 ` Mike Frysinger
@ 2011-09-21 23:21 ` Simon Glass
2011-10-01 19:54 ` Wolfgang Denk
2 siblings, 0 replies; 50+ messages in thread
From: Simon Glass @ 2011-09-21 23:21 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Mon, Aug 29, 2011 at 5:14 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> There are some locations in the code which anticipate printf() being called
> before the console is ready by squelching printf() on gd->have_console.
> Move this squelching into printf(), vprintf(), puts() and putc(). Also
> make tstc() and getc() return 0 if console is not yet initialised
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
This stops U-Boot from hanging if I add a printf() prior to console
init in board_init_f. Great!
Tested-by: Simon Glass <sjg@chromium.org>
Regards,
Simon
> ---
> ?arch/powerpc/cpu/mpc5xxx/i2c.c | ? 30 ++++++++++--------------------
> ?arch/powerpc/cpu/mpc8xx/i2c.c ?| ? 18 ++++++------------
> ?common/console.c ? ? ? ? ? ? ? | ? 18 ++++++++++++++++++
> ?drivers/i2c/ppc4xx_i2c.c ? ? ? | ? ?5 +----
> ?drivers/i2c/soft_i2c.c ? ? ? ? | ? ?1 -
> ?5 files changed, 35 insertions(+), 37 deletions(-)
>
> diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
> index 9fb330f..f9d293b 100644
> --- a/arch/powerpc/cpu/mpc5xxx/i2c.c
> +++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
[snip]
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
` (2 preceding siblings ...)
2011-09-01 10:48 ` [U-Boot] [PATCH V5] " Graeme Russ
@ 2011-09-26 22:50 ` Vadim Bendebury
2011-09-27 11:22 ` Graeme Russ
3 siblings, 1 reply; 50+ messages in thread
From: Vadim Bendebury @ 2011-09-26 22:50 UTC (permalink / raw)
To: u-boot
On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
>
> To enable this functionality, the board configuration file must define:
> ?- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> ?- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> ?- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>
> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> Any earlier characters are silently dropped.
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes since V3
> ?- Fixed ?blank subject caused by gap between the Cc: list and Date:
>
> Changes since V2
> ?- Cast buffer size to unsigned long to help compilers produce tighter
> ? code
> ?- Use inline stub functions to reduce #ifdef clutter
> ?- Add documentation to README
>
> Changes Since V1
> ?- Implemented circular buffer
> ?- Trivial code styl corrections
>
> ?README ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 14 +++++++++
> ?arch/arm/include/asm/global_data.h ? ? ? ?| ? ?3 ++
> ?arch/avr32/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/blackfin/include/asm/global_data.h ? | ? ?3 ++
> ?arch/m68k/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/microblaze/include/asm/global_data.h | ? ?3 ++
> ?arch/mips/include/asm/global_data.h ? ? ? | ? ?3 ++
> ?arch/nios2/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/powerpc/include/asm/global_data.h ? ?| ? ?3 ++
> ?arch/sh/include/asm/global_data.h ? ? ? ? | ? ?3 ++
> ?arch/sparc/include/asm/global_data.h ? ? ?| ? ?3 ++
> ?arch/x86/include/asm/global_data.h ? ? ? ?| ? ?3 ++
I know I am late to the party here, but all of a sudden I need to
implement something similar, albeit slightly different:
- the memory could be allocated by the "cold bootprom" which starts u-boot;
- all console output needs to be saved, not just until the moment when
the console hardware is initialized.
I could work on top of this patch and send another one once this one
has been accepted. May I suggest an improvement though:
is it really necessary to store the index in the global data
structure. This requires editing all these .h files adding another
unsighty conditionally compiled field. Why not to store the index as
the first word in the buffer allocated for this temp storage?
cheers,
/vb
> ?common/console.c ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 43 +++++++++++++++++++++++++++-
> ?13 files changed, 88 insertions(+), 2 deletions(-)
>
> diff --git a/README b/README
> index 0886987..170e67b 100644
> --- a/README
> +++ b/README
> @@ -619,6 +619,20 @@ The following options need to be configured:
> ? ? ? ? ? ? ? ?must be defined, to setup the maximum idle timeout for
> ? ? ? ? ? ? ? ?the SMC.
>
> +- Pre-Console Buffer:
> + ? ? ? ? ? ? ? ?Prior to the console being initialised (i.e. serial UART
> + ? ? ? ? ? ? ? ?initialised etc) all console output is silently discarded.
> + ? ? ? ? ? ? ? ?Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
> + ? ? ? ? ? ? ? ?buffer any console messages prior to the console being
> + ? ? ? ? ? ? ? ?initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
> + ? ? ? ? ? ? ? ?bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
> + ? ? ? ? ? ? ? ?a cicular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
> + ? ? ? ? ? ? ? ?bytes are output before the console is ?initialised, the
> + ? ? ? ? ? ? ? ?earlier bytes are discarded.
> +
> + ? ? ? ? ? ? ? ?'Sane' compilers will generate smaller code if
> + ? ? ? ? ? ? ? ?CONFIG_PRE_CON_BUF_SZ is a power of 2
> +
> ?- Boot Delay: ?CONFIG_BOOTDELAY - in seconds
> ? ? ? ? ? ? ? ?Delay before automatically booting the default image;
> ? ? ? ? ? ? ? ?set to -1 to disable autoboot.
> diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
> index 4fc51fd..b85b7fe 100644
> --- a/arch/arm/include/asm/global_data.h
> +++ b/arch/arm/include/asm/global_data.h
> @@ -38,6 +38,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? */
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* base address of frame buffer */
> diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
> index 4ef8fc5..5c654bd 100644
> --- a/arch/avr32/include/asm/global_data.h
> +++ b/arch/avr32/include/asm/global_data.h
> @@ -38,6 +38,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? stack_end; ? ? ?/* highest stack address */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address of env struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of env valid? */
> diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
> index eba5e93..f7aa711 100644
> --- a/arch/blackfin/include/asm/global_data.h
> +++ b/arch/blackfin/include/asm/global_data.h
> @@ -45,6 +45,9 @@ typedef struct global_data {
> ? ? ? ?unsigned long board_type;
> ? ? ? ?unsigned long baudrate;
> ? ? ? ?unsigned long have_console; ? ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ram_size; ? ? ? ? ? /* RAM size */
> ? ? ? ?unsigned long env_addr; /* Address ?of Environment struct */
> ? ? ? ?unsigned long env_valid; ? ? ? ?/* Checksum of Environment valid? */
> diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
> index fc486fd..0ba2b43 100644
> --- a/arch/m68k/include/asm/global_data.h
> +++ b/arch/m68k/include/asm/global_data.h
> @@ -57,6 +57,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct ? ? ? */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called ? ? ? ? ? ? */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* Base addr of framebuffer memory */
> ?#endif
> diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
> index 557ad27..6e8537c 100644
> --- a/arch/microblaze/include/asm/global_data.h
> +++ b/arch/microblaze/include/asm/global_data.h
> @@ -39,6 +39,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? */
> ? ? ? ?unsigned long ? fb_base; ? ? ? ?/* base address of frame buffer */
> diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
> index 271a290..b193517 100644
> --- a/arch/mips/include/asm/global_data.h
> +++ b/arch/mips/include/asm/global_data.h
> @@ -41,6 +41,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
> index 2c4a719..d9f0664 100644
> --- a/arch/nios2/include/asm/global_data.h
> +++ b/arch/nios2/include/asm/global_data.h
> @@ -29,6 +29,9 @@ typedef ? ? ? struct ?global_data {
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? cpu_clk; ? ? ? ?/* CPU clock in Hz! ? ? ? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid */
> diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
> index a33ca2f..7fcaf38 100644
> --- a/arch/powerpc/include/asm/global_data.h
> +++ b/arch/powerpc/include/asm/global_data.h
> @@ -138,6 +138,9 @@ typedef ? ? struct ?global_data {
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct ? ? ? */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called ? ? ? ? ? ? */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
> ? ? ? ?unsigned int ? ?dp_alloc_base;
> ? ? ? ?unsigned int ? ?dp_alloc_top;
> diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
> index 0c09ba9..1b782fc 100644
> --- a/arch/sh/include/asm/global_data.h
> +++ b/arch/sh/include/asm/global_data.h
> @@ -34,6 +34,9 @@ typedef ? ? ? struct global_data
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? cpu_clk; ? ? ? ?/* CPU clock in Hz! */
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> ? ? ? ?unsigned long ? env_valid; ? ? ?/* Checksum of Environment valid */
> diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
> index 9b14674..a1e4b44 100644
> --- a/arch/sparc/include/asm/global_data.h
> +++ b/arch/sparc/include/asm/global_data.h
> @@ -53,6 +53,9 @@ typedef struct global_data {
> ? ? ? ?unsigned long env_valid; ? ? ? ?/* Checksum of Environment valid? ? ? ? */
> ? ? ? ?unsigned long have_console; ? ? /* serial_init() was called */
>
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ?#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
> ? ? ? ?unsigned long fb_base; ?/* Base address of framebuffer memory ? */
> ?#endif
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index f977dbe..6cf7955 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -40,6 +40,9 @@ typedef ? ? ? struct global_data {
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> ? ? ? ?unsigned long ? have_console; ? /* serial_init() was called */
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> + ? ? ? unsigned long ? precon_buf_idx; /* Pre-Console buffer index */
> +#endif
> ? ? ? ?unsigned long ? reloc_off; ? ? ?/* Relocation Offset */
> ? ? ? ?unsigned long ? load_off; ? ? ? /* Load Offset */
> ? ? ? ?unsigned long ? env_addr; ? ? ? /* Address ?of Environment struct */
> diff --git a/common/console.c b/common/console.c
> index b23d933..570196e 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -329,6 +329,39 @@ int tstc(void)
> ? ? ? ?return serial_tstc();
> ?}
>
> +#ifdef CONFIG_PRE_CONSOLE_BUFFER
> +#define CIRC_BUF_IDX(idx) ((idx) % (unsigned long)CONFIG_PRE_CON_BUF_SZ)
> +
> +void pre_console_putc(const char c)
> +{
> + ? ? ? char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
> +
> + ? ? ? buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
> +}
> +
> +void pre_console_puts(const char *s)
> +{
> + ? ? ? while (*s)
> + ? ? ? ? ? ? ? pre_console_putc(*s++);
> +}
> +
> +void print_pre_console_buffer(void)
> +{
> + ? ? ? unsigned long i = 0;
> + ? ? ? char *buffer = (char *)CONFIG_PRE_CON_BUF_ADDR;
> +
> + ? ? ? if (gd->precon_buf_idx > CONFIG_PRE_CON_BUF_SZ)
> + ? ? ? ? ? ? ? i = gd->precon_buf_idx - CONFIG_PRE_CON_BUF_SZ;
> +
> + ? ? ? while (i < gd->precon_buf_idx)
> + ? ? ? ? ? ? ? putc(buffer[CIRC_BUF_IDX(i++)]);
> +}
> +#else
> +static inline void pre_console_putc(const char c) {}
> +static inline void pre_console_puts(const char *s) {}
> +static inline void print_pre_console_buffer(void) {}
> +#endif
> +
> ?void putc(const char c)
> ?{
> ?#ifdef CONFIG_SILENT_CONSOLE
> @@ -342,7 +375,7 @@ void putc(const char c)
> ?#endif
>
> ? ? ? ?if (!gd->have_console)
> - ? ? ? ? ? ? ? return;
> + ? ? ? ? ? ? ? return pre_console_putc(c);
>
> ? ? ? ?if (gd->flags & GD_FLG_DEVINIT) {
> ? ? ? ? ? ? ? ?/* Send to the standard output */
> @@ -366,7 +399,7 @@ void puts(const char *s)
> ?#endif
>
> ? ? ? ?if (!gd->have_console)
> - ? ? ? ? ? ? ? return;
> + ? ? ? ? ? ? ? return pre_console_puts(s);
>
> ? ? ? ?if (gd->flags & GD_FLG_DEVINIT) {
> ? ? ? ? ? ? ? ?/* Send to the standard output */
> @@ -383,8 +416,10 @@ int printf(const char *fmt, ...)
> ? ? ? ?uint i;
> ? ? ? ?char printbuffer[CONFIG_SYS_PBSIZE];
>
> +#ifndef CONFIG_PRE_CONSOLE_BUFFER
> ? ? ? ?if (!gd->have_console)
> ? ? ? ? ? ? ? ?return 0;
> +#endif
>
> ? ? ? ?va_start(args, fmt);
>
> @@ -404,8 +439,10 @@ int vprintf(const char *fmt, va_list args)
> ? ? ? ?uint i;
> ? ? ? ?char printbuffer[CONFIG_SYS_PBSIZE];
>
> +#ifndef CONFIG_PRE_CONSOLE_BUFFER
> ? ? ? ?if (!gd->have_console)
> ? ? ? ? ? ? ? ?return 0;
> +#endif
>
> ? ? ? ?/* For this to work, printbuffer must be larger than
> ? ? ? ? * anything we ever want to print.
> @@ -547,6 +584,8 @@ int console_init_f(void)
> ? ? ? ? ? ? ? ?gd->flags |= GD_FLG_SILENT;
> ?#endif
>
> + ? ? ? print_pre_console_buffer();
> +
> ? ? ? ?return 0;
> ?}
>
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-09-26 22:50 ` [U-Boot] [PATCH V4] " Vadim Bendebury
@ 2011-09-27 11:22 ` Graeme Russ
2011-09-27 14:55 ` Vadim Bendebury
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-09-27 11:22 UTC (permalink / raw)
To: u-boot
Hi Vadim,
On 27/09/11 08:50, Vadim Bendebury wrote:
> On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Allow redirection of console output prior to console initialisation to a
>> temporary buffer.
>>
>> To enable this functionality, the board configuration file must define:
>> - CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
>> - CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
>> - CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>>
>> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
>> Any earlier characters are silently dropped.
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
[snip]
>
> I know I am late to the party here, but all of a sudden I need to
> implement something similar, albeit slightly different:
better late than never :)
> - the memory could be allocated by the "cold bootprom" which starts u-boot;
Typically, the pre-console buffer would exist in the CPU cache (or similar
non-(S)DRAM location)
> - all console output needs to be saved, not just until the moment when
> the console hardware is initialized.
That could be a _huge_ amount of info and highly variable. Remember, the
available space for a pre-console buffer could be tiny. If this is needed,
then maybe look at forking stdio instead (one branch to console, one branch
to you console buffer)
> I could work on top of this patch and send another one once this one
> has been accepted. May I suggest an improvement though:
>
> is it really necessary to store the index in the global data
> structure. This requires editing all these .h files adding another
> unsighty conditionally compiled field. Why not to store the index as
> the first word in the buffer allocated for this temp storage?
I like this - but instead:
struct pre_con_buff {
int idx;
char *buffer[CONFIG_PRE_CON_BUF_SZ];
}
struct pre_con_buff *pre_con_buffer;
pre_con_buffer = (struct pre_con_buff *)CONFIG_PRE_CON_BUF_ADDR;
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-09-27 11:22 ` Graeme Russ
@ 2011-09-27 14:55 ` Vadim Bendebury
2011-09-29 23:15 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Vadim Bendebury @ 2011-09-27 14:55 UTC (permalink / raw)
To: u-boot
On Tue, Sep 27, 2011 at 4:22 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Vadim,
>
> On 27/09/11 08:50, Vadim Bendebury wrote:
>> On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>> Allow redirection of console output prior to console initialisation to a
>>> temporary buffer.
>>>
>>> To enable this functionality, the board configuration file must define:
>>> ?- CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
>>> ?- CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
>>> ?- CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>>>
>>> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
>>> Any earlier characters are silently dropped.
>>>
>>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>
> [snip]
>
>>
>> I know I am late to the party here, but all of a sudden I need to
>> implement something similar, albeit slightly different:
>
> better late than never :)
>
>> - the memory could be allocated by the "cold bootprom" which starts u-boot;
>
> Typically, the pre-console buffer would exist in the CPU cache (or similar
> non-(S)DRAM location)
>
hi Graeme,
Actually, there are many cases when u-boot starts running with memory
fully initialized - ARM platforms is one case and coreboot/u-boot
combination on x86 is another, but in general, yes, this buffer could
be mapped to the internal CPU memory nailed to a fixed address.
>> - all console output needs to be saved, not just until the moment when
>> the console hardware is initialized.
>
> That could be a _huge_ amount of info and highly variable. Remember, the
> available space for a pre-console buffer could be tiny. If this is needed,
> then maybe look at forking stdio instead (one branch to console, one branch
> to you console buffer)
>
Sure, if the room in the preallocated buffer is not enough, only the
most recent data fitting in the space would be kept.
I don't quite understand what you mean by "forking stdio". I was
thinking about introducing a separate driver for this memory stored
console output, but sjg@ explained that while running from ROM u-boot
supports only one console interface, so there is no way to have
console stream sent to more than one driver before relocation.
>> I could work on top of this patch and send another one once this one
>> has been accepted. May I suggest an improvement though:
>>
>> is it really necessary to store the index in the global data
>> structure. This requires editing all these .h files adding another
>> unsighty ?conditionally compiled field. Why not to store the index as
>> the first word in the buffer allocated for this temp storage?
>
> I like this - but instead:
>
> struct pre_con_buff {
> ? ? ? ?int idx;
> ? ? ? ?char *buffer[CONFIG_PRE_CON_BUF_SZ];
> }
>
> struct pre_con_buff *pre_con_buffer;
>
> pre_con_buffer = (struct pre_con_buff *)CONFIG_PRE_CON_BUF_ADDR;
>
yes, this is exactly what I meant,
cheers,
/vb
> Regards,
>
> Graeme
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-09-27 14:55 ` Vadim Bendebury
@ 2011-09-29 23:15 ` Graeme Russ
2011-09-29 23:39 ` Vadim Bendebury
0 siblings, 1 reply; 50+ messages in thread
From: Graeme Russ @ 2011-09-29 23:15 UTC (permalink / raw)
To: u-boot
Hi Vadim,
On Wed, Sep 28, 2011 at 12:55 AM, Vadim Bendebury <vbendeb@chromium.org> wrote:
> On Tue, Sep 27, 2011 at 4:22 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Hi Vadim,
>>
>> On 27/09/11 08:50, Vadim Bendebury wrote:
>>> On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
[snip]
>> Typically, the pre-console buffer would exist in the CPU cache (or similar
>> non-(S)DRAM location)
>>
> hi Graeme,
>
> Actually, there are many cases when u-boot starts running with memory
> fully initialized - ARM platforms is one case and coreboot/u-boot
> combination on x86 is another, but in general, yes, this buffer could
> be mapped to the internal CPU memory nailed to a fixed address.
And we have to satisfy the 'absolute majority', not the 'many' or the
'simply majority'. And I'm not sure it's always true that ARM platforms
have fully initialised SDRAM when U-Boot starts
>>> - all console output needs to be saved, not just until the moment when
>>> the console hardware is initialized.
>>
>> That could be a _huge_ amount of info and highly variable. Remember, the
>> available space for a pre-console buffer could be tiny. If this is needed,
>> then maybe look at forking stdio instead (one branch to console, one branch
>> to you console buffer)
>>
>
> Sure, if the room in the preallocated buffer is not enough, only the
> most recent data fitting in the space would be kept.
>
> I don't quite understand what you mean by "forking stdio". I was
Search for CONFIG_CONSOLE_MUX - There appears to be support for sending
stdout to multiple output devices:
static void console_putc(int file, const char c)
{
int i;
struct stdio_dev *dev;
for (i = 0; i < cd_count[file]; i++) {
dev = console_devices[file][i];
if (dev->putc != NULL)
dev->putc(c);
}
}
I don't know have to register additional devices though
> thinking about introducing a separate driver for this memory stored
> console output, but sjg@ explained that while running from ROM u-boot
> supports only one console interface, so there is no way to have
> console stream sent to more than one driver before relocation.
Yes, while running from ROM your options are very limited, but if you have
a console buffer big enough to get you into RAM you can do lot more
>>> I could work on top of this patch and send another one once this one
>>> has been accepted. May I suggest an improvement though:
>>>
>>> is it really necessary to store the index in the global data
>>> structure. This requires editing all these .h files adding another
>>> unsighty conditionally compiled field. Why not to store the index as
>>> the first word in the buffer allocated for this temp storage?
>>
>> I like this - but instead:
>>
>> struct pre_con_buff {
>> int idx;
>> char *buffer[CONFIG_PRE_CON_BUF_SZ];
>> }
>>
>> struct pre_con_buff *pre_con_buffer;
>>
>> pre_con_buffer = (struct pre_con_buff *)CONFIG_PRE_CON_BUF_ADDR;
>>
>
> yes, this is exactly what I meant,
>
Thinking more about this, I think I prefer the current patch for two
reasons:
1) gd is guaranteed to be cleared - The memory holding the buffer is not
so you would need to initialise it somehow - That could mean splitting
the init for each arch
2) pre_con_buffer is larger than CONFIG_PRE_CON_BUF_SZ. This will need to
be taken into consideration if the buffer is being crammed into a very
tightly crafted memory map - Forgetting to take this into account is
going to cause lots of pain. Now you could do:
struct pre_con_buff {
u16 idx;
char *buffer[CONFIG_PRE_CON_BUF_SZ - 2];
}
but the buffer size should really be a power two (so the compiler
optimises the divides into shifts) - So now we have to define
CONFIG_PRE_CON_BUF_SZ as say 258. It's starting to get messy
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-09-29 23:15 ` Graeme Russ
@ 2011-09-29 23:39 ` Vadim Bendebury
2011-09-29 23:47 ` Graeme Russ
0 siblings, 1 reply; 50+ messages in thread
From: Vadim Bendebury @ 2011-09-29 23:39 UTC (permalink / raw)
To: u-boot
On Thu, Sep 29, 2011 at 4:15 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Vadim,
>
> On Wed, Sep 28, 2011 at 12:55 AM, Vadim Bendebury <vbendeb@chromium.org> wrote:
>> On Tue, Sep 27, 2011 at 4:22 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>> Hi Vadim,
>>>
>>> On 27/09/11 08:50, Vadim Bendebury wrote:
>>>> On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> [snip]
>
>>> Typically, the pre-console buffer would exist in the CPU cache (or similar
>>> non-(S)DRAM location)
>>>
>> hi Graeme,
>>
>> Actually, there are many cases when u-boot starts running with memory
>> fully initialized - ARM platforms is one case and coreboot/u-boot
>> combination on x86 is another, but in general, yes, this buffer could
>> be mapped to the internal CPU memory nailed to a fixed address.
>
> And we have to satisfy the 'absolute majority', not the 'many' or the
> 'simply majority'. And I'm not sure it's always true that ARM platforms
> have fully initialised SDRAM when U-Boot starts
>
>>>> - all console output needs to be saved, not just until the moment when
>>>> the console hardware is initialized.
>>>
>>> That could be a _huge_ amount of info and highly variable. Remember, the
>>> available space for a pre-console buffer could be tiny. If this is needed,
>>> then maybe look at forking stdio instead (one branch to console, one branch
>>> to you console buffer)
>>>
>>
>> Sure, if the room in the preallocated buffer is not enough, only the
>> most recent data fitting in the space would be kept.
>>
>> I don't quite understand what you mean by "forking stdio". I was
>
> Search for CONFIG_CONSOLE_MUX - There appears to be support for sending
> stdout to multiple output devices:
>
> static void console_putc(int file, const char c)
> {
> ? ? ? ?int i;
> ? ? ? ?struct stdio_dev *dev;
>
> ? ? ? ?for (i = 0; i < cd_count[file]; i++) {
> ? ? ? ? ? ? ? ?dev = console_devices[file][i];
> ? ? ? ? ? ? ? ?if (dev->putc != NULL)
> ? ? ? ? ? ? ? ?dev->putc(c);
> ? ? ? ?}
> }
>
>
> I don't know have to register additional devices though
>
hi Graeme,
sure, I understand how the console mux works, i was not sure you were
referring to it.
>> thinking about introducing a separate driver for this memory stored
>> console output, but sjg@ explained that while running from ROM u-boot
>> supports only one console interface, so there is no way to have
>> console stream sent to more than one driver before relocation.
>
> Yes, while running from ROM your options are very limited, but if you have
> a console buffer big enough to get you into RAM you can do lot more
>
>>>> I could work on top of this patch and send another one once this one
>>>> has been accepted. May I suggest an improvement though:
>>>>
>>>> is it really necessary to store the index in the global data
>>>> structure. This requires editing all these .h files adding another
>>>> unsighty ?conditionally compiled field. Why not to store the index as
>>>> the first word in the buffer allocated for this temp storage?
>>>
>>> I like this - but instead:
>>>
>>> struct pre_con_buff {
>>> ? ? ? ?int idx;
>>> ? ? ? ?char *buffer[CONFIG_PRE_CON_BUF_SZ];
>>> }
>>>
>>> struct pre_con_buff *pre_con_buffer;
>>>
>>> pre_con_buffer = (struct pre_con_buff *)CONFIG_PRE_CON_BUF_ADDR;
>>>
>>
>> yes, this is exactly what I meant,
>>
>
> Thinking more about this, I think I prefer the current patch for two
> reasons:
>
> ?1) gd is guaranteed to be cleared - The memory holding the buffer is not
> ? ?so you would need to initialise it somehow - That could mean splitting
> ? ?the init for each arch
doesn't each console type have an init routine? this would be a place
to initialize the header.
> ?2) pre_con_buffer is larger than CONFIG_PRE_CON_BUF_SZ. This will need to
> ? ?be taken into consideration if the buffer is being crammed into a very
> ? ?tightly crafted memory map - Forgetting to take this into account is
> ? ?going to cause lots of pain. Now you could do:
>
> ? ? ? ?struct pre_con_buff {
> ? ? ? ? ? ? ? ?u16 idx;
> ? ? ? ? ? ? ? ?char *buffer[CONFIG_PRE_CON_BUF_SZ - 2];
> ? ? ? ?}
>
I actually have just implemented this for coreboot. It has its own
idiosyncrasies of course, the console buffer needs to be kept in three
different places and the contents copied three times on the way up.
I used this structure for the log buffer:
struct pre_con_buff {
? ? ? ? ?u16 size;
u16 idx;
char buffer[0]
};
Then, the initialization code would just get the memory area address
and size, overlay this structure on top of it and set the size field
to
<area size> - sizeof(struct pre_con_buff)
yes, this results in a non power of two buffer size, but IMO the
convenience of keeping everything in one place and (and not changing
multiple .h files) is worth the lost performance of not being able to
utilize power of two arithmetic optimization (which I think is
negligible in any case).
cheers,
/vb
> ? ?but the buffer size should really be a power two (so the compiler
> ? ?optimises the divides into shifts) - So now we have to define
> ? ?CONFIG_PRE_CON_BUF_SZ as say 258. It's starting to get messy
>
>
> Regards,
>
> Graeme
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V4] console: Implement pre-console buffer
2011-09-29 23:39 ` Vadim Bendebury
@ 2011-09-29 23:47 ` Graeme Russ
0 siblings, 0 replies; 50+ messages in thread
From: Graeme Russ @ 2011-09-29 23:47 UTC (permalink / raw)
To: u-boot
Hi Vladim
On Fri, Sep 30, 2011 at 9:39 AM, Vadim Bendebury <vbendeb@chromium.org> wrote:
> On Thu, Sep 29, 2011 at 4:15 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Hi Vadim,
>>
>> On Wed, Sep 28, 2011 at 12:55 AM, Vadim Bendebury <vbendeb@chromium.org> wrote:
>>> On Tue, Sep 27, 2011 at 4:22 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>>> Hi Vadim,
>>>>
>>>> On 27/09/11 08:50, Vadim Bendebury wrote:
>>>>> On Wed, Aug 31, 2011 at 5:58 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
[snip]
>>
>> 1) gd is guaranteed to be cleared - The memory holding the buffer is not
>> so you would need to initialise it somehow - That could mean splitting
>> the init for each arch
>
> doesn't each console type have an init routine? this would be a place
> to initialize the header.
The point is that with pre-console buffer, we have a storage location for
console output even before any console init routine is run - console is
available as soon as gd is cleared (which is _very_ early indeed)
>> 2) pre_con_buffer is larger than CONFIG_PRE_CON_BUF_SZ. This will need to
>> be taken into consideration if the buffer is being crammed into a very
>> tightly crafted memory map - Forgetting to take this into account is
>> going to cause lots of pain. Now you could do:
>>
>> struct pre_con_buff {
>> u16 idx;
>> char *buffer[CONFIG_PRE_CON_BUF_SZ - 2];
>> }
>>
>
> I actually have just implemented this for coreboot. It has its own
> idiosyncrasies of course, the console buffer needs to be kept in three
> different places and the contents copied three times on the way up.
Ouch!
> I used this structure for the log buffer:
>
> struct pre_con_buff {
> u16 size;
> u16 idx;
> char buffer[0]
> };
>
> Then, the initialization code would just get the memory area address
> and size, overlay this structure on top of it and set the size field
> to
>
> <area size> - sizeof(struct pre_con_buff)
For U-Boot, that sounds like a lot of stuffing around to save two bytes
in gd
> yes, this results in a non power of two buffer size, but IMO the
> convenience of keeping everything in one place and (and not changing
> multiple .h files) is worth the lost performance of not being able to
> utilize power of two arithmetic optimization (which I think is
> negligible in any case).
In an embedded bootloader, every clock counts :) - You desktop junkies are
too used to long boot times ;)
>> but the buffer size should really be a power two (so the compiler
>> optimises the divides into shifts) - So now we have to define
>> CONFIG_PRE_CON_BUF_SZ as say 258. It's starting to get messy
And messier (at least in the context of U-Boot - YMMV)
Regards,
Graeme
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
2011-08-30 17:16 ` Mike Frysinger
2011-09-21 23:21 ` Simon Glass
@ 2011-10-01 19:54 ` Wolfgang Denk
2 siblings, 0 replies; 50+ messages in thread
From: Wolfgang Denk @ 2011-10-01 19:54 UTC (permalink / raw)
To: u-boot
Dear Graeme Russ,
In message <1314620046-26187-2-git-send-email-graeme.russ@gmail.com> you wrote:
> There are some locations in the code which anticipate printf() being called
> before the console is ready by squelching printf() on gd->have_console.
> Move this squelching into printf(), vprintf(), puts() and putc(). Also
> make tstc() and getc() return 0 if console is not yet initialised
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> arch/powerpc/cpu/mpc5xxx/i2c.c | 30 ++++++++++--------------------
> arch/powerpc/cpu/mpc8xx/i2c.c | 18 ++++++------------
> common/console.c | 18 ++++++++++++++++++
> drivers/i2c/ppc4xx_i2c.c | 5 +----
> drivers/i2c/soft_i2c.c | 1 -
> 5 files changed, 35 insertions(+), 37 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
I express preference for a chronological sequence of events which
precludes a violence. - Terry Pratchett, _The Dark Side of the Sun_
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-21 23:18 ` Simon Glass
@ 2011-10-04 5:30 ` Simon Glass
0 siblings, 0 replies; 50+ messages in thread
From: Simon Glass @ 2011-10-04 5:30 UTC (permalink / raw)
To: u-boot
Hi Graeme,
On Wed, Sep 21, 2011 at 4:18 PM, Simon Glass <sjg@chromium.org> wrote:
> Hi Graeme,
>
> On Thu, Sep 1, 2011 at 3:52 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> > Allow redirection of console output prior to console initialisation to a
> > temporary buffer.
> >
> > To enable this functionality, the board (or arch) must define:
> > - CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> > - CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> > - CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
> >
> > The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> > Any earlier characters are silently dropped.
> >
> > Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>
> I tested this on a Tegra2 Seaboard.
>
> Tested-by: Simon Glass <sjg@chromium.org>
>
Further to this, I pushed it a little further and managed to get early
console output from the AVP (an ARM7) before the Cortex-A9s are fired up on
a Tegra20/30. That's pretty early!
This is a great patch and very useful for early bring-up I think. I hope it
will be merged this window. Any other comments?
Regards,
Simon
>
> Regards,
> Simon
>
> > ---
> > Grrrr - Repost of V5 with an SoB. There has to be a better way of
> > automating patch updates ;)
> >
> > Changes since V4
> > - Fixed typo in README
> > - Made *pre_console* functions in console.c static
> > - Slight tweak to commit message - Some may choose to set the
> > configuration defines at the arch level
> >
> > Changes since V3
> > - Fixed blank subject caused by gap between the Cc: list and Date:
> >
> > Changes since V2
> > - Cast buffer size to unsigned long to help compilers produce tighter
> > code
> > - Use inline stub functions to reduce #ifdef clutter
> > - Add documentation to README
> >
> > Changes Since V1
> > - Implemented circular buffer
> > - Trivial code styl corrections
> >
> > ---
> > README | 14 +++++++++
> > arch/arm/include/asm/global_data.h | 3 ++
> > arch/avr32/include/asm/global_data.h | 3 ++
> > arch/blackfin/include/asm/global_data.h | 3 ++
> > arch/m68k/include/asm/global_data.h | 3 ++
> > arch/microblaze/include/asm/global_data.h | 3 ++
> > arch/mips/include/asm/global_data.h | 3 ++
> > arch/nios2/include/asm/global_data.h | 3 ++
> > arch/powerpc/include/asm/global_data.h | 3 ++
> > arch/sh/include/asm/global_data.h | 3 ++
> > arch/sparc/include/asm/global_data.h | 3 ++
> > arch/x86/include/asm/global_data.h | 3 ++
> > common/console.c | 43
> +++++++++++++++++++++++++++-
> > 13 files changed, 88 insertions(+), 2 deletions(-)
> >
> > diff --git a/README b/README
> > index 0886987..cf6c01f 100644
> [snip]
>
^ permalink raw reply [flat|nested] 50+ messages in thread
* [U-Boot] [PATCH V5] console: Implement pre-console buffer
2011-09-01 10:52 ` Graeme Russ
2011-09-01 14:02 ` Mike Frysinger
2011-09-21 23:18 ` Simon Glass
@ 2011-10-05 18:50 ` Wolfgang Denk
2 siblings, 0 replies; 50+ messages in thread
From: Wolfgang Denk @ 2011-10-05 18:50 UTC (permalink / raw)
To: u-boot
Dear Graeme Russ,
In message <1314874326-10231-1-git-send-email-graeme.russ@gmail.com> you wrote:
> Allow redirection of console output prior to console initialisation to a
> temporary buffer.
>
> To enable this functionality, the board (or arch) must define:
> - CONFIG_PRE_CONSOLE_BUFFER - Enable pre-console buffer
> - CONFIG_PRE_CON_BUF_ADDR - Base address of pre-console buffer
> - CONFIG_PRE_CON_BUF_SZ - Size of pre-console buffer (in bytes)
>
> The pre-console buffer will buffer the last CONFIG_PRE_CON_BUF_SZ bytes
> Any earlier characters are silently dropped.
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Grrrr - Repost of V5 with an SoB. There has to be a better way of
> automating patch updates ;)
>
> Changes since V4
> - Fixed typo in README
> - Made *pre_console* functions in console.c static
> - Slight tweak to commit message - Some may choose to set the
> configuration defines at the arch level
>
> Changes since V3
> - Fixed blank subject caused by gap between the Cc: list and Date:
>
> Changes since V2
> - Cast buffer size to unsigned long to help compilers produce tighter
> code
> - Use inline stub functions to reduce #ifdef clutter
> - Add documentation to README
>
> Changes Since V1
> - Implemented circular buffer
> - Trivial code styl corrections
>
> ---
> README | 14 +++++++++
> arch/arm/include/asm/global_data.h | 3 ++
> arch/avr32/include/asm/global_data.h | 3 ++
> arch/blackfin/include/asm/global_data.h | 3 ++
> arch/m68k/include/asm/global_data.h | 3 ++
> arch/microblaze/include/asm/global_data.h | 3 ++
> arch/mips/include/asm/global_data.h | 3 ++
> arch/nios2/include/asm/global_data.h | 3 ++
> arch/powerpc/include/asm/global_data.h | 3 ++
> arch/sh/include/asm/global_data.h | 3 ++
> arch/sparc/include/asm/global_data.h | 3 ++
> arch/x86/include/asm/global_data.h | 3 ++
> common/console.c | 43 +++++++++++++++++++++++++++-
> 13 files changed, 88 insertions(+), 2 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The greatest threat towards future is indifference.
^ permalink raw reply [flat|nested] 50+ messages in thread
end of thread, other threads:[~2011-10-05 18:50 UTC | newest]
Thread overview: 50+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-29 12:14 [U-Boot] [PATCH 0/2] console: Squelch and pre-console buffer Graeme Russ
2011-08-29 12:14 ` [U-Boot] [PATCH 1/2] console: Squelch pre-console output in console functions Graeme Russ
2011-08-30 17:16 ` Mike Frysinger
2011-08-30 19:01 ` Wolfgang Denk
2011-09-21 23:21 ` Simon Glass
2011-10-01 19:54 ` Wolfgang Denk
2011-08-29 12:14 ` [U-Boot] [PATCH 2/2] console: Implement pre-console buffer Graeme Russ
2011-08-30 12:49 ` [U-Boot] [PATCH V2] " Graeme Russ
2011-08-30 17:19 ` Mike Frysinger
2011-08-30 19:45 ` Simon Glass
2011-08-30 19:52 ` Wolfgang Denk
2011-08-30 19:58 ` Mike Frysinger
2011-08-30 20:08 ` Wolfgang Denk
2011-08-30 20:18 ` Simon Glass
2011-08-30 20:57 ` Wolfgang Denk
2011-08-30 21:02 ` Simon Glass
2011-08-30 23:00 ` Graeme Russ
2011-08-30 23:39 ` Graeme Russ
2011-08-31 2:46 ` Mike Frysinger
2011-08-30 20:07 ` Simon Glass
2011-08-31 12:35 ` [U-Boot] (no subject) Graeme Russ
2011-08-31 12:38 ` Graeme Russ
2011-08-31 12:58 ` [U-Boot] [PATCH V4] console: Implement pre-console buffer Graeme Russ
2011-08-31 15:09 ` Mike Frysinger
2011-08-31 21:15 ` Graeme Russ
2011-08-31 21:33 ` Mike Frysinger
2011-08-31 21:59 ` Graeme Russ
2011-08-31 22:44 ` Mike Frysinger
2011-08-31 22:51 ` Graeme Russ
2011-08-31 16:58 ` Simon Glass
2011-08-31 19:18 ` Wolfgang Denk
2011-08-31 20:05 ` Simon Glass
2011-08-31 20:22 ` Mike Frysinger
2011-08-31 20:26 ` Simon Glass
2011-09-01 10:48 ` [U-Boot] [PATCH V5] " Graeme Russ
2011-09-01 10:52 ` Graeme Russ
2011-09-01 14:02 ` Mike Frysinger
2011-09-01 18:51 ` Simon Glass
2011-09-01 23:34 ` Graeme Russ
2011-09-02 2:41 ` Mike Frysinger
2011-09-02 2:58 ` Simon Glass
2011-09-21 23:18 ` Simon Glass
2011-10-04 5:30 ` Simon Glass
2011-10-05 18:50 ` Wolfgang Denk
2011-09-26 22:50 ` [U-Boot] [PATCH V4] " Vadim Bendebury
2011-09-27 11:22 ` Graeme Russ
2011-09-27 14:55 ` Vadim Bendebury
2011-09-29 23:15 ` Graeme Russ
2011-09-29 23:39 ` Vadim Bendebury
2011-09-29 23:47 ` Graeme Russ
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.