Skip to content

Commit d1d56f8

Browse files
herraa1glikely
authored andcommitted
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 <[email protected]> Acked-by: Benjamin Herrenschmidt <[email protected]> Signed-off-by: Grant Likely <[email protected]>
1 parent b8e8efa commit d1d56f8

File tree

6 files changed

+94
-0
lines changed

6 files changed

+94
-0
lines changed

arch/powerpc/Kconfig.debug

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,14 @@ config PPC_EARLY_DEBUG_CPM
254254
using a CPM-based serial port. This assumes that the bootwrapper
255255
has run, and set up the CPM in a particular way.
256256

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+
257265
endchoice
258266

259267
config PPC_EARLY_DEBUG_44x_PHYSLOW

arch/powerpc/include/asm/udbg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ extern void __init udbg_init_btext(void);
5151
extern void __init udbg_init_44x_as1(void);
5252
extern void __init udbg_init_40x_realmode(void);
5353
extern void __init udbg_init_cpm(void);
54+
extern void __init udbg_init_usbgecko(void);
5455

5556
#endif /* __KERNEL__ */
5657
#endif /* _ASM_POWERPC_UDBG_H */

arch/powerpc/kernel/head_32.S

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ __after_mmu_off:
164164
#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
165165
bl setup_cpm_bat
166166
#endif
167+
#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
168+
bl setup_usbgecko_bat
169+
#endif
167170

168171
/*
169172
* Call setup_cpu for CPU 0 and initialize 6xx Idle
@@ -1203,6 +1206,28 @@ setup_cpm_bat:
12031206
blr
12041207
#endif
12051208

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
1228+
blr
1229+
#endif
1230+
12061231
#ifdef CONFIG_8260
12071232
/* Jump into the system reset for the rom.
12081233
* We first disable the MMU, and then jump to the ROM reset address.

arch/powerpc/kernel/udbg.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ void __init udbg_early_init(void)
6060
udbg_init_40x_realmode();
6161
#elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
6262
udbg_init_cpm();
63+
#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
64+
udbg_init_usbgecko();
6365
#endif
6466

6567
#ifdef CONFIG_PPC_EARLY_DEBUG

arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <asm/io.h>
1818
#include <asm/prom.h>
1919
#include <asm/udbg.h>
20+
#include <asm/fixmap.h>
2021

2122
#include "usbgecko_udbg.h"
2223

@@ -270,3 +271,58 @@ void __init ug_udbg_init(void)
270271
of_node_put(np);
271272
return;
272273
}
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 */
328+

arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ static inline void __init ug_udbg_init(void)
2727

2828
#endif /* CONFIG_USBGECKO_UDBG */
2929

30+
void __init udbg_init_usbgecko(void);
31+
3032
#endif /* __USBGECKO_UDBG_H */

0 commit comments

Comments
 (0)