Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc2eb76c authored by Cyril Chemparathy's avatar Cyril Chemparathy Committed by Kevin Hilman
Browse files

Davinci: generalized debug macros



This patch adopts a debug uart selection similar to the OMAP model.  During
the boot process, the uncompress code determines the physical and virtual base
addresses of the board-specific debug uart.  These addresses are then passed
on to the in-kernel debug macros through a small chunk of memory placed just
below the page tables (@0x80003ff8).

Signed-off-by: default avatarCyril Chemparathy <cyril@ti.com>
Signed-off-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
parent 7e27d6e7
Loading
Loading
Loading
Loading
+39 −11
Original line number Original line Diff line number Diff line
@@ -17,22 +17,50 @@
 */
 */


#include <linux/serial_reg.h>
#include <linux/serial_reg.h>

#include <asm/memory.h>

#include <mach/serial.h>

#define UART_SHIFT	2
#define UART_SHIFT	2


		.pushsection .data
davinci_uart_phys:	.word	0
davinci_uart_virt:	.word	0
		.popsection

		.macro addruart, rx, tmp
		.macro addruart, rx, tmp

		/* Use davinci_uart_phys/virt if already configured */
10:		mrc	p15, 0, \rx, c1, c0
		tst	\rx, #1			@ MMU enabled?
		ldreq	\rx, =__virt_to_phys(davinci_uart_phys)
		ldrne	\rx, =davinci_uart_virt
		ldr	\rx, [\rx]
		cmp	\rx, #0			@ is port configured?
		bne	99f			@ already configured

		mrc	p15, 0, \rx, c1, c0
		mrc	p15, 0, \rx, c1, c0
		tst	\rx, #1			@ MMU enabled?
		tst	\rx, #1			@ MMU enabled?
		moveq	\rx, #0x01000000	@ physical base address

		movne	\rx, #0xfe000000	@ virtual base
		/* Copy uart phys address from decompressor uart info */
#if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx)
		ldreq	\tmp, =__virt_to_phys(davinci_uart_phys)
#error Cannot enable DaVinci and DA8XX platforms concurrently
		ldrne	\tmp, =davinci_uart_phys
#elif defined(CONFIG_MACH_DAVINCI_DA830_EVM) || \
		ldreq	\rx, =DAVINCI_UART_INFO
	defined(CONFIG_MACH_DAVINCI_DA850_EVM)
		ldrne	\rx, =__phys_to_virt(DAVINCI_UART_INFO)
		orr	\rx, \rx, #0x00d00000	@ physical base address
		ldr	\rx, [\rx, #0]
		orr	\rx, \rx, #0x0000d000	@ of UART 2
		str	\rx, [\tmp]
#else

		orr	\rx, \rx, #0x00c20000   @ UART 0
		/* Copy uart virt address from decompressor uart info */
#endif
		ldreq	\tmp, =__virt_to_phys(davinci_uart_virt)
		ldrne	\tmp, =davinci_uart_virt
		ldreq	\rx, =DAVINCI_UART_INFO
		ldrne	\rx, =__phys_to_virt(DAVINCI_UART_INFO)
		ldr	\rx, [\rx, #4]
		str	\rx, [\tmp]

		b	10b
99:
		.endm
		.endm


		.macro	senduart,rd,rx
		.macro	senduart,rd,rx
+13 −0
Original line number Original line Diff line number Diff line
@@ -11,8 +11,19 @@
#ifndef __ASM_ARCH_SERIAL_H
#ifndef __ASM_ARCH_SERIAL_H
#define __ASM_ARCH_SERIAL_H
#define __ASM_ARCH_SERIAL_H


#include <asm/memory.h>

#include <mach/hardware.h>
#include <mach/hardware.h>


/*
 * Stolen area that contains debug uart physical and virtual addresses.  These
 * addresses are filled in by the uncompress.h code, and are used by the debug
 * macros in debug-macro.S.
 *
 * This area sits just below the page tables (see arch/arm/kernel/head.S).
 */
#define DAVINCI_UART_INFO	(PHYS_OFFSET + 0x3ff8)

#define DAVINCI_UART0_BASE	(IO_PHYS + 0x20000)
#define DAVINCI_UART0_BASE	(IO_PHYS + 0x20000)
#define DAVINCI_UART1_BASE	(IO_PHYS + 0x20400)
#define DAVINCI_UART1_BASE	(IO_PHYS + 0x20400)
#define DAVINCI_UART2_BASE	(IO_PHYS + 0x20800)
#define DAVINCI_UART2_BASE	(IO_PHYS + 0x20800)
@@ -26,11 +37,13 @@
#define UART_DM646X_SCR			0x10
#define UART_DM646X_SCR			0x10
#define UART_DM646X_SCR_TX_WATERMARK	0x08
#define UART_DM646X_SCR_TX_WATERMARK	0x08


#ifndef __ASSEMBLY__
struct davinci_uart_config {
struct davinci_uart_config {
	/* Bit field of UARTs present; bit 0 --> UART1 */
	/* Bit field of UARTs present; bit 0 --> UART1 */
	unsigned int enabled_uarts;
	unsigned int enabled_uarts;
};
};


extern int davinci_serial_init(struct davinci_uart_config *);
extern int davinci_serial_init(struct davinci_uart_config *);
#endif


#endif /* __ASM_ARCH_SERIAL_H */
#endif /* __ASM_ARCH_SERIAL_H */
+59 −21
Original line number Original line Diff line number Diff line
/*
/*
 * Serial port stubs for kernel decompress status messages
 * Serial port stubs for kernel decompress status messages
 *
 *
 *  Author:     Anant Gole
 * Initially based on:
 * (C) Copyright (C) 2006, Texas Instruments, Inc
 * arch/arm/plat-omap/include/mach/uncompress.h
 *
 * Original copyrights follow.
 *
 * Copyright (C) 2000 RidgeRun, Inc.
 * Author: Greg Lonnon <glonnon@ridgerun.com>
 *
 * Rewritten by:
 * Author: <source@mvista.com>
 * 2004 (c) MontaVista Software, Inc.
 *
 *
 * This file is licensed under the terms of the GNU General Public License
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * version 2. This program is licensed "as is" without any warranty of any
@@ -11,30 +20,17 @@


#include <linux/types.h>
#include <linux/types.h>
#include <linux/serial_reg.h>
#include <linux/serial_reg.h>
#include <mach/serial.h>


#include <asm/mach-types.h>
#include <asm/mach-types.h>


extern unsigned int __machine_arch_type;
#include <mach/serial.h>


static u32 *uart;
static u32 *uart;

static u32 *uart_info = (u32 *)(DAVINCI_UART_INFO);
static u32 *get_uart_base(void)
{
	if (__machine_arch_type == MACH_TYPE_DAVINCI_DA830_EVM ||
		__machine_arch_type == MACH_TYPE_DAVINCI_DA850_EVM)
		return (u32 *)DA8XX_UART2_BASE;
	else
		return (u32 *)DAVINCI_UART0_BASE;
}


/* PORT_16C550A, in polled non-fifo mode */
/* PORT_16C550A, in polled non-fifo mode */

static void putc(char c)
static void putc(char c)
{
{
	if (!uart)
		uart = get_uart_base();

	while (!(uart[UART_LSR] & UART_LSR_THRE))
	while (!(uart[UART_LSR] & UART_LSR_THRE))
		barrier();
		barrier();
	uart[UART_TX] = c;
	uart[UART_TX] = c;
@@ -42,12 +38,54 @@ static void putc(char c)


static inline void flush(void)
static inline void flush(void)
{
{
	if (!uart)
		uart = get_uart_base();

	while (!(uart[UART_LSR] & UART_LSR_THRE))
	while (!(uart[UART_LSR] & UART_LSR_THRE))
		barrier();
		barrier();
}
}


#define arch_decomp_setup()
static inline void set_uart_info(u32 phys, void * __iomem virt)
{
	uart = (u32 *)phys;
	uart_info[0] = phys;
	uart_info[1] = (u32)virt;
}

#define _DEBUG_LL_ENTRY(machine, phys, virt)			\
	if (machine_is_##machine()) {				\
		set_uart_info(phys, virt);			\
		break;						\
	}

#define DEBUG_LL_DAVINCI(machine, port)				\
	_DEBUG_LL_ENTRY(machine, DAVINCI_UART##port##_BASE,	\
			IO_ADDRESS(DAVINCI_UART##port##_BASE))

#define DEBUG_LL_DA8XX(machine, port)				\
	_DEBUG_LL_ENTRY(machine, DA8XX_UART##port##_BASE,	\
			IO_ADDRESS(DA8XX_UART##port##_BASE))

static inline void __arch_decomp_setup(unsigned long arch_id)
{
	/*
	 * Initialize the port based on the machine ID from the bootloader.
	 * Note that we're using macros here instead of switch statement
	 * as machine_is functions are optimized out for the boards that
	 * are not selected.
	 */
	do {
		/* Davinci boards */
		DEBUG_LL_DAVINCI(davinci_evm,		0);
		DEBUG_LL_DAVINCI(sffsdr,		0);
		DEBUG_LL_DAVINCI(neuros_osd2,		0);
		DEBUG_LL_DAVINCI(davinci_dm355_evm,	0);
		DEBUG_LL_DAVINCI(dm355_leopard,		0);
		DEBUG_LL_DAVINCI(davinci_dm6467_evm,	0);
		DEBUG_LL_DAVINCI(davinci_dm365_evm,	0);

		/* DA8xx boards */
		DEBUG_LL_DA8XX(davinci_da830_evm,	2);
		DEBUG_LL_DA8XX(davinci_da850_evm,	2);
	} while (0);
}

#define arch_decomp_setup()	__arch_decomp_setup(arch_id)
#define arch_decomp_wdog()
#define arch_decomp_wdog()