Commit d1d56f8c1d5a622228177eca47e9dcff0498bddb
Committed by
Grant Likely
1 parent
b8e8efaa86
Exists in
master
and in
7 other branches
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
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 */ |