Merge branch 'next' of git://git.secretlab.ca/git/linux-2.6
* 'next' of git://git.secretlab.ca/git/linux-2.6: (23 commits) powerpc: fix up for mmu_mapin_ram api change powerpc: wii: allow ioremap within the memory hole powerpc: allow ioremap within reserved memory regions wii: use both mem1 and mem2 as ram wii: bootwrapper: add fixup to calc useable mem2 powerpc: gamecube/wii: early debugging using usbgecko powerpc: reserve fixmap entries for early debug powerpc: wii: default config powerpc: wii: platform support powerpc: wii: hollywood interrupt controller support powerpc: broadway processor support powerpc: wii: bootwrapper bits powerpc: wii: device tree powerpc: gamecube: default config powerpc: gamecube: platform support powerpc: gamecube/wii: flipper interrupt controller support powerpc: gamecube/wii: udbg support for usbgecko powerpc: gamecube/wii: do not include PCI support powerpc: gamecube/wii: declare as non-coherent platforms powerpc: gamecube/wii: introduce GAMECUBE_COMMON ... Fix up conflicts in arch/powerpc/mm/fsl_booke_mmu.c. Hopefully even close to correctly.
This commit is contained in:
@@ -66,7 +66,7 @@ src-wlib := string.S crt0.S crtsavres.S stdio.c main.c \
|
||||
gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
|
||||
4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
|
||||
cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
|
||||
fsl-soc.c mpc8xx.c pq2.c
|
||||
fsl-soc.c mpc8xx.c pq2.c ugecon.c
|
||||
src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c \
|
||||
cuboot-ebony.c cuboot-hotfoot.c treeboot-ebony.c prpmc2800.c \
|
||||
ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
|
||||
@@ -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 wii-head.S wii.c
|
||||
src-boot := $(src-wlib) $(src-plat) empty.c
|
||||
|
||||
src-boot := $(addprefix $(obj)/, $(src-boot))
|
||||
@@ -254,6 +255,8 @@ 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
|
||||
image-$(CONFIG_WII) += dtbImage.wii
|
||||
|
||||
# Board port in arch/powerpc/platform/amigaone/Kconfig
|
||||
image-$(CONFIG_AMIGAONE) += cuImage.amigaone
|
||||
|
114
arch/powerpc/boot/dts/gamecube.dts
Normal file
114
arch/powerpc/boot/dts/gamecube.dts
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* arch/powerpc/boot/dts/gamecube.dts
|
||||
*
|
||||
* Nintendo GameCube platform device tree source
|
||||
* Copyright (C) 2007-2009 The GameCube Linux Team
|
||||
* Copyright (C) 2007,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.
|
||||
*
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
model = "nintendo,gamecube";
|
||||
compatible = "nintendo,gamecube";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
chosen {
|
||||
bootargs = "root=/dev/gcnsda2 rootwait udbg-immortal";
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x01800000>;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,gekko@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
clock-frequency = <486000000>; /* 486MHz */
|
||||
bus-frequency = <162000000>; /* 162MHz core-to-bus 3x */
|
||||
timebase-frequency = <40500000>; /* 162MHz / 4 */
|
||||
i-cache-line-size = <32>;
|
||||
d-cache-line-size = <32>;
|
||||
i-cache-size = <32768>;
|
||||
d-cache-size = <32768>;
|
||||
};
|
||||
};
|
||||
|
||||
/* devices contained int the flipper chipset */
|
||||
flipper {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "nintendo,flipper";
|
||||
ranges = <0x0c000000 0x0c000000 0x00010000>;
|
||||
interrupt-parent = <&PIC>;
|
||||
|
||||
video@0c002000 {
|
||||
compatible = "nintendo,flipper-vi";
|
||||
reg = <0x0c002000 0x100>;
|
||||
interrupts = <8>;
|
||||
};
|
||||
|
||||
processor-interface@0c003000 {
|
||||
compatible = "nintendo,flipper-pi";
|
||||
reg = <0x0c003000 0x100>;
|
||||
|
||||
PIC: pic {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "nintendo,flipper-pic";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
dsp@0c005000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "nintendo,flipper-dsp";
|
||||
reg = <0x0c005000 0x200>;
|
||||
interrupts = <6>;
|
||||
|
||||
memory@0 {
|
||||
compatible = "nintendo,flipper-aram";
|
||||
reg = <0 0x1000000>; /* 16MB */
|
||||
};
|
||||
};
|
||||
|
||||
disk@0c006000 {
|
||||
compatible = "nintendo,flipper-di";
|
||||
reg = <0x0c006000 0x40>;
|
||||
interrupts = <2>;
|
||||
};
|
||||
|
||||
audio@0c006c00 {
|
||||
compatible = "nintendo,flipper-ai";
|
||||
reg = <0x0c006c00 0x20>;
|
||||
interrupts = <6>;
|
||||
};
|
||||
|
||||
gamepad-controller@0c006400 {
|
||||
compatible = "nintendo,flipper-si";
|
||||
reg = <0x0c006400 0x100>;
|
||||
interrupts = <3>;
|
||||
};
|
||||
|
||||
/* External Interface bus */
|
||||
exi@0c006800 {
|
||||
compatible = "nintendo,flipper-exi";
|
||||
reg = <0x0c006800 0x40>;
|
||||
virtual-reg = <0x0c006800>;
|
||||
interrupts = <4>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
218
arch/powerpc/boot/dts/wii.dts
Normal file
218
arch/powerpc/boot/dts/wii.dts
Normal file
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* arch/powerpc/boot/dts/wii.dts
|
||||
*
|
||||
* Nintendo Wii platform device tree source
|
||||
* Copyright (C) 2008-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.
|
||||
*
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/*
|
||||
* This is commented-out for now.
|
||||
* Until a later patch is merged, the kernel can use only the first
|
||||
* contiguous RAM range and will BUG() if the memreserve is outside
|
||||
* that range.
|
||||
*/
|
||||
/*/memreserve/ 0x10000000 0x0004000;*/ /* DSP RAM */
|
||||
|
||||
/ {
|
||||
model = "nintendo,wii";
|
||||
compatible = "nintendo,wii";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
chosen {
|
||||
bootargs = "root=/dev/mmcblk0p2 rootwait udbg-immortal";
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x01800000 /* MEM1 24MB 1T-SRAM */
|
||||
0x10000000 0x04000000>; /* MEM2 64MB GDDR3 */
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,broadway@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
clock-frequency = <729000000>; /* 729MHz */
|
||||
bus-frequency = <243000000>; /* 243MHz core-to-bus 3x */
|
||||
timebase-frequency = <60750000>; /* 243MHz / 4 */
|
||||
i-cache-line-size = <32>;
|
||||
d-cache-line-size = <32>;
|
||||
i-cache-size = <32768>;
|
||||
d-cache-size = <32768>;
|
||||
};
|
||||
};
|
||||
|
||||
/* devices contained in the hollywood chipset */
|
||||
hollywood {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "nintendo,hollywood";
|
||||
ranges = <0x0c000000 0x0c000000 0x01000000
|
||||
0x0d000000 0x0d000000 0x00800000
|
||||
0x0d800000 0x0d800000 0x00800000>;
|
||||
interrupt-parent = <&PIC0>;
|
||||
|
||||
video@0c002000 {
|
||||
compatible = "nintendo,hollywood-vi",
|
||||
"nintendo,flipper-vi";
|
||||
reg = <0x0c002000 0x100>;
|
||||
interrupts = <8>;
|
||||
};
|
||||
|
||||
processor-interface@0c003000 {
|
||||
compatible = "nintendo,hollywood-pi",
|
||||
"nintendo,flipper-pi";
|
||||
reg = <0x0c003000 0x100>;
|
||||
|
||||
PIC0: pic0 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "nintendo,flipper-pic";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
dsp@0c005000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "nintendo,hollywood-dsp",
|
||||
"nintendo,flipper-dsp";
|
||||
reg = <0x0c005000 0x200>;
|
||||
interrupts = <6>;
|
||||
};
|
||||
|
||||
gamepad-controller@0d006400 {
|
||||
compatible = "nintendo,hollywood-si",
|
||||
"nintendo,flipper-si";
|
||||
reg = <0x0d006400 0x100>;
|
||||
interrupts = <3>;
|
||||
};
|
||||
|
||||
audio@0c006c00 {
|
||||
compatible = "nintendo,hollywood-ai",
|
||||
"nintendo,flipper-ai";
|
||||
reg = <0x0d006c00 0x20>;
|
||||
interrupts = <6>;
|
||||
};
|
||||
|
||||
/* External Interface bus */
|
||||
exi@0d006800 {
|
||||
compatible = "nintendo,hollywood-exi",
|
||||
"nintendo,flipper-exi";
|
||||
reg = <0x0d006800 0x40>;
|
||||
virtual-reg = <0x0d006800>;
|
||||
interrupts = <4>;
|
||||
};
|
||||
|
||||
usb@0d040000 {
|
||||
compatible = "nintendo,hollywood-usb-ehci",
|
||||
"usb-ehci";
|
||||
reg = <0x0d040000 0x100>;
|
||||
interrupts = <4>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
usb@0d050000 {
|
||||
compatible = "nintendo,hollywood-usb-ohci",
|
||||
"usb-ohci";
|
||||
reg = <0x0d050000 0x100>;
|
||||
interrupts = <5>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
usb@0d060000 {
|
||||
compatible = "nintendo,hollywood-usb-ohci",
|
||||
"usb-ohci";
|
||||
reg = <0x0d060000 0x100>;
|
||||
interrupts = <6>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
sd@0d070000 {
|
||||
compatible = "nintendo,hollywood-sdhci",
|
||||
"sdhci";
|
||||
reg = <0x0d070000 0x200>;
|
||||
interrupts = <7>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
sdio@0d080000 {
|
||||
compatible = "nintendo,hollywood-sdhci",
|
||||
"sdhci";
|
||||
reg = <0x0d080000 0x200>;
|
||||
interrupts = <8>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
ipc@0d000000 {
|
||||
compatible = "nintendo,hollywood-ipc";
|
||||
reg = <0x0d000000 0x10>;
|
||||
interrupts = <30>;
|
||||
interrupt-parent = <&PIC1>;
|
||||
};
|
||||
|
||||
PIC1: pic1@0d800030 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "nintendo,hollywood-pic";
|
||||
reg = <0x0d800030 0x10>;
|
||||
interrupt-controller;
|
||||
interrupts = <14>;
|
||||
};
|
||||
|
||||
GPIO: gpio@0d8000c0 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "nintendo,hollywood-gpio";
|
||||
reg = <0x0d8000c0 0x40>;
|
||||
gpio-controller;
|
||||
|
||||
/*
|
||||
* This is commented out while a standard binding
|
||||
* for i2c over gpio is defined.
|
||||
*/
|
||||
/*
|
||||
i2c-video {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "i2c-gpio";
|
||||
|
||||
gpios = <&GPIO 15 0
|
||||
&GPIO 14 0>;
|
||||
clock-frequency = <250000>;
|
||||
no-clock-stretching;
|
||||
scl-is-open-drain;
|
||||
sda-is-open-drain;
|
||||
sda-enforce-dir;
|
||||
|
||||
AVE: audio-video-encoder@70 {
|
||||
compatible = "nintendo,wii-audio-video-encoder";
|
||||
reg = <0x70>;
|
||||
};
|
||||
};
|
||||
*/
|
||||
};
|
||||
|
||||
control@0d800100 {
|
||||
compatible = "nintendo,hollywood-control";
|
||||
reg = <0x0d800100 0x300>;
|
||||
};
|
||||
|
||||
disk@0d806000 {
|
||||
compatible = "nintendo,hollywood-di";
|
||||
reg = <0x0d806000 0x40>;
|
||||
interrupts = <2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
111
arch/powerpc/boot/gamecube-head.S
Normal file
111
arch/powerpc/boot/gamecube-head.S
Normal file
@@ -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:
|
||||
mflr 8
|
||||
clrlwi 8, 8, 3 /* convert to a real address */
|
||||
addi 8, 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 0x214, 8 /* IBAT2U */
|
||||
mtspr 0x21d, 9 /* DBAT2L */
|
||||
mtspr 0x21c, 8 /* DBAT2U */
|
||||
|
||||
/* enable and invalidate the caches if not already enabled */
|
||||
mfspr 8, 0x3f0 /* HID0 */
|
||||
andi. 0, 8, (1<<15) /* HID0_ICE */
|
||||
bne 1f
|
||||
ori 8, 8, (1<<15)|(1<<11) /* HID0_ICE|HID0_ICFI*/
|
||||
1:
|
||||
andi. 0, 8, (1<<14) /* HID0_DCE */
|
||||
bne 1f
|
||||
ori 8, 8, (1<<14)|(1<<10) /* HID0_DCE|HID0_DCFI*/
|
||||
1:
|
||||
mtspr 0x3f0, 8 /* HID0 */
|
||||
isync
|
||||
|
||||
/* initialize arguments */
|
||||
li 3, 0
|
||||
li 4, 0
|
||||
li 5, 0
|
||||
|
||||
/* turn the MMU on */
|
||||
bcl 20, 31, 1f
|
||||
1:
|
||||
mflr 8
|
||||
addi 8, 8, _mmu_on - 1b
|
||||
mfmsr 9
|
||||
ori 9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */
|
||||
mtsrr0 8
|
||||
mtsrr1 9
|
||||
sync
|
||||
rfi
|
||||
_mmu_on:
|
||||
b _zimage_start_lib
|
||||
|
35
arch/powerpc/boot/gamecube.c
Normal file
35
arch/powerpc/boot/gamecube.c
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* arch/powerpc/boot/gamecube.c
|
||||
*
|
||||
* Nintendo GameCube bootwrapper support
|
||||
* 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 <stddef.h>
|
||||
#include "stdio.h"
|
||||
#include "types.h"
|
||||
#include "io.h"
|
||||
#include "ops.h"
|
||||
|
||||
#include "ugecon.h"
|
||||
|
||||
BSS_STACK(8192);
|
||||
|
||||
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
|
||||
{
|
||||
u32 heapsize = 16*1024*1024 - (u32)_end;
|
||||
|
||||
simple_alloc_init(_end, heapsize, 32, 64);
|
||||
fdt_init(_dtb_start);
|
||||
|
||||
if (ug_probe())
|
||||
console_ops.write = ug_console_write;
|
||||
}
|
||||
|
147
arch/powerpc/boot/ugecon.c
Normal file
147
arch/powerpc/boot/ugecon.c
Normal file
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* arch/powerpc/boot/ugecon.c
|
||||
*
|
||||
* USB Gecko bootwrapper console.
|
||||
* Copyright (C) 2008-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 <stddef.h>
|
||||
#include "stdio.h"
|
||||
#include "types.h"
|
||||
#include "io.h"
|
||||
#include "ops.h"
|
||||
|
||||
|
||||
#define EXI_CLK_32MHZ 5
|
||||
|
||||
#define EXI_CSR 0x00
|
||||
#define EXI_CSR_CLKMASK (0x7<<4)
|
||||
#define EXI_CSR_CLK_32MHZ (EXI_CLK_32MHZ<<4)
|
||||
#define EXI_CSR_CSMASK (0x7<<7)
|
||||
#define EXI_CSR_CS_0 (0x1<<7) /* Chip Select 001 */
|
||||
|
||||
#define EXI_CR 0x0c
|
||||
#define EXI_CR_TSTART (1<<0)
|
||||
#define EXI_CR_WRITE (1<<2)
|
||||
#define EXI_CR_READ_WRITE (2<<2)
|
||||
#define EXI_CR_TLEN(len) (((len)-1)<<4)
|
||||
|
||||
#define EXI_DATA 0x10
|
||||
|
||||
|
||||
/* virtual address base for input/output, retrieved from device tree */
|
||||
static void *ug_io_base;
|
||||
|
||||
|
||||
static u32 ug_io_transaction(u32 in)
|
||||
{
|
||||
u32 *csr_reg = ug_io_base + EXI_CSR;
|
||||
u32 *data_reg = ug_io_base + EXI_DATA;
|
||||
u32 *cr_reg = ug_io_base + EXI_CR;
|
||||
u32 csr, data, cr;
|
||||
|
||||
/* select */
|
||||
csr = EXI_CSR_CLK_32MHZ | EXI_CSR_CS_0;
|
||||
out_be32(csr_reg, csr);
|
||||
|
||||
/* read/write */
|
||||
data = in;
|
||||
out_be32(data_reg, data);
|
||||
cr = EXI_CR_TLEN(2) | EXI_CR_READ_WRITE | EXI_CR_TSTART;
|
||||
out_be32(cr_reg, cr);
|
||||
|
||||
while (in_be32(cr_reg) & EXI_CR_TSTART)
|
||||
barrier();
|
||||
|
||||
/* deselect */
|
||||
out_be32(csr_reg, 0);
|
||||
|
||||
data = in_be32(data_reg);
|
||||
return data;
|
||||
}
|
||||
|
||||
static int ug_is_txfifo_ready(void)
|
||||
{
|
||||
return ug_io_transaction(0xc0000000) & 0x04000000;
|
||||
}
|
||||
|
||||
static void ug_raw_putc(char ch)
|
||||
{
|
||||
ug_io_transaction(0xb0000000 | (ch << 20));
|
||||
}
|
||||
|
||||
static void ug_putc(char ch)
|
||||
{
|
||||
int count = 16;
|
||||
|
||||
if (!ug_io_base)
|
||||
return;
|
||||
|
||||
while (!ug_is_txfifo_ready() && count--)
|
||||
barrier();
|
||||
if (count)
|
||||
ug_raw_putc(ch);
|
||||
}
|
||||
|
||||
void ug_console_write(const char *buf, int len)
|
||||
{
|
||||
char *b = (char *)buf;
|
||||
|
||||
while (len--) {
|
||||
if (*b == '\n')
|
||||
ug_putc('\r');
|
||||
ug_putc(*b++);
|
||||
}
|
||||
}
|
||||
|
||||
static int ug_is_adapter_present(void)
|
||||
{
|
||||
if (!ug_io_base)
|
||||
return 0;
|
||||
return ug_io_transaction(0x90000000) == 0x04700000;
|
||||
}
|
||||
|
||||
static void *ug_grab_exi_io_base(void)
|
||||
{
|
||||
u32 v;
|
||||
void *devp;
|
||||
|
||||
devp = find_node_by_compatible(NULL, "nintendo,flipper-exi");
|
||||
if (devp == NULL)
|
||||
goto err_out;
|
||||
if (getprop(devp, "virtual-reg", &v, sizeof(v)) != sizeof(v))
|
||||
goto err_out;
|
||||
|
||||
return (void *)v;
|
||||
|
||||
err_out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *ug_probe(void)
|
||||
{
|
||||
void *exi_io_base;
|
||||
int i;
|
||||
|
||||
exi_io_base = ug_grab_exi_io_base();
|
||||
if (!exi_io_base)
|
||||
return NULL;
|
||||
|
||||
/* look for a usbgecko on memcard slots A and B */
|
||||
for (i = 0; i < 2; i++) {
|
||||
ug_io_base = exi_io_base + 0x14 * i;
|
||||
if (ug_is_adapter_present())
|
||||
break;
|
||||
}
|
||||
if (i == 2)
|
||||
ug_io_base = NULL;
|
||||
return ug_io_base;
|
||||
}
|
||||
|
24
arch/powerpc/boot/ugecon.h
Normal file
24
arch/powerpc/boot/ugecon.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* arch/powerpc/boot/ugecon.h
|
||||
*
|
||||
* USB Gecko early bootwrapper console.
|
||||
* Copyright (C) 2008-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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __UGECON_H
|
||||
#define __UGECON_H
|
||||
|
||||
extern void *ug_probe(void);
|
||||
|
||||
extern void ug_putc(char ch);
|
||||
extern void ug_console_write(const char *buf, int len);
|
||||
|
||||
#endif /* __UGECON_H */
|
||||
|
142
arch/powerpc/boot/wii-head.S
Normal file
142
arch/powerpc/boot/wii-head.S
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* arch/powerpc/boot/wii-head.S
|
||||
*
|
||||
* Nintendo Wii bootwrapper entry.
|
||||
* Copyright (C) 2008-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
|
||||
* - if the high BATs are enabled or not
|
||||
*
|
||||
* We enable the high BATs, 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:
|
||||
mflr 8
|
||||
clrlwi 8, 8, 3 /* convert to a real address */
|
||||
addi 8, 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 */
|
||||
|
||||
mtspr 0x230, 8 /* IBAT4U */
|
||||
mtspr 0x232, 8 /* IBAT5U */
|
||||
mtspr 0x234, 8 /* IBAT6U */
|
||||
mtspr 0x236, 8 /* IBAT7U */
|
||||
mtspr 0x238, 8 /* DBAT4U */
|
||||
mtspr 0x23a, 8 /* DBAT5U */
|
||||
mtspr 0x23c, 8 /* DBAT6U */
|
||||
mtspr 0x23e, 8 /* DBAT7U */
|
||||
|
||||
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 0x214, 8 /* IBAT2U */
|
||||
mtspr 0x21d, 9 /* DBAT2L */
|
||||
mtspr 0x21c, 8 /* DBAT2U */
|
||||
|
||||
lis 8, 0x1000 /* MEM2 */
|
||||
ori 8, 8, 0x07ff /* 64MiB */
|
||||
lis 9, 0x1000
|
||||
ori 9, 9, 0x0002 /* rw */
|
||||
mtspr 0x216, 8 /* IBAT3U */
|
||||
mtspr 0x217, 9 /* IBAT3L */
|
||||
mtspr 0x21e, 8 /* DBAT3U */
|
||||
mtspr 0x21f, 9 /* DBAT3L */
|
||||
|
||||
/* enable the high BATs */
|
||||
mfspr 8, 0x3f3 /* HID4 */
|
||||
oris 8, 8, 0x0200
|
||||
mtspr 0x3f3, 8 /* HID4 */
|
||||
|
||||
/* enable and invalidate the caches if not already enabled */
|
||||
mfspr 8, 0x3f0 /* HID0 */
|
||||
andi. 0, 8, (1<<15) /* HID0_ICE */
|
||||
bne 1f
|
||||
ori 8, 8, (1<<15)|(1<<11) /* HID0_ICE|HID0_ICFI*/
|
||||
1:
|
||||
andi. 0, 8, (1<<14) /* HID0_DCE */
|
||||
bne 1f
|
||||
ori 8, 8, (1<<14)|(1<<10) /* HID0_DCE|HID0_DCFI*/
|
||||
1:
|
||||
mtspr 0x3f0, 8 /* HID0 */
|
||||
isync
|
||||
|
||||
/* initialize arguments */
|
||||
li 3, 0
|
||||
li 4, 0
|
||||
li 5, 0
|
||||
|
||||
/* turn the MMU on */
|
||||
bcl 20, 31, 1f
|
||||
1:
|
||||
mflr 8
|
||||
addi 8, 8, _mmu_on - 1b
|
||||
mfmsr 9
|
||||
ori 9, 9, (1<<4)|(1<<5) /* MSR_DR|MSR_IR */
|
||||
mtsrr0 8
|
||||
mtsrr1 9
|
||||
sync
|
||||
rfi
|
||||
_mmu_on:
|
||||
/* turn on the front blue led (aka: yay! we got here!) */
|
||||
lis 8, 0x0d00
|
||||
ori 8, 8, 0x00c0
|
||||
lwz 9, 0(8)
|
||||
ori 9, 9, 0x20
|
||||
stw 9, 0(8)
|
||||
|
||||
b _zimage_start_lib
|
||||
|
158
arch/powerpc/boot/wii.c
Normal file
158
arch/powerpc/boot/wii.c
Normal file
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
* arch/powerpc/boot/wii.c
|
||||
*
|
||||
* Nintendo Wii bootwrapper support
|
||||
* Copyright (C) 2008-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 <stddef.h>
|
||||
#include "stdio.h"
|
||||
#include "types.h"
|
||||
#include "io.h"
|
||||
#include "ops.h"
|
||||
|
||||
#include "ugecon.h"
|
||||
|
||||
BSS_STACK(8192);
|
||||
|
||||
#define HW_REG(x) ((void *)(x))
|
||||
|
||||
#define EXI_CTRL HW_REG(0x0d800070)
|
||||
#define EXI_CTRL_ENABLE (1<<0)
|
||||
|
||||
#define MEM2_TOP (0x10000000 + 64*1024*1024)
|
||||
#define FIRMWARE_DEFAULT_SIZE (12*1024*1024)
|
||||
|
||||
|
||||
struct mipc_infohdr {
|
||||
char magic[3];
|
||||
u8 version;
|
||||
u32 mem2_boundary;
|
||||
u32 ipc_in;
|
||||
size_t ipc_in_size;
|
||||
u32 ipc_out;
|
||||
size_t ipc_out_size;
|
||||
};
|
||||
|
||||
static int mipc_check_address(u32 pa)
|
||||
{
|
||||
/* only MEM2 addresses */
|
||||
if (pa < 0x10000000 || pa > 0x14000000)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct mipc_infohdr *mipc_get_infohdr(void)
|
||||
{
|
||||
struct mipc_infohdr **hdrp, *hdr;
|
||||
|
||||
/* 'mini' header pointer is the last word of MEM2 memory */
|
||||
hdrp = (struct mipc_infohdr **)0x13fffffc;
|
||||
if (mipc_check_address((u32)hdrp)) {
|
||||
printf("mini: invalid hdrp %08X\n", (u32)hdrp);
|
||||
hdr = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
hdr = *hdrp;
|
||||
if (mipc_check_address((u32)hdr)) {
|
||||
printf("mini: invalid hdr %08X\n", (u32)hdr);
|
||||
hdr = NULL;
|
||||
goto out;
|
||||
}
|
||||
if (memcmp(hdr->magic, "IPC", 3)) {
|
||||
printf("mini: invalid magic\n");
|
||||
hdr = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
return hdr;
|
||||
}
|
||||
|
||||
static int mipc_get_mem2_boundary(u32 *mem2_boundary)
|
||||
{
|
||||
struct mipc_infohdr *hdr;
|
||||
int error;
|
||||
|
||||
hdr = mipc_get_infohdr();
|
||||
if (!hdr) {
|
||||
error = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (mipc_check_address(hdr->mem2_boundary)) {
|
||||
printf("mini: invalid mem2_boundary %08X\n",
|
||||
hdr->mem2_boundary);
|
||||
error = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
*mem2_boundary = hdr->mem2_boundary;
|
||||
error = 0;
|
||||
out:
|
||||
return error;
|
||||
|
||||
}
|
||||
|
||||
static void platform_fixups(void)
|
||||
{
|
||||
void *mem;
|
||||
u32 reg[4];
|
||||
u32 mem2_boundary;
|
||||
int len;
|
||||
int error;
|
||||
|
||||
mem = finddevice("/memory");
|
||||
if (!mem)
|
||||
fatal("Can't find memory node\n");
|
||||
|
||||
/* two ranges of (address, size) words */
|
||||
len = getprop(mem, "reg", reg, sizeof(reg));
|
||||
if (len != sizeof(reg)) {
|
||||
/* nothing to do */
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* retrieve MEM2 boundary from 'mini' */
|
||||
error = mipc_get_mem2_boundary(&mem2_boundary);
|
||||
if (error) {
|
||||
/* if that fails use a sane value */
|
||||
mem2_boundary = MEM2_TOP - FIRMWARE_DEFAULT_SIZE;
|
||||
}
|
||||
|
||||
if (mem2_boundary > reg[2] && mem2_boundary < reg[2] + reg[3]) {
|
||||
reg[3] = mem2_boundary - reg[2];
|
||||
printf("top of MEM2 @ %08X\n", reg[2] + reg[3]);
|
||||
setprop(mem, "reg", reg, sizeof(reg));
|
||||
}
|
||||
|
||||
out:
|
||||
return;
|
||||
}
|
||||
|
||||
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
|
||||
{
|
||||
u32 heapsize = 24*1024*1024 - (u32)_end;
|
||||
|
||||
simple_alloc_init(_end, heapsize, 32, 64);
|
||||
fdt_init(_dtb_start);
|
||||
|
||||
/*
|
||||
* 'mini' boots the Broadway processor with EXI disabled.
|
||||
* We need it enabled before probing for the USB Gecko.
|
||||
*/
|
||||
out_be32(EXI_CTRL, in_be32(EXI_CTRL) | EXI_CTRL_ENABLE);
|
||||
|
||||
if (ug_probe())
|
||||
console_ops.write = ug_console_write;
|
||||
|
||||
platform_ops.fixups = platform_fixups;
|
||||
}
|
||||
|
@@ -230,6 +230,10 @@ xpedite52*)
|
||||
link_address='0x1400000'
|
||||
platformo=$object/cuboot-85xx.o
|
||||
;;
|
||||
gamecube|wii)
|
||||
link_address='0x600000'
|
||||
platformo="$object/$platform-head.o $object/$platform.o"
|
||||
;;
|
||||
esac
|
||||
|
||||
vmz="$tmpdir/`basename \"$kernel\"`.$ext"
|
||||
|
Reference in New Issue
Block a user