diff mbox

[RESEND] ARM: debug: add support for Palmchip 16550-like UART

Message ID 1445950678-16097-1-git-send-email-mans@mansr.com (mailing list archive)
State New, archived
Headers show

Commit Message

Måns Rullgård Oct. 27, 2015, 12:57 p.m. UTC
Some SoCs have a Palmchip UART with a non-standard register layout.
This allows the debug console to work with these.

Signed-off-by: Mans Rullgard <mans@mansr.com>
---
 arch/arm/Kconfig.debug        |  8 ++++++++
 arch/arm/include/debug/8250.S | 12 ++++++++++++
 2 files changed, 20 insertions(+)

Comments

Mason Nov. 4, 2015, 3:39 p.m. UTC | #1
On 27/10/2015 13:57, Mans Rullgard wrote:

> Some SoCs have a Palmchip UART with a non-standard register layout.
> This allows the debug console to work with these.
> 
> Signed-off-by: Mans Rullgard <mans@mansr.com>
> ---
>  arch/arm/Kconfig.debug        |  8 ++++++++
>  arch/arm/include/debug/8250.S | 12 ++++++++++++
>  2 files changed, 20 insertions(+)
> 
> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
> index 0cfd7f9..9039fff 100644
> --- a/arch/arm/Kconfig.debug
> +++ b/arch/arm/Kconfig.debug
> @@ -1597,6 +1597,14 @@ config DEBUG_UART_8250_WORD
>  		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
>  		DEBUG_BRCMSTB_UART
>  
> +config DEBUG_UART_8250_PALMCHIP
> +	bool "8250 UART is Palmchip variant"
> +	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250

I am 100% clueless about the UART sequence in Linux.

There's earlyprintk, the boot console (polled?), the "full-blown"
console (with IRQs)...

If I want earlyprintk, I have to enable DEBUG_LL (?) so I'll have
DEBUG_LL_UART_8250, right? There's no way to pick DEBUG_UART_8250
in menuconfig, is there?

So I picked the following options:

CONFIG_DEBUG_LL=y
# CONFIG_DEBUG_ICEDCC is not set
# CONFIG_DEBUG_SEMIHOSTING is not set
CONFIG_DEBUG_LL_UART_8250=y
# CONFIG_DEBUG_LL_UART_PL01X is not set
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
# CONFIG_DEBUG_UART_8250 is not set
# CONFIG_DEBUG_UART_BCM63XX is not set
CONFIG_DEBUG_UART_PHYS=0x10700
CONFIG_DEBUG_UART_VIRT=0xf0010700
CONFIG_DEBUG_UART_8250_SHIFT=2
CONFIG_DEBUG_UART_8250_WORD=y
CONFIG_DEBUG_UART_8250_PALMCHIP=y
# CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
CONFIG_DEBUG_UNCOMPRESS=y
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
CONFIG_EARLY_PRINTK=y

I suppose I have to provide DEBUG_UART_PHYS because it needs
the address before it can parse the DT? But how am I supposed
to know the virtual address? Isn't that from iomap(UART_PHYS)?

'make' wouldn't let me proceed unless I gave something...

Then I have to add earlyprintk to my boot command line, right?
Do I need to specify more than that?
According to the documentation,

	earlyprintk=	[X86,SH,BLACKFIN,ARM,M68k]
			earlyprintk=vga
			earlyprintk=efi
			earlyprintk=xen
			earlyprintk=serial[,ttySn[,baudrate]]
			earlyprintk=serial[,0x...[,baudrate]]
			earlyprintk=ttySn[,baudrate]
			earlyprintk=dbgp[debugController#]
			earlyprintk=pciserial,bus:device.function[,baudrate]

> +	help
> +	  Palmchip provides a UART implementation compatible with 16550
> +	  except for having a different register layout.  Say Y here if
> +	  the debug UART is of this type.
> +
>  config DEBUG_UART_8250_FLOW_CONTROL
>  	bool "Enable flow control for 8250 UART"
>  	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
> diff --git a/arch/arm/include/debug/8250.S b/arch/arm/include/debug/8250.S
> index 7f7446f..2332f40 100644
> --- a/arch/arm/include/debug/8250.S
> +++ b/arch/arm/include/debug/8250.S
> @@ -9,6 +9,18 @@
>   */
>  #include <linux/serial_reg.h>
>  
> +#ifdef CONFIG_DEBUG_UART_8250_PALMCHIP
> +
> +#undef UART_TX
> +#undef UART_LSR
> +#undef UART_MSR
> +
> +#define UART_TX 1
> +#define UART_LSR 7
> +#define UART_MSR 8
> +
> +#endif
> +
>  		.macro	addruart, rp, rv, tmp
>  		ldr	\rp, =CONFIG_DEBUG_UART_PHYS
>  		ldr	\rv, =CONFIG_DEBUG_UART_VIRT
> 

Regards.
Måns Rullgård Nov. 4, 2015, 3:47 p.m. UTC | #2
Mason <slash.tmp@free.fr> writes:

> On 27/10/2015 13:57, Mans Rullgard wrote:
>
>> Some SoCs have a Palmchip UART with a non-standard register layout.
>> This allows the debug console to work with these.
>> 
>> Signed-off-by: Mans Rullgard <mans@mansr.com>
>> ---
>>  arch/arm/Kconfig.debug        |  8 ++++++++
>>  arch/arm/include/debug/8250.S | 12 ++++++++++++
>>  2 files changed, 20 insertions(+)
>> 
>> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
>> index 0cfd7f9..9039fff 100644
>> --- a/arch/arm/Kconfig.debug
>> +++ b/arch/arm/Kconfig.debug
>> @@ -1597,6 +1597,14 @@ config DEBUG_UART_8250_WORD
>>  		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
>>  		DEBUG_BRCMSTB_UART
>>  
>> +config DEBUG_UART_8250_PALMCHIP
>> +	bool "8250 UART is Palmchip variant"
>> +	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
>
> I am 100% clueless about the UART sequence in Linux.
>
> There's earlyprintk, the boot console (polled?), the "full-blown"
> console (with IRQs)...
>
> If I want earlyprintk, I have to enable DEBUG_LL (?) so I'll have
> DEBUG_LL_UART_8250, right? There's no way to pick DEBUG_UART_8250
> in menuconfig, is there?
>
> So I picked the following options:
>
> CONFIG_DEBUG_LL=y
> # CONFIG_DEBUG_ICEDCC is not set
> # CONFIG_DEBUG_SEMIHOSTING is not set
> CONFIG_DEBUG_LL_UART_8250=y
> # CONFIG_DEBUG_LL_UART_PL01X is not set
> CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
> # CONFIG_DEBUG_UART_8250 is not set
> # CONFIG_DEBUG_UART_BCM63XX is not set
> CONFIG_DEBUG_UART_PHYS=0x10700
> CONFIG_DEBUG_UART_VIRT=0xf0010700
> CONFIG_DEBUG_UART_8250_SHIFT=2
> CONFIG_DEBUG_UART_8250_WORD=y
> CONFIG_DEBUG_UART_8250_PALMCHIP=y
> # CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
> CONFIG_DEBUG_UNCOMPRESS=y
> CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
> CONFIG_EARLY_PRINTK=y

Those are the settings I use.

> I suppose I have to provide DEBUG_UART_PHYS because it needs
> the address before it can parse the DT? But how am I supposed
> to know the virtual address? Isn't that from iomap(UART_PHYS)?

The decompression code and early setup don't have that luxury.

> 'make' wouldn't let me proceed unless I gave something...
>
> Then I have to add earlyprintk to my boot command line, right?
> Do I need to specify more than that?

Just earlyprintk without any parameters works.
Mason Nov. 4, 2015, 3:59 p.m. UTC | #3
On 04/11/2015 16:47, Måns Rullgård wrote:

> Mason writes:
> 
>> On 27/10/2015 13:57, Mans Rullgard wrote:
>>
>>> Some SoCs have a Palmchip UART with a non-standard register layout.
>>> This allows the debug console to work with these.
>>>
>>> Signed-off-by: Mans Rullgard <mans@mansr.com>
>>> ---
>>>  arch/arm/Kconfig.debug        |  8 ++++++++
>>>  arch/arm/include/debug/8250.S | 12 ++++++++++++
>>>  2 files changed, 20 insertions(+)
>>>
>>> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
>>> index 0cfd7f9..9039fff 100644
>>> --- a/arch/arm/Kconfig.debug
>>> +++ b/arch/arm/Kconfig.debug
>>> @@ -1597,6 +1597,14 @@ config DEBUG_UART_8250_WORD
>>>  		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
>>>  		DEBUG_BRCMSTB_UART
>>>  
>>> +config DEBUG_UART_8250_PALMCHIP
>>> +	bool "8250 UART is Palmchip variant"
>>> +	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
>>
>> I am 100% clueless about the UART sequence in Linux.
>>
>> There's earlyprintk, the boot console (polled?), the "full-blown"
>> console (with IRQs)...
>>
>> If I want earlyprintk, I have to enable DEBUG_LL (?) so I'll have
>> DEBUG_LL_UART_8250, right? There's no way to pick DEBUG_UART_8250
>> in menuconfig, is there?
>>
>> So I picked the following options:
>>
>> CONFIG_DEBUG_LL=y
>> # CONFIG_DEBUG_ICEDCC is not set
>> # CONFIG_DEBUG_SEMIHOSTING is not set
>> CONFIG_DEBUG_LL_UART_8250=y
>> # CONFIG_DEBUG_LL_UART_PL01X is not set
>> CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
>> # CONFIG_DEBUG_UART_8250 is not set
>> # CONFIG_DEBUG_UART_BCM63XX is not set
>> CONFIG_DEBUG_UART_PHYS=0x10700
>> CONFIG_DEBUG_UART_VIRT=0xf0010700
>> CONFIG_DEBUG_UART_8250_SHIFT=2
>> CONFIG_DEBUG_UART_8250_WORD=y
>> CONFIG_DEBUG_UART_8250_PALMCHIP=y
>> # CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
>> CONFIG_DEBUG_UNCOMPRESS=y
>> CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
>> CONFIG_EARLY_PRINTK=y
> 
> Those are the settings I use.
> 
>> I suppose I have to provide DEBUG_UART_PHYS because it needs
>> the address before it can parse the DT? But how am I supposed
>> to know the virtual address? Isn't that from iomap(UART_PHYS)?
> 
> The decompression code and early setup don't have that luxury.

But how am I supposed to compute the virtual address?
Can I set DEBUG_UART_VIRT to 0xdeadbeef? :-)

Also is it expected that setting DEBUG_LL forces make to recompile
every source file in the source tree?

Regards.
Måns Rullgård Nov. 4, 2015, 4:08 p.m. UTC | #4
Mason <slash.tmp@free.fr> writes:

> On 04/11/2015 16:47, Måns Rullgård wrote:
>
>> Mason writes:
>> 
>>> On 27/10/2015 13:57, Mans Rullgard wrote:
>>>
>>>> Some SoCs have a Palmchip UART with a non-standard register layout.
>>>> This allows the debug console to work with these.
>>>>
>>>> Signed-off-by: Mans Rullgard <mans@mansr.com>
>>>> ---
>>>>  arch/arm/Kconfig.debug        |  8 ++++++++
>>>>  arch/arm/include/debug/8250.S | 12 ++++++++++++
>>>>  2 files changed, 20 insertions(+)
>>>>
>>>> diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
>>>> index 0cfd7f9..9039fff 100644
>>>> --- a/arch/arm/Kconfig.debug
>>>> +++ b/arch/arm/Kconfig.debug
>>>> @@ -1597,6 +1597,14 @@ config DEBUG_UART_8250_WORD
>>>>  		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
>>>>  		DEBUG_BRCMSTB_UART
>>>>  
>>>> +config DEBUG_UART_8250_PALMCHIP
>>>> +	bool "8250 UART is Palmchip variant"
>>>> +	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
>>>
>>> I am 100% clueless about the UART sequence in Linux.
>>>
>>> There's earlyprintk, the boot console (polled?), the "full-blown"
>>> console (with IRQs)...
>>>
>>> If I want earlyprintk, I have to enable DEBUG_LL (?) so I'll have
>>> DEBUG_LL_UART_8250, right? There's no way to pick DEBUG_UART_8250
>>> in menuconfig, is there?
>>>
>>> So I picked the following options:
>>>
>>> CONFIG_DEBUG_LL=y
>>> # CONFIG_DEBUG_ICEDCC is not set
>>> # CONFIG_DEBUG_SEMIHOSTING is not set
>>> CONFIG_DEBUG_LL_UART_8250=y
>>> # CONFIG_DEBUG_LL_UART_PL01X is not set
>>> CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
>>> # CONFIG_DEBUG_UART_8250 is not set
>>> # CONFIG_DEBUG_UART_BCM63XX is not set
>>> CONFIG_DEBUG_UART_PHYS=0x10700
>>> CONFIG_DEBUG_UART_VIRT=0xf0010700
>>> CONFIG_DEBUG_UART_8250_SHIFT=2
>>> CONFIG_DEBUG_UART_8250_WORD=y
>>> CONFIG_DEBUG_UART_8250_PALMCHIP=y
>>> # CONFIG_DEBUG_UART_8250_FLOW_CONTROL is not set
>>> CONFIG_DEBUG_UNCOMPRESS=y
>>> CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
>>> CONFIG_EARLY_PRINTK=y
>> 
>> Those are the settings I use.
>> 
>>> I suppose I have to provide DEBUG_UART_PHYS because it needs
>>> the address before it can parse the DT? But how am I supposed
>>> to know the virtual address? Isn't that from iomap(UART_PHYS)?
>> 
>> The decompression code and early setup don't have that luxury.
>
> But how am I supposed to compute the virtual address?
> Can I set DEBUG_UART_VIRT to 0xdeadbeef? :-)

Add 0xf0000000.

> Also is it expected that setting DEBUG_LL forces make to recompile
> every source file in the source tree?

Apparently. :)
Arnd Bergmann Nov. 4, 2015, 8:39 p.m. UTC | #5
On Tuesday 27 October 2015 12:57:57 Mans Rullgard wrote:
> --- a/arch/arm/include/debug/8250.S
> +++ b/arch/arm/include/debug/8250.S
> @@ -9,6 +9,18 @@
>   */
>  #include <linux/serial_reg.h>
>  
> +#ifdef CONFIG_DEBUG_UART_8250_PALMCHIP
> +
> +#undef UART_TX
> +#undef UART_LSR
> +#undef UART_MSR
> +
> +#define UART_TX 1
> +#define UART_LSR 7
> +#define UART_MSR 8
> +
> +#endif
> 

Maybe use a separate file instead of an #ifdef?


Something like

arch/arm/include/debug/8250-palmchip.S:

#include <linux/serial_reg.h>
 
#undef UART_TX
#undef UART_LSR
#undef UART_MSR

#define UART_TX 1
#define UART_LSR 7
#define UART_MSR 8

#include "8250.S"



	Arnd
Måns Rullgård Nov. 4, 2015, 9:41 p.m. UTC | #6
Arnd Bergmann <arnd@arndb.de> writes:

> On Tuesday 27 October 2015 12:57:57 Mans Rullgard wrote:
>> --- a/arch/arm/include/debug/8250.S
>> +++ b/arch/arm/include/debug/8250.S
>> @@ -9,6 +9,18 @@
>>   */
>>  #include <linux/serial_reg.h>
>>  
>> +#ifdef CONFIG_DEBUG_UART_8250_PALMCHIP
>> +
>> +#undef UART_TX
>> +#undef UART_LSR
>> +#undef UART_MSR
>> +
>> +#define UART_TX 1
>> +#define UART_LSR 7
>> +#define UART_MSR 8
>> +
>> +#endif
>> 
>
> Maybe use a separate file instead of an #ifdef?
>
> Something like
>
> arch/arm/include/debug/8250-palmchip.S:
>
> #include <linux/serial_reg.h>
>  
> #undef UART_TX
> #undef UART_LSR
> #undef UART_MSR
>
> #define UART_TX 1
> #define UART_LSR 7
> #define UART_MSR 8
>
> #include "8250.S"

Good idea.  I'll make a new patch.
diff mbox

Patch

diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index 0cfd7f9..9039fff 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -1597,6 +1597,14 @@  config DEBUG_UART_8250_WORD
 		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2 || \
 		DEBUG_BRCMSTB_UART
 
+config DEBUG_UART_8250_PALMCHIP
+	bool "8250 UART is Palmchip variant"
+	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
+	help
+	  Palmchip provides a UART implementation compatible with 16550
+	  except for having a different register layout.  Say Y here if
+	  the debug UART is of this type.
+
 config DEBUG_UART_8250_FLOW_CONTROL
 	bool "Enable flow control for 8250 UART"
 	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
diff --git a/arch/arm/include/debug/8250.S b/arch/arm/include/debug/8250.S
index 7f7446f..2332f40 100644
--- a/arch/arm/include/debug/8250.S
+++ b/arch/arm/include/debug/8250.S
@@ -9,6 +9,18 @@ 
  */
 #include <linux/serial_reg.h>
 
+#ifdef CONFIG_DEBUG_UART_8250_PALMCHIP
+
+#undef UART_TX
+#undef UART_LSR
+#undef UART_MSR
+
+#define UART_TX 1
+#define UART_LSR 7
+#define UART_MSR 8
+
+#endif
+
 		.macro	addruart, rp, rv, tmp
 		ldr	\rp, =CONFIG_DEBUG_UART_PHYS
 		ldr	\rv, =CONFIG_DEBUG_UART_VIRT