ARM: tegra: simplify DEBUG_LL UART selection options
Subsystems (3)
PATCH v2 1/3 ARM: tegra: simplify DEBUG_LL UART selection options
From: Stephen Warren <[email protected]>
Delete CONFIG_TEGRA_DEBUG_UART_AUTO_SCRATCH; it's not useful any more:
* No upstream bootloader currently or will ever support this option.
* CONFIG_TEGRA_DEBUG_UART_AUTO_ODMDATA is a much more direct alternative.
Merge the fixed and automatic UART selection menus into a single choice for simplicity; now you either pick AUTO_ODMDATA or a single fixed UART, rather than potentially having an AUTO option override whatever fixed option was chosen.
Remove TEGRA_DEBUG_UART_NONE; if you don't want a Tegra DEBUG_LL UART, simply don't turn on DEBUG_LL. NONE used to be the default option, so pick AUTO_ODMDATA as the new default.
---
v2:
* Remove redundant default selection in mach-tegra/Kconfig
* Rebase on iomap.h/irammap.h moves
arch/arm/mach-tegra/Kconfig | 40 ++++--------------- arch/arm/mach-tegra/common.c | 5 +- arch/arm/mach-tegra/include/mach/uncompress.h | 52 ++----------------------- arch/arm/mach-tegra/iomap.h | 14 ------- 4 files changed, 15 insertions(+), 96 deletions(-)
arch/arm/mach-tegra/Kconfig +9 -31
@@ -58,11 +58,16 @@ config TEGRA_AHB perfomance parameters(priority, prefech size). choice - prompt "Default low-level debug console UART" - default TEGRA_DEBUG_UART_NONE + prompt "Low-level debug console UART" -config TEGRA_DEBUG_UART_NONE - bool "None" +config TEGRA_DEBUG_UART_AUTO_ODMDATA + bool "Via ODMDATA" + help + Automatically determines which UART to use for low-level debug based + on the ODMDATA value. This value is part of the BCT, and is written + to the boot memory device using nvflash, or other flashing tool. + When bits 19:18 are 3, then bits 17:15 indicate which UART to use; + 0/1/2/3/4 are UART A/B/C/D/E. config TEGRA_DEBUG_UARTA bool "UART-A"
@@ -81,33 +86,6 @@ config TEGRA_DEBUG_UARTE endchoice -choice - prompt "Automatic low-level debug console UART" - default TEGRA_DEBUG_UART_AUTO_NONE - -config TEGRA_DEBUG_UART_AUTO_NONE - bool "None" - -config TEGRA_DEBUG_UART_AUTO_ODMDATA - bool "Via ODMDATA" - help - Automatically determines which UART to use for low-level debug based - on the ODMDATA value. This value is part of the BCT, and is written - to the boot memory device using nvflash, or other flashing tool. - When bits 19:18 are 3, then bits 17:15 indicate which UART to use; - 0/1/2/3/4 are UART A/B/C/D/E. - -config TEGRA_DEBUG_UART_AUTO_SCRATCH - bool "Via UART scratch register" - help - Automatically determines which UART to use for low-level debug based - on the UART scratch register value. Some bootloaders put ASCII 'D' - in this register when they initialize their own console UART output. - Using this option allows the kernel to automatically pick the same - UART. - -endchoice - config TEGRA_EMC_SCALING_ENABLE bool "Enable scaling the memory frequency"
arch/arm/mach-tegra/common.c +2 -3
@@ -44,14 +44,13 @@* kernel is loaded. The data is declared here rather than debug-macro.S so * that multiple inclusions of debug-macro.S point at the same data. */ -#define TEGRA_DEBUG_UART_OFFSET (TEGRA_DEBUG_UART_BASE & 0xFFFF)u32 tegra_uart_config[3 ] = {/* Debug UART initialization required */ 1 ,/* Debug UART physical address */ - (u32)(IO_APB_PHYS +TEGRA_DEBUG_UART_OFFSET ), +0 ,/* Debug UART virtual address */ - (u32)(IO_APB_VIRT +TEGRA_DEBUG_UART_OFFSET ), +0 , };#ifdef CONFIG_OF
arch/arm/mach-tegra/include/mach/uncompress.h +4 -48
74 lines not on this page · raw message
arch/arm/mach-tegra/iomap.h +0 -14
@@ -261,20 +261,6 @@#define TEGRA_SDMMC4_BASE 0xC8000600#define TEGRA_SDMMC4_SIZE SZ_512 -#if defined(CONFIG_TEGRA_DEBUG_UART_NONE ) -# define TEGRA_DEBUG_UART_BASE 0 -#elif defined(CONFIG_TEGRA_DEBUG_UARTA ) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTA_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTB ) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTB_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTC ) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTC_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTD ) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTD_BASE -#elif defined(CONFIG_TEGRA_DEBUG_UARTE ) -# define TEGRA_DEBUG_UART_BASE TEGRA_UARTE_BASE -#endif -/* On TEGRA, many peripherals are very closely packed in * two 256MB io windows (that actually only use about 64KB * at the start of each).
Signature · 1 line
1.7.0.4
PATCH v2 2/3 ARM: tegra: make debug-macro.S work standalone
From: Stephen Warren <[email protected]>
Prior to this change, Tegra's debug-macro.S relied on uncompress.h having determined which UART to use, and whether it was safe to use the UART (i.e. is it not in reset, and clocked). This determination was communicated from uncompress.h to debug-macro.S using a few bytes of Tegra's IRAM (an on-SoC RAM). This had the disadvantage that uncompress.h was a required part of the kernel boot process; booting a non-compressed kernel would not allow earlyprintk to operate.
This change duplicates the UART selection and validation logic into debug-macro.S so that the reliance on uncompress.h is removed.
This also helps out with single-zImage work, since there is currently no support for using any uncompress with single-zImage.
---
v2:
* Rebase on iomap.h/irammap.h moves
arch/arm/mach-tegra/common.c | 4 +- arch/arm/mach-tegra/include/mach/debug-macro.S | 151 ++++++++++++++++++++--- arch/arm/mach-tegra/include/mach/uncompress.h | 13 -- arch/arm/mach-tegra/irammap.h | 9 -- 4 files changed, 134 insertions(+), 43 deletions(-)
arch/arm/mach-tegra/common.c +3 -1
@@ -44,13 +44,15 @@* kernel is loaded. The data is declared here rather than debug-macro.S so * that multiple inclusions of debug-macro.S point at the same data. */ -u32 tegra_uart_config[3 ] = { +u32 tegra_uart_config[4 ] = {/* Debug UART initialization required */ 1 ,/* Debug UART physical address */ 0 ,/* Debug UART virtual address */ 0 , +/* Scratch space for debug macro */ +0 , };#ifdef CONFIG_OF
arch/arm/mach-tegra/include/mach/debug-macro.S +131 -20
194 lines not on this page · raw message
arch/arm/mach-tegra/include/mach/uncompress.h +0 -13
@@ -29,7 +29,6 @@#include <linux/serial_reg.h> #include "../../iomap.h" -#include "../../irammap.h" #define BIT (x) (1 << (x))#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0]))
@@ -52,17 +51,6 @@ static inline void flush(void) { } -static inline void save_uart_address (void ) -{ -u32 *buf = (u32 *)(TEGRA_IRAM_BASE +TEGRA_IRAM_DEBUG_UART_OFFSET ); - -if (uart) { - buf[0 ] =TEGRA_IRAM_DEBUG_UART_COOKIE ; - buf[1 ] = (u32 )uart; - }else - buf[0 ] =0 ; -} - static const struct { u32 base; u32 reset_reg;
@@ -169,7 +157,6 @@ static inline void arch_decomp_setup(void)else uart = (volatile u8 *)uarts[uart_id].base; -save_uart_address ();if (uart ==NULL )return ;
arch/arm/mach-tegra/irammap.h +0 -9
@@ -23,13 +23,4 @@#define TEGRA_IRAM_RESET_HANDLER_OFFSET 0#define TEGRA_IRAM_RESET_HANDLER_SIZE SZ_1K -/* -* These locations are written to by uncompress.h, and read by debug-macro.S. -* The first word holds the cookie value if the data is valid. The second -* word holds the UART physical address. -*/ -#define TEGRA_IRAM_DEBUG_UART_OFFSET SZ_1K -#define TEGRA_IRAM_DEBUG_UART_SIZE 8 -#define TEGRA_IRAM_DEBUG_UART_COOKIE 0x55415254 -#endif
Signature · 1 line
1.7.0.4
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
Move Tegra's debug-macro.S over to the common debug macro directory.
Move Tegra's debug UART selection menu into ARM's Kconfig.debug, so that all related options are selected in the same place.
Tegra's uncompress.h is left in mach-tegra/include/mach; it will be removed whenever Tegra is converted to multi-platform.
---
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:
#include "../../mach-tegra/iomap.h"
in arch/arm/include/debug/tegra.S is acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's struct map_desc entries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra's iomap.h would have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.
Second, is the Kconfig.debug change reasonable? I guess I could remove the second choice menu I added, and just put all the options in the main "Kernel low-level debugging port" choice. However, that would make the "if" statements in "config DEBUG_LL_INCLUDE" rather more unwieldy.
v2:
* Remove redundant default selection in Kconfig.debug, fix indentation there.
* Rebase on iomap.h/irammap.h moves
arch/arm/Kconfig.debug | 38 +++++ arch/arm/include/debug/tegra.S | 209 +++++++++++++++++++++++ arch/arm/mach-tegra/Kconfig | 29 ---- arch/arm/mach-tegra/include/mach/debug-macro.S | 211 ------------------------ 4 files changed, 247 insertions(+), 240 deletions(-) create mode 100644 arch/arm/include/debug/tegra.S delete mode 100644 arch/arm/mach-tegra/include/mach/debug-macro.S
arch/arm/Kconfig.debug +38 -0
@@ -345,6 +345,13 @@ choice Say Y here if you want kernel low-level debugging support on SOCFPGA based platforms. + config DEBUG_TEGRA_UART + depends on ARCH_TEGRA + bool "Use Tegra UART for low-level debug" + help + Say Y here if you want kernel low-level debugging support + on Tegra based platforms. + config DEBUG_VEXPRESS_UART0_DETECT bool "Autodetect UART0 on Versatile Express Cortex-A core tiles" depends on ARCH_VEXPRESS && CPU_CP15_MMU
@@ -409,6 +416,36 @@ choice endchoice +choice + prompt "Low-level debug console UART" + depends on DEBUG_LL && DEBUG_TEGRA_UART + + config TEGRA_DEBUG_UART_AUTO_ODMDATA + bool "Via ODMDATA" + help + Automatically determines which UART to use for low-level debug based + on the ODMDATA value. This value is part of the BCT, and is written + to the boot memory device using nvflash, or other flashing tool. + When bits 19:18 are 3, then bits 17:15 indicate which UART to use; + 0/1/2/3/4 are UART A/B/C/D/E. + + config TEGRA_DEBUG_UARTA + bool "UART A" + + config TEGRA_DEBUG_UARTB + bool "UART B" + + config TEGRA_DEBUG_UARTC + bool "UART C" + + config TEGRA_DEBUG_UARTD + bool "UART D" + + config TEGRA_DEBUG_UARTE + bool "UART E" + +endchoice + config DEBUG_LL_INCLUDE string default "debug/icedcc.S" if DEBUG_ICEDCC
@@ -418,6 +455,7 @@ config DEBUG_LL_INCLUDE default "debug/socfpga.S" if DEBUG_SOCFPGA_UART default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \ DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1 + default "debug/tegra.S" if DEBUG_TEGRA_UART default "mach/debug-macro.S" config EARLY_PRINTK
arch/arm/include/debug/tegra.S new file +209 -0
209 lines not on this page · raw message
arch/arm/mach-tegra/Kconfig +0 -29
@@ -57,35 +57,6 @@ config TEGRA_AHB which controls AHB bus master arbitration and some perfomance parameters(priority, prefech size). -choice - prompt "Low-level debug console UART" - -config TEGRA_DEBUG_UART_AUTO_ODMDATA - bool "Via ODMDATA" - help - Automatically determines which UART to use for low-level debug based - on the ODMDATA value. This value is part of the BCT, and is written - to the boot memory device using nvflash, or other flashing tool. - When bits 19:18 are 3, then bits 17:15 indicate which UART to use; - 0/1/2/3/4 are UART A/B/C/D/E. - -config TEGRA_DEBUG_UARTA - bool "UART-A" - -config TEGRA_DEBUG_UARTB - bool "UART-B" - -config TEGRA_DEBUG_UARTC - bool "UART-C" - -config TEGRA_DEBUG_UARTD - bool "UART-D" - -config TEGRA_DEBUG_UARTE - bool "UART-E" - -endchoice - config TEGRA_EMC_SCALING_ENABLE bool "Enable scaling the memory frequency"
arch/arm/mach-tegra/include/mach/debug-macro.S deleted +0 -211
211 lines not on this page · raw message
Signature · 1 line
1.7.0.4
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 11 lines · Stephen Warren
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:
#include "
../../mach-tegra/iomap.h"in
arch/arm/include/debug/tegra.Sis acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's structmap_descentries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra'siomap.hwould have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.
I don't have a good answer for this unfortunately. I wouldn't want relative include paths to take over because they can paper over a lot of other problems when people get lazy.
Quoted 4 lines
Second, is the
Kconfig.debugchange reasonable? I guess I could remove the second choice menu I added, and just put all the options in the main "Kernel low-level debugging port" choice. However, that would make the "if" statements in "configDEBUG_LL_INCLUDE" rather more unwieldy.
It looks ok to me in principle, but you could also solve this by making DEBUG_TEGRA_UART a silent option like this:
@@ -345,6 +345,46 @@ choice
Say Y here if you want kernel low-level debugging support on SOCFPGA based platforms.
+ config DEBUG_TEGRA_UARTA
+ depends on ARCH_TEGRA
+ select DEBUG_TEGRA_UART
+ bool "Use Tegra UARTA for low-level debug"
+ help
+ Say Y here if you want kernel low-level debugging support
+ on Tegra based platforms.
+
+ config DEBUG_TEGRA_UARTB
+ depends on ARCH_TEGRA
+ select DEBUG_TEGRA_UART
+ bool "Use Tegra UARTB for low-level debug"
+ help
+ Say Y here if you want kernel low-level debugging support
+ on Tegra based platforms.
+
+ config DEBUG_TEGRA_UARTC
+ depends on ARCH_TEGRA
+ select DEBUG_TEGRA_UART
+ bool "Use Tegra UARTC for low-level debug"
+ help
+ Say Y here if you want kernel low-level debugging support
+ on Tegra based platforms.
+
+ config DEBUG_TEGRA_UARTD
+ depends on ARCH_TEGRA
+ select DEBUG_TEGRA_UART
+ bool "Use Tegra UARTD for low-level debug"
+ help
+ Say Y here if you want kernel low-level debugging support
+ on Tegra based platforms.
+
+ config DEBUG_TEGRA_UARTE
+ depends on ARCH_TEGRA
+ select DEBUG_TEGRA_UART
+ bool "Use Tegra UARTE for low-level debug"
+ help
+ Say Y here if you want kernel low-level debugging support
+ on Tegra based platforms.
+
config DEBUG_VEXPRESS_UART0_DETECT
bool "Autodetect UART0 on Versatile Express Cortex-A core tiles" depends on ARCH_VEXPRESS && CPU_CP15_MMU
@@ -409,6 +416,36 @@ choice
endchoice
+config DEBUG_TEGRA_UART
+ bool
I don't have a strong preference either way.
ARnd
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
In reply to Stephen WarrenQuoted 16 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Move Tegra's
debug-macro.Sover to the common debug macro directory.Move Tegra's debug UART selection menu into ARM's
Kconfig.debug, so that all related options are selected in the same place.Tegra's
uncompress.his left in mach-tegra/include/mach; it will be removed whenever Tegra is converted to multi-platform.Signed-off-by Stephen Warren <[email protected]>---
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:#include "
../../mach-tegra/iomap.h"
Quoted 7 lines
in
arch/arm/include/debug/tegra.Sis acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's structmap_descentries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra'siomap.hwould have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.
We already have a way to get the phys and virt addresses at runtime with addruart macro. Couldn't we wrap this with a proper function and setup the mapping at runtime. This would move it out of the platforms.
I'd also like to make the virtual address the same on all platforms (but different offsets within a 1MB section) and make the phys address a kconfig option. This would also eliminate the need for the platform include and potentially addruart for that matter.
Rob
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 25 lines · Rob Herring
Quoted 16 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Move Tegra's
debug-macro.Sover to the common debug macro directory.Move Tegra's debug UART selection menu into ARM's
Kconfig.debug, so that all related options are selected in the same place.Tegra's
uncompress.his left in mach-tegra/include/mach; it will be removed whenever Tegra is converted to multi-platform.Signed-off-by Stephen Warren <[email protected]>---
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:#include "
../../mach-tegra/iomap.h"Quoted 7 lines
in
arch/arm/include/debug/tegra.Sis acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's structmap_descentries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra'siomap.hwould have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.
Quoted 2 lines
We already have a way to get the phys and virt addresses at runtime with addruart macro.
So this discussion is mainly about the implementation of addruart.
Quoted 2 lines
Couldn't we wrap this with a proper function and setup the mapping at runtime. This would move it out of the platforms.
So, the mapping already is set up at run-time at least during early boot; __create_page_tables() in arch/arm/kernel/head.S calls addruart and sets up an entry for it.
I suppose the implication here is that the virtual address that addruart returns doesn't have to match anything that the machine later sets up using iotable_init().
If that's true, then Tegra's debug-macro.S only needs to know the UART physical address, and can make up almost any arbitrary virtual address (perhaps even driven by the logic you mention in your next paragraph below) and hence need not rely on Tegra's iomap.h. That said, we'd still have to manually remember not to create conflicting virtual address setups in the two places, which would still be easier with a shared header.
However, I then have two questions:
1) How long do the page tables set up by __create_page_tables() last; do they stick around forever, or at least as long as the macros from debug-macro.S are used, or are they replaced sometime, on the assumption that the machine's .map_io() will call iotable_init() and end up setting up the same mapping?
2) If the virtual address returned by addruart on Tegra is different than any virtual addresses set up by Tegra's .map_io(), and Tegra's .map_io() sets up a very broad mapping that covers all peripherals including the UART, and hence the UART physical registers get mapped into two virtual addresses, will this cause any problems? IIRC, duplicate mappings can cause some issues on ARM, but perhaps that only applies to memory-like mappings, and not completely uncached IO mappings?
Quoted 4 lines
I'd also like to make the virtual address the same on all platforms (but different offsets within a 1MB section) and make the phys address a kconfig option. This would also eliminate the need for the platform include and potentially addruart for that matter.
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 49 lines · Stephen Warren
Quoted 25 lines · Rob Herring
Quoted 16 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Move Tegra's
debug-macro.Sover to the common debug macro directory.Move Tegra's debug UART selection menu into ARM's
Kconfig.debug, so that all related options are selected in the same place.Tegra's
uncompress.his left in mach-tegra/include/mach; it will be removed whenever Tegra is converted to multi-platform.Signed-off-by Stephen Warren <[email protected]>---
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:#include "
../../mach-tegra/iomap.h"Quoted 7 lines
in
arch/arm/include/debug/tegra.Sis acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's structmap_descentries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra'siomap.hwould have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.Quoted 2 lines
We already have a way to get the phys and virt addresses at runtime with addruart macro.
So this discussion is mainly about the implementation of addruart.
Quoted 2 lines
Couldn't we wrap this with a proper function and setup the mapping at runtime. This would move it out of the platforms.
So, the mapping already is set up at run-time at least during early boot;
__create_page_tables()inarch/arm/kernel/head.Scalls addruart and sets up an entry for it.I suppose the implication here is that the virtual address that addruart returns doesn't have to match anything that the machine later sets up using
iotable_init().If that's true, then Tegra's
debug-macro.Sonly needs to know the UART physical address, and can make up almost any arbitrary virtual address (perhaps even driven by the logic you mention in your next paragraph below) and hence need not rely on Tegra'siomap.h. That said, we'd still have to manually remember not to create conflicting virtual address setups in the two places, which would still be easier with a shared header.
Quoted 7 lines
However, I then have two questions:
1) How long do the page tables set up by
__create_page_tables()last; do they stick around forever, or at least as long as the macros fromdebug-macro.Sare used, or are they replaced sometime, on the assumption that the machine's .map_io() will calliotable_init()and end up setting up the same mapping?
So answering my own question here after testing this:
If I use a different (to iomap.h) virtual address in debug-macro.S, then the very very early output from earlyprintk does work:
Quoted 8 lines
[ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.7.0-rc1-next-20121016-... [ 0.000000] CPU: ARMv7 Processor [411fc090] revision 0 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: nVidia Tegra20 (Flattened Device Tree), model: NVIDIA Tegra2 Harmony evaluation board [ 0.000000] bootconsole [earlycon0] enabled [ 0.000000] Memory policy: ECC disabled, Data cache writealloc
However, the kernel either hangs or output simply stops working at that point. If I modify Tegra's iotable_init() call to add an entry to map the UART to the virtual address debug-macro.S assumes, then everything works again.
That implies we really do need to keep the two pieces of code completely in sync, so a shared header is the right way to go. It also implies that having duplicate mappings of the same physical address doesn't cause any immediate obvious catastrophic problems.
Ways we might avoid files in arch/arm/include/debug having to use relative include paths to pick up that header are:
a) Move mach-${mach}/include/mach/iomap.h to iomap-${mach}.h in some standard include path.
b) Rework debug-macro.S so that it isn't an include file, but rather a regular top-level file. In other words, rather than compiling arch/arm/kernel/debug.S, and having that #include DEBUG_LL_INCLUDE, instead compile DEBUG_LL_SOURCE (i.e. arch/arm/mach-${mach}/debug.S by default), and have that #include any common parts (e.g. implementation of printhex8). This has benefits of:
b1) arch/arm/mach-${mach}/debug.S is in the mach directory that owns it, rather than having them all dumped into a common location.
b2) Can use #include "iomap.h", a non-relative include, to pick up the shared header
b3) Perhaps we can simplify the current debug.S e.g. have a common debug-semihosting.S that contains the semihosting stuff, and only include that from mach-*/debug.S if that machine uses semihosting, or similar?
(b) seems like a lot of work. I don't see any advantage of (a) over just using the relative include.
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 7 lines · Stephen Warren
That implies we really do need to keep the two pieces of code completely in sync, so a shared header is the right way to go. It also implies that having duplicate mappings of the same physical address doesn't cause any immediate obvious catastrophic problems.
Ways we might avoid files in
arch/arm/include/debughaving to use relative include paths to pick up that header are:
Why not take the opposite approach. Treat the platform as setting up the addresses for the UART. Then arrange for the debug macros to match that. Or we define a common virtual address for debug UARTs (which platforms would not be able to use).
Quoted 2 lines
b) Rework
debug-macro.Sso that it isn't an include file, but rather a regular top-level file.
No, that won't work. It's used in two places - the kernel and the decompressor. Hence why it is an include file (it's not an include file just for the fun of it.)
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 11 lines · Russell King - ARM Linux
Quoted 7 lines · Stephen Warren
That implies we really do need to keep the two pieces of code completely in sync, so a shared header is the right way to go. It also implies that having duplicate mappings of the same physical address doesn't cause any immediate obvious catastrophic problems.
Ways we might avoid files in
arch/arm/include/debughaving to use relative include paths to pick up that header are:Why not take the opposite approach. Treat the platform as setting up the addresses for the UART. Then arrange for the debug macros to match that.
Well, wouldn't the debug macros match it by including a common header file that defined the virtual address:-)
Quoted 2 lines
Or we define a common virtual address for debug UARTs (which platforms would not be able to use).
That seems like good idea.
Quoted 6 lines
Quoted 2 lines
b) Rework
debug-macro.Sso that it isn't an include file, but rather a regular top-level file.No, that won't work. It's used in two places - the kernel and the decompressor. Hence why it is an include file (it's not an include file just for the fun of it.)
Can't the file just be compiled twice by the two different Makefiles?
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
In reply to Stephen WarrenQuoted 1 line · Stephen Warren
On 10/17/2012 10:22 AM, Stephen Warren wrote:
snip
Quoted 11 lines
That implies we really do need to keep the two pieces of code completely in sync, so a shared header is the right way to go. It also implies that having duplicate mappings of the same physical address doesn't cause any immediate obvious catastrophic problems.
Ways we might avoid files in
arch/arm/include/debughaving to use relative include paths to pick up that header are:a) Move
mach-${mach}/include/mach/iomap.hto iomap-${mach}.h in some standard include path.
Your goal should be to get rid of iomap.h though...
Quoted 13 lines
b) Rework
debug-macro.Sso that it isn't an include file, but rather a regular top-level file. In other words, rather than compilingarch/arm/kernel/debug.S, and having that #includeDEBUG_LL_INCLUDE, instead compileDEBUG_LL_SOURCE(i.e.arch/arm/mach-${mach}/debug.Sby default), and have that #include any common parts (e.g. implementation of printhex8). This has benefits of:b1)
arch/arm/mach-${mach}/debug.Sis in the mach directory that owns it, rather than having them all dumped into a common location.b2) Can use #include "
iomap.h", a non-relative include, to pick up the shared header
Quoted 7 lines
b3) Perhaps we can simplify the current
debug.Se.g. have a commondebug-semihosting.Sthat contains the semihosting stuff, and only include that frommach-*/debug.Sif that machine uses semihosting, or similar?(b) seems like a lot of work. I don't see any advantage of (a) over just using the relative include.
Agreed.
Here is what I mentioned previously. This removes the static mapping from the platforms. This is untested and probably breaks on different DEBUG_LL options. For now, platforms call debug_ll_io_init, but once all platforms are converted, this can be called from devicemaps_init.
arch/arm/include/asm/mach/map.h +3 -0
@@ -40,6 +40,9 @@ extern void iotable_init(struct map_desc *, int);extern void vm_reserve_area_early (unsigned long addr,unsigned long size,void *caller); +extern void debug_ll_addr (unsigned long *paddr,unsigned long *vaddr); +extern void debug_ll_io_init (void ); +struct mem_type ;extern const struct mem_type *get_mem_type (unsigned int type);/*
arch/arm/kernel/debug.S +7 -0
@@ -100,6 +100,13 @@ ENTRY(printch) b 1b ENDPROC(printch) +ENTRY(debug_ll_addr) + addruart r2, r3, ip + str r2, [r0] + str r3, [r1] + mov pc, lr +ENDPROC(debug_ll_addr) + #else ENTRY(printascii)
arch/arm/mm/mmu.c +14 -0
@@ -876,6 +876,20 @@ static void __init pci_reserve_io(void)#define pci_reserve_io () do { } while (0)#endif +void __init debug_ll_io_init (void ) +{ +struct map_desc map; + +if (!IS_ENABLED (CONFIG_DEBUG_LL )) +return ; + +debug_ll_addr (&map.pfn, &map.virtual); + map.pfn =__phys_to_pfn (map.pfn); + map.length =PAGE_SIZE ; + map.type =MT_DEVICE ; +create_mapping (&map); +} +static void *__initdata vmalloc_min = (void *)(VMALLOC_END - (240 <<20 ) -VMALLOC_OFFSET );
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 4 lines · Rob Herring
Here is what I mentioned previously. This removes the static mapping from the platforms. This is untested and probably breaks on different
DEBUG_LLoptions. For now, platforms calldebug_ll_io_init, but once all platforms are converted, this can be called fromdevicemaps_init.
There's a problem with this approach. What if the platform specifically sets the debug addresses to be within one of it's existing mappings (which is definitely what you'd want to do with 8250-based UARTs attached to a PCI bus.)
This isn't going to work in that case unless we split the debug mapping from the PCI IO space mapping.
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
Quoted 6 lines · Russell King - ARM Linux
Quoted 4 lines · Rob Herring
Here is what I mentioned previously. This removes the static mapping from the platforms. This is untested and probably breaks on different
DEBUG_LLoptions. For now, platforms calldebug_ll_io_init, but once all platforms are converted, this can be called fromdevicemaps_init.
Quoted 7 lines
There's a problem with this approach. What if the platform specifically sets the debug addresses to be within one of it's existing mappings (which is definitely what you'd want to do with 8250-based UARTs attached to a PCI bus.)
This isn't going to work in that case unless we split the debug mapping from the PCI IO space mapping.
It is opt-in, so we may never get to the last step. We're still better off than now. Is there a platform that is doing this? If so, I didn't move any DEBUG_LL users to the fixed i/o space so they would still be using their old i/o space address. Having 2 mappings would work, right? You use the debug mapping initially and when PCI bus and the real console driver are up, you switch to the fixed i/o space.
This isn't just a PCI issue. You could also have a mapping that covers a block of SOC peripherals including the uart and you don't want a separate mapping.
Rob
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
In reply to Rob HerringOn 10/18/2012 07:47 AM, Rob Herring wrote:
...
Quoted 10 lines
Here is what I mentioned previously. This removes the static mapping from the platforms. This is untested and probably breaks on different
DEBUG_LLoptions. For now, platforms calldebug_ll_io_init, but once all platforms are converted, this can be called fromdevicemaps_init.arch/arm/mm/mmu.c +3
-0+void __init debug_ll_io_init (void ) +{ +struct map_desc map;
arch/arm/mm/mmu.c static void __init pci_reserve_io(void) · line 891
Quoted 10 lines
arch/arm/mm/mmu.c +10
-0+ +if (!IS_ENABLED (CONFIG_DEBUG_LL )) +return ; + +debug_ll_addr (&map.pfn, &map.virtual); + map.pfn =__phys_to_pfn (map.pfn); + map.length =PAGE_SIZE ; + map.type =MT_DEVICE ; +create_mapping (&map); +}
OK, so I just call this new function from Tegra's tegra_map_common_io(). That looks pretty neat. I'll give it a try.
PATCH v2 3/3 ARM: tegra: move debug-macro.S to include/debug
In reply to Stephen WarrenQuoted 42 lines · Stephen Warren
Quoted 25 lines · Rob Herring
Quoted 16 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Move Tegra's
debug-macro.Sover to the common debug macro directory.Move Tegra's debug UART selection menu into ARM's
Kconfig.debug, so that all related options are selected in the same place.Tegra's
uncompress.his left in mach-tegra/include/mach; it will be removed whenever Tegra is converted to multi-platform.Signed-off-by Stephen Warren <[email protected]>---
Rob, Arnd, Olof, I'd particularly like feedback on whether the following:#include "
../../mach-tegra/iomap.h"Quoted 7 lines
in
arch/arm/include/debug/tegra.Sis acceptable. I'd really like to continue to #include a header to share the defines to Tegra physical memory layout and virtual based addresses with Tegra's io.c's structmap_descentries, so they can't get out of sync. So, the include can either use the relative path as quoted above (which I don't think will cause any significant maintenance issue), or Tegra'siomap.hwould have to be moved somewhere public so e.g. <tegra-iomap.h> could be included.Quoted 2 lines
We already have a way to get the phys and virt addresses at runtime with addruart macro.
So this discussion is mainly about the implementation of addruart.
Quoted 2 lines
Couldn't we wrap this with a proper function and setup the mapping at runtime. This would move it out of the platforms.
So, the mapping already is set up at run-time at least during early boot;
__create_page_tables()inarch/arm/kernel/head.Scalls addruart and sets up an entry for it.I suppose the implication here is that the virtual address that addruart returns doesn't have to match anything that the machine later sets up using
iotable_init().
Quoted 6 lines
If that's true, then Tegra's
debug-macro.Sonly needs to know the UART physical address, and can make up almost any arbitrary virtual address (perhaps even driven by the logic you mention in your next paragraph below) and hence need not rely on Tegra'siomap.h. That said, we'd still have to manually remember not to create conflicting virtual address setups in the two places, which would still be easier with a shared header.
The virtual address has to remain the same.
A non-platform specific header for a fixed virtual address define would be cleaner than relative includes.
Quoted 8 lines
However, I then have two questions:
1) How long do the page tables set up by
__create_page_tables()last; do they stick around forever, or at least as long as the macros fromdebug-macro.Sare used, or are they replaced sometime, on the assumption that the machine's .map_io() will calliotable_init()and end up setting up the same mapping?
It works to...
[ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Linux version 3.5.4+ (rob at rob-laptop) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-1ubuntu1) ) #280 SMP Wed Oct 17 18:00:29 CDT 2012 () [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: Highbank, model: Calxeda Highbank [ 0.000000] bootconsole [earlycon0] enabled [ 0.000000] cma: CMA: reserved 16 MiB at 2e800000 [ 0.000000] Memory policy: ECC disabled, Data cache writealloc
...here with no iotable mapping.
Quoted 8 lines
2) If the virtual address returned by addruart on Tegra is different than any virtual addresses set up by Tegra's .map_io(), and Tegra's .map_io() sets up a very broad mapping that covers all peripherals including the UART, and hence the UART physical registers get mapped into two virtual addresses, will this cause any problems? IIRC, duplicate mappings can cause some issues on ARM, but perhaps that only applies to memory-like mappings, and not completely uncached IO mappings?
The virt address has to match. It can initially be a 1MB section and then replaced with a 4K entry, but the same DEBUG_LL macros are used throughout the boot process as the mapping is updated.
Duplicate mappings of different memory types is the problem. Multiple mapping of the same type are fine and common (the zero page for example).
Rob