Re: [RFC PATCH v2 03/11] powerpc: gamecube: bootwrapper bits

2009-12-01 Thread Segher Boessenkool
Add support for the Nintendo GameCube video game console to the  
powerpc

bootwrapper.

dtbImage.gamecube is a wrapped image that contains a flat device tree,
an entry point compatible with SDload, and an optional initrd.

Signed-off-by: Albert Herranz 

Acked-by: Segher Boessenkool 


---
v1 -> v2
- Use a separate asm file for the entry point code.
  Suggestion by Segher Boessenkool and Benjamin Herrenschmidt.
- Do not make assumptions about the state of the cache and MMU on
  entry, eliminating dependencies on a particular bootloader.
  Suggestion by Segher Boessenkool.
- Use consistently the same (easier to read) form of bcl to load the
  next instruction address in LR. Suggestion by Segher Boessenkool.
- Identity map I/O memory too to avoid confusions.
  Suggestion by Segher Boessenkool.
- Probe dinamically for usbgecko. Suggestion by Segher Boessenkool.

 arch/powerpc/boot/Makefile|4 +-
 arch/powerpc/boot/gamecube-head.S |  111 ++ 
+++

 arch/powerpc/boot/gamecube.c  |   35 
 arch/powerpc/boot/wrapper |4 +
 4 files changed, 153 insertions(+), 1 deletions(-)
 create mode 100644 arch/powerpc/boot/gamecube-head.S
 create mode 100644 arch/powerpc/boot/gamecube.c

diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 44bce21..3e70aab 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -76,7 +76,8 @@ src-plat := of.c cuboot-52xx.c cuboot-824x.c  
cuboot-83xx.c cuboot-85xx.c holly.c

cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c 
\
virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \
-   cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c
+   cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c \
+   gamecube-head.S gamecube.c
 src-boot := $(src-wlib) $(src-plat) empty.c

 src-boot := $(addprefix $(obj)/, $(src-boot))
@@ -254,6 +255,7 @@ image-$(CONFIG_KSI8560) += 
cuImage.ksi8560
 image-$(CONFIG_STORCENTER) += cuImage.storcenter
 image-$(CONFIG_MPC7448HPC2)+= cuImage.mpc7448hpc2
 image-$(CONFIG_PPC_C2K)+= cuImage.c2k
+image-$(CONFIG_GAMECUBE)   += dtbImage.gamecube

 # Board port in arch/powerpc/platform/amigaone/Kconfig
 image-$(CONFIG_AMIGAONE)   += cuImage.amigaone
diff --git a/arch/powerpc/boot/gamecube-head.S b/arch/powerpc/boot/ 
gamecube-head.S

new file mode 100644
index 000..65a9b2a
--- /dev/null
+++ b/arch/powerpc/boot/gamecube-head.S
@@ -0,0 +1,111 @@
+/*
+ * arch/powerpc/boot/gamecube-head.S
+ *
+ * Nintendo GameCube bootwrapper entry.
+ * Copyright (C) 2004-2009 The GameCube Linux Team
+ * Copyright (C) 2008,2009 Albert Herranz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ */
+
+#include "ppc_asm.h"
+
+/*
+ * The entry code does no assumptions regarding:
+ * - if the data and instruction caches are enabled or not
+ * - if the MMU is enabled or not
+ *
+ * We enable the caches if not already enabled, enable the MMU  
with an

+ * identity mapping scheme and jump to the start code.
+ */
+
+   .text
+
+   .globl _zimage_start
+_zimage_start:
+
+   /* turn the MMU off */
+   mfmsr   9
+   rlwinm  9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */
+   bcl 20, 31, 1f
+1:
+   mflr8
+   clrlwi  8, 8, 3 /* convert to a real address */
+   addi8, 8, _mmu_off - 1b
+   mtsrr0  8
+   mtsrr1  9
+   rfi
+_mmu_off:
+   /* MMU disabled */
+
+   /* setup BATs */
+   isync
+   li  8, 0
+   mtspr   0x210, 8/* IBAT0U */
+   mtspr   0x212, 8/* IBAT1U */
+   mtspr   0x214, 8/* IBAT2U */
+   mtspr   0x216, 8/* IBAT3U */
+   mtspr   0x218, 8/* DBAT0U */
+   mtspr   0x21a, 8/* DBAT1U */
+   mtspr   0x21c, 8/* DBAT2U */
+   mtspr   0x21e, 8/* DBAT3U */
+
+   li  8, 0x01ff   /* first 16MiB */
+   li  9, 0x0002   /* rw */
+   mtspr   0x211, 9/* IBAT0L */
+   mtspr   0x210, 8/* IBAT0U */
+   mtspr   0x219, 9/* DBAT0L */
+   mtspr   0x218, 8/* DBAT0U */
+
+   lis 8, 0x0c00   /* I/O mem */
+   ori 8, 8, 0x3ff /* 32MiB */
+   lis 9, 0x0c00
+   ori 9, 9, 0x002a/* uncached, guarded, rw */
+   mtspr   0x21b, 9/* DBAT1L */
+   mtspr   0x21a, 8/* DBAT1U */
+
+   lis 8, 0x0100   /* next 8MiB */
+   ori 8, 8, 0x00ff/* 8MiB */
+   lis 9, 0x0100
+   ori 9, 9, 0x0002/* rw */
+   mtspr   0

[RFC PATCH v2 03/11] powerpc: gamecube: bootwrapper bits

2009-11-28 Thread Albert Herranz
Add support for the Nintendo GameCube video game console to the powerpc
bootwrapper.

dtbImage.gamecube is a wrapped image that contains a flat device tree,
an entry point compatible with SDload, and an optional initrd.

Signed-off-by: Albert Herranz 
---
v1 -> v2
- Use a separate asm file for the entry point code.
  Suggestion by Segher Boessenkool and Benjamin Herrenschmidt.
- Do not make assumptions about the state of the cache and MMU on
  entry, eliminating dependencies on a particular bootloader.
  Suggestion by Segher Boessenkool.
- Use consistently the same (easier to read) form of bcl to load the
  next instruction address in LR. Suggestion by Segher Boessenkool.
- Identity map I/O memory too to avoid confusions.
  Suggestion by Segher Boessenkool.
- Probe dinamically for usbgecko. Suggestion by Segher Boessenkool.

 arch/powerpc/boot/Makefile|4 +-
 arch/powerpc/boot/gamecube-head.S |  111 +
 arch/powerpc/boot/gamecube.c  |   35 
 arch/powerpc/boot/wrapper |4 +
 4 files changed, 153 insertions(+), 1 deletions(-)
 create mode 100644 arch/powerpc/boot/gamecube-head.S
 create mode 100644 arch/powerpc/boot/gamecube.c

diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 44bce21..3e70aab 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -76,7 +76,8 @@ src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c 
cuboot-85xx.c holly.c
cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c 
\
virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c \
-   cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c
+   cuboot-acadia.c cuboot-amigaone.c cuboot-kilauea.c \
+   gamecube-head.S gamecube.c
 src-boot := $(src-wlib) $(src-plat) empty.c
 
 src-boot := $(addprefix $(obj)/, $(src-boot))
@@ -254,6 +255,7 @@ image-$(CONFIG_KSI8560) += 
cuImage.ksi8560
 image-$(CONFIG_STORCENTER) += cuImage.storcenter
 image-$(CONFIG_MPC7448HPC2)+= cuImage.mpc7448hpc2
 image-$(CONFIG_PPC_C2K)+= cuImage.c2k
+image-$(CONFIG_GAMECUBE)   += dtbImage.gamecube
 
 # Board port in arch/powerpc/platform/amigaone/Kconfig
 image-$(CONFIG_AMIGAONE)   += cuImage.amigaone
diff --git a/arch/powerpc/boot/gamecube-head.S 
b/arch/powerpc/boot/gamecube-head.S
new file mode 100644
index 000..65a9b2a
--- /dev/null
+++ b/arch/powerpc/boot/gamecube-head.S
@@ -0,0 +1,111 @@
+/*
+ * arch/powerpc/boot/gamecube-head.S
+ *
+ * Nintendo GameCube bootwrapper entry.
+ * Copyright (C) 2004-2009 The GameCube Linux Team
+ * Copyright (C) 2008,2009 Albert Herranz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ */
+
+#include "ppc_asm.h"
+
+/*
+ * The entry code does no assumptions regarding:
+ * - if the data and instruction caches are enabled or not
+ * - if the MMU is enabled or not
+ *
+ * We enable the caches if not already enabled, enable the MMU with an
+ * identity mapping scheme and jump to the start code.
+ */
+
+   .text
+
+   .globl _zimage_start
+_zimage_start:
+
+   /* turn the MMU off */
+   mfmsr   9
+   rlwinm  9, 9, 0, ~((1<<4)|(1<<5)) /* MSR_DR|MSR_IR */
+   bcl 20, 31, 1f
+1:
+   mflr8
+   clrlwi  8, 8, 3 /* convert to a real address */
+   addi8, 8, _mmu_off - 1b
+   mtsrr0  8
+   mtsrr1  9
+   rfi
+_mmu_off:
+   /* MMU disabled */
+
+   /* setup BATs */
+   isync
+   li  8, 0
+   mtspr   0x210, 8/* IBAT0U */
+   mtspr   0x212, 8/* IBAT1U */
+   mtspr   0x214, 8/* IBAT2U */
+   mtspr   0x216, 8/* IBAT3U */
+   mtspr   0x218, 8/* DBAT0U */
+   mtspr   0x21a, 8/* DBAT1U */
+   mtspr   0x21c, 8/* DBAT2U */
+   mtspr   0x21e, 8/* DBAT3U */
+
+   li  8, 0x01ff   /* first 16MiB */
+   li  9, 0x0002   /* rw */
+   mtspr   0x211, 9/* IBAT0L */
+   mtspr   0x210, 8/* IBAT0U */
+   mtspr   0x219, 9/* DBAT0L */
+   mtspr   0x218, 8/* DBAT0U */
+
+   lis 8, 0x0c00   /* I/O mem */
+   ori 8, 8, 0x3ff /* 32MiB */
+   lis 9, 0x0c00
+   ori 9, 9, 0x002a/* uncached, guarded, rw */
+   mtspr   0x21b, 9/* DBAT1L */
+   mtspr   0x21a, 8/* DBAT1U */
+
+   lis 8, 0x0100   /* next 8MiB */
+   ori 8, 8, 0x00ff/* 8MiB */
+   lis 9, 0x0100
+   ori 9, 9, 0x0002/* rw */
+   mtspr   0x215, 9/* IBAT2L */
+   mtspr