Commit 96554d70 authored by Tony Lindgren's avatar Tony Lindgren

omap: Use a memory address for storing the debug port info instead of UART1 scratchpad

This removes the dependency to the UART1 being available for storing
the debug configuration in uncompress.h. This will simplify the
DEBUG_LL UART configuration for boards that may not have UART1, or
have an external UART as it requires only one mapping for DEBUG_LL.

The patch has a few limitations. Basically now we're assuming that
the kernel uncompress code won't overlap with OMAP_UART_INFO. We also
assume the printascii is called at least once before paging_init in
order for addruart to have a chance to read the UART setup from
OMAP_UART_INFO.

As suggested by Cyril Chemparathy <cyril@ti.com>,
Vikram Pandita <vikram.pandita@ti.com> and
Kevin Hilman <khilman@deeprootsystems.com>. Based on an earlier
patch posted for Davinci by Cyril Chemparathy <cyril@ti.com>.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent daa49495
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
#include <asm/memory.h>
#include <plat/serial.h> #include <plat/serial.h>
.pushsection .data .pushsection .data
...@@ -37,23 +39,12 @@ omap_uart_virt: .word 0x0 ...@@ -37,23 +39,12 @@ omap_uart_virt: .word 0x0
cmp \rx, #0 @ is port configured? cmp \rx, #0 @ is port configured?
bne 99f @ already configured bne 99f @ already configured
/* Check 7XX UART1 scratchpad register for uart to use */ /* Check the debug UART configuration set in uncompress.h */
mrc p15, 0, \rx, c1, c0 mrc p15, 0, \rx, c1, c0
tst \rx, #1 @ MMU enabled? tst \rx, #1 @ MMU enabled?
moveq \rx, #0xff000000 @ physical base address ldreq \rx, =OMAP_UART_INFO
movne \rx, #0xfe000000 @ virtual base ldrne \rx, =__phys_to_virt(OMAP_UART_INFO)
orr \rx, \rx, #0x00fb0000 @ OMAP1UART1 ldr \rx, [\rx, #0]
ldrb \rx, [\rx, #(UART_SCR << OMAP7XX_PORT_SHIFT)]
cmp \rx, #0 @ anything in 7XX scratchpad?
bne 10f @ found 7XX uart
/* Check 15xx/16xx UART1 scratchpad register for uart to use */
mrc p15, 0, \rx, c1, c0
tst \rx, #1 @ MMU enabled?
moveq \rx, #0xff000000 @ physical base address
movne \rx, #0xfe000000 @ virtual base
orr \rx, \rx, #0x00fb0000 @ OMAP1UART1
ldrb \rx, [\rx, #(UART_SCR << OMAP_PORT_SHIFT)]
/* Select the UART to use based on the UART1 scratchpad value */ /* Select the UART to use based on the UART1 scratchpad value */
10: cmp \rx, #0 @ no port configured? 10: cmp \rx, #0 @ no port configured?
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
#include <asm/memory.h>
#include <plat/serial.h> #include <plat/serial.h>
#define UART_OFFSET(addr) ((addr) & 0x00ffffff) #define UART_OFFSET(addr) ((addr) & 0x00ffffff)
...@@ -40,13 +42,12 @@ omap_uart_lsr: .word 0 ...@@ -40,13 +42,12 @@ omap_uart_lsr: .word 0
cmp \rx, #0 @ is port configured? cmp \rx, #0 @ is port configured?
bne 99f @ already configured bne 99f @ already configured
/* Check UART1 scratchpad register for uart to use */ /* Check the debug UART configuration set in uncompress.h */
mrc p15, 0, \rx, c1, c0 mrc p15, 0, \rx, c1, c0
tst \rx, #1 @ MMU enabled? tst \rx, #1 @ MMU enabled?
moveq \rx, #0x48000000 @ physical base address ldreq \rx, =OMAP_UART_INFO
movne \rx, #0xfa000000 @ virtual base ldrne \rx, =__phys_to_virt(OMAP_UART_INFO)
orr \rx, \rx, #0x0006a000 @ uart1 on omap2/3/4 ldr \rx, [\rx, #0]
ldrb \rx, [\rx, #(UART_SCR << OMAP_PORT_SHIFT)] @ scratchpad
/* Select the UART to use based on the UART1 scratchpad value */ /* Select the UART to use based on the UART1 scratchpad value */
cmp \rx, #0 @ no port configured? cmp \rx, #0 @ no port configured?
......
...@@ -15,6 +15,20 @@ ...@@ -15,6 +15,20 @@
#include <linux/init.h> #include <linux/init.h>
/*
* Memory entry used for the DEBUG_LL UART configuration. See also
* uncompress.h and debug-macro.S.
*
* Note that using a memory location for storing the UART configuration
* has at least two limitations:
*
* 1. Kernel uncompress code cannot overlap OMAP_UART_INFO as the
* uncompress code could then partially overwrite itself
* 2. We assume printascii is called at least once before paging_init,
* and addruart has a chance to read OMAP_UART_INFO
*/
#define OMAP_UART_INFO (PHYS_OFFSET + 0x3ffc)
/* OMAP1 serial ports */ /* OMAP1 serial ports */
#define OMAP1_UART1_BASE 0xfffb0000 #define OMAP1_UART1_BASE 0xfffb0000
#define OMAP1_UART2_BASE 0xfffb0800 #define OMAP1_UART2_BASE 0xfffb0800
......
...@@ -20,27 +20,21 @@ ...@@ -20,27 +20,21 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
#include <asm/memory.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <plat/serial.h> #include <plat/serial.h>
static volatile u8 *uart1_base;
static int uart1_shift;
static volatile u8 *uart_base; static volatile u8 *uart_base;
static int uart_shift; static int uart_shift;
/* /*
* Store the DEBUG_LL uart number into UART1 scratchpad register. * Store the DEBUG_LL uart number into memory.
* See also debug-macro.S, and serial.c for related code. * See also debug-macro.S, and serial.c for related code.
*
* Please note that we currently assume that:
* - UART1 clocks are enabled for register access
* - UART1 scratchpad register can be used
*/ */
static void set_uart1_scratchpad(unsigned char port) static void set_omap_uart_info(unsigned char port)
{ {
uart1_base[UART_SCR << uart1_shift] = port; *(volatile u32 *)OMAP_UART_INFO = port;
} }
static void putc(int c) static void putc(int c)
...@@ -60,42 +54,38 @@ static inline void flush(void) ...@@ -60,42 +54,38 @@ static inline void flush(void)
/* /*
* Macros to configure UART1 and debug UART * Macros to configure UART1 and debug UART
*/ */
#define _DEBUG_LL_ENTRY(mach, uart1_phys, uart1_shft, \ #define _DEBUG_LL_ENTRY(mach, dbg_uart, dbg_shft, dbg_id) \
dbg_uart, dbg_shft, dbg_id) \
if (machine_is_##mach()) { \ if (machine_is_##mach()) { \
uart1_base = (volatile u8 *)(uart1_phys); \
uart1_shift = (uart1_shft); \
uart_base = (volatile u8 *)(dbg_uart); \ uart_base = (volatile u8 *)(dbg_uart); \
uart_shift = (dbg_shft); \ uart_shift = (dbg_shft); \
port = (dbg_id); \ port = (dbg_id); \
set_uart1_scratchpad(port); \ set_omap_uart_info(port); \
break; \ break; \
} }
#define DEBUG_LL_OMAP7XX(p, mach) \ #define DEBUG_LL_OMAP7XX(p, mach) \
_DEBUG_LL_ENTRY(mach, OMAP1_UART1_BASE, OMAP7XX_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT, \
OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT, OMAP1UART##p) OMAP1UART##p)
#define DEBUG_LL_OMAP1(p, mach) \ #define DEBUG_LL_OMAP1(p, mach) \
_DEBUG_LL_ENTRY(mach, OMAP1_UART1_BASE, OMAP_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT, \
OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP1UART##p) OMAP1UART##p)
#define DEBUG_LL_OMAP2(p, mach) \ #define DEBUG_LL_OMAP2(p, mach) \
_DEBUG_LL_ENTRY(mach, OMAP2_UART1_BASE, OMAP_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT, \
OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP2UART##p) OMAP2UART##p)
#define DEBUG_LL_OMAP3(p, mach) \ #define DEBUG_LL_OMAP3(p, mach) \
_DEBUG_LL_ENTRY(mach, OMAP3_UART1_BASE, OMAP_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT, \
OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP3UART##p) OMAP3UART##p)
#define DEBUG_LL_OMAP4(p, mach) \ #define DEBUG_LL_OMAP4(p, mach) \
_DEBUG_LL_ENTRY(mach, OMAP4_UART1_BASE, OMAP_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT, \
OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT, OMAP4UART##p) OMAP4UART##p)
/* Zoom2/3 shift is different for UART1 and external port */ /* Zoom2/3 shift is different for UART1 and external port */
#define DEBUG_LL_ZOOM(mach) \ #define DEBUG_LL_ZOOM(mach) \
_DEBUG_LL_ENTRY(mach, OMAP2_UART1_BASE, OMAP_PORT_SHIFT, \ _DEBUG_LL_ENTRY(mach, ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART)
ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART)
static inline void __arch_decomp_setup(unsigned long arch_id) static inline void __arch_decomp_setup(unsigned long arch_id)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment