Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-26 Thread Segher Boessenkool

This will probably break other platforms if
CONFIG_PPC_EARLY_DEBUG_USBGECKO
is set. In general, we try hard to make it possible to build generic
kernels for multiple systems, so it would be better to also add a
runtime check here.


No Arnd. The whole point of EARLY_DEBUG is that it is -known- to break
other platforms :-) So that we can use it before we even get to probe
anything.

I am still tempted, one day, to change the kernel early init to  
setup a

stack in .bss and go straight to C to do that sort of stuff by parsing
the flat DT, this could be done using pretty much completely generic
code :-) But not right now.


No Ben.  The whole point of EARLY_DEBUG is that it _always works_,  
because

it is such trivial code.  Don't break that please, or we'll be forced to
add a REALLY_EARLY_DEBUG instead :-)


Segher

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-26 Thread Benjamin Herrenschmidt
On Thu, 2009-11-26 at 23:54 +0100, Segher Boessenkool wrote:
 No Ben.  The whole point of EARLY_DEBUG is that it _always works_,  
 because
 it is such trivial code.  Don't break that please, or we'll be forced to
 add a REALLY_EARLY_DEBUG instead :-) 

I do tend to agree but heh... temptation to do more cute hacks ... :-)

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-25 Thread Benjamin Herrenschmidt
On Sun, 2009-11-22 at 23:27 +0100, Arnd Bergmann wrote:
 
 This will probably break other platforms if
 CONFIG_PPC_EARLY_DEBUG_USBGECKO
 is set. In general, we try hard to make it possible to build generic
 kernels for multiple systems, so it would be better to also add a
 runtime check here.

No Arnd. The whole point of EARLY_DEBUG is that it is -known- to break
other platforms :-) So that we can use it before we even get to probe
anything.

I am still tempted, one day, to change the kernel early init to setup a
stack in .bss and go straight to C to do that sort of stuff by parsing
the flat DT, this could be done using pretty much completely generic
code :-) But not right now.

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-24 Thread Albert Herranz
Segher Boessenkool wrote:
 You set up DBAT1 here...
 
 +setup_usbgecko_bat:
 +/* prepare a BAT for early io */
 +lisr8, 0x0c00
 +orir8, r8, 0x002a/* uncached, guarded ,rw */
 +lisr11, 0xcc00
 +orir11, r11, 0x3/* 128K */
 +#ifdef CONFIG_WII
 +orisr8, r8, 0x0100
 +orisr11, r11, 0x0100
 +#endif
 +mtsprSPRN_DBAT1L, r8
 +mtsprSPRN_DBAT1U, r11
 +sync
 +isync
 +blr
 
 ... and again here:
 
 +void __init udbg_init_usbgecko(void)
 +{
 +unsigned long vaddr, paddr;
 +
 +#if defined(CONFIG_GAMECUBE)
 +paddr = 0x0c00;
 +#elif defined(CONFIG_WII)
 +paddr = 0x0d00;
 +#else
 +#error Invalid platform for USB Gecko based early debugging.
 +#endif
 +
 +vaddr = 0xc000 | paddr;
 +setbat(1, vaddr, paddr, 128*1024, PAGE_KERNEL_NCG);
 
 Do you need to do it twice?
 

Uhmm... I need to re-check it.
IIRC the BATs were re-initialized in between. But I'm not sure now :)

 +ug_io_base = (void __iomem *)(vaddr | 0x6814);
 
 Oh, hardcoded slot2, now i'm confused which one should be it :-)
 

early udbg  : hardcoded to mem2 slot
normal udbg : as specified in device tree

Clearer now ? ;)

Thanks for the review!
Albert
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-23 Thread Albert Herranz
Arnd Bergmann wrote:
 On Sunday 22 November 2009, Albert Herranz wrote:
 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
 +setup_usbgecko_bat:
 +/* prepare a BAT for early io */
 +lis r8, 0x0c00
 +ori r8, r8, 0x002a  /* uncached, guarded ,rw */
 +lis r11, 0xcc00
 +ori r11, r11, 0x3   /* 128K */
 +#ifdef CONFIG_WII
 +orisr8, r8, 0x0100
 +orisr11, r11, 0x0100
 +#endif
 +mtspr   SPRN_DBAT1L, r8
 +mtspr   SPRN_DBAT1U, r11
 +sync
 +isync
 +blr
 +#endif
 
 This will probably break other platforms if CONFIG_PPC_EARLY_DEBUG_USBGECKO
 is set. In general, we try hard to make it possible to build generic
 kernels for multiple systems, so it would be better to also add a runtime
 check here.
 

Ok, I see the point.
But, what makes CONFIG_PPC_EARLY_DEBUG_USBGECKO case different from 
CONFIG_PPC_EARLY_DEBUG_CPM case here?

 --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
 +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
 @@ -27,4 +27,10 @@ static inline void __init ug_udbg_init(void)
  
  #endif /* CONFIG_USBGECKO_UDBG */
  
 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
 +
 +void __init udbg_init_usbgecko(void);
 +
 +#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
 +
 
 No need to enclose a declaration in #ifdef, better leave it there
 unconditionally, unless you have an alternative version, like
 
 #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
 void __init udbg_init_usbgecko(void);
 #else /* !CONFIG_PPC_EARLY_DEBUG_USBGECKO */
 static inline void udbg_init_usbgecko(void)
 {
 }
 #endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
 
 That style is now more common than having additional #ifdefs
 in the code using the function.

I'll fix that too. Thanks.

Cheers,
Albert
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-23 Thread Arnd Bergmann
On Monday 23 November 2009 19:10:55 Albert Herranz wrote:
 
 Arnd Bergmann wrote:
  On Sunday 22 November 2009, Albert Herranz wrote:
  +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
  +setup_usbgecko_bat:
  +/* prepare a BAT for early io */
  +lis r8, 0x0c00
  +ori r8, r8, 0x002a  /* uncached, guarded ,rw */
  +lis r11, 0xcc00
  +ori r11, r11, 0x3   /* 128K */
  +#ifdef CONFIG_WII
  +orisr8, r8, 0x0100
  +orisr11, r11, 0x0100
  +#endif
  +mtspr   SPRN_DBAT1L, r8
  +mtspr   SPRN_DBAT1U, r11
  +sync
  +isync
  +blr
  +#endif
  
  This will probably break other platforms if CONFIG_PPC_EARLY_DEBUG_USBGECKO
  is set. In general, we try hard to make it possible to build generic
  kernels for multiple systems, so it would be better to also add a runtime
  check here.
  
 
 Ok, I see the point.
 But, what makes CONFIG_PPC_EARLY_DEBUG_USBGECKO case different from 
 CONFIG_PPC_EARLY_DEBUG_CPM case here?
 

I looked again, and the help text for PPC_EARLY_DEBUG makes it very clear that
are never usable on a production kernel. Just leave your code the way it is 
here,
but if there are other places that prevent portable kernels, those should be 
fixed.
I'm not aware of any of those right now.

Arnd 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-23 Thread Segher Boessenkool

You set up DBAT1 here...


+setup_usbgecko_bat:
+   /* prepare a BAT for early io */
+   lis r8, 0x0c00
+   ori r8, r8, 0x002a  /* uncached, guarded ,rw */
+   lis r11, 0xcc00
+   ori r11, r11, 0x3   /* 128K */
+#ifdef CONFIG_WII
+   orisr8, r8, 0x0100
+   orisr11, r11, 0x0100
+#endif
+   mtspr   SPRN_DBAT1L, r8
+   mtspr   SPRN_DBAT1U, r11
+   sync
+   isync
+   blr


... and again here:


+void __init udbg_init_usbgecko(void)
+{
+   unsigned long vaddr, paddr;
+
+#if defined(CONFIG_GAMECUBE)
+   paddr = 0x0c00;
+#elif defined(CONFIG_WII)
+   paddr = 0x0d00;
+#else
+#error Invalid platform for USB Gecko based early debugging.
+#endif
+
+   vaddr = 0xc000 | paddr;
+   setbat(1, vaddr, paddr, 128*1024, PAGE_KERNEL_NCG);


Do you need to do it twice?


+   ug_io_base = (void __iomem *)(vaddr | 0x6814);


Oh, hardcoded slot2, now i'm confused which one should be it :-)


Segher

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-22 Thread Albert Herranz
Add support for using the USB Gecko adapter as an early debugging
console on the Nintendo GameCube and Wii video game consoles.
The USB Gecko is a 3rd party memory card interface adapter that provides
a EXI (External Interface) to USB serial converter.

Signed-off-by: Albert Herranz albert_herr...@yahoo.es
---
 arch/powerpc/Kconfig.debug |8 +
 arch/powerpc/include/asm/udbg.h|1 +
 arch/powerpc/kernel/head_32.S  |   21 
 arch/powerpc/kernel/udbg.c |2 +
 arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c |   33 
 arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h |6 +++
 6 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index 3b10051..11e385b 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -254,6 +254,14 @@ config PPC_EARLY_DEBUG_CPM
  using a CPM-based serial port.  This assumes that the bootwrapper
  has run, and set up the CPM in a particular way.
 
+config PPC_EARLY_DEBUG_USBGECKO
+   bool Early debugging through the USB Gecko adapter
+   depends on GAMECUBE_COMMON
+   select USBGECKO_UDBG
+   help
+ Select this to enable early debugging for Nintendo GameCube/Wii
+ consoles via an external USB Gecko adapter.
+
 endchoice
 
 config PPC_EARLY_DEBUG_44x_PHYSLOW
diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h
index cd21e5e..11ae699 100644
--- a/arch/powerpc/include/asm/udbg.h
+++ b/arch/powerpc/include/asm/udbg.h
@@ -51,6 +51,7 @@ extern void __init udbg_init_btext(void);
 extern void __init udbg_init_44x_as1(void);
 extern void __init udbg_init_40x_realmode(void);
 extern void __init udbg_init_cpm(void);
+extern void __init udbg_init_usbgecko(void);
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index 829c3fe..83a0b79 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -164,6 +164,9 @@ __after_mmu_off:
 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
bl  setup_cpm_bat
 #endif
+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
+   bl  setup_usbgecko_bat
+#endif
 
 /*
  * Call setup_cpu for CPU 0 and initialize 6xx Idle
@@ -1203,6 +1206,24 @@ setup_cpm_bat:
blr
 #endif
 
+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
+setup_usbgecko_bat:
+   /* prepare a BAT for early io */
+   lis r8, 0x0c00
+   ori r8, r8, 0x002a  /* uncached, guarded ,rw */
+   lis r11, 0xcc00
+   ori r11, r11, 0x3   /* 128K */
+#ifdef CONFIG_WII
+   orisr8, r8, 0x0100
+   orisr11, r11, 0x0100
+#endif
+   mtspr   SPRN_DBAT1L, r8
+   mtspr   SPRN_DBAT1U, r11
+   sync
+   isync
+   blr
+#endif
+
 #ifdef CONFIG_8260
 /* Jump into the system reset for the rom.
  * We first disable the MMU, and then jump to the ROM reset address.
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c
index fc9af47..e39cad8 100644
--- a/arch/powerpc/kernel/udbg.c
+++ b/arch/powerpc/kernel/udbg.c
@@ -60,6 +60,8 @@ void __init udbg_early_init(void)
udbg_init_40x_realmode();
 #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
udbg_init_cpm();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
+   udbg_init_usbgecko();
 #endif
 
 #ifdef CONFIG_PPC_EARLY_DEBUG
diff --git a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c 
b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
index 49f86e8..9f5e7ed 100644
--- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
+++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
@@ -234,6 +234,9 @@ void __init ug_udbg_init(void)
struct device_node *stdout;
const char *path;
 
+   if (ug_io_base)
+   udbg_printf(%s: early - final\n, __func__);
+
if (!of_chosen) {
udbg_printf(%s: missing of_chosen\n, __func__);
goto done;
@@ -283,3 +286,33 @@ done:
of_node_put(np);
return;
 }
+
+#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
+
+/*
+ * USB Gecko early debug support initialization for udbg.
+ *
+ */
+void __init udbg_init_usbgecko(void)
+{
+   unsigned long vaddr, paddr;
+
+#if defined(CONFIG_GAMECUBE)
+   paddr = 0x0c00;
+#elif defined(CONFIG_WII)
+   paddr = 0x0d00;
+#else
+#error Invalid platform for USB Gecko based early debugging.
+#endif
+
+   vaddr = 0xc000 | paddr;
+   setbat(1, vaddr, paddr, 128*1024, PAGE_KERNEL_NCG);
+
+   ug_io_base = (void __iomem *)(vaddr | 0x6814);
+
+   udbg_putc = ug_udbg_putc;
+   udbg_getc = ug_udbg_getc;
+   udbg_getc_poll = ug_udbg_getc_poll;
+}
+
+#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
diff --git a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h 
b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
index 3929de3..98034ee 100644
--- 

Re: [RFC PATCH 10/19] powerpc: gamecube/wii: early debugging using usbgecko

2009-11-22 Thread Arnd Bergmann
On Sunday 22 November 2009, Albert Herranz wrote:
 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
 +setup_usbgecko_bat:
 + /* prepare a BAT for early io */
 + lis r8, 0x0c00
 + ori r8, r8, 0x002a  /* uncached, guarded ,rw */
 + lis r11, 0xcc00
 + ori r11, r11, 0x3   /* 128K */
 +#ifdef CONFIG_WII
 + orisr8, r8, 0x0100
 + orisr11, r11, 0x0100
 +#endif
 + mtspr   SPRN_DBAT1L, r8
 + mtspr   SPRN_DBAT1U, r11
 + sync
 + isync
 + blr
 +#endif

This will probably break other platforms if CONFIG_PPC_EARLY_DEBUG_USBGECKO
is set. In general, we try hard to make it possible to build generic
kernels for multiple systems, so it would be better to also add a runtime
check here.

 --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
 +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
 @@ -27,4 +27,10 @@ static inline void __init ug_udbg_init(void)
  
  #endif /* CONFIG_USBGECKO_UDBG */
  
 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
 +
 +void __init udbg_init_usbgecko(void);
 +
 +#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
 +

No need to enclose a declaration in #ifdef, better leave it there
unconditionally, unless you have an alternative version, like

#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
void __init udbg_init_usbgecko(void);
#else /* !CONFIG_PPC_EARLY_DEBUG_USBGECKO */
static inline void udbg_init_usbgecko(void)
{
}
#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */

That style is now more common than having additional #ifdefs
in the code using the function.

Arnd 
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev