Message ID | 4f4baca1cd65f7949610ca901c9a8bcb1bb74cfd.1259871725.git.albert_herranz@yahoo.es (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
> +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO > +setup_usbgecko_bat: > + /* prepare a BAT for early io */ > +#if defined(CONFIG_GAMECUBE) > + lis r8, 0x0c00 > +#elif defined(CONFIG_WII) > + lis r8, 0x0d00 > +#else > +#error Invalid platform for USB Gecko based early debugging. > +#endif A kernel with both CONFIG_WII and CONFIG_GAMECUBE works fine on either, right? If so, could you please switch the two #ifs? A dual-platform kernel will be used on a Wii much more likely than on a GC. > + /* > + * The virtual address used must match the virtual address > + * associated to the fixmap entry FIX_EARLY_DEBUG_BASE. > + */ > + lis r11, 0xfffe /* top 128K */ > + ori r8, r8, 0x002a /* uncached, guarded ,rw */ > + ori r11, r11, 0x3 /* 128K */ I think you should clear Vp since the BAT mapping can survive until after user space is started; it won't hurt to remove it either way. So 2 instead of 3. And put the meaning in the comment :-) Looks fine otherwise. Segher
Segher Boessenkool wrote: >> +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO >> +setup_usbgecko_bat: >> + /* prepare a BAT for early io */ >> +#if defined(CONFIG_GAMECUBE) >> + lis r8, 0x0c00 >> +#elif defined(CONFIG_WII) >> + lis r8, 0x0d00 >> +#else >> +#error Invalid platform for USB Gecko based early debugging. >> +#endif > > A kernel with both CONFIG_WII and CONFIG_GAMECUBE works fine > on either, right? If so, could you please switch the two #ifs? > A dual-platform kernel will be used on a Wii much more likely > than on a GC. > Nope, a GameCube kernel currently doesn't work on a Wii and the same the other way around. But I can make that particular check a runtime check. The idea would be to enclose that snippet in GAMECUBE_COMMON and check the PVR. If it is a Gekko (a fixed value) then we have a GameCube, otherwise we assume a Wii. >> + /* >> + * The virtual address used must match the virtual address >> + * associated to the fixmap entry FIX_EARLY_DEBUG_BASE. >> + */ >> + lis r11, 0xfffe /* top 128K */ >> + ori r8, r8, 0x002a /* uncached, guarded ,rw */ >> + ori r11, r11, 0x3 /* 128K */ > > I think you should clear Vp since the BAT mapping can survive until > after user space is started; it won't hurt to remove it either way. > So 2 instead of 3. And put the meaning in the comment :-) This BAT is re-setup again on MMU_init, way before starting userspace. But I'll make it Vs=1, Vp=0 here too :) > > Looks fine otherwise. > Thanks. > > Segher > > Cheers, Albert
>>> +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO >>> +setup_usbgecko_bat: >>> + /* prepare a BAT for early io */ >>> +#if defined(CONFIG_GAMECUBE) >>> + lis r8, 0x0c00 >>> +#elif defined(CONFIG_WII) >>> + lis r8, 0x0d00 >>> +#else >>> +#error Invalid platform for USB Gecko based early debugging. >>> +#endif >> >> A kernel with both CONFIG_WII and CONFIG_GAMECUBE works fine >> on either, right? If so, could you please switch the two #ifs? >> A dual-platform kernel will be used on a Wii much more likely >> than on a GC. > > Nope, a GameCube kernel currently doesn't work on a Wii and the same the > other way around. What is the problem, just the wrappers? > But I can make that particular check a runtime check. Nah, don't bother, this is just early debug stuff. > The idea would be to enclose that snippet in GAMECUBE_COMMON and check the > PVR. Ugly! Segher
On Thu, 2009-12-03 at 21:35 +0100, Albert Herranz wrote: > 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> > --- > arch/powerpc/Kconfig.debug | 8 +++ > arch/powerpc/include/asm/udbg.h | 1 + > arch/powerpc/kernel/head_32.S | 25 +++++++++ > arch/powerpc/kernel/udbg.c | 2 + > arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c | 56 ++++++++++++++++++++ > arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h | 2 + > 6 files changed, 94 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..00b89c0 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,28 @@ setup_cpm_bat: > blr > #endif > > +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO > +setup_usbgecko_bat: > + /* prepare a BAT for early io */ > +#if defined(CONFIG_GAMECUBE) > + lis r8, 0x0c00 > +#elif defined(CONFIG_WII) > + lis r8, 0x0d00 > +#else > +#error Invalid platform for USB Gecko based early debugging. > +#endif > + /* > + * The virtual address used must match the virtual address > + * associated to the fixmap entry FIX_EARLY_DEBUG_BASE. > + */ > + lis r11, 0xfffe /* top 128K */ > + ori r8, r8, 0x002a /* uncached, guarded ,rw */ > + ori r11, r11, 0x3 /* 128K */ > + mtspr SPRN_DBAT1L, r8 > + mtspr SPRN_DBAT1U, r11 > + 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 ba4c7cc..edc956c 100644 > --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c > +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c > @@ -17,6 +17,7 @@ > #include <asm/io.h> > #include <asm/prom.h> > #include <asm/udbg.h> > +#include <asm/fixmap.h> > > #include "usbgecko_udbg.h" > > @@ -270,3 +271,58 @@ done: > of_node_put(np); > return; > } > + > +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO > + > +static phys_addr_t __init ug_early_grab_io_addr(void) > +{ > +#if defined(CONFIG_GAMECUBE) > + return 0x0c000000; > +#elif defined(CONFIG_WII) > + return 0x0d000000; > +#else > +#error Invalid platform for USB Gecko based early debugging. > +#endif > +} > + > +/* > + * USB Gecko early debug support initialization for udbg. > + */ > +void __init udbg_init_usbgecko(void) > +{ > + void __iomem *early_debug_area; > + void __iomem *exi_io_base; > + > + /* > + * At this point we have a BAT already setup that enables I/O > + * to the EXI hardware. > + * > + * The BAT uses a virtual address range reserved at the fixmap. > + * This must match the virtual address configured in > + * head_32.S:setup_usbgecko_bat(). > + */ > + early_debug_area = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); > + exi_io_base = early_debug_area + 0x00006800; > + > + /* try to detect a USB Gecko */ > + if (!ug_udbg_probe(exi_io_base)) > + return; > + > + /* we found a USB Gecko, load udbg hooks */ > + udbg_putc = ug_udbg_putc; > + udbg_getc = ug_udbg_getc; > + udbg_getc_poll = ug_udbg_getc_poll; > + > + /* > + * Prepare again the same BAT for MMU_init. > + * This allows udbg I/O to continue working after the MMU is > + * turned on for real. > + * It is safe to continue using the same virtual address as it is > + * a reserved fixmap area. > + */ > + setbat(1, (unsigned long)early_debug_area, > + ug_early_grab_io_addr(), 128*1024, PAGE_KERNEL_NCG); > +} > + > +#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..bb6cde4 100644 > --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h > +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h > @@ -27,4 +27,6 @@ static inline void __init ug_udbg_init(void) > > #endif /* CONFIG_USBGECKO_UDBG */ > > +void __init udbg_init_usbgecko(void); > + > #endif /* __USBGECKO_UDBG_H */
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..00b89c0 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,28 @@ setup_cpm_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO +setup_usbgecko_bat: + /* prepare a BAT for early io */ +#if defined(CONFIG_GAMECUBE) + lis r8, 0x0c00 +#elif defined(CONFIG_WII) + lis r8, 0x0d00 +#else +#error Invalid platform for USB Gecko based early debugging. +#endif + /* + * The virtual address used must match the virtual address + * associated to the fixmap entry FIX_EARLY_DEBUG_BASE. + */ + lis r11, 0xfffe /* top 128K */ + ori r8, r8, 0x002a /* uncached, guarded ,rw */ + ori r11, r11, 0x3 /* 128K */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + 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 ba4c7cc..edc956c 100644 --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c @@ -17,6 +17,7 @@ #include <asm/io.h> #include <asm/prom.h> #include <asm/udbg.h> +#include <asm/fixmap.h> #include "usbgecko_udbg.h" @@ -270,3 +271,58 @@ done: of_node_put(np); return; } + +#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO + +static phys_addr_t __init ug_early_grab_io_addr(void) +{ +#if defined(CONFIG_GAMECUBE) + return 0x0c000000; +#elif defined(CONFIG_WII) + return 0x0d000000; +#else +#error Invalid platform for USB Gecko based early debugging. +#endif +} + +/* + * USB Gecko early debug support initialization for udbg. + */ +void __init udbg_init_usbgecko(void) +{ + void __iomem *early_debug_area; + void __iomem *exi_io_base; + + /* + * At this point we have a BAT already setup that enables I/O + * to the EXI hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_usbgecko_bat(). + */ + early_debug_area = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + exi_io_base = early_debug_area + 0x00006800; + + /* try to detect a USB Gecko */ + if (!ug_udbg_probe(exi_io_base)) + return; + + /* we found a USB Gecko, load udbg hooks */ + udbg_putc = ug_udbg_putc; + udbg_getc = ug_udbg_getc; + udbg_getc_poll = ug_udbg_getc_poll; + + /* + * Prepare again the same BAT for MMU_init. + * This allows udbg I/O to continue working after the MMU is + * turned on for real. + * It is safe to continue using the same virtual address as it is + * a reserved fixmap area. + */ + setbat(1, (unsigned long)early_debug_area, + ug_early_grab_io_addr(), 128*1024, PAGE_KERNEL_NCG); +} + +#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..bb6cde4 100644 --- a/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h +++ b/arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h @@ -27,4 +27,6 @@ static inline void __init ug_udbg_init(void) #endif /* CONFIG_USBGECKO_UDBG */ +void __init udbg_init_usbgecko(void); + #endif /* __USBGECKO_UDBG_H */
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> --- arch/powerpc/Kconfig.debug | 8 +++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_32.S | 25 +++++++++ arch/powerpc/kernel/udbg.c | 2 + arch/powerpc/platforms/embedded6xx/usbgecko_udbg.c | 56 ++++++++++++++++++++ arch/powerpc/platforms/embedded6xx/usbgecko_udbg.h | 2 + 6 files changed, 94 insertions(+), 0 deletions(-)