mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-03 03:46:51 +07:00
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: Cyril Chemparathy <cyril@ti.com> Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
This commit is contained in:
parent
7e27d6e778
commit
dc2eb76c40
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -1,8 +1,17 @@
|
|||||||
/*
|
/*
|
||||||
* 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()
|
||||||
|
Loading…
Reference in New Issue
Block a user