Commit d1d56f8c1d5a622228177eca47e9dcff0498bddb

Authored by Albert Herranz
Committed by Grant Likely
1 parent b8e8efaa86

powerpc: gamecube/wii: early debugging using usbgecko

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_herranz@yahoo.es>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

Showing 6 changed files with 94 additions and 0 deletions Side-by-side Diff

arch/powerpc/Kconfig.debug
... ... @@ -254,6 +254,14 @@
254 254 using a CPM-based serial port. This assumes that the bootwrapper
255 255 has run, and set up the CPM in a particular way.
256 256  
  257 +config PPC_EARLY_DEBUG_USBGECKO
  258 + bool "Early debugging through the USB Gecko adapter"
  259 + depends on GAMECUBE_COMMON
  260 + select USBGECKO_UDBG
  261 + help
  262 + Select this to enable early debugging for Nintendo GameCube/Wii
  263 + consoles via an external USB Gecko adapter.
  264 +
257 265 endchoice
258 266  
259 267 config PPC_EARLY_DEBUG_44x_PHYSLOW
arch/powerpc/include/asm/udbg.h
... ... @@ -51,6 +51,7 @@
51 51 extern void __init udbg_init_44x_as1(void);
52 52 extern void __init udbg_init_40x_realmode(void);
53 53 extern void __init udbg_init_cpm(void);
  54 +extern void __init udbg_init_usbgecko(void);
54 55  
55 56 #endif /* __KERNEL__ */
56 57 #endif /* _ASM_POWERPC_UDBG_H */
arch/powerpc/kernel/head_32.S
... ... @@ -164,6 +164,9 @@
164 164 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
165 165 bl setup_cpm_bat
166 166 #endif
  167 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
  168 + bl setup_usbgecko_bat
  169 +#endif
167 170  
168 171 /*
169 172 * Call setup_cpu for CPU 0 and initialize 6xx Idle
... ... @@ -1200,6 +1203,28 @@
1200 1203 ori r11, r11, (BL_1M << 2) | 2
1201 1204 mtspr SPRN_DBAT1U, r11
1202 1205  
  1206 + blr
  1207 +#endif
  1208 +
  1209 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
  1210 +setup_usbgecko_bat:
  1211 + /* prepare a BAT for early io */
  1212 +#if defined(CONFIG_GAMECUBE)
  1213 + lis r8, 0x0c00
  1214 +#elif defined(CONFIG_WII)
  1215 + lis r8, 0x0d00
  1216 +#else
  1217 +#error Invalid platform for USB Gecko based early debugging.
  1218 +#endif
  1219 + /*
  1220 + * The virtual address used must match the virtual address
  1221 + * associated to the fixmap entry FIX_EARLY_DEBUG_BASE.
  1222 + */
  1223 + lis r11, 0xfffe /* top 128K */
  1224 + ori r8, r8, 0x002a /* uncached, guarded ,rw */
  1225 + ori r11, r11, 0x2 /* 128K, Vs=1, Vp=0 */
  1226 + mtspr SPRN_DBAT1L, r8
  1227 + mtspr SPRN_DBAT1U, r11
1203 1228 blr
1204 1229 #endif
1205 1230  
arch/powerpc/kernel/udbg.c
... ... @@ -60,6 +60,8 @@
60 60 udbg_init_40x_realmode();
61 61 #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
62 62 udbg_init_cpm();
  63 +#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
  64 + udbg_init_usbgecko();
63 65 #endif
64 66  
65 67 #ifdef CONFIG_PPC_EARLY_DEBUG
arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c
... ... @@ -17,6 +17,7 @@
17 17 #include <asm/io.h>
18 18 #include <asm/prom.h>
19 19 #include <asm/udbg.h>
  20 +#include <asm/fixmap.h>
20 21  
21 22 #include "usbgecko_udbg.h"
22 23  
... ... @@ -270,4 +271,58 @@
270 271 of_node_put(np);
271 272 return;
272 273 }
  274 +
  275 +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
  276 +
  277 +static phys_addr_t __init ug_early_grab_io_addr(void)
  278 +{
  279 +#if defined(CONFIG_GAMECUBE)
  280 + return 0x0c000000;
  281 +#elif defined(CONFIG_WII)
  282 + return 0x0d000000;
  283 +#else
  284 +#error Invalid platform for USB Gecko based early debugging.
  285 +#endif
  286 +}
  287 +
  288 +/*
  289 + * USB Gecko early debug support initialization for udbg.
  290 + */
  291 +void __init udbg_init_usbgecko(void)
  292 +{
  293 + void __iomem *early_debug_area;
  294 + void __iomem *exi_io_base;
  295 +
  296 + /*
  297 + * At this point we have a BAT already setup that enables I/O
  298 + * to the EXI hardware.
  299 + *
  300 + * The BAT uses a virtual address range reserved at the fixmap.
  301 + * This must match the virtual address configured in
  302 + * head_32.S:setup_usbgecko_bat().
  303 + */
  304 + early_debug_area = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE);
  305 + exi_io_base = early_debug_area + 0x00006800;
  306 +
  307 + /* try to detect a USB Gecko */
  308 + if (!ug_udbg_probe(exi_io_base))
  309 + return;
  310 +
  311 + /* we found a USB Gecko, load udbg hooks */
  312 + udbg_putc = ug_udbg_putc;
  313 + udbg_getc = ug_udbg_getc;
  314 + udbg_getc_poll = ug_udbg_getc_poll;
  315 +
  316 + /*
  317 + * Prepare again the same BAT for MMU_init.
  318 + * This allows udbg I/O to continue working after the MMU is
  319 + * turned on for real.
  320 + * It is safe to continue using the same virtual address as it is
  321 + * a reserved fixmap area.
  322 + */
  323 + setbat(1, (unsigned long)early_debug_area,
  324 + ug_early_grab_io_addr(), 128*1024, PAGE_KERNEL_NCG);
  325 +}
  326 +
  327 +#endif /* CONFIG_PPC_EARLY_DEBUG_USBGECKO */
arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h
... ... @@ -27,5 +27,7 @@
27 27  
28 28 #endif /* CONFIG_USBGECKO_UDBG */
29 29  
  30 +void __init udbg_init_usbgecko(void);
  31 +
30 32 #endif /* __USBGECKO_UDBG_H */