* [PATCH 00/12] powerpc: Nintendo Wii U support @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Ash Logan (11): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: Add minimal default config Roberto Van Eeden (1): powerpc: espresso processor support .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 327 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 19 + arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 67 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1635 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: df0cc57e057f18e44dac8e6c18aba47ab53202f9 -- 2.35.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH 00/12] powerpc: Nintendo Wii U support @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Ash Logan (11): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: Add minimal default config Roberto Van Eeden (1): powerpc: espresso processor support .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 327 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 19 + arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 67 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1635 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: df0cc57e057f18e44dac8e6c18aba47ab53202f9 -- 2.35.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:43 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 13:28 ` Rob Herring -1 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-03-02 13:28 UTC (permalink / raw) To: Ash Logan Cc: Paul Mackerras, Michael Ellerman, Christophe Leroy, Benjamin Herrenschmidt, linux-kernel, linuxppc-dev, Jonathan Neuschäfer On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: > > Adds schema for the various Wii U devicetree nodes used. Please resend to the DT list if you want this reviewed and so that checks run. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ > 8 files changed, 300 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..5824b07928f5 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,28 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > + > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + compatible: > + oneOf: > + - description: Nintendo Wii U video game console > + items: > + - const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..878a81595f5f > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U "Espresso" interrupt controller > + items: > + - const: nintendo,espresso-pic > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + > +additionalProperties: false > + > +examples: > + - | > + espresso_pic: pic@c000078 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..e54d49015f36 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,41 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte "GPU7" graphics processor > + items: > + - const: nintendo,latte-gpu7 > + reg: > + items: > + - description: GpuF0MMReg registers > + interrupts: > + items: > + - description: Main interrupt, connected via Espresso PIC > + > +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties > +additionalProperties: true > + > +examples: > + - | > + gpu7@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..7b9de4effcb0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,43 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte AHCI controller > + items: > + - const: nintendo,latte-ahci > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +additionalProperties: false > + > +examples: > + - | > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..ed0b4c28ce48 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte DSP > + items: > + - const: nintendo,latte-dsp > + reg: > + items: > + - description: DSP registers > + > +# Once more is known about this device more properties will likely be added > +additionalProperties: true > + > +examples: > + - | > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..a2df71fb9964 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte interrupt controller > + items: > + - const: nintendo,latte-pic > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +additionalProperties: false > + > +examples: > + - | > + latte_pic: pic@d800440 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..4b9b0820edc1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,40 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte SDHCI > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: SDHCI interrupt > + > +additionalProperties: false > + > +examples: > + - | > + sdcard_0: sdhci@d070000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6ae86d198fa3 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U "Latte" SoC > + items: > + - const: nintendo,latte > + > +additionalProperties: true > + > +... > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-03-02 13:28 ` Rob Herring 0 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-03-02 13:28 UTC (permalink / raw) To: Ash Logan Cc: linux-kernel, Paul Mackerras, linuxppc-dev, Jonathan Neuschäfer On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: > > Adds schema for the various Wii U devicetree nodes used. Please resend to the DT list if you want this reviewed and so that checks run. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ > 8 files changed, 300 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..5824b07928f5 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,28 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > + > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + compatible: > + oneOf: > + - description: Nintendo Wii U video game console > + items: > + - const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..878a81595f5f > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U "Espresso" interrupt controller > + items: > + - const: nintendo,espresso-pic > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + > +additionalProperties: false > + > +examples: > + - | > + espresso_pic: pic@c000078 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..e54d49015f36 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,41 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte "GPU7" graphics processor > + items: > + - const: nintendo,latte-gpu7 > + reg: > + items: > + - description: GpuF0MMReg registers > + interrupts: > + items: > + - description: Main interrupt, connected via Espresso PIC > + > +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties > +additionalProperties: true > + > +examples: > + - | > + gpu7@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..7b9de4effcb0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,43 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte AHCI controller > + items: > + - const: nintendo,latte-ahci > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +additionalProperties: false > + > +examples: > + - | > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..ed0b4c28ce48 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte DSP > + items: > + - const: nintendo,latte-dsp > + reg: > + items: > + - description: DSP registers > + > +# Once more is known about this device more properties will likely be added > +additionalProperties: true > + > +examples: > + - | > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..a2df71fb9964 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte interrupt controller > + items: > + - const: nintendo,latte-pic > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +additionalProperties: false > + > +examples: > + - | > + latte_pic: pic@d800440 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..4b9b0820edc1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,40 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte SDHCI > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: SDHCI interrupt > + > +additionalProperties: false > + > +examples: > + - | > + sdcard_0: sdhci@d070000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6ae86d198fa3 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U "Latte" SoC > + items: > + - const: nintendo,latte > + > +additionalProperties: true > + > +... > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH 02/12] powerpc: wiiu: device tree 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:43 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Roberto Van Eeden, Emmanuel Gil Peyrot Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..aaf264963f61 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,327 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + spi_gpio: spi-gpio { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + seeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; + + gpio2: gpio2@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; +}; -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 02/12] powerpc: wiiu: device tree @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: Emmanuel Gil Peyrot, linuxppc-dev, linux-kernel, Roberto Van Eeden, j.ne Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..aaf264963f61 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,327 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + spi_gpio: spi-gpio { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + seeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; + + gpio2: gpio2@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; +}; -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH 02/12] powerpc: wiiu: device tree 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 13:36 ` Rob Herring -1 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-03-02 13:36 UTC (permalink / raw) To: Ash Logan Cc: Paul Mackerras, Michael Ellerman, Christophe Leroy, Benjamin Herrenschmidt, linux-kernel, linuxppc-dev, Jonathan Neuschäfer, Roberto Van Eeden, Emmanuel Gil Peyrot On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: > > Add a device tree source file for the Nintendo Wii U video game console. Test this with 'make W=1 dtbs_checks'. > > Signed-off-by: Ash Logan <ash@heyquark.com> > Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > --- > arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ > 1 file changed, 327 insertions(+) > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > > diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts > new file mode 100644 > index 000000000000..aaf264963f61 > --- /dev/null > +++ b/arch/powerpc/boot/dts/wiiu.dts > @@ -0,0 +1,327 @@ > +// SPDX-License-Identifier: GPL-2.0 What about non-GPL environments? > +/* > + * Nintendo Wii U Device Tree Source > + * > + * Copyright (C) 2022 The linux-wiiu Team > + */ > + > +/dts-v1/; > +#include <dt-bindings/gpio/gpio.h> > +#include <dt-bindings/input/input.h> > + > +/ { > + model = "nintendo,wiiu"; > + compatible = "nintendo,wiiu"; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + chosen { > + bootargs = "root=/dev/sda1 rootwait"; > + }; > + > + memory { > + device_type = "memory"; > + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ > + 0x08000000 0x00300000 /* MEM0 - 3MiB */ > + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ > + }; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + /* TODO: Add SMP */ > + PowerPC,espresso@0 { > + device_type = "cpu"; > + reg = <0>; > + clock-frequency = <1243125000>; /* 1.243125GHz */ > + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ > + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ > + i-cache-size = <32768>; /* 32K icache */ > + i-cache-line-size = <32>; > + i-cache-block-size = <32>; > + i-cache-sets = <128>; > + d-cache-size = <32768>; /* 32K dcache */ > + d-cache-line-size = <32>; > + d-cache-block-size = <32>; > + d-cache-sets = <128>; > + next-level-cache = <&L2_0>; > + L2_0:l2-cache { > + compatible = "cache"; > + cache-level = <2>; > + cache-unified; > + cache-size = <0x80000>; /* 512KB L2 */ > + cache-line-size = <64>; > + cache-block-size = <32>; > + cache-sets = <2048>; > + }; > + }; > + }; > + > + latte { > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "nintendo,latte"; > + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ > + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ > + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ > + > + gpu7@c200000 { gpu@... > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > + > + espresso_pic: pic@c000078 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > + > + ehci_0: usb@d040000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d040000 0x100>; > + interrupts = <4>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_0_0: usb@d050000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d050000 0x100>; > + interrupts = <5>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ohci_0_1: usb@d060000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d060000 0x100>; > + interrupts = <6>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_1: usb@d120000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d120000 0x100>; > + interrupts = <16>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_1_0: usb@d130000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d130000 0x100>; > + interrupts = <35>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_2: usb@d140000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d140000 0x100>; > + interrupts = <36>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_2_0: usb@d150000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d150000 0x100>; > + interrupts = <37>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + sdcard_0: sdhci@d070000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > + > + wifi_0: sdhci@d080000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d080000 0x200>; > + interrupts = <8>; > + interrupt-parent = <&latte_pic>; > + }; > + > + legacy_ipc: ipc@d800000 { > + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; space between compatibles needed. > + reg = <0x0d800000 0x10>; > + interrupts = <30 31>; > + interrupt-parent = <&latte_pic>; > + }; > + > + latte_otp: otp@d8001ec { > + compatible = "nintendo,latte-otp"; > + reg = <0x0d8001ec 0x8>; > + }; > + > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x808>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38 28>; > + }; > + > + latte_pic: pic@d800440 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > + > + gpio: gpio@d8000c0 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d8000c0 0x40>; > + gpio-controller; > + /* TODO: There are actually 31 AHBALL GPIOs */ > + ngpios = <24>; > + > + gpio-line-names = > + "POWER", "DWIFI", "FAN", "DC_DC", > + "", "Esp10WorkAround", "", "", > + "PADPD", "", "EEP_CS", "EEP_CLK", > + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", > + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", > + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + > + spi_gpio: spi-gpio { Move this to root level. It's not on the 'latte' bus. > + compatible = "spi-gpio"; > + #address-cells = <1>; > + #size-cells = <0>; > + status = "okay"; Not needed, that's the default. > + > + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; > + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; > + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; > + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; > + num-chipselects = <1>; > + > + seeprom@0 { eeprom@0 > + compatible = "atmel,at93c66"; > + reg = <0>; > + spi-max-frequency = <1000000>; > + spi-cs-high; > + /* TODO: wiiubrew says this is 16-bit, but I only get the correct > + * values in 8-bit... > + */ > + data-size = <8>; > + read-only; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ > + rng_seed: rng@12 { reg = <0x012 8>; }; > + ppc_pvr: pvr@20 { reg = <0x020 4>; }; > + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; > + seeprom_ver: sver@2a { reg = <0x02A 2>; }; > + otp_ver: over@2c { reg = <0x02C 2>; }; > + otp_rev: orev@2e { reg = <0x02E 2>; }; > + otp_ver_str: over-str@30 { reg = <0x030 8>; }; > + > + bc_crc: bc-crc@38 { reg = <0x038 4>; }; > + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; > + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; > + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; > + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; > + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; > + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; > + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; > + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; > + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; > + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; > + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; > + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; > + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; > + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; > + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; > + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; > + > + drive_key: drvkey@80 { reg = <0x080 16>; }; > + factory_key: fackey@90 { reg = <0x090 16>; }; > + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; > + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; > + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; > + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; > + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; > + > + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; > + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; > + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; > + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; > + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; > + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; > + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; > + sysprod_code: sp_code@158 { reg = <0x158 8>; }; > + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; > + sysprod_model: sp_model@170 { reg = <0x170 16>; }; > + > + prod_year: pyear@188 { reg = <0x188 2>; }; > + prod_date: pdate@18a { reg = <0x18A 2>; }; > + prod_time: ptime@18c { reg = <0x18C 2>; }; > + > + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; > + }; > + }; > + > + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ > + gpio-keys-polled { This too. > + poll-interval = <50>; > + compatible = "gpio-keys-polled"; > + > + power { > + label = "Power Button"; > + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; > + linux,code = <KEY_POWER>; > + }; > + }; > + > + gpio2: gpio2@d8000c0 { gpio@d800520 > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d800520 0x40>; > + gpio-controller; > + ngpios = <7>; > + > + gpio-line-names = > + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", > + "AVE_INT", "", "AVE_RESET"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + }; > +}; > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 02/12] powerpc: wiiu: device tree @ 2022-03-02 13:36 ` Rob Herring 0 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-03-02 13:36 UTC (permalink / raw) To: Ash Logan Cc: Emmanuel Gil Peyrot, linux-kernel, Paul Mackerras, Roberto Van Eeden, linuxppc-dev, Jonathan Neuschäfer On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: > > Add a device tree source file for the Nintendo Wii U video game console. Test this with 'make W=1 dtbs_checks'. > > Signed-off-by: Ash Logan <ash@heyquark.com> > Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > --- > arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ > 1 file changed, 327 insertions(+) > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > > diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts > new file mode 100644 > index 000000000000..aaf264963f61 > --- /dev/null > +++ b/arch/powerpc/boot/dts/wiiu.dts > @@ -0,0 +1,327 @@ > +// SPDX-License-Identifier: GPL-2.0 What about non-GPL environments? > +/* > + * Nintendo Wii U Device Tree Source > + * > + * Copyright (C) 2022 The linux-wiiu Team > + */ > + > +/dts-v1/; > +#include <dt-bindings/gpio/gpio.h> > +#include <dt-bindings/input/input.h> > + > +/ { > + model = "nintendo,wiiu"; > + compatible = "nintendo,wiiu"; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + chosen { > + bootargs = "root=/dev/sda1 rootwait"; > + }; > + > + memory { > + device_type = "memory"; > + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ > + 0x08000000 0x00300000 /* MEM0 - 3MiB */ > + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ > + }; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + /* TODO: Add SMP */ > + PowerPC,espresso@0 { > + device_type = "cpu"; > + reg = <0>; > + clock-frequency = <1243125000>; /* 1.243125GHz */ > + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ > + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ > + i-cache-size = <32768>; /* 32K icache */ > + i-cache-line-size = <32>; > + i-cache-block-size = <32>; > + i-cache-sets = <128>; > + d-cache-size = <32768>; /* 32K dcache */ > + d-cache-line-size = <32>; > + d-cache-block-size = <32>; > + d-cache-sets = <128>; > + next-level-cache = <&L2_0>; > + L2_0:l2-cache { > + compatible = "cache"; > + cache-level = <2>; > + cache-unified; > + cache-size = <0x80000>; /* 512KB L2 */ > + cache-line-size = <64>; > + cache-block-size = <32>; > + cache-sets = <2048>; > + }; > + }; > + }; > + > + latte { > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "nintendo,latte"; > + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ > + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ > + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ > + > + gpu7@c200000 { gpu@... > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > + > + espresso_pic: pic@c000078 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > + > + ehci_0: usb@d040000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d040000 0x100>; > + interrupts = <4>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_0_0: usb@d050000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d050000 0x100>; > + interrupts = <5>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ohci_0_1: usb@d060000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d060000 0x100>; > + interrupts = <6>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_1: usb@d120000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d120000 0x100>; > + interrupts = <16>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_1_0: usb@d130000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d130000 0x100>; > + interrupts = <35>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_2: usb@d140000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d140000 0x100>; > + interrupts = <36>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_2_0: usb@d150000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d150000 0x100>; > + interrupts = <37>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + sdcard_0: sdhci@d070000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > + > + wifi_0: sdhci@d080000 { > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d080000 0x200>; > + interrupts = <8>; > + interrupt-parent = <&latte_pic>; > + }; > + > + legacy_ipc: ipc@d800000 { > + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; space between compatibles needed. > + reg = <0x0d800000 0x10>; > + interrupts = <30 31>; > + interrupt-parent = <&latte_pic>; > + }; > + > + latte_otp: otp@d8001ec { > + compatible = "nintendo,latte-otp"; > + reg = <0x0d8001ec 0x8>; > + }; > + > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x808>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38 28>; > + }; > + > + latte_pic: pic@d800440 { > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > + > + gpio: gpio@d8000c0 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d8000c0 0x40>; > + gpio-controller; > + /* TODO: There are actually 31 AHBALL GPIOs */ > + ngpios = <24>; > + > + gpio-line-names = > + "POWER", "DWIFI", "FAN", "DC_DC", > + "", "Esp10WorkAround", "", "", > + "PADPD", "", "EEP_CS", "EEP_CLK", > + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", > + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", > + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + > + spi_gpio: spi-gpio { Move this to root level. It's not on the 'latte' bus. > + compatible = "spi-gpio"; > + #address-cells = <1>; > + #size-cells = <0>; > + status = "okay"; Not needed, that's the default. > + > + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; > + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; > + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; > + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; > + num-chipselects = <1>; > + > + seeprom@0 { eeprom@0 > + compatible = "atmel,at93c66"; > + reg = <0>; > + spi-max-frequency = <1000000>; > + spi-cs-high; > + /* TODO: wiiubrew says this is 16-bit, but I only get the correct > + * values in 8-bit... > + */ > + data-size = <8>; > + read-only; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ > + rng_seed: rng@12 { reg = <0x012 8>; }; > + ppc_pvr: pvr@20 { reg = <0x020 4>; }; > + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; > + seeprom_ver: sver@2a { reg = <0x02A 2>; }; > + otp_ver: over@2c { reg = <0x02C 2>; }; > + otp_rev: orev@2e { reg = <0x02E 2>; }; > + otp_ver_str: over-str@30 { reg = <0x030 8>; }; > + > + bc_crc: bc-crc@38 { reg = <0x038 4>; }; > + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; > + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; > + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; > + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; > + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; > + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; > + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; > + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; > + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; > + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; > + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; > + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; > + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; > + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; > + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; > + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; > + > + drive_key: drvkey@80 { reg = <0x080 16>; }; > + factory_key: fackey@90 { reg = <0x090 16>; }; > + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; > + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; > + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; > + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; > + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; > + > + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; > + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; > + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; > + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; > + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; > + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; > + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; > + sysprod_code: sp_code@158 { reg = <0x158 8>; }; > + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; > + sysprod_model: sp_model@170 { reg = <0x170 16>; }; > + > + prod_year: pyear@188 { reg = <0x188 2>; }; > + prod_date: pdate@18a { reg = <0x18A 2>; }; > + prod_time: ptime@18c { reg = <0x18C 2>; }; > + > + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; > + }; > + }; > + > + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ > + gpio-keys-polled { This too. > + poll-interval = <50>; > + compatible = "gpio-keys-polled"; > + > + power { > + label = "Power Button"; > + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; > + linux,code = <KEY_POWER>; > + }; > + }; > + > + gpio2: gpio2@d8000c0 { gpio@d800520 > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d800520 0x40>; > + gpio-controller; > + ngpios = <7>; > + > + gpio-line-names = > + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", > + "AVE_INT", "", "AVE_RESET"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + }; > +}; > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 02/12] powerpc: wiiu: device tree 2022-03-02 13:36 ` Rob Herring @ 2022-03-03 2:41 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-03 2:41 UTC (permalink / raw) To: Rob Herring Cc: Paul Mackerras, Michael Ellerman, Christophe Leroy, Benjamin Herrenschmidt, linux-kernel, linuxppc-dev, Jonathan Neuschäfer, Roberto Van Eeden, Emmanuel Gil Peyrot, devicetree Hi Rob, Thanks for the review. On 3/3/22 00:36, Rob Herring wrote: > On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: >> >> Add a device tree source file for the Nintendo Wii U video game console. > > Test this with 'make W=1 dtbs_checks'. Does make W=1 ARCH=powerpc wiiu_defconfig dtbs_check seem reasonable? I ran it, and saw LINT/CHKDT/UPD/SCHEMA/COPY steps, but if I put garbage in the .dts it gives no warnings. >> >> Signed-off-by: Ash Logan <ash@heyquark.com> >> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> >> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> >> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> >> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> >> --- >> arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ >> 1 file changed, 327 insertions(+) >> create mode 100644 arch/powerpc/boot/dts/wiiu.dts >> >> diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts >> new file mode 100644 >> index 000000000000..aaf264963f61 >> --- /dev/null >> +++ b/arch/powerpc/boot/dts/wiiu.dts >> @@ -0,0 +1,327 @@ >> +// SPDX-License-Identifier: GPL-2.0 > > What about non-GPL environments? The other powerpc dts files are all GPL-2.0(-or-later), is there a preferred license for devicetrees? >> +/* >> + * Nintendo Wii U Device Tree Source >> + * >> + * Copyright (C) 2022 The linux-wiiu Team >> + */ >> + >> +/dts-v1/; >> +#include <dt-bindings/gpio/gpio.h> >> +#include <dt-bindings/input/input.h> >> + >> +/ { >> + model = "nintendo,wiiu"; >> + compatible = "nintendo,wiiu"; >> + >> + #address-cells = <1>; >> + #size-cells = <1>; >> + >> + chosen { >> + bootargs = "root=/dev/sda1 rootwait"; >> + }; >> + >> + memory { >> + device_type = "memory"; >> + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ >> + 0x08000000 0x00300000 /* MEM0 - 3MiB */ >> + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ >> + }; >> + >> + cpus { >> + #address-cells = <1>; >> + #size-cells = <0>; >> + >> + /* TODO: Add SMP */ >> + PowerPC,espresso@0 { >> + device_type = "cpu"; >> + reg = <0>; >> + clock-frequency = <1243125000>; /* 1.243125GHz */ >> + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ >> + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ >> + i-cache-size = <32768>; /* 32K icache */ >> + i-cache-line-size = <32>; >> + i-cache-block-size = <32>; >> + i-cache-sets = <128>; >> + d-cache-size = <32768>; /* 32K dcache */ >> + d-cache-line-size = <32>; >> + d-cache-block-size = <32>; >> + d-cache-sets = <128>; >> + next-level-cache = <&L2_0>; >> + L2_0:l2-cache { >> + compatible = "cache"; >> + cache-level = <2>; >> + cache-unified; >> + cache-size = <0x80000>; /* 512KB L2 */ >> + cache-line-size = <64>; >> + cache-block-size = <32>; >> + cache-sets = <2048>; >> + }; >> + }; >> + }; >> + >> + latte { >> + #address-cells = <1>; >> + #size-cells = <1>; >> + compatible = "nintendo,latte"; >> + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ >> + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ >> + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ >> + >> + gpu7@c200000 { > > gpu@... > >> + compatible = "nintendo,latte-gpu7"; >> + reg = <0x0c200000 0x80000>; >> + interrupts = <2>; >> + interrupt-parent = <&espresso_pic>; >> + }; >> + >> + espresso_pic: pic@c000078 { >> + #interrupt-cells = <1>; >> + interrupt-controller; >> + >> + compatible = "nintendo,espresso-pic"; >> + reg = <0x0c000078 0x18>; >> + }; >> + >> + latte_dsp: dsp@c005000 { >> + compatible = "nintendo,latte-dsp"; >> + reg = <0x0c005000 0x200>; >> + }; >> + >> + ehci_0: usb@d040000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d040000 0x100>; >> + interrupts = <4>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_0_0: usb@d050000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d050000 0x100>; >> + interrupts = <5>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ohci_0_1: usb@d060000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d060000 0x100>; >> + interrupts = <6>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ehci_1: usb@d120000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d120000 0x100>; >> + interrupts = <16>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_1_0: usb@d130000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d130000 0x100>; >> + interrupts = <35>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ehci_2: usb@d140000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d140000 0x100>; >> + interrupts = <36>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_2_0: usb@d150000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d150000 0x100>; >> + interrupts = <37>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + sdcard_0: sdhci@d070000 { >> + compatible = "nintendo,latte-sdhci","sdhci"; >> + reg = <0x0d070000 0x200>; >> + interrupts = <7>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + wifi_0: sdhci@d080000 { >> + compatible = "nintendo,latte-sdhci","sdhci"; >> + reg = <0x0d080000 0x200>; >> + interrupts = <8>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + legacy_ipc: ipc@d800000 { >> + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; > > space between compatibles needed. > >> + reg = <0x0d800000 0x10>; >> + interrupts = <30 31>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + latte_otp: otp@d8001ec { >> + compatible = "nintendo,latte-otp"; >> + reg = <0x0d8001ec 0x8>; >> + }; >> + >> + sata: ahci@d160400 { >> + compatible = "nintendo,latte-ahci"; >> + reg = <0x0d160400 0x808>; >> + >> + interrupt-parent = <&latte_pic>; >> + interrupts = <38 28>; >> + }; >> + >> + latte_pic: pic@d800440 { >> + #interrupt-cells = <1>; >> + interrupt-controller; >> + >> + compatible = "nintendo,latte-pic"; >> + reg = <0x0d800440 0x30>; >> + interrupt-parent = <&espresso_pic>; >> + interrupts = <24>; >> + }; >> + >> + gpio: gpio@d8000c0 { >> + #gpio-cells = <2>; >> + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; >> + >> + reg = <0x0d8000c0 0x40>; >> + gpio-controller; >> + /* TODO: There are actually 31 AHBALL GPIOs */ >> + ngpios = <24>; >> + >> + gpio-line-names = >> + "POWER", "DWIFI", "FAN", "DC_DC", >> + "", "Esp10WorkAround", "", "", >> + "PADPD", "", "EEP_CS", "EEP_CLK", >> + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", >> + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", >> + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; >> + >> + interrupt-controller; >> + #interrupt-cells = <2>; >> + interrupts = <10>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + spi_gpio: spi-gpio { > > Move this to root level. It's not on the 'latte' bus. > >> + compatible = "spi-gpio"; >> + #address-cells = <1>; >> + #size-cells = <0>; >> + status = "okay"; > > Not needed, that's the default. > >> + >> + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; >> + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; >> + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; >> + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; >> + num-chipselects = <1>; >> + >> + seeprom@0 { > > eeprom@0 > >> + compatible = "atmel,at93c66"; >> + reg = <0>; >> + spi-max-frequency = <1000000>; >> + spi-cs-high; >> + /* TODO: wiiubrew says this is 16-bit, but I only get the correct >> + * values in 8-bit... >> + */ >> + data-size = <8>; >> + read-only; >> + >> + #address-cells = <1>; >> + #size-cells = <1>; >> + >> + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ >> + rng_seed: rng@12 { reg = <0x012 8>; }; >> + ppc_pvr: pvr@20 { reg = <0x020 4>; }; >> + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; >> + seeprom_ver: sver@2a { reg = <0x02A 2>; }; >> + otp_ver: over@2c { reg = <0x02C 2>; }; >> + otp_rev: orev@2e { reg = <0x02E 2>; }; >> + otp_ver_str: over-str@30 { reg = <0x030 8>; }; >> + >> + bc_crc: bc-crc@38 { reg = <0x038 4>; }; >> + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; >> + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; >> + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; >> + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; >> + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; >> + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; >> + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; >> + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; >> + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; >> + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; >> + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; >> + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; >> + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; >> + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; >> + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; >> + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; >> + >> + drive_key: drvkey@80 { reg = <0x080 16>; }; >> + factory_key: fackey@90 { reg = <0x090 16>; }; >> + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; >> + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; >> + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; >> + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; >> + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; >> + >> + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; >> + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; >> + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; >> + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; >> + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; >> + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; >> + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; >> + sysprod_code: sp_code@158 { reg = <0x158 8>; }; >> + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; >> + sysprod_model: sp_model@170 { reg = <0x170 16>; }; >> + >> + prod_year: pyear@188 { reg = <0x188 2>; }; >> + prod_date: pdate@18a { reg = <0x18A 2>; }; >> + prod_time: ptime@18c { reg = <0x18C 2>; }; >> + >> + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; >> + }; >> + }; >> + >> + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ >> + gpio-keys-polled { > > This too. > >> + poll-interval = <50>; >> + compatible = "gpio-keys-polled"; >> + >> + power { >> + label = "Power Button"; >> + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; >> + linux,code = <KEY_POWER>; >> + }; >> + }; >> + >> + gpio2: gpio2@d8000c0 { > > gpio@d800520 > >> + #gpio-cells = <2>; >> + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; >> + >> + reg = <0x0d800520 0x40>; >> + gpio-controller; >> + ngpios = <7>; >> + >> + gpio-line-names = >> + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", >> + "AVE_INT", "", "AVE_RESET"; >> + >> + interrupt-controller; >> + #interrupt-cells = <2>; >> + interrupts = <10>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + }; >> +}; >> -- >> 2.35.1 >> Will do in v2. Thanks, Ash ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 02/12] powerpc: wiiu: device tree @ 2022-03-03 2:41 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-03 2:41 UTC (permalink / raw) To: Rob Herring Cc: devicetree, Emmanuel Gil Peyrot, linux-kernel, Paul Mackerras, Roberto Van Eeden, linuxppc-dev, Jonathan Neuschäfer Hi Rob, Thanks for the review. On 3/3/22 00:36, Rob Herring wrote: > On Tue, Mar 1, 2022 at 10:44 PM Ash Logan <ash@heyquark.com> wrote: >> >> Add a device tree source file for the Nintendo Wii U video game console. > > Test this with 'make W=1 dtbs_checks'. Does make W=1 ARCH=powerpc wiiu_defconfig dtbs_check seem reasonable? I ran it, and saw LINT/CHKDT/UPD/SCHEMA/COPY steps, but if I put garbage in the .dts it gives no warnings. >> >> Signed-off-by: Ash Logan <ash@heyquark.com> >> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> >> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> >> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> >> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> >> --- >> arch/powerpc/boot/dts/wiiu.dts | 327 +++++++++++++++++++++++++++++++++ >> 1 file changed, 327 insertions(+) >> create mode 100644 arch/powerpc/boot/dts/wiiu.dts >> >> diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts >> new file mode 100644 >> index 000000000000..aaf264963f61 >> --- /dev/null >> +++ b/arch/powerpc/boot/dts/wiiu.dts >> @@ -0,0 +1,327 @@ >> +// SPDX-License-Identifier: GPL-2.0 > > What about non-GPL environments? The other powerpc dts files are all GPL-2.0(-or-later), is there a preferred license for devicetrees? >> +/* >> + * Nintendo Wii U Device Tree Source >> + * >> + * Copyright (C) 2022 The linux-wiiu Team >> + */ >> + >> +/dts-v1/; >> +#include <dt-bindings/gpio/gpio.h> >> +#include <dt-bindings/input/input.h> >> + >> +/ { >> + model = "nintendo,wiiu"; >> + compatible = "nintendo,wiiu"; >> + >> + #address-cells = <1>; >> + #size-cells = <1>; >> + >> + chosen { >> + bootargs = "root=/dev/sda1 rootwait"; >> + }; >> + >> + memory { >> + device_type = "memory"; >> + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ >> + 0x08000000 0x00300000 /* MEM0 - 3MiB */ >> + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ >> + }; >> + >> + cpus { >> + #address-cells = <1>; >> + #size-cells = <0>; >> + >> + /* TODO: Add SMP */ >> + PowerPC,espresso@0 { >> + device_type = "cpu"; >> + reg = <0>; >> + clock-frequency = <1243125000>; /* 1.243125GHz */ >> + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ >> + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ >> + i-cache-size = <32768>; /* 32K icache */ >> + i-cache-line-size = <32>; >> + i-cache-block-size = <32>; >> + i-cache-sets = <128>; >> + d-cache-size = <32768>; /* 32K dcache */ >> + d-cache-line-size = <32>; >> + d-cache-block-size = <32>; >> + d-cache-sets = <128>; >> + next-level-cache = <&L2_0>; >> + L2_0:l2-cache { >> + compatible = "cache"; >> + cache-level = <2>; >> + cache-unified; >> + cache-size = <0x80000>; /* 512KB L2 */ >> + cache-line-size = <64>; >> + cache-block-size = <32>; >> + cache-sets = <2048>; >> + }; >> + }; >> + }; >> + >> + latte { >> + #address-cells = <1>; >> + #size-cells = <1>; >> + compatible = "nintendo,latte"; >> + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ >> + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ >> + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ >> + >> + gpu7@c200000 { > > gpu@... > >> + compatible = "nintendo,latte-gpu7"; >> + reg = <0x0c200000 0x80000>; >> + interrupts = <2>; >> + interrupt-parent = <&espresso_pic>; >> + }; >> + >> + espresso_pic: pic@c000078 { >> + #interrupt-cells = <1>; >> + interrupt-controller; >> + >> + compatible = "nintendo,espresso-pic"; >> + reg = <0x0c000078 0x18>; >> + }; >> + >> + latte_dsp: dsp@c005000 { >> + compatible = "nintendo,latte-dsp"; >> + reg = <0x0c005000 0x200>; >> + }; >> + >> + ehci_0: usb@d040000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d040000 0x100>; >> + interrupts = <4>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_0_0: usb@d050000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d050000 0x100>; >> + interrupts = <5>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ohci_0_1: usb@d060000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d060000 0x100>; >> + interrupts = <6>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ehci_1: usb@d120000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d120000 0x100>; >> + interrupts = <16>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_1_0: usb@d130000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d130000 0x100>; >> + interrupts = <35>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + ehci_2: usb@d140000 { >> + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; >> + reg = <0x0d140000 0x100>; >> + interrupts = <36>; >> + interrupt-parent = <&latte_pic>; >> + big-endian-regs; >> + }; >> + >> + ohci_2_0: usb@d150000 { >> + compatible = "nintendo,latte-usb-ohci"; >> + reg = <0x0d150000 0x100>; >> + interrupts = <37>; >> + interrupt-parent = <&latte_pic>; >> + >> + big-endian-regs; >> + }; >> + >> + sdcard_0: sdhci@d070000 { >> + compatible = "nintendo,latte-sdhci","sdhci"; >> + reg = <0x0d070000 0x200>; >> + interrupts = <7>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + wifi_0: sdhci@d080000 { >> + compatible = "nintendo,latte-sdhci","sdhci"; >> + reg = <0x0d080000 0x200>; >> + interrupts = <8>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + legacy_ipc: ipc@d800000 { >> + compatible = "nintendo,latte-ipc","nintendo,hollywood-ipc"; > > space between compatibles needed. > >> + reg = <0x0d800000 0x10>; >> + interrupts = <30 31>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + latte_otp: otp@d8001ec { >> + compatible = "nintendo,latte-otp"; >> + reg = <0x0d8001ec 0x8>; >> + }; >> + >> + sata: ahci@d160400 { >> + compatible = "nintendo,latte-ahci"; >> + reg = <0x0d160400 0x808>; >> + >> + interrupt-parent = <&latte_pic>; >> + interrupts = <38 28>; >> + }; >> + >> + latte_pic: pic@d800440 { >> + #interrupt-cells = <1>; >> + interrupt-controller; >> + >> + compatible = "nintendo,latte-pic"; >> + reg = <0x0d800440 0x30>; >> + interrupt-parent = <&espresso_pic>; >> + interrupts = <24>; >> + }; >> + >> + gpio: gpio@d8000c0 { >> + #gpio-cells = <2>; >> + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; >> + >> + reg = <0x0d8000c0 0x40>; >> + gpio-controller; >> + /* TODO: There are actually 31 AHBALL GPIOs */ >> + ngpios = <24>; >> + >> + gpio-line-names = >> + "POWER", "DWIFI", "FAN", "DC_DC", >> + "", "Esp10WorkAround", "", "", >> + "PADPD", "", "EEP_CS", "EEP_CLK", >> + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", >> + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", >> + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; >> + >> + interrupt-controller; >> + #interrupt-cells = <2>; >> + interrupts = <10>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + >> + spi_gpio: spi-gpio { > > Move this to root level. It's not on the 'latte' bus. > >> + compatible = "spi-gpio"; >> + #address-cells = <1>; >> + #size-cells = <0>; >> + status = "okay"; > > Not needed, that's the default. > >> + >> + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; >> + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; >> + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; >> + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; >> + num-chipselects = <1>; >> + >> + seeprom@0 { > > eeprom@0 > >> + compatible = "atmel,at93c66"; >> + reg = <0>; >> + spi-max-frequency = <1000000>; >> + spi-cs-high; >> + /* TODO: wiiubrew says this is 16-bit, but I only get the correct >> + * values in 8-bit... >> + */ >> + data-size = <8>; >> + read-only; >> + >> + #address-cells = <1>; >> + #size-cells = <1>; >> + >> + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ >> + rng_seed: rng@12 { reg = <0x012 8>; }; >> + ppc_pvr: pvr@20 { reg = <0x020 4>; }; >> + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; >> + seeprom_ver: sver@2a { reg = <0x02A 2>; }; >> + otp_ver: over@2c { reg = <0x02C 2>; }; >> + otp_rev: orev@2e { reg = <0x02E 2>; }; >> + otp_ver_str: over-str@30 { reg = <0x030 8>; }; >> + >> + bc_crc: bc-crc@38 { reg = <0x038 4>; }; >> + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; >> + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; >> + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; >> + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; >> + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; >> + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; >> + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; >> + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; >> + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; >> + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; >> + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; >> + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; >> + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; >> + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; >> + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; >> + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; >> + >> + drive_key: drvkey@80 { reg = <0x080 16>; }; >> + factory_key: fackey@90 { reg = <0x090 16>; }; >> + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; >> + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; >> + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; >> + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; >> + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; >> + >> + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; >> + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; >> + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; >> + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; >> + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; >> + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; >> + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; >> + sysprod_code: sp_code@158 { reg = <0x158 8>; }; >> + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; >> + sysprod_model: sp_model@170 { reg = <0x170 16>; }; >> + >> + prod_year: pyear@188 { reg = <0x188 2>; }; >> + prod_date: pdate@18a { reg = <0x18A 2>; }; >> + prod_time: ptime@18c { reg = <0x18C 2>; }; >> + >> + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; >> + }; >> + }; >> + >> + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ >> + gpio-keys-polled { > > This too. > >> + poll-interval = <50>; >> + compatible = "gpio-keys-polled"; >> + >> + power { >> + label = "Power Button"; >> + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; >> + linux,code = <KEY_POWER>; >> + }; >> + }; >> + >> + gpio2: gpio2@d8000c0 { > > gpio@d800520 > >> + #gpio-cells = <2>; >> + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; >> + >> + reg = <0x0d800520 0x40>; >> + gpio-controller; >> + ngpios = <7>; >> + >> + gpio-line-names = >> + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", >> + "AVE_INT", "", "AVE_RESET"; >> + >> + interrupt-controller; >> + #interrupt-cells = <2>; >> + interrupts = <10>; >> + interrupt-parent = <&latte_pic>; >> + }; >> + }; >> +}; >> -- >> 2.35.1 >> Will do in v2. Thanks, Ash ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH 03/12] powerpc: wiiu: bootwrapper support 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:43 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Emmanuel Gil Peyrot Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 9993c6256ad2..4e31bb648f4d 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -155,6 +155,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -353,6 +354,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 9184eda780fd..f42abe4ebde2 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 03/12] powerpc: wiiu: bootwrapper support @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: Emmanuel Gil Peyrot, linuxppc-dev, linux-kernel, j.ne Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 9993c6256ad2..4e31bb648f4d 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -155,6 +155,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -353,6 +354,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 9184eda780fd..f42abe4ebde2 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 04/12] powerpc: wiiu: introduce wiiu platform 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:43 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne Add empty platforms/wiiu for Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 5 +++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 8 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index e02d29a9d12f..7ea25ea369b4 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..e5513205da3c --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 04/12] powerpc: wiiu: introduce wiiu platform @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne Add empty platforms/wiiu for Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 5 +++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 8 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index e02d29a9d12f..7ea25ea369b4 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..e5513205da3c --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 05/12] powerpc: wiiu: declare as non-coherent 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:43 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index a208997ade88..bec8293a7985 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -485,7 +485,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 05/12] powerpc: wiiu: declare as non-coherent @ 2022-03-02 4:43 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:43 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index a208997ade88..bec8293a7985 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -485,7 +485,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 06/12] powerpc: wiiu: udbg support for latteipc 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 +++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 197 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 192f0ed0097f..15c7fa7c040a 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index 0ea9e70ed78b..82858c0283ac 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 68e5c0a7e99d..f159e500342c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -167,6 +167,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1206,4 +1209,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index e5513205da3c..fa86cbc33d5e 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,3 +3,16 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..d546b3ba9bab --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 06/12] powerpc: wiiu: udbg support for latteipc @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 +++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 197 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 192f0ed0097f..15c7fa7c040a 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index 0ea9e70ed78b..82858c0283ac 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 68e5c0a7e99d..f159e500342c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -167,6 +167,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1206,4 +1209,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index e5513205da3c..fa86cbc33d5e 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,3 +3,16 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..d546b3ba9bab --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 07/12] powerpc: wiiu: espresso interrupt controller support 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Roberto Van Eeden Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 07/12] powerpc: wiiu: espresso interrupt controller support @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, Roberto Van Eeden, j.ne Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 08/12] powerpc: wiiu: latte interrupt controller support 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Roberto Van Eeden Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index fa86cbc33d5e..5e062536ca58 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY config LATTEIPC_UDBG bool "Chipset IPC udbg console for the Nintendo Wii U" diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..d16e0c2de2b0 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 08/12] powerpc: wiiu: latte interrupt controller support @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, Roberto Van Eeden, j.ne Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index fa86cbc33d5e..5e062536ca58 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY config LATTEIPC_UDBG bool "Chipset IPC udbg console for the Nintendo Wii U" diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..d16e0c2de2b0 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 09/12] powerpc: espresso processor support 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Roberto Van Eeden From: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index ae0fdef0ac11..b575f5570485 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -718,6 +718,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 09/12] powerpc: espresso processor support @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, Roberto Van Eeden, j.ne From: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index ae0fdef0ac11..b575f5570485 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -718,6 +718,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 10/12] powerpc: wiiu: platform support 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, Roberto Van Eeden, Emmanuel Gil Peyrot Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 67 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..279fa899a296 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static const struct of_device_id wiiu_of_bus[] = { + { + .compatible = "nintendo,latte", + }, + {}, +}; + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_populate(NULL, wiiu_of_bus, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 10/12] powerpc: wiiu: platform support @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: Emmanuel Gil Peyrot, linuxppc-dev, linux-kernel, Roberto Van Eeden, j.ne Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 67 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..279fa899a296 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static const struct of_device_id wiiu_of_bus[] = { + { + .compatible = "nintendo,latte", + }, + {}, +}; + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_populate(NULL, wiiu_of_bus, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 3d690be48e84..59a84629d9a0 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -125,10 +125,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 3d690be48e84..59a84629d9a0 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -125,10 +125,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-03-02 4:44 ` Ash Logan @ 2022-05-13 22:43 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-13 22:43 UTC (permalink / raw) To: Ash Logan Cc: paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > pgtable_32.c:mapin_ram loops over each valid memory range, which means > non-contiguous memory just works. Hello! Does it mean that non-contiguous memory works for any 32-bit powerpc platform, and not only for wiiu? If yes, should not be non-contiguous memory support enabled for all 32-bit ppc boards then? > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > arch/powerpc/mm/init_32.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > index 3d690be48e84..59a84629d9a0 100644 > --- a/arch/powerpc/mm/init_32.c > +++ b/arch/powerpc/mm/init_32.c > @@ -125,10 +125,10 @@ void __init MMU_init(void) > * lowmem_end_addr is initialized below. > */ > if (memblock.memory.cnt > 1) { > -#ifndef CONFIG_WII > +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > memblock_enforce_memory_limit(memblock.memory.regions[0].size); > pr_warn("Only using first contiguous memory region\n"); > -#else > +#elif defined(CONFIG_WII) > wii_memory_fixups(); > #endif > } > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-05-13 22:43 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-13 22:43 UTC (permalink / raw) To: Ash Logan; +Cc: linux-kernel, robh+dt, paulus, linuxppc-dev, j.ne On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > pgtable_32.c:mapin_ram loops over each valid memory range, which means > non-contiguous memory just works. Hello! Does it mean that non-contiguous memory works for any 32-bit powerpc platform, and not only for wiiu? If yes, should not be non-contiguous memory support enabled for all 32-bit ppc boards then? > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > arch/powerpc/mm/init_32.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > index 3d690be48e84..59a84629d9a0 100644 > --- a/arch/powerpc/mm/init_32.c > +++ b/arch/powerpc/mm/init_32.c > @@ -125,10 +125,10 @@ void __init MMU_init(void) > * lowmem_end_addr is initialized below. > */ > if (memblock.memory.cnt > 1) { > -#ifndef CONFIG_WII > +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > memblock_enforce_memory_limit(memblock.memory.regions[0].size); > pr_warn("Only using first contiguous memory region\n"); > -#else > +#elif defined(CONFIG_WII) > wii_memory_fixups(); > #endif > } > -- > 2.35.1 > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-05-13 22:43 ` Pali Rohár @ 2022-05-20 3:41 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-05-20 3:41 UTC (permalink / raw) To: Pali Rohár Cc: paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On 14/5/22 08:43, Pali Rohár wrote: > On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: >> pgtable_32.c:mapin_ram loops over each valid memory range, which means >> non-contiguous memory just works. > > Hello! Does it mean that non-contiguous memory works for any 32-bit > powerpc platform, and not only for wiiu? If yes, should not be > non-contiguous memory support enabled for all 32-bit ppc boards then? Hi! Sorry for my delayed response. As best I can tell, it does indeed Just Work, but I have only been able to test on wiiu which is missing a lot of features other boards have (like PCI) - so it's possible there's still an assumption elsewhere in the kernel that I haven't hit. As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards out there where it's even possible to have non-contiguous memory. >> Signed-off-by: Ash Logan <ash@heyquark.com> >> --- >> arch/powerpc/mm/init_32.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c >> index 3d690be48e84..59a84629d9a0 100644 >> --- a/arch/powerpc/mm/init_32.c >> +++ b/arch/powerpc/mm/init_32.c >> @@ -125,10 +125,10 @@ void __init MMU_init(void) >> * lowmem_end_addr is initialized below. >> */ >> if (memblock.memory.cnt > 1) { >> -#ifndef CONFIG_WII >> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) >> memblock_enforce_memory_limit(memblock.memory.regions[0].size); >> pr_warn("Only using first contiguous memory region\n"); >> -#else >> +#elif defined(CONFIG_WII) >> wii_memory_fixups(); >> #endif >> } >> -- >> 2.35.1 >> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-05-20 3:41 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-05-20 3:41 UTC (permalink / raw) To: Pali Rohár; +Cc: linux-kernel, robh+dt, paulus, linuxppc-dev, j.ne On 14/5/22 08:43, Pali Rohár wrote: > On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: >> pgtable_32.c:mapin_ram loops over each valid memory range, which means >> non-contiguous memory just works. > > Hello! Does it mean that non-contiguous memory works for any 32-bit > powerpc platform, and not only for wiiu? If yes, should not be > non-contiguous memory support enabled for all 32-bit ppc boards then? Hi! Sorry for my delayed response. As best I can tell, it does indeed Just Work, but I have only been able to test on wiiu which is missing a lot of features other boards have (like PCI) - so it's possible there's still an assumption elsewhere in the kernel that I haven't hit. As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards out there where it's even possible to have non-contiguous memory. >> Signed-off-by: Ash Logan <ash@heyquark.com> >> --- >> arch/powerpc/mm/init_32.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c >> index 3d690be48e84..59a84629d9a0 100644 >> --- a/arch/powerpc/mm/init_32.c >> +++ b/arch/powerpc/mm/init_32.c >> @@ -125,10 +125,10 @@ void __init MMU_init(void) >> * lowmem_end_addr is initialized below. >> */ >> if (memblock.memory.cnt > 1) { >> -#ifndef CONFIG_WII >> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) >> memblock_enforce_memory_limit(memblock.memory.regions[0].size); >> pr_warn("Only using first contiguous memory region\n"); >> -#else >> +#elif defined(CONFIG_WII) >> wii_memory_fixups(); >> #endif >> } >> -- >> 2.35.1 >> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-05-20 3:41 ` Ash Logan @ 2022-05-20 8:04 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-20 8:04 UTC (permalink / raw) To: Ash Logan Cc: paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On Friday 20 May 2022 13:41:04 Ash Logan wrote: > On 14/5/22 08:43, Pali Rohár wrote: > > On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > >> pgtable_32.c:mapin_ram loops over each valid memory range, which means > >> non-contiguous memory just works. > > > > Hello! Does it mean that non-contiguous memory works for any 32-bit > > powerpc platform, and not only for wiiu? If yes, should not be > > non-contiguous memory support enabled for all 32-bit ppc boards then? > > Hi! Sorry for my delayed response. As best I can tell, it does indeed > Just Work, but I have only been able to test on wiiu which is missing a > lot of features other boards have (like PCI) - so it's possible there's > still an assumption elsewhere in the kernel that I haven't hit. > > As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > out there where it's even possible to have non-contiguous memory. What is the reason that those two boards are the **only**? Is there some specific requirement from bootloader or hardware to "enable" non-contiguous memory support? I'm interested in enabling non-contiguous memory support for P2020-based board as it has gaps in its 32-bit memory layout and which could be used for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > >> Signed-off-by: Ash Logan <ash@heyquark.com> > >> --- > >> arch/powerpc/mm/init_32.c | 4 ++-- > >> 1 file changed, 2 insertions(+), 2 deletions(-) > >> > >> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > >> index 3d690be48e84..59a84629d9a0 100644 > >> --- a/arch/powerpc/mm/init_32.c > >> +++ b/arch/powerpc/mm/init_32.c > >> @@ -125,10 +125,10 @@ void __init MMU_init(void) > >> * lowmem_end_addr is initialized below. > >> */ > >> if (memblock.memory.cnt > 1) { > >> -#ifndef CONFIG_WII > >> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > >> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > >> pr_warn("Only using first contiguous memory region\n"); > >> -#else > >> +#elif defined(CONFIG_WII) > >> wii_memory_fixups(); > >> #endif > >> } > >> -- > >> 2.35.1 > >> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-05-20 8:04 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-20 8:04 UTC (permalink / raw) To: Ash Logan; +Cc: linux-kernel, robh+dt, paulus, linuxppc-dev, j.ne On Friday 20 May 2022 13:41:04 Ash Logan wrote: > On 14/5/22 08:43, Pali Rohár wrote: > > On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > >> pgtable_32.c:mapin_ram loops over each valid memory range, which means > >> non-contiguous memory just works. > > > > Hello! Does it mean that non-contiguous memory works for any 32-bit > > powerpc platform, and not only for wiiu? If yes, should not be > > non-contiguous memory support enabled for all 32-bit ppc boards then? > > Hi! Sorry for my delayed response. As best I can tell, it does indeed > Just Work, but I have only been able to test on wiiu which is missing a > lot of features other boards have (like PCI) - so it's possible there's > still an assumption elsewhere in the kernel that I haven't hit. > > As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > out there where it's even possible to have non-contiguous memory. What is the reason that those two boards are the **only**? Is there some specific requirement from bootloader or hardware to "enable" non-contiguous memory support? I'm interested in enabling non-contiguous memory support for P2020-based board as it has gaps in its 32-bit memory layout and which could be used for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > >> Signed-off-by: Ash Logan <ash@heyquark.com> > >> --- > >> arch/powerpc/mm/init_32.c | 4 ++-- > >> 1 file changed, 2 insertions(+), 2 deletions(-) > >> > >> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > >> index 3d690be48e84..59a84629d9a0 100644 > >> --- a/arch/powerpc/mm/init_32.c > >> +++ b/arch/powerpc/mm/init_32.c > >> @@ -125,10 +125,10 @@ void __init MMU_init(void) > >> * lowmem_end_addr is initialized below. > >> */ > >> if (memblock.memory.cnt > 1) { > >> -#ifndef CONFIG_WII > >> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > >> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > >> pr_warn("Only using first contiguous memory region\n"); > >> -#else > >> +#elif defined(CONFIG_WII) > >> wii_memory_fixups(); > >> #endif > >> } > >> -- > >> 2.35.1 > >> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-05-20 8:04 ` Pali Rohár @ 2022-05-20 10:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-05-20 10:44 UTC (permalink / raw) To: Pali Rohár; +Cc: linux-kernel, robh+dt, paulus, linuxppc-dev, j.ne On 20/5/22 18:04, Pali Rohár wrote: > On Friday 20 May 2022 13:41:04 Ash Logan wrote: >> On 14/5/22 08:43, Pali Rohár wrote: >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means >>>> non-contiguous memory just works. >>> >>> Hello! Does it mean that non-contiguous memory works for any 32-bit >>> powerpc platform, and not only for wiiu? If yes, should not be >>> non-contiguous memory support enabled for all 32-bit ppc boards then? >> >> Hi! Sorry for my delayed response. As best I can tell, it does indeed >> Just Work, but I have only been able to test on wiiu which is missing a >> lot of features other boards have (like PCI) - so it's possible there's >> still an assumption elsewhere in the kernel that I haven't hit. >> >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards >> out there where it's even possible to have non-contiguous memory. > > What is the reason that those two boards are the **only**? Is there some > specific requirement from bootloader or hardware to "enable" > non-contiguous memory support? Not that I know of, I was just saying that I was only aware of those two boards where the memory map isn't contiguous, and that is the only place where it has been tested. Evidently you know of another board! > I'm interested in enabling non-contiguous memory support for P2020-based > board as it has gaps in its 32-bit memory layout and which could be used > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or whatever, then more memory at a higher address) then you should try a patch along these lines, because barring the unknowns I mentioned before it should work. At least as far as I'm aware ;) >>>> Signed-off-by: Ash Logan <ash@heyquark.com> >>>> --- >>>> arch/powerpc/mm/init_32.c | 4 ++-- >>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c >>>> index 3d690be48e84..59a84629d9a0 100644 >>>> --- a/arch/powerpc/mm/init_32.c >>>> +++ b/arch/powerpc/mm/init_32.c >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) >>>> * lowmem_end_addr is initialized below. >>>> */ >>>> if (memblock.memory.cnt > 1) { >>>> -#ifndef CONFIG_WII >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); >>>> pr_warn("Only using first contiguous memory region\n"); >>>> -#else >>>> +#elif defined(CONFIG_WII) >>>> wii_memory_fixups(); >>>> #endif >>>> } >>>> -- >>>> 2.35.1 >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-05-20 10:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-05-20 10:44 UTC (permalink / raw) To: Pali Rohár Cc: paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On 20/5/22 18:04, Pali Rohár wrote: > On Friday 20 May 2022 13:41:04 Ash Logan wrote: >> On 14/5/22 08:43, Pali Rohár wrote: >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means >>>> non-contiguous memory just works. >>> >>> Hello! Does it mean that non-contiguous memory works for any 32-bit >>> powerpc platform, and not only for wiiu? If yes, should not be >>> non-contiguous memory support enabled for all 32-bit ppc boards then? >> >> Hi! Sorry for my delayed response. As best I can tell, it does indeed >> Just Work, but I have only been able to test on wiiu which is missing a >> lot of features other boards have (like PCI) - so it's possible there's >> still an assumption elsewhere in the kernel that I haven't hit. >> >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards >> out there where it's even possible to have non-contiguous memory. > > What is the reason that those two boards are the **only**? Is there some > specific requirement from bootloader or hardware to "enable" > non-contiguous memory support? Not that I know of, I was just saying that I was only aware of those two boards where the memory map isn't contiguous, and that is the only place where it has been tested. Evidently you know of another board! > I'm interested in enabling non-contiguous memory support for P2020-based > board as it has gaps in its 32-bit memory layout and which could be used > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or whatever, then more memory at a higher address) then you should try a patch along these lines, because barring the unknowns I mentioned before it should work. At least as far as I'm aware ;) >>>> Signed-off-by: Ash Logan <ash@heyquark.com> >>>> --- >>>> arch/powerpc/mm/init_32.c | 4 ++-- >>>> 1 file changed, 2 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c >>>> index 3d690be48e84..59a84629d9a0 100644 >>>> --- a/arch/powerpc/mm/init_32.c >>>> +++ b/arch/powerpc/mm/init_32.c >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) >>>> * lowmem_end_addr is initialized below. >>>> */ >>>> if (memblock.memory.cnt > 1) { >>>> -#ifndef CONFIG_WII >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); >>>> pr_warn("Only using first contiguous memory region\n"); >>>> -#else >>>> +#elif defined(CONFIG_WII) >>>> wii_memory_fixups(); >>>> #endif >>>> } >>>> -- >>>> 2.35.1 >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-05-20 10:44 ` Ash Logan @ 2022-05-20 12:30 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-20 12:30 UTC (permalink / raw) To: linux-mm Cc: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne + linux-mm Do you know what are requirements for kernel to support non-contiguous memory support and what is needed to enable it for 32-bit powerpc? Currently powerpc arch code does not support "memblock.memory.cnt > 1" except for WII which seems like a hack... See below. On Friday 20 May 2022 20:44:04 Ash Logan wrote: > On 20/5/22 18:04, Pali Rohár wrote: > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > >> On 14/5/22 08:43, Pali Rohár wrote: > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > >>>> non-contiguous memory just works. > >>> > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > >>> powerpc platform, and not only for wiiu? If yes, should not be > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > >> > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > >> Just Work, but I have only been able to test on wiiu which is missing a > >> lot of features other boards have (like PCI) - so it's possible there's > >> still an assumption elsewhere in the kernel that I haven't hit. > >> > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > >> out there where it's even possible to have non-contiguous memory. > > > > What is the reason that those two boards are the **only**? Is there some > > specific requirement from bootloader or hardware to "enable" > > non-contiguous memory support? > > Not that I know of, I was just saying that I was only aware of those two > boards where the memory map isn't contiguous, and that is the only place > where it has been tested. Evidently you know of another board! > > > I'm interested in enabling non-contiguous memory support for P2020-based > > board as it has gaps in its 32-bit memory layout and which could be used > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > whatever, then more memory at a higher address) then you should try a > patch along these lines, because barring the unknowns I mentioned before > it should work. At least as far as I'm aware ;) > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > >>>> --- > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > >>>> > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > >>>> index 3d690be48e84..59a84629d9a0 100644 > >>>> --- a/arch/powerpc/mm/init_32.c > >>>> +++ b/arch/powerpc/mm/init_32.c > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > >>>> * lowmem_end_addr is initialized below. > >>>> */ > >>>> if (memblock.memory.cnt > 1) { > >>>> -#ifndef CONFIG_WII > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > >>>> pr_warn("Only using first contiguous memory region\n"); > >>>> -#else > >>>> +#elif defined(CONFIG_WII) > >>>> wii_memory_fixups(); > >>>> #endif > >>>> } > >>>> -- > >>>> 2.35.1 > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-05-20 12:30 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-05-20 12:30 UTC (permalink / raw) To: linux-mm; +Cc: linux-kernel, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne + linux-mm Do you know what are requirements for kernel to support non-contiguous memory support and what is needed to enable it for 32-bit powerpc? Currently powerpc arch code does not support "memblock.memory.cnt > 1" except for WII which seems like a hack... See below. On Friday 20 May 2022 20:44:04 Ash Logan wrote: > On 20/5/22 18:04, Pali Rohár wrote: > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > >> On 14/5/22 08:43, Pali Rohár wrote: > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > >>>> non-contiguous memory just works. > >>> > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > >>> powerpc platform, and not only for wiiu? If yes, should not be > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > >> > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > >> Just Work, but I have only been able to test on wiiu which is missing a > >> lot of features other boards have (like PCI) - so it's possible there's > >> still an assumption elsewhere in the kernel that I haven't hit. > >> > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > >> out there where it's even possible to have non-contiguous memory. > > > > What is the reason that those two boards are the **only**? Is there some > > specific requirement from bootloader or hardware to "enable" > > non-contiguous memory support? > > Not that I know of, I was just saying that I was only aware of those two > boards where the memory map isn't contiguous, and that is the only place > where it has been tested. Evidently you know of another board! > > > I'm interested in enabling non-contiguous memory support for P2020-based > > board as it has gaps in its 32-bit memory layout and which could be used > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > whatever, then more memory at a higher address) then you should try a > patch along these lines, because barring the unknowns I mentioned before > it should work. At least as far as I'm aware ;) > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > >>>> --- > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > >>>> > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > >>>> index 3d690be48e84..59a84629d9a0 100644 > >>>> --- a/arch/powerpc/mm/init_32.c > >>>> +++ b/arch/powerpc/mm/init_32.c > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > >>>> * lowmem_end_addr is initialized below. > >>>> */ > >>>> if (memblock.memory.cnt > 1) { > >>>> -#ifndef CONFIG_WII > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > >>>> pr_warn("Only using first contiguous memory region\n"); > >>>> -#else > >>>> +#elif defined(CONFIG_WII) > >>>> wii_memory_fixups(); > >>>> #endif > >>>> } > >>>> -- > >>>> 2.35.1 > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-05-20 12:30 ` Pali Rohár @ 2022-06-09 22:24 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-06-09 22:24 UTC (permalink / raw) To: linux-mm Cc: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > + linux-mm > > Do you know what are requirements for kernel to support non-contiguous > memory support and what is needed to enable it for 32-bit powerpc? Any hints? > Currently powerpc arch code does not support "memblock.memory.cnt > 1" > except for WII which seems like a hack... See below. > > On Friday 20 May 2022 20:44:04 Ash Logan wrote: > > On 20/5/22 18:04, Pali Rohár wrote: > > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > > >> On 14/5/22 08:43, Pali Rohár wrote: > > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > > >>>> non-contiguous memory just works. > > >>> > > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > > >>> powerpc platform, and not only for wiiu? If yes, should not be > > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > > >> > > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > > >> Just Work, but I have only been able to test on wiiu which is missing a > > >> lot of features other boards have (like PCI) - so it's possible there's > > >> still an assumption elsewhere in the kernel that I haven't hit. > > >> > > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > > >> out there where it's even possible to have non-contiguous memory. > > > > > > What is the reason that those two boards are the **only**? Is there some > > > specific requirement from bootloader or hardware to "enable" > > > non-contiguous memory support? > > > > Not that I know of, I was just saying that I was only aware of those two > > boards where the memory map isn't contiguous, and that is the only place > > where it has been tested. Evidently you know of another board! > > > > > I'm interested in enabling non-contiguous memory support for P2020-based > > > board as it has gaps in its 32-bit memory layout and which could be used > > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > > whatever, then more memory at a higher address) then you should try a > > patch along these lines, because barring the unknowns I mentioned before > > it should work. At least as far as I'm aware ;) > > > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > > >>>> --- > > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > > >>>> > > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > > >>>> index 3d690be48e84..59a84629d9a0 100644 > > >>>> --- a/arch/powerpc/mm/init_32.c > > >>>> +++ b/arch/powerpc/mm/init_32.c > > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > > >>>> * lowmem_end_addr is initialized below. > > >>>> */ > > >>>> if (memblock.memory.cnt > 1) { > > >>>> -#ifndef CONFIG_WII > > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > > >>>> pr_warn("Only using first contiguous memory region\n"); > > >>>> -#else > > >>>> +#elif defined(CONFIG_WII) > > >>>> wii_memory_fixups(); > > >>>> #endif > > >>>> } > > >>>> -- > > >>>> 2.35.1 > > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-06-09 22:24 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-06-09 22:24 UTC (permalink / raw) To: linux-mm; +Cc: linux-kernel, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > + linux-mm > > Do you know what are requirements for kernel to support non-contiguous > memory support and what is needed to enable it for 32-bit powerpc? Any hints? > Currently powerpc arch code does not support "memblock.memory.cnt > 1" > except for WII which seems like a hack... See below. > > On Friday 20 May 2022 20:44:04 Ash Logan wrote: > > On 20/5/22 18:04, Pali Rohár wrote: > > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > > >> On 14/5/22 08:43, Pali Rohár wrote: > > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > > >>>> non-contiguous memory just works. > > >>> > > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > > >>> powerpc platform, and not only for wiiu? If yes, should not be > > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > > >> > > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > > >> Just Work, but I have only been able to test on wiiu which is missing a > > >> lot of features other boards have (like PCI) - so it's possible there's > > >> still an assumption elsewhere in the kernel that I haven't hit. > > >> > > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > > >> out there where it's even possible to have non-contiguous memory. > > > > > > What is the reason that those two boards are the **only**? Is there some > > > specific requirement from bootloader or hardware to "enable" > > > non-contiguous memory support? > > > > Not that I know of, I was just saying that I was only aware of those two > > boards where the memory map isn't contiguous, and that is the only place > > where it has been tested. Evidently you know of another board! > > > > > I'm interested in enabling non-contiguous memory support for P2020-based > > > board as it has gaps in its 32-bit memory layout and which could be used > > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > > whatever, then more memory at a higher address) then you should try a > > patch along these lines, because barring the unknowns I mentioned before > > it should work. At least as far as I'm aware ;) > > > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > > >>>> --- > > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > > >>>> > > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > > >>>> index 3d690be48e84..59a84629d9a0 100644 > > >>>> --- a/arch/powerpc/mm/init_32.c > > >>>> +++ b/arch/powerpc/mm/init_32.c > > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > > >>>> * lowmem_end_addr is initialized below. > > >>>> */ > > >>>> if (memblock.memory.cnt > 1) { > > >>>> -#ifndef CONFIG_WII > > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > > >>>> pr_warn("Only using first contiguous memory region\n"); > > >>>> -#else > > >>>> +#elif defined(CONFIG_WII) > > >>>> wii_memory_fixups(); > > >>>> #endif > > >>>> } > > >>>> -- > > >>>> 2.35.1 > > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-06-09 22:24 ` Pali Rohár @ 2022-08-08 18:40 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-08-08 18:40 UTC (permalink / raw) To: linux-mm Cc: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > + linux-mm > > > > Do you know what are requirements for kernel to support non-contiguous > > memory support and what is needed to enable it for 32-bit powerpc? > > Any hints? PING? > > Currently powerpc arch code does not support "memblock.memory.cnt > 1" > > except for WII which seems like a hack... See below. > > > > On Friday 20 May 2022 20:44:04 Ash Logan wrote: > > > On 20/5/22 18:04, Pali Rohár wrote: > > > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > > > >> On 14/5/22 08:43, Pali Rohár wrote: > > > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > > > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > > > >>>> non-contiguous memory just works. > > > >>> > > > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > > > >>> powerpc platform, and not only for wiiu? If yes, should not be > > > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > > > >> > > > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > > > >> Just Work, but I have only been able to test on wiiu which is missing a > > > >> lot of features other boards have (like PCI) - so it's possible there's > > > >> still an assumption elsewhere in the kernel that I haven't hit. > > > >> > > > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > > > >> out there where it's even possible to have non-contiguous memory. > > > > > > > > What is the reason that those two boards are the **only**? Is there some > > > > specific requirement from bootloader or hardware to "enable" > > > > non-contiguous memory support? > > > > > > Not that I know of, I was just saying that I was only aware of those two > > > boards where the memory map isn't contiguous, and that is the only place > > > where it has been tested. Evidently you know of another board! > > > > > > > I'm interested in enabling non-contiguous memory support for P2020-based > > > > board as it has gaps in its 32-bit memory layout and which could be used > > > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > > > > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > > > whatever, then more memory at a higher address) then you should try a > > > patch along these lines, because barring the unknowns I mentioned before > > > it should work. At least as far as I'm aware ;) > > > > > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > > > >>>> --- > > > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > > > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > > > >>>> > > > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > > > >>>> index 3d690be48e84..59a84629d9a0 100644 > > > >>>> --- a/arch/powerpc/mm/init_32.c > > > >>>> +++ b/arch/powerpc/mm/init_32.c > > > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > > > >>>> * lowmem_end_addr is initialized below. > > > >>>> */ > > > >>>> if (memblock.memory.cnt > 1) { > > > >>>> -#ifndef CONFIG_WII > > > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > > > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > > > >>>> pr_warn("Only using first contiguous memory region\n"); > > > >>>> -#else > > > >>>> +#elif defined(CONFIG_WII) > > > >>>> wii_memory_fixups(); > > > >>>> #endif > > > >>>> } > > > >>>> -- > > > >>>> 2.35.1 > > > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-08-08 18:40 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-08-08 18:40 UTC (permalink / raw) To: linux-mm; +Cc: linux-kernel, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > + linux-mm > > > > Do you know what are requirements for kernel to support non-contiguous > > memory support and what is needed to enable it for 32-bit powerpc? > > Any hints? PING? > > Currently powerpc arch code does not support "memblock.memory.cnt > 1" > > except for WII which seems like a hack... See below. > > > > On Friday 20 May 2022 20:44:04 Ash Logan wrote: > > > On 20/5/22 18:04, Pali Rohár wrote: > > > > On Friday 20 May 2022 13:41:04 Ash Logan wrote: > > > >> On 14/5/22 08:43, Pali Rohár wrote: > > > >>> On Wednesday 02 March 2022 15:44:05 Ash Logan wrote: > > > >>>> pgtable_32.c:mapin_ram loops over each valid memory range, which means > > > >>>> non-contiguous memory just works. > > > >>> > > > >>> Hello! Does it mean that non-contiguous memory works for any 32-bit > > > >>> powerpc platform, and not only for wiiu? If yes, should not be > > > >>> non-contiguous memory support enabled for all 32-bit ppc boards then? > > > >> > > > >> Hi! Sorry for my delayed response. As best I can tell, it does indeed > > > >> Just Work, but I have only been able to test on wiiu which is missing a > > > >> lot of features other boards have (like PCI) - so it's possible there's > > > >> still an assumption elsewhere in the kernel that I haven't hit. > > > >> > > > >> As best I can tell, the Wii and Wii U are the only 32-bit powerpc boards > > > >> out there where it's even possible to have non-contiguous memory. > > > > > > > > What is the reason that those two boards are the **only**? Is there some > > > > specific requirement from bootloader or hardware to "enable" > > > > non-contiguous memory support? > > > > > > Not that I know of, I was just saying that I was only aware of those two > > > boards where the memory map isn't contiguous, and that is the only place > > > where it has been tested. Evidently you know of another board! > > > > > > > I'm interested in enabling non-contiguous memory support for P2020-based > > > > board as it has gaps in its 32-bit memory layout and which could be used > > > > for RAM mapping when 4GB DDR3 module is plugged in (default is 2GB). > > > > > > If it's like the Wii or Wii U (some memory at 0, a gap for MMIO or > > > whatever, then more memory at a higher address) then you should try a > > > patch along these lines, because barring the unknowns I mentioned before > > > it should work. At least as far as I'm aware ;) > > > > > > >>>> Signed-off-by: Ash Logan <ash@heyquark.com> > > > >>>> --- > > > >>>> arch/powerpc/mm/init_32.c | 4 ++-- > > > >>>> 1 file changed, 2 insertions(+), 2 deletions(-) > > > >>>> > > > >>>> diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c > > > >>>> index 3d690be48e84..59a84629d9a0 100644 > > > >>>> --- a/arch/powerpc/mm/init_32.c > > > >>>> +++ b/arch/powerpc/mm/init_32.c > > > >>>> @@ -125,10 +125,10 @@ void __init MMU_init(void) > > > >>>> * lowmem_end_addr is initialized below. > > > >>>> */ > > > >>>> if (memblock.memory.cnt > 1) { > > > >>>> -#ifndef CONFIG_WII > > > >>>> +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) > > > >>>> memblock_enforce_memory_limit(memblock.memory.regions[0].size); > > > >>>> pr_warn("Only using first contiguous memory region\n"); > > > >>>> -#else > > > >>>> +#elif defined(CONFIG_WII) > > > >>>> wii_memory_fixups(); > > > >>>> #endif > > > >>>> } > > > >>>> -- > > > >>>> 2.35.1 > > > >>>> ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-08-08 18:40 ` Pali Rohár @ 2022-09-08 15:25 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-08 15:25 UTC (permalink / raw) To: Pali Rohár Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm Le 08/08/2022 à 20:40, Pali Rohár a écrit : > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>> + linux-mm >>> >>> Do you know what are requirements for kernel to support non-contiguous >>> memory support and what is needed to enable it for 32-bit powerpc? >> >> Any hints? > > PING? > The tree following patches landed in powerpc/next branch, so they should soon be visible in linux-next too: fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of gigantic pages") b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-09-08 15:25 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-08 15:25 UTC (permalink / raw) To: Pali Rohár Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne Le 08/08/2022 à 20:40, Pali Rohár a écrit : > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>> + linux-mm >>> >>> Do you know what are requirements for kernel to support non-contiguous >>> memory support and what is needed to enable it for 32-bit powerpc? >> >> Any hints? > > PING? > The tree following patches landed in powerpc/next branch, so they should soon be visible in linux-next too: fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of gigantic pages") b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory 2022-09-08 15:25 ` Christophe Leroy @ 2022-09-08 15:35 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-08 15:35 UTC (permalink / raw) To: Christophe Leroy Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > >>> + linux-mm > >>> > >>> Do you know what are requirements for kernel to support non-contiguous > >>> memory support and what is needed to enable it for 32-bit powerpc? > >> > >> Any hints? > > > > PING? > > > > The tree following patches landed in powerpc/next branch, so they should > soon be visible in linux-next too: > > fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > gigantic pages") > b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") Ou, nice! I will try to test it if it allows me to access more than 2GB of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-09-08 15:35 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-08 15:35 UTC (permalink / raw) To: Christophe Leroy Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > >>> + linux-mm > >>> > >>> Do you know what are requirements for kernel to support non-contiguous > >>> memory support and what is needed to enable it for 32-bit powerpc? > >> > >> Any hints? > > > > PING? > > > > The tree following patches landed in powerpc/next branch, so they should > soon be visible in linux-next too: > > fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > gigantic pages") > b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") Ou, nice! I will try to test it if it allows me to access more than 2GB of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Fragmented physical memory on powerpc/32 2022-09-08 15:35 ` Pali Rohár @ 2022-09-08 20:17 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-08 20:17 UTC (permalink / raw) To: Christophe Leroy Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > > Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > > >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > >>> + linux-mm > > >>> > > >>> Do you know what are requirements for kernel to support non-contiguous > > >>> memory support and what is needed to enable it for 32-bit powerpc? > > >> > > >> Any hints? > > > > > > PING? > > > > > > > The tree following patches landed in powerpc/next branch, so they should > > soon be visible in linux-next too: > > > > fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > > gigantic pages") > > b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > > 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > > Ou, nice! I will try to test it if it allows me to access more than 2GB > of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. Hello! Ok, I have tried it from powerpc/next branch, but seems it does not work. I'm getting just early kernel crash. [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 [ 0.000000] Faulting instruction address: 0xc01c8348 [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 [ 0.000000] DEAR: 0007df58 ESR: 00000000 [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 [ 0.000000] Call Trace: [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 [ 0.000000] Instruction dump: [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 [ 0.000000] ---[ end trace 0000000000000000 ]--- [ 0.000000] [ 0.000000] Kernel panic - not syncing: Fatal exception [ 0.000000] Rebooting in 1 seconds.. [ 0.000000] System Halted, OK to turn off power 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB address range. And on ranges: 0x0000_0000 - 0x7fff_ffff 0xc020_0000 - 0xeeff_ffff 0xf000_0000 - 0xff6f_ffff there is no peripheral device, they are free for DRAM. Between these physical ranges are mapped peripheral devices (PCIe and NOR). Any idea if I'm doing something wrong or there can be a bug in memory code? Quite suspicious is that "Initmem setup node 0" prints one range where are also peripherals, not just DRAM. Crash is on address 0xc01c8348 which belongs to PCIe. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Fragmented physical memory on powerpc/32 @ 2022-09-08 20:17 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-08 20:17 UTC (permalink / raw) To: Christophe Leroy Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > > Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > > On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > > >> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > >>> + linux-mm > > >>> > > >>> Do you know what are requirements for kernel to support non-contiguous > > >>> memory support and what is needed to enable it for 32-bit powerpc? > > >> > > >> Any hints? > > > > > > PING? > > > > > > > The tree following patches landed in powerpc/next branch, so they should > > soon be visible in linux-next too: > > > > fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > > gigantic pages") > > b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > > 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > > Ou, nice! I will try to test it if it allows me to access more than 2GB > of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. Hello! Ok, I have tried it from powerpc/next branch, but seems it does not work. I'm getting just early kernel crash. [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 [ 0.000000] Faulting instruction address: 0xc01c8348 [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 [ 0.000000] DEAR: 0007df58 ESR: 00000000 [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 [ 0.000000] Call Trace: [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 [ 0.000000] Instruction dump: [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 [ 0.000000] ---[ end trace 0000000000000000 ]--- [ 0.000000] [ 0.000000] Kernel panic - not syncing: Fatal exception [ 0.000000] Rebooting in 1 seconds.. [ 0.000000] System Halted, OK to turn off power 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB address range. And on ranges: 0x0000_0000 - 0x7fff_ffff 0xc020_0000 - 0xeeff_ffff 0xf000_0000 - 0xff6f_ffff there is no peripheral device, they are free for DRAM. Between these physical ranges are mapped peripheral devices (PCIe and NOR). Any idea if I'm doing something wrong or there can be a bug in memory code? Quite suspicious is that "Initmem setup node 0" prints one range where are also peripherals, not just DRAM. Crash is on address 0xc01c8348 which belongs to PCIe. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-08 20:17 ` Pali Rohár @ 2022-09-10 9:39 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-10 9:39 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm + Adding Mike who might help if the problem is around memblock. Le 08/09/2022 à 22:17, Pali Rohár a écrit : > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>>>>> + linux-mm >>>>>> >>>>>> Do you know what are requirements for kernel to support non-contiguous >>>>>> memory support and what is needed to enable it for 32-bit powerpc? >>>>> >>>>> Any hints? >>>> >>>> PING? >>>> >>> >>> The tree following patches landed in powerpc/next branch, so they should >>> soon be visible in linux-next too: >>> >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of >>> gigantic pages") >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") >> >> Ou, nice! I will try to test it if it allows me to access more than 2GB >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > not work. I'm getting just early kernel crash. > > [ 0.000000] CPU maps initialized for 1 thread per core > [ 0.000000] (thread shift is 0) > [ 0.000000] ----------------------------------------------------- > [ 0.000000] phys_mem_size = 0xbe500000 > [ 0.000000] dcache_bsize = 0x20 > [ 0.000000] icache_bsize = 0x20 > [ 0.000000] cpu_features = 0x0000000010010108 > [ 0.000000] possible = 0x0000000010010108 > [ 0.000000] always = 0x0000000010010108 > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > [ 0.000000] mmu_features = 0x00020010 > [ 0.000000] ----------------------------------------------------- > mpc85xx_rdb_setup_arch() > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > [ 0.000000] barrier-nospec: patched 182 locations > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > [ 0.000000] Memory hole size: 1042MB > [ 0.000000] Zone ranges: > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > [ 0.000000] Movable zone start for each node > [ 0.000000] Early memory node ranges > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > [ 0.000000] Faulting instruction address: 0xc01c8348 > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > [ 0.000000] Modules linked in: > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > [ 0.000000] Call Trace: > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > [ 0.000000] Instruction dump: > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > [ 0.000000] ---[ end trace 0000000000000000 ]--- > [ 0.000000] > [ 0.000000] Kernel panic - not syncing: Fatal exception > [ 0.000000] Rebooting in 1 seconds.. > [ 0.000000] System Halted, OK to turn off power > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > address range. And on ranges: > 0x0000_0000 - 0x7fff_ffff > 0xc020_0000 - 0xeeff_ffff > 0xf000_0000 - 0xff6f_ffff > there is no peripheral device, they are free for DRAM. Between these > physical ranges are mapped peripheral devices (PCIe and NOR). > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > Quite suspicious is that "Initmem setup node 0" prints one range where > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > which belongs to PCIe. > Yes I also find that "Initmem setup node 0" suspicious. However the crash address 0xc01c8348 is valid kernel address. That's a virtual address, not a physical address, so that's not PCIe. That's kernel linear mapping, so that's likely physical address 0x001c8348 offseted by PAGE_OFFSET which is 0xc0000000. Do you have a way to reproduce this problem under QEMU ? Thanks Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-10 9:39 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-10 9:39 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne + Adding Mike who might help if the problem is around memblock. Le 08/09/2022 à 22:17, Pali Rohár a écrit : > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>>>>> + linux-mm >>>>>> >>>>>> Do you know what are requirements for kernel to support non-contiguous >>>>>> memory support and what is needed to enable it for 32-bit powerpc? >>>>> >>>>> Any hints? >>>> >>>> PING? >>>> >>> >>> The tree following patches landed in powerpc/next branch, so they should >>> soon be visible in linux-next too: >>> >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of >>> gigantic pages") >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") >> >> Ou, nice! I will try to test it if it allows me to access more than 2GB >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > not work. I'm getting just early kernel crash. > > [ 0.000000] CPU maps initialized for 1 thread per core > [ 0.000000] (thread shift is 0) > [ 0.000000] ----------------------------------------------------- > [ 0.000000] phys_mem_size = 0xbe500000 > [ 0.000000] dcache_bsize = 0x20 > [ 0.000000] icache_bsize = 0x20 > [ 0.000000] cpu_features = 0x0000000010010108 > [ 0.000000] possible = 0x0000000010010108 > [ 0.000000] always = 0x0000000010010108 > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > [ 0.000000] mmu_features = 0x00020010 > [ 0.000000] ----------------------------------------------------- > mpc85xx_rdb_setup_arch() > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > [ 0.000000] barrier-nospec: patched 182 locations > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > [ 0.000000] Memory hole size: 1042MB > [ 0.000000] Zone ranges: > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > [ 0.000000] Movable zone start for each node > [ 0.000000] Early memory node ranges > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > [ 0.000000] Faulting instruction address: 0xc01c8348 > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > [ 0.000000] Modules linked in: > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > [ 0.000000] Call Trace: > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > [ 0.000000] Instruction dump: > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > [ 0.000000] ---[ end trace 0000000000000000 ]--- > [ 0.000000] > [ 0.000000] Kernel panic - not syncing: Fatal exception > [ 0.000000] Rebooting in 1 seconds.. > [ 0.000000] System Halted, OK to turn off power > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > address range. And on ranges: > 0x0000_0000 - 0x7fff_ffff > 0xc020_0000 - 0xeeff_ffff > 0xf000_0000 - 0xff6f_ffff > there is no peripheral device, they are free for DRAM. Between these > physical ranges are mapped peripheral devices (PCIe and NOR). > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > Quite suspicious is that "Initmem setup node 0" prints one range where > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > which belongs to PCIe. > Yes I also find that "Initmem setup node 0" suspicious. However the crash address 0xc01c8348 is valid kernel address. That's a virtual address, not a physical address, so that's not PCIe. That's kernel linear mapping, so that's likely physical address 0x001c8348 offseted by PAGE_OFFSET which is 0xc0000000. Do you have a way to reproduce this problem under QEMU ? Thanks Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-10 9:39 ` Christophe Leroy @ 2022-09-12 14:48 ` Mike Rapoport -1 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-12 14:48 UTC (permalink / raw) To: Christophe Leroy Cc: Pali Rohár, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: > + Adding Mike who might help if the problem is around memblock. > > Le 08/09/2022 à 22:17, Pali Rohár a écrit : > > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : > >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > >>>>>> + linux-mm > >>>>>> > >>>>>> Do you know what are requirements for kernel to support non-contiguous > >>>>>> memory support and what is needed to enable it for 32-bit powerpc? > >>>>> > >>>>> Any hints? > >>>> > >>>> PING? > >>>> > >>> > >>> The tree following patches landed in powerpc/next branch, so they should > >>> soon be visible in linux-next too: > >>> > >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > >>> gigantic pages") > >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > >> > >> Ou, nice! I will try to test it if it allows me to access more than 2GB > >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > > not work. I'm getting just early kernel crash. > > > > [ 0.000000] CPU maps initialized for 1 thread per core > > [ 0.000000] (thread shift is 0) > > [ 0.000000] ----------------------------------------------------- > > [ 0.000000] phys_mem_size = 0xbe500000 > > [ 0.000000] dcache_bsize = 0x20 > > [ 0.000000] icache_bsize = 0x20 > > [ 0.000000] cpu_features = 0x0000000010010108 > > [ 0.000000] possible = 0x0000000010010108 > > [ 0.000000] always = 0x0000000010010108 > > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > > [ 0.000000] mmu_features = 0x00020010 > > [ 0.000000] ----------------------------------------------------- > > mpc85xx_rdb_setup_arch() > > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > > [ 0.000000] barrier-nospec: patched 182 locations > > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > > [ 0.000000] Memory hole size: 1042MB > > [ 0.000000] Zone ranges: > > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > > [ 0.000000] Movable zone start for each node > > [ 0.000000] Early memory node ranges > > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > > [ 0.000000] Faulting instruction address: 0xc01c8348 > > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > > [ 0.000000] Modules linked in: > > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > > [ 0.000000] Call Trace: > > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > > [ 0.000000] Instruction dump: > > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > > [ 0.000000] ---[ end trace 0000000000000000 ]--- > > [ 0.000000] > > [ 0.000000] Kernel panic - not syncing: Fatal exception > > [ 0.000000] Rebooting in 1 seconds.. > > [ 0.000000] System Halted, OK to turn off power > > > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > > address range. And on ranges: > > 0x0000_0000 - 0x7fff_ffff > > 0xc020_0000 - 0xeeff_ffff > > 0xf000_0000 - 0xff6f_ffff > > there is no peripheral device, they are free for DRAM. Between these > > physical ranges are mapped peripheral devices (PCIe and NOR). > > > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > > > Quite suspicious is that "Initmem setup node 0" prints one range where > > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > > which belongs to PCIe. > > > > Yes I also find that "Initmem setup node 0" suspicious. > > However the crash address 0xc01c8348 is valid kernel address. That's a > virtual address, not a physical address, so that's not PCIe. That's > kernel linear mapping, so that's likely physical address 0x001c8348 > offseted by PAGE_OFFSET which is 0xc0000000. If I read the dump correctly, 0xc01c8348 is the PC of the instruction that crashed and the access was to 0x0007df58 which seem to well inside 0x0000_0000 - 0x7fff_ffff range. And the "Early memory node ranges" look consistent with the memory layout above. My guess would be that something went wrong in the linear map setup, but it won't hurt running with "memblock=debug" added to the kernel command line to see if there is anything suspicious there. > Do you have a way to reproduce this problem under QEMU ? > > Thanks > Christophe -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-12 14:48 ` Mike Rapoport 0 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-12 14:48 UTC (permalink / raw) To: Christophe Leroy Cc: linuxppc-dev, linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, Pali Rohár, j.ne On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: > + Adding Mike who might help if the problem is around memblock. > > Le 08/09/2022 à 22:17, Pali Rohár a écrit : > > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : > >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > >>>>>> + linux-mm > >>>>>> > >>>>>> Do you know what are requirements for kernel to support non-contiguous > >>>>>> memory support and what is needed to enable it for 32-bit powerpc? > >>>>> > >>>>> Any hints? > >>>> > >>>> PING? > >>>> > >>> > >>> The tree following patches landed in powerpc/next branch, so they should > >>> soon be visible in linux-next too: > >>> > >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > >>> gigantic pages") > >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > >> > >> Ou, nice! I will try to test it if it allows me to access more than 2GB > >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > > not work. I'm getting just early kernel crash. > > > > [ 0.000000] CPU maps initialized for 1 thread per core > > [ 0.000000] (thread shift is 0) > > [ 0.000000] ----------------------------------------------------- > > [ 0.000000] phys_mem_size = 0xbe500000 > > [ 0.000000] dcache_bsize = 0x20 > > [ 0.000000] icache_bsize = 0x20 > > [ 0.000000] cpu_features = 0x0000000010010108 > > [ 0.000000] possible = 0x0000000010010108 > > [ 0.000000] always = 0x0000000010010108 > > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > > [ 0.000000] mmu_features = 0x00020010 > > [ 0.000000] ----------------------------------------------------- > > mpc85xx_rdb_setup_arch() > > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > > [ 0.000000] barrier-nospec: patched 182 locations > > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > > [ 0.000000] Memory hole size: 1042MB > > [ 0.000000] Zone ranges: > > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > > [ 0.000000] Movable zone start for each node > > [ 0.000000] Early memory node ranges > > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > > [ 0.000000] Faulting instruction address: 0xc01c8348 > > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > > [ 0.000000] Modules linked in: > > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > > [ 0.000000] Call Trace: > > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > > [ 0.000000] Instruction dump: > > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > > [ 0.000000] ---[ end trace 0000000000000000 ]--- > > [ 0.000000] > > [ 0.000000] Kernel panic - not syncing: Fatal exception > > [ 0.000000] Rebooting in 1 seconds.. > > [ 0.000000] System Halted, OK to turn off power > > > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > > address range. And on ranges: > > 0x0000_0000 - 0x7fff_ffff > > 0xc020_0000 - 0xeeff_ffff > > 0xf000_0000 - 0xff6f_ffff > > there is no peripheral device, they are free for DRAM. Between these > > physical ranges are mapped peripheral devices (PCIe and NOR). > > > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > > > Quite suspicious is that "Initmem setup node 0" prints one range where > > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > > which belongs to PCIe. > > > > Yes I also find that "Initmem setup node 0" suspicious. > > However the crash address 0xc01c8348 is valid kernel address. That's a > virtual address, not a physical address, so that's not PCIe. That's > kernel linear mapping, so that's likely physical address 0x001c8348 > offseted by PAGE_OFFSET which is 0xc0000000. If I read the dump correctly, 0xc01c8348 is the PC of the instruction that crashed and the access was to 0x0007df58 which seem to well inside 0x0000_0000 - 0x7fff_ffff range. And the "Early memory node ranges" look consistent with the memory layout above. My guess would be that something went wrong in the linear map setup, but it won't hurt running with "memblock=debug" added to the kernel command line to see if there is anything suspicious there. > Do you have a way to reproduce this problem under QEMU ? > > Thanks > Christophe -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-12 14:48 ` Mike Rapoport @ 2022-09-12 21:16 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-12 21:16 UTC (permalink / raw) To: Mike Rapoport Cc: Christophe Leroy, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Monday 12 September 2022 15:48:05 Mike Rapoport wrote: > On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: > > + Adding Mike who might help if the problem is around memblock. > > > > Le 08/09/2022 à 22:17, Pali Rohár a écrit : > > > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > > >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > > >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > > >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > >>>>>> + linux-mm > > >>>>>> > > >>>>>> Do you know what are requirements for kernel to support non-contiguous > > >>>>>> memory support and what is needed to enable it for 32-bit powerpc? > > >>>>> > > >>>>> Any hints? > > >>>> > > >>>> PING? > > >>>> > > >>> > > >>> The tree following patches landed in powerpc/next branch, so they should > > >>> soon be visible in linux-next too: > > >>> > > >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > > >>> gigantic pages") > > >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > > >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > > >> > > >> Ou, nice! I will try to test it if it allows me to access more than 2GB > > >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > > > > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > > > not work. I'm getting just early kernel crash. > > > > > > [ 0.000000] CPU maps initialized for 1 thread per core > > > [ 0.000000] (thread shift is 0) > > > [ 0.000000] ----------------------------------------------------- > > > [ 0.000000] phys_mem_size = 0xbe500000 > > > [ 0.000000] dcache_bsize = 0x20 > > > [ 0.000000] icache_bsize = 0x20 > > > [ 0.000000] cpu_features = 0x0000000010010108 > > > [ 0.000000] possible = 0x0000000010010108 > > > [ 0.000000] always = 0x0000000010010108 > > > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > > > [ 0.000000] mmu_features = 0x00020010 > > > [ 0.000000] ----------------------------------------------------- > > > mpc85xx_rdb_setup_arch() > > > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > > > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > > > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > > > [ 0.000000] barrier-nospec: patched 182 locations > > > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > > > [ 0.000000] Memory hole size: 1042MB > > > [ 0.000000] Zone ranges: > > > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > > > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > > > [ 0.000000] Movable zone start for each node > > > [ 0.000000] Early memory node ranges > > > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > > > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > > > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > > > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > > > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > > > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > > > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > > > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > > > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > > > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > > > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > > > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > > > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > > > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > > > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > > > [ 0.000000] Faulting instruction address: 0xc01c8348 > > > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > > > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > > > [ 0.000000] Modules linked in: > > > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > > > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > > > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > > > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > > > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > > > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > > > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > > > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > > > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > > > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > > > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > > > [ 0.000000] Call Trace: > > > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > > > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > > > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > > > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > > > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > > > [ 0.000000] Instruction dump: > > > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > > > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > > > [ 0.000000] ---[ end trace 0000000000000000 ]--- > > > [ 0.000000] > > > [ 0.000000] Kernel panic - not syncing: Fatal exception > > > [ 0.000000] Rebooting in 1 seconds.. > > > [ 0.000000] System Halted, OK to turn off power > > > > > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > > > address range. And on ranges: > > > 0x0000_0000 - 0x7fff_ffff > > > 0xc020_0000 - 0xeeff_ffff > > > 0xf000_0000 - 0xff6f_ffff > > > there is no peripheral device, they are free for DRAM. Between these > > > physical ranges are mapped peripheral devices (PCIe and NOR). > > > > > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > > > > > Quite suspicious is that "Initmem setup node 0" prints one range where > > > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > > > which belongs to PCIe. > > > > > > > Yes I also find that "Initmem setup node 0" suspicious. > > > > However the crash address 0xc01c8348 is valid kernel address. That's a > > virtual address, not a physical address, so that's not PCIe. That's > > kernel linear mapping, so that's likely physical address 0x001c8348 > > offseted by PAGE_OFFSET which is 0xc0000000. > > If I read the dump correctly, 0xc01c8348 is the PC of the instruction that > crashed and the access was to 0x0007df58 which seem to well inside > 0x0000_0000 - 0x7fff_ffff range. I have tried to read and write memory at address 0x0007df58 in U-Boot and it works fine without any crash. I repeated that boot and it always failed with same errors at same address. I have also tried to use different 4GB DDR module (just in case if it is non-functional) but it failed on the same error on the same address. > And the "Early memory node ranges" look consistent with the memory layout > above. > > My guess would be that something went wrong in the linear map setup, but it > won't hurt running with "memblock=debug" added to the kernel command line > to see if there is anything suspicious there. Here is boot log on serial console with memblock=debug command line: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 116 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff5713] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 116 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff5693] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 [ 0.000000] Faulting instruction address: 0xc01c8348 [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 [ 0.000000] DEAR: 0007df58 ESR: 00000000 [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 [ 0.000000] Call Trace: [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 [ 0.000000] Instruction dump: [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 [ 0.000000] ---[ end trace 0000000000000000 ]--- [ 0.000000] [ 0.000000] Kernel panic - not syncing: Fatal exception [ 0.000000] Rebooting in 1 seconds.. [ 0.000000] System Halted, OK to turn off power Do you need something more for debug? > > Do you have a way to reproduce this problem under QEMU ? Well, I really do not know how to run it in QEMU. IIRC QEMU does not have support for P2020 processor. Is there any guidance? > > Thanks > > Christophe > > -- > Sincerely yours, > Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-12 21:16 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-12 21:16 UTC (permalink / raw) To: Mike Rapoport Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Monday 12 September 2022 15:48:05 Mike Rapoport wrote: > On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: > > + Adding Mike who might help if the problem is around memblock. > > > > Le 08/09/2022 à 22:17, Pali Rohár a écrit : > > > On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: > > >> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: > > >>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : > > >>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: > > >>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: > > >>>>>> + linux-mm > > >>>>>> > > >>>>>> Do you know what are requirements for kernel to support non-contiguous > > >>>>>> memory support and what is needed to enable it for 32-bit powerpc? > > >>>>> > > >>>>> Any hints? > > >>>> > > >>>> PING? > > >>>> > > >>> > > >>> The tree following patches landed in powerpc/next branch, so they should > > >>> soon be visible in linux-next too: > > >>> > > >>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of > > >>> gigantic pages") > > >>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") > > >>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") > > >> > > >> Ou, nice! I will try to test it if it allows me to access more than 2GB > > >> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. > > > > > > Hello! Ok, I have tried it from powerpc/next branch, but seems it does > > > not work. I'm getting just early kernel crash. > > > > > > [ 0.000000] CPU maps initialized for 1 thread per core > > > [ 0.000000] (thread shift is 0) > > > [ 0.000000] ----------------------------------------------------- > > > [ 0.000000] phys_mem_size = 0xbe500000 > > > [ 0.000000] dcache_bsize = 0x20 > > > [ 0.000000] icache_bsize = 0x20 > > > [ 0.000000] cpu_features = 0x0000000010010108 > > > [ 0.000000] possible = 0x0000000010010108 > > > [ 0.000000] always = 0x0000000010010108 > > > [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 > > > [ 0.000000] mmu_features = 0x00020010 > > > [ 0.000000] ----------------------------------------------------- > > > mpc85xx_rdb_setup_arch() > > > [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead > > > [ 0.000000] MPC85xx RDB board from Freescale Semiconductor > > > [ 0.000000] barrier-nospec: using isync; sync as speculation barrier > > > [ 0.000000] barrier-nospec: patched 182 locations > > > [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 > > > [ 0.000000] Memory hole size: 1042MB > > > [ 0.000000] Zone ranges: > > > [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] > > > [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] > > > [ 0.000000] Movable zone start for each node > > > [ 0.000000] Early memory node ranges > > > [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] > > > [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] > > > [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] > > > [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] > > > [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts > > > [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 > > > [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 > > > [ 0.000000] pcpu-alloc: [0] 0 [0] 1 > > > [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 > > > [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 > > > [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) > > > [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) > > > [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off > > > [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) > > > [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 > > > [ 0.000000] Faulting instruction address: 0xc01c8348 > > > [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] > > > [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC > > > [ 0.000000] Modules linked in: > > > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 > > > [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a > > > [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) > > > [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 > > > [ 0.000000] DEAR: 0007df58 ESR: 00000000 > > > [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 > > > [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 > > > [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 > > > [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 > > > [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 > > > [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 > > > [ 0.000000] Call Trace: > > > [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) > > > [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 > > > [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 > > > [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 > > > [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 > > > [ 0.000000] Instruction dump: > > > [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a > > > [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 > > > [ 0.000000] ---[ end trace 0000000000000000 ]--- > > > [ 0.000000] > > > [ 0.000000] Kernel panic - not syncing: Fatal exception > > > [ 0.000000] Rebooting in 1 seconds.. > > > [ 0.000000] System Halted, OK to turn off power > > > > > > 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB > > > address range. And on ranges: > > > 0x0000_0000 - 0x7fff_ffff > > > 0xc020_0000 - 0xeeff_ffff > > > 0xf000_0000 - 0xff6f_ffff > > > there is no peripheral device, they are free for DRAM. Between these > > > physical ranges are mapped peripheral devices (PCIe and NOR). > > > > > > Any idea if I'm doing something wrong or there can be a bug in memory code? > > > > > > Quite suspicious is that "Initmem setup node 0" prints one range where > > > are also peripherals, not just DRAM. Crash is on address 0xc01c8348 > > > which belongs to PCIe. > > > > > > > Yes I also find that "Initmem setup node 0" suspicious. > > > > However the crash address 0xc01c8348 is valid kernel address. That's a > > virtual address, not a physical address, so that's not PCIe. That's > > kernel linear mapping, so that's likely physical address 0x001c8348 > > offseted by PAGE_OFFSET which is 0xc0000000. > > If I read the dump correctly, 0xc01c8348 is the PC of the instruction that > crashed and the access was to 0x0007df58 which seem to well inside > 0x0000_0000 - 0x7fff_ffff range. I have tried to read and write memory at address 0x0007df58 in U-Boot and it works fine without any crash. I repeated that boot and it always failed with same errors at same address. I have also tried to use different 4GB DDR module (just in case if it is non-functional) but it failed on the same error on the same address. > And the "Early memory node ranges" look consistent with the memory layout > above. > > My guess would be that something went wrong in the linear map setup, but it > won't hurt running with "memblock=debug" added to the kernel command line > to see if there is anything suspicious there. Here is boot log on serial console with memblock=debug command line: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 116 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff5713] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 116 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff5693] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 [ 0.000000] Faulting instruction address: 0xc01c8348 [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 [ 0.000000] DEAR: 0007df58 ESR: 00000000 [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 [ 0.000000] Call Trace: [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 [ 0.000000] Instruction dump: [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 [ 0.000000] ---[ end trace 0000000000000000 ]--- [ 0.000000] [ 0.000000] Kernel panic - not syncing: Fatal exception [ 0.000000] Rebooting in 1 seconds.. [ 0.000000] System Halted, OK to turn off power Do you need something more for debug? > > Do you have a way to reproduce this problem under QEMU ? Well, I really do not know how to run it in QEMU. IIRC QEMU does not have support for P2020 processor. Is there any guidance? > > Thanks > > Christophe > > -- > Sincerely yours, > Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-12 21:16 ` Pali Rohár @ 2022-09-13 6:11 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-13 6:11 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm Le 12/09/2022 à 23:16, Pali Rohár a écrit : > On Monday 12 September 2022 15:48:05 Mike Rapoport wrote: >> On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: >>> + Adding Mike who might help if the problem is around memblock. >>> >>> Le 08/09/2022 à 22:17, Pali Rohár a écrit : >>>> On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: >>>>> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: >>>>>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : >>>>>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >>>>>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>>>>>>>> + linux-mm >>>>>>>>> >>>>>>>>> Do you know what are requirements for kernel to support non-contiguous >>>>>>>>> memory support and what is needed to enable it for 32-bit powerpc? >>>>>>>> >>>>>>>> Any hints? >>>>>>> >>>>>>> PING? >>>>>>> >>>>>> >>>>>> The tree following patches landed in powerpc/next branch, so they should >>>>>> soon be visible in linux-next too: >>>>>> >>>>>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of >>>>>> gigantic pages") >>>>>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") >>>>>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") >>>>> >>>>> Ou, nice! I will try to test it if it allows me to access more than 2GB >>>>> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. >>>> >>>> Hello! Ok, I have tried it from powerpc/next branch, but seems it does >>>> not work. I'm getting just early kernel crash. >>>> >>>> [ 0.000000] CPU maps initialized for 1 thread per core >>>> [ 0.000000] (thread shift is 0) >>>> [ 0.000000] ----------------------------------------------------- >>>> [ 0.000000] phys_mem_size = 0xbe500000 >>>> [ 0.000000] dcache_bsize = 0x20 >>>> [ 0.000000] icache_bsize = 0x20 >>>> [ 0.000000] cpu_features = 0x0000000010010108 >>>> [ 0.000000] possible = 0x0000000010010108 >>>> [ 0.000000] always = 0x0000000010010108 >>>> [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 >>>> [ 0.000000] mmu_features = 0x00020010 >>>> [ 0.000000] ----------------------------------------------------- >>>> mpc85xx_rdb_setup_arch() >>>> [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead >>>> [ 0.000000] MPC85xx RDB board from Freescale Semiconductor >>>> [ 0.000000] barrier-nospec: using isync; sync as speculation barrier >>>> [ 0.000000] barrier-nospec: patched 182 locations >>>> [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 >>>> [ 0.000000] Memory hole size: 1042MB >>>> [ 0.000000] Zone ranges: >>>> [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] >>>> [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] >>>> [ 0.000000] Movable zone start for each node >>>> [ 0.000000] Early memory node ranges >>>> [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] >>>> [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] >>>> [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] >>>> [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] >>>> [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts >>>> [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 >>>> [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 >>>> [ 0.000000] pcpu-alloc: [0] 0 [0] 1 >>>> [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 >>>> [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 >>>> [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) >>>> [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) >>>> [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off >>>> [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) >>>> [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 >>>> [ 0.000000] Faulting instruction address: 0xc01c8348 >>>> [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] >>>> [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC >>>> [ 0.000000] Modules linked in: >>>> [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 >>>> [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a >>>> [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) >>>> [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 >>>> [ 0.000000] DEAR: 0007df58 ESR: 00000000 >>>> [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 >>>> [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 >>>> [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 >>>> [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 >>>> [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 >>>> [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 >>>> [ 0.000000] Call Trace: >>>> [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) >>>> [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 >>>> [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 >>>> [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 >>>> [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 >>>> [ 0.000000] Instruction dump: >>>> [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a >>>> [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 >>>> [ 0.000000] ---[ end trace 0000000000000000 ]--- >>>> [ 0.000000] >>>> [ 0.000000] Kernel panic - not syncing: Fatal exception >>>> [ 0.000000] Rebooting in 1 seconds.. >>>> [ 0.000000] System Halted, OK to turn off power >>>> >>>> 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB >>>> address range. And on ranges: >>>> 0x0000_0000 - 0x7fff_ffff >>>> 0xc020_0000 - 0xeeff_ffff >>>> 0xf000_0000 - 0xff6f_ffff >>>> there is no peripheral device, they are free for DRAM. Between these >>>> physical ranges are mapped peripheral devices (PCIe and NOR). >>>> >>>> Any idea if I'm doing something wrong or there can be a bug in memory code? >>>> >>>> Quite suspicious is that "Initmem setup node 0" prints one range where >>>> are also peripherals, not just DRAM. Crash is on address 0xc01c8348 >>>> which belongs to PCIe. >>>> >>> >>> Yes I also find that "Initmem setup node 0" suspicious. >>> >>> However the crash address 0xc01c8348 is valid kernel address. That's a >>> virtual address, not a physical address, so that's not PCIe. That's >>> kernel linear mapping, so that's likely physical address 0x001c8348 >>> offseted by PAGE_OFFSET which is 0xc0000000. >> >> If I read the dump correctly, 0xc01c8348 is the PC of the instruction that >> crashed and the access was to 0x0007df58 which seem to well inside >> 0x0000_0000 - 0x7fff_ffff range. > > I have tried to read and write memory at address 0x0007df58 in U-Boot > and it works fine without any crash. You are mixing physical and virtual addresses. With Uboot, you checked the Physical address. That corresponds to address 0xc007df58 in Linux. The Oops happens at virtual address 0x7df58 which is definitely invalid as it is below 0xc0000000. > > I repeated that boot and it always failed with same errors at same > address. I have also tried to use different 4GB DDR module (just in case > if it is non-functional) but it failed on the same error on the same > address. > >> And the "Early memory node ranges" look consistent with the memory layout >> above. >> >> My guess would be that something went wrong in the linear map setup, but it >> won't hurt running with "memblock=debug" added to the kernel command line >> to see if there is anything suspicious there. > > Here is boot log on serial console with memblock=debug command line: > ... > > Do you need something more for debug? Can you send me the 'vmlinux' used to generate the above Oops so that I can see exactly where we are in function mem_init(). And could you also try without CONFIG_HIGHMEM just in case. > >>> Do you have a way to reproduce this problem under QEMU ? > > Well, I really do not know how to run it in QEMU. IIRC QEMU does not > have support for P2020 processor. Is there any guidance? > I don't know. I guess there might be the same problem with any e500. But as far as I can see, the 8544 emulation on QEMU has a limit of 3GB and provides memory as a single block. Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-13 6:11 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-13 6:11 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne Le 12/09/2022 à 23:16, Pali Rohár a écrit : > On Monday 12 September 2022 15:48:05 Mike Rapoport wrote: >> On Sat, Sep 10, 2022 at 09:39:20AM +0000, Christophe Leroy wrote: >>> + Adding Mike who might help if the problem is around memblock. >>> >>> Le 08/09/2022 à 22:17, Pali Rohár a écrit : >>>> On Thursday 08 September 2022 17:35:11 Pali Rohár wrote: >>>>> On Thursday 08 September 2022 15:25:14 Christophe Leroy wrote: >>>>>> Le 08/08/2022 à 20:40, Pali Rohár a écrit : >>>>>>> On Friday 10 June 2022 00:24:20 Pali Rohár wrote: >>>>>>>> On Friday 20 May 2022 14:30:02 Pali Rohár wrote: >>>>>>>>> + linux-mm >>>>>>>>> >>>>>>>>> Do you know what are requirements for kernel to support non-contiguous >>>>>>>>> memory support and what is needed to enable it for 32-bit powerpc? >>>>>>>> >>>>>>>> Any hints? >>>>>>> >>>>>>> PING? >>>>>>> >>>>>> >>>>>> The tree following patches landed in powerpc/next branch, so they should >>>>>> soon be visible in linux-next too: >>>>>> >>>>>> fc06755e2562 ("powerpc/32: Drop a stale comment about reservation of >>>>>> gigantic pages") >>>>>> b0e0d68b1c52 ("powerpc/32: Allow fragmented physical memory") >>>>>> 0115953dcebe ("powerpc/32: Remove wii_memory_fixups()") >>>>> >>>>> Ou, nice! I will try to test it if it allows me to access more than 2GB >>>>> of RAM from 4GB DDR3 module with 32-bit addressing mode on P2020 CPU. >>>> >>>> Hello! Ok, I have tried it from powerpc/next branch, but seems it does >>>> not work. I'm getting just early kernel crash. >>>> >>>> [ 0.000000] CPU maps initialized for 1 thread per core >>>> [ 0.000000] (thread shift is 0) >>>> [ 0.000000] ----------------------------------------------------- >>>> [ 0.000000] phys_mem_size = 0xbe500000 >>>> [ 0.000000] dcache_bsize = 0x20 >>>> [ 0.000000] icache_bsize = 0x20 >>>> [ 0.000000] cpu_features = 0x0000000010010108 >>>> [ 0.000000] possible = 0x0000000010010108 >>>> [ 0.000000] always = 0x0000000010010108 >>>> [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 >>>> [ 0.000000] mmu_features = 0x00020010 >>>> [ 0.000000] ----------------------------------------------------- >>>> mpc85xx_rdb_setup_arch() >>>> [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead >>>> [ 0.000000] MPC85xx RDB board from Freescale Semiconductor >>>> [ 0.000000] barrier-nospec: using isync; sync as speculation barrier >>>> [ 0.000000] barrier-nospec: patched 182 locations >>>> [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 >>>> [ 0.000000] Memory hole size: 1042MB >>>> [ 0.000000] Zone ranges: >>>> [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] >>>> [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] >>>> [ 0.000000] Movable zone start for each node >>>> [ 0.000000] Early memory node ranges >>>> [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] >>>> [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] >>>> [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] >>>> [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] >>>> [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts >>>> [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 >>>> [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 >>>> [ 0.000000] pcpu-alloc: [0] 0 [0] 1 >>>> [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 >>>> [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs,2048 rootflags=chk_data_crc rw console=ttyS0,115200 >>>> [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) >>>> [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) >>>> [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off >>>> [ 0.000000] Kernel attempted to read user page (7df58) - exploit attempt? (uid: 0) >>>> [ 0.000000] BUG: Unable to handle kernel data access on read at 0x0007df58 >>>> [ 0.000000] Faulting instruction address: 0xc01c8348 >>>> [ 0.000000] Oops: Kernel access of bad area, sig: 11 [#1] >>>> [ 0.000000] BE PAGE_SIZE=4K SMP NR_CPUS=2 P2020RDB-PC >>>> [ 0.000000] Modules linked in: >>>> [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-0caacb197b677410bdac81bc34f05235+ #121 >>>> [ 0.000000] NIP: c01c8348 LR: c01cb2bc CTR: 0000000a >>>> [ 0.000000] REGS: c10d7e20 TRAP: 0300 Not tainted (6.0.0-rc2-0caacb197b677410bdac81bc34f05235+) >>>> [ 0.000000] MSR: 00021000 <CE,ME> CR: 48044224 XER: 00000000 >>>> [ 0.000000] DEAR: 0007df58 ESR: 00000000 >>>> [ 0.000000] GPR00: c01cb294 c10d7f10 c1045340 00000001 00000004 c112bcc0 00000015 eedf1000 >>>> [ 0.000000] GPR08: 00000003 0007df58 00000000 f0000000 28044228 00000200 00000000 00000000 >>>> [ 0.000000] GPR16: 00000000 00000000 00000000 0275cb7a c0000000 00000001 0000075f 00000000 >>>> [ 0.000000] GPR24: c1031004 00000000 00000000 00000001 c10f0000 eedf1000 00080000 00080000 >>>> [ 0.000000] NIP [c01c8348] free_unref_page_prepare.part.93+0x48/0x60 >>>> [ 0.000000] LR [c01cb2bc] free_unref_page+0x84/0x4b8 >>>> [ 0.000000] Call Trace: >>>> [ 0.000000] [c10d7f10] [eedf1000] 0xeedf1000 (unreliable) >>>> [ 0.000000] [c10d7f20] [c01cb294] free_unref_page+0x5c/0x4b8 >>>> [ 0.000000] [c10d7f70] [c1007644] mem_init+0xd0/0x194 >>>> [ 0.000000] [c10d7fa0] [c1000e4c] start_kernel+0x4c0/0x6d0 >>>> [ 0.000000] [c10d7ff0] [c00003e0] set_ivor+0x13c/0x178 >>>> [ 0.000000] Instruction dump: >>>> [ 0.000000] 552817be 5509103a 7d294214 55293830 7d4a4a14 812a003c 814a0038 5529002a >>>> [ 0.000000] 7c892050 5484c23a 5489eafa 548406fe <7d2a482e> 7d242430 5484077e 90870010 >>>> [ 0.000000] ---[ end trace 0000000000000000 ]--- >>>> [ 0.000000] >>>> [ 0.000000] Kernel panic - not syncing: Fatal exception >>>> [ 0.000000] Rebooting in 1 seconds.. >>>> [ 0.000000] System Halted, OK to turn off power >>>> >>>> 4GB DDR3 SODIMM module is set via Freescale LBC to the whole 4 GB >>>> address range. And on ranges: >>>> 0x0000_0000 - 0x7fff_ffff >>>> 0xc020_0000 - 0xeeff_ffff >>>> 0xf000_0000 - 0xff6f_ffff >>>> there is no peripheral device, they are free for DRAM. Between these >>>> physical ranges are mapped peripheral devices (PCIe and NOR). >>>> >>>> Any idea if I'm doing something wrong or there can be a bug in memory code? >>>> >>>> Quite suspicious is that "Initmem setup node 0" prints one range where >>>> are also peripherals, not just DRAM. Crash is on address 0xc01c8348 >>>> which belongs to PCIe. >>>> >>> >>> Yes I also find that "Initmem setup node 0" suspicious. >>> >>> However the crash address 0xc01c8348 is valid kernel address. That's a >>> virtual address, not a physical address, so that's not PCIe. That's >>> kernel linear mapping, so that's likely physical address 0x001c8348 >>> offseted by PAGE_OFFSET which is 0xc0000000. >> >> If I read the dump correctly, 0xc01c8348 is the PC of the instruction that >> crashed and the access was to 0x0007df58 which seem to well inside >> 0x0000_0000 - 0x7fff_ffff range. > > I have tried to read and write memory at address 0x0007df58 in U-Boot > and it works fine without any crash. You are mixing physical and virtual addresses. With Uboot, you checked the Physical address. That corresponds to address 0xc007df58 in Linux. The Oops happens at virtual address 0x7df58 which is definitely invalid as it is below 0xc0000000. > > I repeated that boot and it always failed with same errors at same > address. I have also tried to use different 4GB DDR module (just in case > if it is non-functional) but it failed on the same error on the same > address. > >> And the "Early memory node ranges" look consistent with the memory layout >> above. >> >> My guess would be that something went wrong in the linear map setup, but it >> won't hurt running with "memblock=debug" added to the kernel command line >> to see if there is anything suspicious there. > > Here is boot log on serial console with memblock=debug command line: > ... > > Do you need something more for debug? Can you send me the 'vmlinux' used to generate the above Oops so that I can see exactly where we are in function mem_init(). And could you also try without CONFIG_HIGHMEM just in case. > >>> Do you have a way to reproduce this problem under QEMU ? > > Well, I really do not know how to run it in QEMU. IIRC QEMU does not > have support for P2020 processor. Is there any guidance? > I don't know. I guess there might be the same problem with any e500. But as far as I can see, the 8544 emulation on QEMU has a limit of 3GB and provides memory as a single block. Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-13 6:11 ` Christophe Leroy @ 2022-09-13 12:36 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-13 12:36 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > > > Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>> >>> My guess would be that something went wrong in the linear map setup, >>> but it >>> won't hurt running with "memblock=debug" added to the kernel command >>> line >>> to see if there is anything suspicious there. >> >> Here is boot log on serial console with memblock=debug command line: >> > ... >> >> Do you need something more for debug? > > Can you send me the 'vmlinux' used to generate the above Oops so that I > can see exactly where we are in function mem_init(). > > And could you also try without CONFIG_HIGHMEM just in case. > I looked at the vmlinux you sent me, the problem is in the loop for highmem in mem_init(). It crashes in the call to free_highmem_page() #ifdef CONFIG_HIGHMEM { unsigned long pfn, highmem_mapnr; highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; struct page *page = pfn_to_page(pfn); if (!memblock_is_reserved(paddr)) free_highmem_page(page); } } #endif /* CONFIG_HIGHMEM */ As far as I can see in the memblock debug lines, the holes don't seem to be marked as reserved by memblock. So it is above valid ? Other architectures seem to do differently. Can you try by replacing !memblock_is_reserved(paddr) by memblock_is_memory(paddr) ? Thanks Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-13 12:36 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-13 12:36 UTC (permalink / raw) To: Pali Rohár, Mike Rapoport Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > > > Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>> >>> My guess would be that something went wrong in the linear map setup, >>> but it >>> won't hurt running with "memblock=debug" added to the kernel command >>> line >>> to see if there is anything suspicious there. >> >> Here is boot log on serial console with memblock=debug command line: >> > ... >> >> Do you need something more for debug? > > Can you send me the 'vmlinux' used to generate the above Oops so that I > can see exactly where we are in function mem_init(). > > And could you also try without CONFIG_HIGHMEM just in case. > I looked at the vmlinux you sent me, the problem is in the loop for highmem in mem_init(). It crashes in the call to free_highmem_page() #ifdef CONFIG_HIGHMEM { unsigned long pfn, highmem_mapnr; highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; struct page *page = pfn_to_page(pfn); if (!memblock_is_reserved(paddr)) free_highmem_page(page); } } #endif /* CONFIG_HIGHMEM */ As far as I can see in the memblock debug lines, the holes don't seem to be marked as reserved by memblock. So it is above valid ? Other architectures seem to do differently. Can you try by replacing !memblock_is_reserved(paddr) by memblock_is_memory(paddr) ? Thanks Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-13 12:36 ` Christophe Leroy @ 2022-09-14 9:32 ` Mike Rapoport -1 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-14 9:32 UTC (permalink / raw) To: Christophe Leroy Cc: Pali Rohár, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: > > > Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > > > > > > Le 12/09/2022 à 23:16, Pali Rohár a écrit : > > > > > > > > My guess would be that something went wrong in the linear map > > > > setup, but it > > > > won't hurt running with "memblock=debug" added to the kernel > > > > command line > > > > to see if there is anything suspicious there. > > > > > > Here is boot log on serial console with memblock=debug command line: > > > > > ... > > > > > > Do you need something more for debug? > > > > Can you send me the 'vmlinux' used to generate the above Oops so that I > > can see exactly where we are in function mem_init(). > > > > And could you also try without CONFIG_HIGHMEM just in case. > > > > I looked at the vmlinux you sent me, the problem is in the loop for highmem > in mem_init(). It crashes in the call to free_highmem_page() > > #ifdef CONFIG_HIGHMEM > { > unsigned long pfn, highmem_mapnr; > > highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; > for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { > phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; > struct page *page = pfn_to_page(pfn); > if (!memblock_is_reserved(paddr)) > free_highmem_page(page); > } > } > #endif /* CONFIG_HIGHMEM */ > > > As far as I can see in the memblock debug lines, the holes don't seem to be > marked as reserved by memblock. So it is above valid ? Other architectures > seem to do differently. > > Can you try by replacing !memblock_is_reserved(paddr) by > memblock_is_memory(paddr) ? The holes should not be marked as reserved, we just need to loop over the memory ranges rather than over pfns. Then the holes will be taken into account. I believe arm and xtensa got this right: (from arch/arm/mm/init.c) static void __init free_highpages(void) { #ifdef CONFIG_HIGHMEM unsigned long max_low = max_low_pfn; phys_addr_t range_start, range_end; u64 i; /* set highmem page free */ for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &range_start, &range_end, NULL) { unsigned long start = PFN_UP(range_start); unsigned long end = PFN_DOWN(range_end); /* Ignore complete lowmem entries */ if (end <= max_low) continue; /* Truncate partial highmem entries */ if (start < max_low) start = max_low; for (; start < end; start++) free_highmem_page(pfn_to_page(start)); } #endif } > Thanks > Christophe > -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-14 9:32 ` Mike Rapoport 0 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-14 9:32 UTC (permalink / raw) To: Christophe Leroy Cc: linuxppc-dev, linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, Pali Rohár, j.ne On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: > > > Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > > > > > > Le 12/09/2022 à 23:16, Pali Rohár a écrit : > > > > > > > > My guess would be that something went wrong in the linear map > > > > setup, but it > > > > won't hurt running with "memblock=debug" added to the kernel > > > > command line > > > > to see if there is anything suspicious there. > > > > > > Here is boot log on serial console with memblock=debug command line: > > > > > ... > > > > > > Do you need something more for debug? > > > > Can you send me the 'vmlinux' used to generate the above Oops so that I > > can see exactly where we are in function mem_init(). > > > > And could you also try without CONFIG_HIGHMEM just in case. > > > > I looked at the vmlinux you sent me, the problem is in the loop for highmem > in mem_init(). It crashes in the call to free_highmem_page() > > #ifdef CONFIG_HIGHMEM > { > unsigned long pfn, highmem_mapnr; > > highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; > for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { > phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; > struct page *page = pfn_to_page(pfn); > if (!memblock_is_reserved(paddr)) > free_highmem_page(page); > } > } > #endif /* CONFIG_HIGHMEM */ > > > As far as I can see in the memblock debug lines, the holes don't seem to be > marked as reserved by memblock. So it is above valid ? Other architectures > seem to do differently. > > Can you try by replacing !memblock_is_reserved(paddr) by > memblock_is_memory(paddr) ? The holes should not be marked as reserved, we just need to loop over the memory ranges rather than over pfns. Then the holes will be taken into account. I believe arm and xtensa got this right: (from arch/arm/mm/init.c) static void __init free_highpages(void) { #ifdef CONFIG_HIGHMEM unsigned long max_low = max_low_pfn; phys_addr_t range_start, range_end; u64 i; /* set highmem page free */ for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &range_start, &range_end, NULL) { unsigned long start = PFN_UP(range_start); unsigned long end = PFN_DOWN(range_end); /* Ignore complete lowmem entries */ if (end <= max_low) continue; /* Truncate partial highmem entries */ if (start < max_low) start = max_low; for (; start < end; start++) free_highmem_page(pfn_to_page(start)); } #endif } > Thanks > Christophe > -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-14 9:32 ` Mike Rapoport @ 2022-09-14 9:43 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-14 9:43 UTC (permalink / raw) To: Mike Rapoport Cc: Pali Rohár, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm Le 14/09/2022 à 11:32, Mike Rapoport a écrit : > On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: >> >> >> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : >>> >>> >>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>>>> >>>>> My guess would be that something went wrong in the linear map >>>>> setup, but it >>>>> won't hurt running with "memblock=debug" added to the kernel >>>>> command line >>>>> to see if there is anything suspicious there. >>>> >>>> Here is boot log on serial console with memblock=debug command line: >>>> >>> ... >>>> >>>> Do you need something more for debug? >>> >>> Can you send me the 'vmlinux' used to generate the above Oops so that I >>> can see exactly where we are in function mem_init(). >>> >>> And could you also try without CONFIG_HIGHMEM just in case. >>> >> >> I looked at the vmlinux you sent me, the problem is in the loop for highmem >> in mem_init(). It crashes in the call to free_highmem_page() >> >> #ifdef CONFIG_HIGHMEM >> { >> unsigned long pfn, highmem_mapnr; >> >> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; >> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { >> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; >> struct page *page = pfn_to_page(pfn); >> if (!memblock_is_reserved(paddr)) >> free_highmem_page(page); >> } >> } >> #endif /* CONFIG_HIGHMEM */ >> >> >> As far as I can see in the memblock debug lines, the holes don't seem to be >> marked as reserved by memblock. So it is above valid ? Other architectures >> seem to do differently. >> >> Can you try by replacing !memblock_is_reserved(paddr) by >> memblock_is_memory(paddr) ? > > The holes should not be marked as reserved, we just need to loop over the > memory ranges rather than over pfns. Then the holes will be taken into > account. > > I believe arm and xtensa got this right: > > (from arch/arm/mm/init.c) > > static void __init free_highpages(void) > { > #ifdef CONFIG_HIGHMEM > unsigned long max_low = max_low_pfn; > phys_addr_t range_start, range_end; > u64 i; > > /* set highmem page free */ > for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, > &range_start, &range_end, NULL) { > unsigned long start = PFN_UP(range_start); > unsigned long end = PFN_DOWN(range_end); > > /* Ignore complete lowmem entries */ > if (end <= max_low) > continue; > > /* Truncate partial highmem entries */ > if (start < max_low) > start = max_low; > > for (; start < end; start++) > free_highmem_page(pfn_to_page(start)); > } > #endif > } > And what about the way MIPS does it ? static inline void __init mem_init_free_highmem(void) { #ifdef CONFIG_HIGHMEM unsigned long tmp; if (cpu_has_dc_aliases) return; for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { struct page *page = pfn_to_page(tmp); if (!memblock_is_memory(PFN_PHYS(tmp))) SetPageReserved(page); else free_highmem_page(page); } #endif } Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-14 9:43 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-09-14 9:43 UTC (permalink / raw) To: Mike Rapoport Cc: linuxppc-dev, linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, Pali Rohár, j.ne Le 14/09/2022 à 11:32, Mike Rapoport a écrit : > On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: >> >> >> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : >>> >>> >>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>>>> >>>>> My guess would be that something went wrong in the linear map >>>>> setup, but it >>>>> won't hurt running with "memblock=debug" added to the kernel >>>>> command line >>>>> to see if there is anything suspicious there. >>>> >>>> Here is boot log on serial console with memblock=debug command line: >>>> >>> ... >>>> >>>> Do you need something more for debug? >>> >>> Can you send me the 'vmlinux' used to generate the above Oops so that I >>> can see exactly where we are in function mem_init(). >>> >>> And could you also try without CONFIG_HIGHMEM just in case. >>> >> >> I looked at the vmlinux you sent me, the problem is in the loop for highmem >> in mem_init(). It crashes in the call to free_highmem_page() >> >> #ifdef CONFIG_HIGHMEM >> { >> unsigned long pfn, highmem_mapnr; >> >> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; >> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { >> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; >> struct page *page = pfn_to_page(pfn); >> if (!memblock_is_reserved(paddr)) >> free_highmem_page(page); >> } >> } >> #endif /* CONFIG_HIGHMEM */ >> >> >> As far as I can see in the memblock debug lines, the holes don't seem to be >> marked as reserved by memblock. So it is above valid ? Other architectures >> seem to do differently. >> >> Can you try by replacing !memblock_is_reserved(paddr) by >> memblock_is_memory(paddr) ? > > The holes should not be marked as reserved, we just need to loop over the > memory ranges rather than over pfns. Then the holes will be taken into > account. > > I believe arm and xtensa got this right: > > (from arch/arm/mm/init.c) > > static void __init free_highpages(void) > { > #ifdef CONFIG_HIGHMEM > unsigned long max_low = max_low_pfn; > phys_addr_t range_start, range_end; > u64 i; > > /* set highmem page free */ > for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, > &range_start, &range_end, NULL) { > unsigned long start = PFN_UP(range_start); > unsigned long end = PFN_DOWN(range_end); > > /* Ignore complete lowmem entries */ > if (end <= max_low) > continue; > > /* Truncate partial highmem entries */ > if (start < max_low) > start = max_low; > > for (; start < end; start++) > free_highmem_page(pfn_to_page(start)); > } > #endif > } > And what about the way MIPS does it ? static inline void __init mem_init_free_highmem(void) { #ifdef CONFIG_HIGHMEM unsigned long tmp; if (cpu_has_dc_aliases) return; for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { struct page *page = pfn_to_page(tmp); if (!memblock_is_memory(PFN_PHYS(tmp))) SetPageReserved(page); else free_highmem_page(page); } #endif } Christophe ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-14 9:43 ` Christophe Leroy @ 2022-09-14 15:55 ` Mike Rapoport -1 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-14 15:55 UTC (permalink / raw) To: Christophe Leroy Cc: Pali Rohár, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On September 14, 2022 10:43:52 AM GMT+01:00, Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > >Le 14/09/2022 à 11:32, Mike Rapoport a écrit : >> On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: >>> >>> >>> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : >>>> >>>> >>>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>>>>> >>>>>> My guess would be that something went wrong in the linear map >>>>>> setup, but it >>>>>> won't hurt running with "memblock=debug" added to the kernel >>>>>> command line >>>>>> to see if there is anything suspicious there. >>>>> >>>>> Here is boot log on serial console with memblock=debug command line: >>>>> >>>> ... >>>>> >>>>> Do you need something more for debug? >>>> >>>> Can you send me the 'vmlinux' used to generate the above Oops so that I >>>> can see exactly where we are in function mem_init(). >>>> >>>> And could you also try without CONFIG_HIGHMEM just in case. >>>> >>> >>> I looked at the vmlinux you sent me, the problem is in the loop for highmem >>> in mem_init(). It crashes in the call to free_highmem_page() >>> >>> #ifdef CONFIG_HIGHMEM >>> { >>> unsigned long pfn, highmem_mapnr; >>> >>> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; >>> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { >>> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; >>> struct page *page = pfn_to_page(pfn); >>> if (!memblock_is_reserved(paddr)) >>> free_highmem_page(page); >>> } >>> } >>> #endif /* CONFIG_HIGHMEM */ >>> >>> >>> As far as I can see in the memblock debug lines, the holes don't seem to be >>> marked as reserved by memblock. So it is above valid ? Other architectures >>> seem to do differently. >>> >>> Can you try by replacing !memblock_is_reserved(paddr) by >>> memblock_is_memory(paddr) ? >> >> The holes should not be marked as reserved, we just need to loop over the >> memory ranges rather than over pfns. Then the holes will be taken into >> account. >> >> I believe arm and xtensa got this right: >> >> (from arch/arm/mm/init.c) >> >> static void __init free_highpages(void) >> { >> #ifdef CONFIG_HIGHMEM >> unsigned long max_low = max_low_pfn; >> phys_addr_t range_start, range_end; >> u64 i; >> >> /* set highmem page free */ >> for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, >> &range_start, &range_end, NULL) { >> unsigned long start = PFN_UP(range_start); >> unsigned long end = PFN_DOWN(range_end); >> >> /* Ignore complete lowmem entries */ >> if (end <= max_low) >> continue; >> >> /* Truncate partial highmem entries */ >> if (start < max_low) >> start = max_low; >> >> for (; start < end; start++) >> free_highmem_page(pfn_to_page(start)); >> } >> #endif >> } >> > > >And what about the way MIPS does it ? > >static inline void __init mem_init_free_highmem(void) >{ >#ifdef CONFIG_HIGHMEM > unsigned long tmp; > > if (cpu_has_dc_aliases) > return; > > for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { > struct page *page = pfn_to_page(tmp); > > if (!memblock_is_memory(PFN_PHYS(tmp))) > SetPageReserved(page); > else > free_highmem_page(page); > } >#endif >} This iterates over all PFNs in the highmem range and skips those in holes. for_each_free_mem_range() skips the holes altogether. Largely, I think we need to move, say, arm's version to mm/ and use it everywhere, except, perhaps, x86. >Christophe -- Sincerely yours, Mike ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-14 15:55 ` Mike Rapoport 0 siblings, 0 replies; 170+ messages in thread From: Mike Rapoport @ 2022-09-14 15:55 UTC (permalink / raw) To: Christophe Leroy Cc: linuxppc-dev, linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, Pali Rohár, j.ne On September 14, 2022 10:43:52 AM GMT+01:00, Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > >Le 14/09/2022 à 11:32, Mike Rapoport a écrit : >> On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: >>> >>> >>> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : >>>> >>>> >>>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : >>>>>> >>>>>> My guess would be that something went wrong in the linear map >>>>>> setup, but it >>>>>> won't hurt running with "memblock=debug" added to the kernel >>>>>> command line >>>>>> to see if there is anything suspicious there. >>>>> >>>>> Here is boot log on serial console with memblock=debug command line: >>>>> >>>> ... >>>>> >>>>> Do you need something more for debug? >>>> >>>> Can you send me the 'vmlinux' used to generate the above Oops so that I >>>> can see exactly where we are in function mem_init(). >>>> >>>> And could you also try without CONFIG_HIGHMEM just in case. >>>> >>> >>> I looked at the vmlinux you sent me, the problem is in the loop for highmem >>> in mem_init(). It crashes in the call to free_highmem_page() >>> >>> #ifdef CONFIG_HIGHMEM >>> { >>> unsigned long pfn, highmem_mapnr; >>> >>> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; >>> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { >>> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; >>> struct page *page = pfn_to_page(pfn); >>> if (!memblock_is_reserved(paddr)) >>> free_highmem_page(page); >>> } >>> } >>> #endif /* CONFIG_HIGHMEM */ >>> >>> >>> As far as I can see in the memblock debug lines, the holes don't seem to be >>> marked as reserved by memblock. So it is above valid ? Other architectures >>> seem to do differently. >>> >>> Can you try by replacing !memblock_is_reserved(paddr) by >>> memblock_is_memory(paddr) ? >> >> The holes should not be marked as reserved, we just need to loop over the >> memory ranges rather than over pfns. Then the holes will be taken into >> account. >> >> I believe arm and xtensa got this right: >> >> (from arch/arm/mm/init.c) >> >> static void __init free_highpages(void) >> { >> #ifdef CONFIG_HIGHMEM >> unsigned long max_low = max_low_pfn; >> phys_addr_t range_start, range_end; >> u64 i; >> >> /* set highmem page free */ >> for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, >> &range_start, &range_end, NULL) { >> unsigned long start = PFN_UP(range_start); >> unsigned long end = PFN_DOWN(range_end); >> >> /* Ignore complete lowmem entries */ >> if (end <= max_low) >> continue; >> >> /* Truncate partial highmem entries */ >> if (start < max_low) >> start = max_low; >> >> for (; start < end; start++) >> free_highmem_page(pfn_to_page(start)); >> } >> #endif >> } >> > > >And what about the way MIPS does it ? > >static inline void __init mem_init_free_highmem(void) >{ >#ifdef CONFIG_HIGHMEM > unsigned long tmp; > > if (cpu_has_dc_aliases) > return; > > for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { > struct page *page = pfn_to_page(tmp); > > if (!memblock_is_memory(PFN_PHYS(tmp))) > SetPageReserved(page); > else > free_highmem_page(page); > } >#endif >} This iterates over all PFNs in the highmem range and skips those in holes. for_each_free_mem_range() skips the holes altogether. Largely, I think we need to move, say, arm's version to mm/ and use it everywhere, except, perhaps, x86. >Christophe -- Sincerely yours, Mike ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 2022-09-14 15:55 ` Mike Rapoport @ 2022-09-14 19:56 ` Pali Rohár -1 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-14 19:56 UTC (permalink / raw) To: Mike Rapoport Cc: Christophe Leroy, Ash Logan, paulus, mpe, robh+dt, benh, linuxppc-dev, linux-kernel, j.ne, linux-mm On Wednesday 14 September 2022 16:55:04 Mike Rapoport wrote: > On September 14, 2022 10:43:52 AM GMT+01:00, Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > > > > >Le 14/09/2022 à 11:32, Mike Rapoport a écrit : > >> On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: > >>> > >>> > >>> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > >>>> > >>>> > >>>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : > >>>>>> > >>>>>> My guess would be that something went wrong in the linear map > >>>>>> setup, but it > >>>>>> won't hurt running with "memblock=debug" added to the kernel > >>>>>> command line > >>>>>> to see if there is anything suspicious there. > >>>>> > >>>>> Here is boot log on serial console with memblock=debug command line: > >>>>> > >>>> ... > >>>>> > >>>>> Do you need something more for debug? > >>>> > >>>> Can you send me the 'vmlinux' used to generate the above Oops so that I > >>>> can see exactly where we are in function mem_init(). > >>>> > >>>> And could you also try without CONFIG_HIGHMEM just in case. Hello! I disabled CONFIG_HIGHMEM and there is no crash anymore. But kernel see only 761160 kB of RAM, which is less than 3GB. I guess this is expected. > >>>> > >>> > >>> I looked at the vmlinux you sent me, the problem is in the loop for highmem > >>> in mem_init(). It crashes in the call to free_highmem_page() > >>> > >>> #ifdef CONFIG_HIGHMEM > >>> { > >>> unsigned long pfn, highmem_mapnr; > >>> > >>> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; > >>> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { > >>> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; > >>> struct page *page = pfn_to_page(pfn); > >>> if (!memblock_is_reserved(paddr)) > >>> free_highmem_page(page); > >>> } > >>> } > >>> #endif /* CONFIG_HIGHMEM */ > >>> > >>> > >>> As far as I can see in the memblock debug lines, the holes don't seem to be > >>> marked as reserved by memblock. So it is above valid ? Other architectures > >>> seem to do differently. > >>> > >>> Can you try by replacing !memblock_is_reserved(paddr) by > >>> memblock_is_memory(paddr) ? I enabled CONFIG_HIGHMEM again, applied this change and kernel does not crash too anymore. And it sees 3062896 kB of memory (in 'free' output). So seems that this change fixed it. I tried simple C program for allocating memory via malloc() and it successfully allocated 2800 MB. If it tried to request/allocate more then kernel started OOM killer which killed that program gracefully. No kernel or HW crash. Here is bootlog: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff570e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff568e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel virtual memory layout: [ 0.000000] * 0xffbbf000..0xfffff000 : fixmap [ 0.000000] * 0xff400000..0xff800000 : highmem PTEs [ 0.000000] * 0xff3fe000..0xff400000 : early ioremap [ 0.000000] * 0xf1000000..0xff3fe000 : vmalloc & ioremap [ 0.000000] Memory: 3062620K/3118080K available (10732K kernel code, 712K rwdata, 2044K rodata, 276K init, 287K bss, 55460K reserved, 0K cma-reserved, 2331648K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 > >> > >> The holes should not be marked as reserved, we just need to loop over the > >> memory ranges rather than over pfns. Then the holes will be taken into > >> account. > >> > >> I believe arm and xtensa got this right: > >> > >> (from arch/arm/mm/init.c) > >> > >> static void __init free_highpages(void) > >> { > >> #ifdef CONFIG_HIGHMEM > >> unsigned long max_low = max_low_pfn; > >> phys_addr_t range_start, range_end; > >> u64 i; > >> > >> /* set highmem page free */ > >> for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, > >> &range_start, &range_end, NULL) { > >> unsigned long start = PFN_UP(range_start); > >> unsigned long end = PFN_DOWN(range_end); > >> > >> /* Ignore complete lowmem entries */ > >> if (end <= max_low) > >> continue; > >> > >> /* Truncate partial highmem entries */ > >> if (start < max_low) > >> start = max_low; > >> > >> for (; start < end; start++) > >> free_highmem_page(pfn_to_page(start)); > >> } > >> #endif > >> } > >> > > > > > >And what about the way MIPS does it ? > > > >static inline void __init mem_init_free_highmem(void) > >{ > >#ifdef CONFIG_HIGHMEM > > unsigned long tmp; > > > > if (cpu_has_dc_aliases) > > return; > > > > for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { > > struct page *page = pfn_to_page(tmp); > > > > if (!memblock_is_memory(PFN_PHYS(tmp))) > > SetPageReserved(page); > > else > > free_highmem_page(page); > > } > >#endif > >} > > This iterates over all PFNs in the highmem range and skips those in holes. > for_each_free_mem_range() skips the holes altogether. > > Largely, I think we need to move, say, arm's version to mm/ and use it everywhere, except, perhaps, x86. I tried to replace quoted powerpc CONFIG_HIGHMEM code by above arm code and it worked fine too! No kernel crash anymore. But 'free' see only 3062888 kB of total memory. Which is less then with the first workaround. Here is bootlog: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff570e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff568e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel virtual memory layout: [ 0.000000] * 0xffbbf000..0xfffff000 : fixmap [ 0.000000] * 0xff400000..0xff800000 : highmem PTEs [ 0.000000] * 0xff3fe000..0xff400000 : early ioremap [ 0.000000] * 0xf1000000..0xff3fe000 : vmalloc & ioremap [ 0.000000] Memory: 3062612K/3118080K available (10732K kernel code, 712K rwdata, 2044K rodata, 276K init, 287K bss, 55468K reserved, 0K cma-reserved, 2331640K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 > >Christophe > -- > Sincerely yours, > Mike ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: Fragmented physical memory on powerpc/32 @ 2022-09-14 19:56 ` Pali Rohár 0 siblings, 0 replies; 170+ messages in thread From: Pali Rohár @ 2022-09-14 19:56 UTC (permalink / raw) To: Mike Rapoport Cc: linux-kernel, linux-mm, robh+dt, paulus, Ash Logan, linuxppc-dev, j.ne On Wednesday 14 September 2022 16:55:04 Mike Rapoport wrote: > On September 14, 2022 10:43:52 AM GMT+01:00, Christophe Leroy <christophe.leroy@csgroup.eu> wrote: > > > > > >Le 14/09/2022 à 11:32, Mike Rapoport a écrit : > >> On Tue, Sep 13, 2022 at 02:36:13PM +0200, Christophe Leroy wrote: > >>> > >>> > >>> Le 13/09/2022 à 08:11, Christophe Leroy a écrit : > >>>> > >>>> > >>>> Le 12/09/2022 à 23:16, Pali Rohár a écrit : > >>>>>> > >>>>>> My guess would be that something went wrong in the linear map > >>>>>> setup, but it > >>>>>> won't hurt running with "memblock=debug" added to the kernel > >>>>>> command line > >>>>>> to see if there is anything suspicious there. > >>>>> > >>>>> Here is boot log on serial console with memblock=debug command line: > >>>>> > >>>> ... > >>>>> > >>>>> Do you need something more for debug? > >>>> > >>>> Can you send me the 'vmlinux' used to generate the above Oops so that I > >>>> can see exactly where we are in function mem_init(). > >>>> > >>>> And could you also try without CONFIG_HIGHMEM just in case. Hello! I disabled CONFIG_HIGHMEM and there is no crash anymore. But kernel see only 761160 kB of RAM, which is less than 3GB. I guess this is expected. > >>>> > >>> > >>> I looked at the vmlinux you sent me, the problem is in the loop for highmem > >>> in mem_init(). It crashes in the call to free_highmem_page() > >>> > >>> #ifdef CONFIG_HIGHMEM > >>> { > >>> unsigned long pfn, highmem_mapnr; > >>> > >>> highmem_mapnr = lowmem_end_addr >> PAGE_SHIFT; > >>> for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) { > >>> phys_addr_t paddr = (phys_addr_t)pfn << PAGE_SHIFT; > >>> struct page *page = pfn_to_page(pfn); > >>> if (!memblock_is_reserved(paddr)) > >>> free_highmem_page(page); > >>> } > >>> } > >>> #endif /* CONFIG_HIGHMEM */ > >>> > >>> > >>> As far as I can see in the memblock debug lines, the holes don't seem to be > >>> marked as reserved by memblock. So it is above valid ? Other architectures > >>> seem to do differently. > >>> > >>> Can you try by replacing !memblock_is_reserved(paddr) by > >>> memblock_is_memory(paddr) ? I enabled CONFIG_HIGHMEM again, applied this change and kernel does not crash too anymore. And it sees 3062896 kB of memory (in 'free' output). So seems that this change fixed it. I tried simple C program for allocating memory via malloc() and it successfully allocated 2800 MB. If it tried to request/allocate more then kernel started OOM killer which killed that program gracefully. No kernel or HW crash. Here is bootlog: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff570e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff568e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel virtual memory layout: [ 0.000000] * 0xffbbf000..0xfffff000 : fixmap [ 0.000000] * 0xff400000..0xff800000 : highmem PTEs [ 0.000000] * 0xff3fe000..0xff400000 : early ioremap [ 0.000000] * 0xf1000000..0xff3fe000 : vmalloc & ioremap [ 0.000000] Memory: 3062620K/3118080K available (10732K kernel code, 712K rwdata, 2044K rodata, 276K init, 287K bss, 55460K reserved, 0K cma-reserved, 2331648K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 > >> > >> The holes should not be marked as reserved, we just need to loop over the > >> memory ranges rather than over pfns. Then the holes will be taken into > >> account. > >> > >> I believe arm and xtensa got this right: > >> > >> (from arch/arm/mm/init.c) > >> > >> static void __init free_highpages(void) > >> { > >> #ifdef CONFIG_HIGHMEM > >> unsigned long max_low = max_low_pfn; > >> phys_addr_t range_start, range_end; > >> u64 i; > >> > >> /* set highmem page free */ > >> for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, > >> &range_start, &range_end, NULL) { > >> unsigned long start = PFN_UP(range_start); > >> unsigned long end = PFN_DOWN(range_end); > >> > >> /* Ignore complete lowmem entries */ > >> if (end <= max_low) > >> continue; > >> > >> /* Truncate partial highmem entries */ > >> if (start < max_low) > >> start = max_low; > >> > >> for (; start < end; start++) > >> free_highmem_page(pfn_to_page(start)); > >> } > >> #endif > >> } > >> > > > > > >And what about the way MIPS does it ? > > > >static inline void __init mem_init_free_highmem(void) > >{ > >#ifdef CONFIG_HIGHMEM > > unsigned long tmp; > > > > if (cpu_has_dc_aliases) > > return; > > > > for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) { > > struct page *page = pfn_to_page(tmp); > > > > if (!memblock_is_memory(PFN_PHYS(tmp))) > > SetPageReserved(page); > > else > > free_highmem_page(page); > > } > >#endif > >} > > This iterates over all PFNs in the highmem range and skips those in holes. > for_each_free_mem_range() skips the holes altogether. > > Largely, I think we need to move, say, arm's version to mm/ and use it everywhere, except, perhaps, x86. I tried to replace quoted powerpc CONFIG_HIGHMEM code by above arm code and it worked fine too! No kernel crash anymore. But 'free' see only 3062888 kB of total memory. Which is less then with the first workaround. Here is bootlog: [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x4 nid=-1 from=0x00000000 max_addr=0x00000000 smp_setup_cpu_maps+0x40/0x2b4 [ 0.000000] memblock_reserve: [0x2fff5d74-0x2fff5d7b] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] CPU maps initialized for 1 thread per core [ 0.000000] (thread shift is 0) [ 0.000000] memblock_phys_free: [0x2fff5d74-0x2fff5d7b] setup_arch+0x1bc/0x318 [ 0.000000] ----------------------------------------------------- [ 0.000000] phys_mem_size = 0xbe500000 [ 0.000000] dcache_bsize = 0x20 [ 0.000000] icache_bsize = 0x20 [ 0.000000] cpu_features = 0x0000000010010108 [ 0.000000] possible = 0x0000000010010108 [ 0.000000] always = 0x0000000010010108 [ 0.000000] cpu_user_features = 0x84e08000 0x08000000 [ 0.000000] mmu_features = 0x00020010 [ 0.000000] ----------------------------------------------------- [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff2000-0x2fff3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2fff0000-0x2fff1fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffee000-0x2ffeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffec000-0x2ffedfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffea000-0x2ffebfff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe8000-0x2ffe9fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe6000-0x2ffe7fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe4000-0x2ffe5fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe2000-0x2ffe3fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8192 bytes align=0x2000 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_stack+0x2c/0x60 [ 0.000000] memblock_reserve: [0x2ffe0000-0x2ffe1fff] memblock_alloc_range_nid+0xe8/0x1b0 mpc85xx_rdb_setup_arch() [ 0.000000] ioremap() called early from of_iomap+0x48/0x80. Use early_ioremap() instead [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2fff4000-0x2fff4fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MPC85xx RDB board from Freescale Semiconductor [ 0.000000] barrier-nospec: using isync; sync as speculation barrier [ 0.000000] barrier-nospec: patched 182 locations [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 early_pte_alloc_kernel+0x3c/0x90 [ 0.000000] memblock_reserve: [0x2ffdf000-0x2ffdffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Top of RAM: 0xff700000, Total RAM: 0xbe500000 [ 0.000000] Memory hole size: 1042MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000000000000-0x000000002fffffff] [ 0.000000] HighMem [mem 0x0000000030000000-0x00000000ff6fffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000000000000-0x000000007fffffff] [ 0.000000] node 0: [mem 0x00000000c0200000-0x00000000eeffffff] [ 0.000000] node 0: [mem 0x00000000f0000000-0x00000000ff6fffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000ff6fffff] [ 0.000000] memblock_alloc_try_nid_raw: 37675008 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 free_area_init+0x890/0xc94 [ 0.000000] memblock_reserve: [0x2dbf1000-0x2ffdefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5d00-0x2fff5d5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 416 bytes align=0x20 nid=0 from=0x00000000 max_addr=0x00000000 setup_usemap+0x60/0xa0 [ 0.000000] memblock_reserve: [0x2fff5b60-0x2fff5cff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x38/0x154 [ 0.000000] memblock_reserve: [0x2fff5b40-0x2fff5b5f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 1024 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0x7c/0x154 [ 0.000000] memblock_reserve: [0x2fff5740-0x2fff5b3f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 32 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 mmu_context_init+0xc4/0x154 [ 0.000000] memblock_reserve: [0x2fff5720-0x2fff573f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] MMU: Allocated 1088 bytes of context maps for 255 contexts [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x194/0x6d0 [ 0.000000] memblock_reserve: [0x2fff56a0-0x2fff570e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 111 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 start_kernel+0x1c0/0x6d0 [ 0.000000] memblock_reserve: [0x2fff5620-0x2fff568e] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x1000 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x314/0x7b4 [ 0.000000] memblock_reserve: [0x2dbf0000-0x2dbf0fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4096 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_embed_first_chunk+0x4d4/0x7b4 [ 0.000000] memblock_reserve: [0x2dbef000-0x2dbeffff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 90112 bytes align=0x1000 nid=-1 from=0x3fffffff max_addr=0x00000000 pcpu_embed_first_chunk+0x564/0x7b4 [ 0.000000] memblock_reserve: [0x2dbd9000-0x2dbeefff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbe4000-0x2dbe3fff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeefff] pcpu_embed_first_chunk+0x680/0x7b4 [ 0.000000] percpu: Embedded 11 pages/cpu s14196 r8192 d22668 u45056 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x37c/0x924 [ 0.000000] memblock_reserve: [0x2fff5d60-0x2fff5d63] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 4 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3a4/0x924 [ 0.000000] memblock_reserve: [0x2fff5600-0x2fff5603] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3cc/0x924 [ 0.000000] memblock_reserve: [0x2fff55e0-0x2fff55e7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 8 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x3f4/0x924 [ 0.000000] memblock_reserve: [0x2fff55c0-0x2fff55c7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] pcpu-alloc: s14196 r8192 d22668 u45056 alloc=11*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] memblock_alloc_try_nid: 136 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_setup_first_chunk+0x7fc/0x924 [ 0.000000] memblock_reserve: [0x2fff5520-0x2fff55a7] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff54c0-0x2fff551f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 384 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5340-0x2fff54bf] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 388 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2fff51a0-0x2fff5323] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5140-0x2fff519f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 96 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x64/0x2e0 [ 0.000000] memblock_reserve: [0x2fff50e0-0x2fff513f] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 768 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xc4/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd8d00-0x2dbd8fff] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 772 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0xf0/0x2e0 [ 0.000000] memblock_reserve: [0x2dbd89e0-0x2dbd8ce3] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_alloc_try_nid: 192 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 pcpu_alloc_first_chunk+0x11c/0x2e0 [ 0.000000] memblock_reserve: [0x2fff5020-0x2fff50df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] memblock_phys_free: [0x2dbf0000-0x2dbf0fff] pcpu_embed_first_chunk+0x744/0x7b4 [ 0.000000] memblock_phys_free: [0x2dbef000-0x2dbeffff] pcpu_embed_first_chunk+0x754/0x7b4 [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 777792 [ 0.000000] Kernel command line: root=ubi0:rootfs rootfstype=ubifs ubi.mtd=rootfs rootflags=chk_data_crc rw console=ttyS0,115200 memblock=debug [ 0.000000] memblock_alloc_try_nid: 524288 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db589e0-0x2dbd89df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) [ 0.000000] memblock_alloc_try_nid: 262144 bytes align=0x20 nid=-1 from=0x00000000 max_addr=0x00000000 alloc_large_system_hash+0x1a4/0x2ec [ 0.000000] memblock_reserve: [0x2db189e0-0x2db589df] memblock_alloc_range_nid+0xe8/0x1b0 [ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000] Kernel virtual memory layout: [ 0.000000] * 0xffbbf000..0xfffff000 : fixmap [ 0.000000] * 0xff400000..0xff800000 : highmem PTEs [ 0.000000] * 0xff3fe000..0xff400000 : early ioremap [ 0.000000] * 0xf1000000..0xff3fe000 : vmalloc & ioremap [ 0.000000] Memory: 3062612K/3118080K available (10732K kernel code, 712K rwdata, 2044K rodata, 276K init, 287K bss, 55468K reserved, 0K cma-reserved, 2331640K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 > >Christophe > -- > Sincerely yours, > Mike ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH 12/12] powerpc: wiiu: Add minimal default config 2022-03-02 4:43 ` Ash Logan @ 2022-03-02 4:44 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne Add a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH 12/12] powerpc: wiiu: Add minimal default config @ 2022-03-02 4:44 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-03-02 4:44 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linuxppc-dev, linux-kernel, j.ne Add a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.35.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 00/12] powerpc: Nintendo Wii U support 2022-03-02 4:43 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (12): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: Add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 322 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 19 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 67 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1630 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 4b0986a3613c92f4ec1bdc7f60ec66fea135991f -- 2.36.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v2 00/12] powerpc: Nintendo Wii U support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (12): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: Add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 322 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 19 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 67 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1630 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 4b0986a3613c92f4ec1bdc7f60ec66fea135991f -- 2.36.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v2 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 02/12] powerpc: wiiu: device tree 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. arch/powerpc/boot/dts/wiiu.dts | 322 +++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..def648d4362d --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,322 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi-gpio { + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 02/12] powerpc: wiiu: device tree @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. arch/powerpc/boot/dts/wiiu.dts | 322 +++++++++++++++++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..def648d4362d --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,322 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi-gpio { + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 03/12] powerpc: wiiu: bootwrapper support 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 4b4827c475c6..74e77f072e35 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -155,6 +155,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -353,6 +354,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 9184eda780fd..f42abe4ebde2 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 03/12] powerpc: wiiu: bootwrapper support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 4b4827c475c6..74e77f072e35 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -155,6 +155,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -353,6 +354,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 9184eda780fd..f42abe4ebde2 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 04/12] powerpc: wiiu: introduce wiiu platform 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 5 +++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 8 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..e5513205da3c --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 04/12] powerpc: wiiu: introduce wiiu platform @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 5 +++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 8 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..e5513205da3c --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 05/12] powerpc: wiiu: declare as non-coherent 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index e2e1fec91c6e..fd1e82603278 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -504,7 +504,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 05/12] powerpc: wiiu: declare as non-coherent @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index e2e1fec91c6e..fd1e82603278 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -504,7 +504,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 06/12] powerpc: wiiu: udbg support for latteipc 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 +++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 197 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 192f0ed0097f..15c7fa7c040a 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b4aa0d88ce2c..266b0e744ddc 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 6c739beb938c..48d487efb25c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index e5513205da3c..fa86cbc33d5e 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,3 +3,16 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..d546b3ba9bab --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 06/12] powerpc: wiiu: udbg support for latteipc @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 +++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 122 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 197 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 192f0ed0097f..15c7fa7c040a 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b4aa0d88ce2c..266b0e744ddc 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 6c739beb938c..48d487efb25c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index e5513205da3c..fa86cbc33d5e 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,3 +3,16 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..d546b3ba9bab --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v2 06/12] powerpc: wiiu: udbg support for latteipc 2022-06-22 13:10 ` Ash Logan @ 2022-06-27 0:15 ` kernel test robot -1 siblings, 0 replies; 170+ messages in thread From: kernel test robot @ 2022-06-27 0:15 UTC (permalink / raw) To: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh Cc: llvm, kbuild-all, linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Hi Ash, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on robh/for-next linus/master v5.19-rc4 next-20220624] [cannot apply to mpe/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/intel-lab-lkp/linux/commits/Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-c003-20220626 compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b0d6dd3905db145853c7c744ac92d49b00b1fa20) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://github.com/intel-lab-lkp/linux/commit/acc3ab8f224a93f1a41267aeb09dee3d2ec810fb git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 git checkout acc3ab8f224a93f1a41267aeb09dee3d2ec810fb # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/platforms/wiiu/ drivers/usb/misc/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> arch/powerpc/platforms/wiiu/udbg_latteipc.c:65:13: warning: no previous prototype for function 'latteipc_udbg_init' [-Wmissing-prototypes] void __init latteipc_udbg_init(void) ^ arch/powerpc/platforms/wiiu/udbg_latteipc.c:65:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __init latteipc_udbg_init(void) ^ static 1 warning generated. vim +/latteipc_udbg_init +65 arch/powerpc/platforms/wiiu/udbg_latteipc.c 61 62 /* 63 * Latte IPC udbg support initialization. 64 */ > 65 void __init latteipc_udbg_init(void) 66 { 67 struct device_node *np; 68 void __iomem *ipc_io_base; 69 70 if (latteipc_io_base) 71 udbg_printf("%s: early -> final\n", __func__); 72 73 np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); 74 if (!np) { 75 udbg_printf("%s: IPC node not found\n", __func__); 76 goto out; 77 } 78 79 ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); 80 if (!ipc_io_base) { 81 udbg_printf("%s: failed to setup IPC io base\n", __func__); 82 goto done; 83 } 84 85 udbg_putc = latteipc_udbg_putc; 86 udbg_printf("latteipc_udbg: ready\n"); 87 88 done: 89 of_node_put(np); 90 out: 91 return; 92 } 93 -- 0-DAY CI Kernel Test Service https://01.org/lkp ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v2 06/12] powerpc: wiiu: udbg support for latteipc @ 2022-06-27 0:15 ` kernel test robot 0 siblings, 0 replies; 170+ messages in thread From: kernel test robot @ 2022-06-27 0:15 UTC (permalink / raw) To: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, kbuild-all, linkmauve, llvm, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Hi Ash, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on robh/for-next linus/master v5.19-rc4 next-20220624] [cannot apply to mpe/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/intel-lab-lkp/linux/commits/Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-c003-20220626 compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b0d6dd3905db145853c7c744ac92d49b00b1fa20) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://github.com/intel-lab-lkp/linux/commit/acc3ab8f224a93f1a41267aeb09dee3d2ec810fb git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 git checkout acc3ab8f224a93f1a41267aeb09dee3d2ec810fb # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/platforms/wiiu/ drivers/usb/misc/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> arch/powerpc/platforms/wiiu/udbg_latteipc.c:65:13: warning: no previous prototype for function 'latteipc_udbg_init' [-Wmissing-prototypes] void __init latteipc_udbg_init(void) ^ arch/powerpc/platforms/wiiu/udbg_latteipc.c:65:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __init latteipc_udbg_init(void) ^ static 1 warning generated. vim +/latteipc_udbg_init +65 arch/powerpc/platforms/wiiu/udbg_latteipc.c 61 62 /* 63 * Latte IPC udbg support initialization. 64 */ > 65 void __init latteipc_udbg_init(void) 66 { 67 struct device_node *np; 68 void __iomem *ipc_io_base; 69 70 if (latteipc_io_base) 71 udbg_printf("%s: early -> final\n", __func__); 72 73 np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); 74 if (!np) { 75 udbg_printf("%s: IPC node not found\n", __func__); 76 goto out; 77 } 78 79 ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); 80 if (!ipc_io_base) { 81 udbg_printf("%s: failed to setup IPC io base\n", __func__); 82 goto done; 83 } 84 85 udbg_putc = latteipc_udbg_putc; 86 udbg_printf("latteipc_udbg: ready\n"); 87 88 done: 89 of_node_put(np); 90 out: 91 return; 92 } 93 -- 0-DAY CI Kernel Test Service https://01.org/lkp ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v2 07/12] powerpc: wiiu: espresso interrupt controller support 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 07/12] powerpc: wiiu: espresso interrupt controller support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 08/12] powerpc: wiiu: latte interrupt controller support 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index fa86cbc33d5e..5e062536ca58 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY config LATTEIPC_UDBG bool "Chipset IPC udbg console for the Nintendo Wii U" diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..d16e0c2de2b0 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 08/12] powerpc: wiiu: latte interrupt controller support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index fa86cbc33d5e..5e062536ca58 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY config LATTEIPC_UDBG bool "Chipset IPC udbg console for the Nintendo Wii U" diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..d16e0c2de2b0 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v2 08/12] powerpc: wiiu: latte interrupt controller support 2022-06-22 13:10 ` Ash Logan @ 2022-06-27 2:51 ` kernel test robot -1 siblings, 0 replies; 170+ messages in thread From: kernel test robot @ 2022-06-27 2:51 UTC (permalink / raw) To: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh Cc: llvm, kbuild-all, linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Hi Ash, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on robh/for-next] [cannot apply to mpe/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/intel-lab-lkp/linux/commits/Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-c003-20220626 (https://download.01.org/0day-ci/archive/20220627/202206271019.YEn99lfz-lkp@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b0d6dd3905db145853c7c744ac92d49b00b1fa20) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://github.com/intel-lab-lkp/linux/commit/533a7cf49cc00c4eaafd2afee5ecd9e23bac99f2 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 git checkout 533a7cf49cc00c4eaafd2afee5ecd9e23bac99f2 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/platforms/wiiu/ drivers/usb/misc/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> arch/powerpc/platforms/wiiu/latte-pic.c:155:14: warning: no previous prototype for function 'latte_pic_get_irq' [-Wmissing-prototypes] unsigned int latte_pic_get_irq(struct irq_domain *h) ^ arch/powerpc/platforms/wiiu/latte-pic.c:155:1: note: declare 'static' if the function is not intended to be used outside of this translation unit unsigned int latte_pic_get_irq(struct irq_domain *h) ^ static 1 warning generated. vim +/latte_pic_get_irq +155 arch/powerpc/platforms/wiiu/latte-pic.c 150 151 /* 152 * Determinate if there are interrupts pending 153 * Checks AHBALL (0-32) and AHBLT (32-64) 154 */ > 155 unsigned int latte_pic_get_irq(struct irq_domain *h) 156 { 157 struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); 158 u32 irq_status, irq; 159 160 /* Check AHBALL first */ 161 irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); 162 163 if (irq_status == 0) { 164 /* Try AHBLT */ 165 irq_status = 166 in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); 167 if (irq_status == 0) 168 return 0; /* No IRQs pending */ 169 170 /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ 171 irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; 172 return irq_linear_revmap(h, irq); 173 } 174 175 irq = __ffs(irq_status); 176 return irq_linear_revmap(h, irq); 177 } 178 -- 0-DAY CI Kernel Test Service https://01.org/lkp ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v2 08/12] powerpc: wiiu: latte interrupt controller support @ 2022-06-27 2:51 ` kernel test robot 0 siblings, 0 replies; 170+ messages in thread From: kernel test robot @ 2022-06-27 2:51 UTC (permalink / raw) To: Ash Logan, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, kbuild-all, linkmauve, llvm, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Hi Ash, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on powerpc/next] [also build test WARNING on robh/for-next] [cannot apply to mpe/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/intel-lab-lkp/linux/commits/Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-randconfig-c003-20220626 (https://download.01.org/0day-ci/archive/20220627/202206271019.YEn99lfz-lkp@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project b0d6dd3905db145853c7c744ac92d49b00b1fa20) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install powerpc cross compiling tool for clang build # apt-get install binutils-powerpc-linux-gnu # https://github.com/intel-lab-lkp/linux/commit/533a7cf49cc00c4eaafd2afee5ecd9e23bac99f2 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ash-Logan/dt-bindings-wiiu-Document-the-Nintendo-Wii-U-devicetree/20220622-221056 git checkout 533a7cf49cc00c4eaafd2afee5ecd9e23bac99f2 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/platforms/wiiu/ drivers/usb/misc/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> arch/powerpc/platforms/wiiu/latte-pic.c:155:14: warning: no previous prototype for function 'latte_pic_get_irq' [-Wmissing-prototypes] unsigned int latte_pic_get_irq(struct irq_domain *h) ^ arch/powerpc/platforms/wiiu/latte-pic.c:155:1: note: declare 'static' if the function is not intended to be used outside of this translation unit unsigned int latte_pic_get_irq(struct irq_domain *h) ^ static 1 warning generated. vim +/latte_pic_get_irq +155 arch/powerpc/platforms/wiiu/latte-pic.c 150 151 /* 152 * Determinate if there are interrupts pending 153 * Checks AHBALL (0-32) and AHBLT (32-64) 154 */ > 155 unsigned int latte_pic_get_irq(struct irq_domain *h) 156 { 157 struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); 158 u32 irq_status, irq; 159 160 /* Check AHBALL first */ 161 irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); 162 163 if (irq_status == 0) { 164 /* Try AHBLT */ 165 irq_status = 166 in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); 167 if (irq_status == 0) 168 return 0; /* No IRQs pending */ 169 170 /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ 171 irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; 172 return irq_linear_revmap(h, irq); 173 } 174 175 irq = __ffs(irq_status); 176 return irq_linear_revmap(h, irq); 177 } 178 -- 0-DAY CI Kernel Test Service https://01.org/lkp ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v2 09/12] powerpc: espresso processor support 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index ae0fdef0ac11..b575f5570485 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -718,6 +718,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 09/12] powerpc: espresso processor support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index ae0fdef0ac11..b575f5570485 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -718,6 +718,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 10/12] powerpc: wiiu: platform support 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 67 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..279fa899a296 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static const struct of_device_id wiiu_of_bus[] = { + { + .compatible = "nintendo,latte", + }, + {}, +}; + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_populate(NULL, wiiu_of_bus, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 10/12] powerpc: wiiu: platform support @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 67 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..279fa899a296 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static const struct of_device_id wiiu_of_bus[] = { + { + .compatible = "nintendo,latte", + }, + {}, +}; + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_populate(NULL, wiiu_of_bus, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 11/12] powerpc: wiiu: don't enforce flat memory 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 3d690be48e84..59a84629d9a0 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -125,10 +125,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 3d690be48e84..59a84629d9a0 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -125,10 +125,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 12/12] powerpc: wiiu: Add minimal default config 2022-06-22 13:10 ` Ash Logan @ 2022-06-22 13:10 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v2 12/12] powerpc: wiiu: Add minimal default config @ 2022-06-22 13:10 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-22 13:10 UTC (permalink / raw) To: paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, linuxppc-dev, j.ne Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 00/12] powerpc: Nintendo Wii U support 2022-06-22 13:10 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v2: - Fixed some overzealous deleting in the devicetree, oops. - Fixed missing declarations for some functions (thanks robots) - Fixed some checkpatch warnings. - Mark latte as a simple-bus and use of_platform_default_populate. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (12): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 326 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 22 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 60 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1632 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 03c765b0e3b4cb5063276b086c76f7a612856a9a -- 2.36.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v3 00/12] powerpc: Nintendo Wii U support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor - workaround for the discontiguous RAM blocks This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v2: - Fixed some overzealous deleting in the devicetree, oops. - Fixed missing declarations for some functions (thanks robots) - Fixed some checkpatch warnings. - Mark latte as a simple-bus and use of_platform_default_populate. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (12): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: don't enforce flat memory powerpc: wiiu: add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 326 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cputable.c | 16 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/mm/init_32.c | 4 +- arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 22 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 60 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1632 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 03c765b0e3b4cb5063276b086c76f7a612856a9a -- 2.36.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v3 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ 8 files changed, 300 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..5824b07928f5 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- + +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + compatible: + oneOf: + - description: Nintendo Wii U video game console + items: + - const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..878a81595f5f --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Espresso" interrupt controller + items: + - const: nintendo,espresso-pic + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + +additionalProperties: false + +examples: + - | + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..e54d49015f36 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte "GPU7" graphics processor + items: + - const: nintendo,latte-gpu7 + reg: + items: + - description: GpuF0MMReg registers + interrupts: + items: + - description: Main interrupt, connected via Espresso PIC + +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties +additionalProperties: true + +examples: + - | + gpu7@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..7b9de4effcb0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte AHCI controller + items: + - const: nintendo,latte-ahci + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +additionalProperties: false + +examples: + - | + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..ed0b4c28ce48 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte DSP + items: + - const: nintendo,latte-dsp + reg: + items: + - description: DSP registers + +# Once more is known about this device more properties will likely be added +additionalProperties: true + +examples: + - | + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..a2df71fb9964 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte interrupt controller + items: + - const: nintendo,latte-pic + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + interrupt-controller: true + reg: + items: + - description: Core registers + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +additionalProperties: false + +examples: + - | + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..4b9b0820edc1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,40 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U Latte SDHCI + items: + - const: nintendo,latte-sdhci + - const: sdhci + reg: + items: + - description: Core registers + interrupts: + items: + - description: SDHCI interrupt + +additionalProperties: false + +examples: + - | + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6ae86d198fa3 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +properties: + compatible: + oneOf: + - description: Nintendo Wii U "Latte" SoC + items: + - const: nintendo,latte + +additionalProperties: true + +... -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v3 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-06-28 13:31 ` Ash Logan @ 2022-06-29 9:52 ` Krzysztof Kozlowski -1 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 9:52 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel On 28/06/2022 15:31, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ > 8 files changed, 300 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..5824b07928f5 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,28 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > + > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + compatible: > + oneOf: > + - description: Nintendo Wii U video game console > + items: > + - const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..878a81595f5f > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +properties: > + compatible: > + oneOf: No need for oneOf, just const. > + - description: Nintendo Wii U "Espresso" interrupt controller No need for description. > + items: > + - const: nintendo,espresso-pic > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 Blank line between each property. > + interrupt-controller: true > + reg: > + items: > + - description: Core registers Just maxItems:1. Description is not helpful. Missing required properties. > + > +additionalProperties: false > + > +examples: > + - | > + espresso_pic: pic@c000078 { Generic node name, so "interrupt-controller" > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; compatible and reg by convention go first in list of properties. This applies everywhere, also to your DTS. > + }; > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..e54d49015f36 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,41 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte "GPU7" graphics processor > + items: > + - const: nintendo,latte-gpu7 > + reg: > + items: > + - description: GpuF0MMReg registers > + interrupts: > + items: > + - description: Main interrupt, connected via Espresso PIC Same comments as your interrupt controller patch. I guess these comments apply everywhere here. Missing required properties. > + > +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties > +additionalProperties: true No, it must be false. It's okay to extend the binding later. > + > +examples: > + - | > + gpu7@c200000 { Generic node name, so "gpu". > + compatible = "nintendo,latte-gpu7"; Wrong indentation. Use four spaces for DTS example. > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..7b9de4effcb0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,43 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte AHCI controller > + items: > + - const: nintendo,latte-ahci > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). Here description can stay, so no need for maxItems. > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + This should also reference ahci schema (I think it is ready). > +additionalProperties: false > + > +examples: > + - | > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; Fix indentation. > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..ed0b4c28ce48 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte DSP > + items: > + - const: nintendo,latte-dsp > + reg: > + items: > + - description: DSP registers > + > +# Once more is known about this device more properties will likely be added > +additionalProperties: true Again, no. All other comments also apply. > + > +examples: > + - | > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..a2df71fb9964 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte interrupt controller > + items: > + - const: nintendo,latte-pic > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +additionalProperties: false > + > +examples: > + - | > + latte_pic: pic@d800440 { interrupt-controller. All other comments apply. > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..4b9b0820edc1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,40 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte SDHCI > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: SDHCI interrupt You need to reference mmc-controller bindings in allOf. > + > +additionalProperties: false > + > +examples: > + - | > + sdcard_0: sdhci@d070000 { Node name: mmc The bindings look poor, several easy to fix mistakes. I suggest to open example-schema.yaml and start from there. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-06-29 9:52 ` Krzysztof Kozlowski 0 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 9:52 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne On 28/06/2022 15:31, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > .../bindings/powerpc/nintendo/wiiu.yaml | 28 +++++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++++++++++ > 8 files changed, 300 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..5824b07928f5 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,28 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > + > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + compatible: > + oneOf: > + - description: Nintendo Wii U video game console > + items: > + - const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..878a81595f5f > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +properties: > + compatible: > + oneOf: No need for oneOf, just const. > + - description: Nintendo Wii U "Espresso" interrupt controller No need for description. > + items: > + - const: nintendo,espresso-pic > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 Blank line between each property. > + interrupt-controller: true > + reg: > + items: > + - description: Core registers Just maxItems:1. Description is not helpful. Missing required properties. > + > +additionalProperties: false > + > +examples: > + - | > + espresso_pic: pic@c000078 { Generic node name, so "interrupt-controller" > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; compatible and reg by convention go first in list of properties. This applies everywhere, also to your DTS. > + }; > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..e54d49015f36 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,41 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte "GPU7" graphics processor > + items: > + - const: nintendo,latte-gpu7 > + reg: > + items: > + - description: GpuF0MMReg registers > + interrupts: > + items: > + - description: Main interrupt, connected via Espresso PIC Same comments as your interrupt controller patch. I guess these comments apply everywhere here. Missing required properties. > + > +# This will likely get bound to the Radeon driver one day, which will neccesitate extra properties > +additionalProperties: true No, it must be false. It's okay to extend the binding later. > + > +examples: > + - | > + gpu7@c200000 { Generic node name, so "gpu". > + compatible = "nintendo,latte-gpu7"; Wrong indentation. Use four spaces for DTS example. > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..7b9de4effcb0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,43 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte AHCI controller > + items: > + - const: nintendo,latte-ahci > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). Here description can stay, so no need for maxItems. > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + This should also reference ahci schema (I think it is ready). > +additionalProperties: false > + > +examples: > + - | > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; Fix indentation. > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..ed0b4c28ce48 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte DSP > + items: > + - const: nintendo,latte-dsp > + reg: > + items: > + - description: DSP registers > + > +# Once more is known about this device more properties will likely be added > +additionalProperties: true Again, no. All other comments also apply. > + > +examples: > + - | > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..a2df71fb9964 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte interrupt controller > + items: > + - const: nintendo,latte-pic > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + interrupt-controller: true > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +additionalProperties: false > + > +examples: > + - | > + latte_pic: pic@d800440 { interrupt-controller. All other comments apply. > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..4b9b0820edc1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,40 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +properties: > + compatible: > + oneOf: > + - description: Nintendo Wii U Latte SDHCI > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + reg: > + items: > + - description: Core registers > + interrupts: > + items: > + - description: SDHCI interrupt You need to reference mmc-controller bindings in allOf. > + > +additionalProperties: false > + > +examples: > + - | > + sdcard_0: sdhci@d070000 { Node name: mmc The bindings look poor, several easy to fix mistakes. I suggest to open example-schema.yaml and start from there. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v3 02/12] powerpc: wiiu: device tree 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. v2->v3: Re-added address-cells accidentally removed in v2. Marked latte as a simple-bus, since it is. arch/powerpc/boot/dts/wiiu.dts | 326 +++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..44a5a1469095 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte", "simple-bus"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + latte_gpu: gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi-gpio { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 02/12] powerpc: wiiu: device tree @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. v2->v3: Re-added address-cells accidentally removed in v2. Marked latte as a simple-bus, since it is. arch/powerpc/boot/dts/wiiu.dts | 326 +++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..44a5a1469095 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,326 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wiiu"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + chosen { + bootargs = "root=/dev/sda1 rootwait"; + }; + + memory { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + latte { + #address-cells = <1>; + #size-cells = <1>; + compatible = "nintendo,latte", "simple-bus"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + latte_gpu: gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: pic@c000078 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-usb-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: sdhci@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: sdhci@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata: ahci@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: pic@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi-gpio { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys-polled { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree 2022-06-28 13:31 ` Ash Logan @ 2022-06-29 9:58 ` Krzysztof Kozlowski -1 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 9:58 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel On 28/06/2022 15:31, Ash Logan wrote: > Add a device tree source file for the Nintendo Wii U video game console. > > Signed-off-by: Ash Logan <ash@heyquark.com> > Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > --- > v1->v2: Style and formatting changes suggested by Rob Herring. > License remains GPL-2.0 as the other powerpc dtses are the same, happy > to change if there is a different preferred default. > v2->v3: Re-added address-cells accidentally removed in v2. > Marked latte as a simple-bus, since it is. Thank you for your patch. There is something to discuss/improve. > > arch/powerpc/boot/dts/wiiu.dts | 326 +++++++++++++++++++++++++++++++++ > 1 file changed, 326 insertions(+) > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > > diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts > new file mode 100644 > index 000000000000..44a5a1469095 > --- /dev/null > +++ b/arch/powerpc/boot/dts/wiiu.dts > @@ -0,0 +1,326 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Nintendo Wii U Device Tree Source > + * > + * Copyright (C) 2022 The linux-wiiu Team > + */ > + > +/dts-v1/; > +#include <dt-bindings/gpio/gpio.h> > +#include <dt-bindings/input/input.h> > + > +/ { > + model = "nintendo,wiiu"; It's not compatible, but user-visible string, e.g. "Nintendo Wii U" > + compatible = "nintendo,wiiu"; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + chosen { > + bootargs = "root=/dev/sda1 rootwait"; This does not belong to shared DTS. No bootargs. > + }; > + > + memory { > + device_type = "memory"; > + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ > + 0x08000000 0x00300000 /* MEM0 - 3MiB */ > + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ > + }; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + /* TODO: Add SMP */ > + PowerPC,espresso@0 { Node name should be generic, so "cpu". Unless something needs the specific node name? > + device_type = "cpu"; > + reg = <0>; > + clock-frequency = <1243125000>; /* 1.243125GHz */ > + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ > + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ > + i-cache-size = <32768>; /* 32K icache */ > + i-cache-line-size = <32>; > + i-cache-block-size = <32>; > + i-cache-sets = <128>; > + d-cache-size = <32768>; /* 32K dcache */ > + d-cache-line-size = <32>; > + d-cache-block-size = <32>; > + d-cache-sets = <128>; > + next-level-cache = <&L2_0>; > + L2_0:l2-cache { > + compatible = "cache"; > + cache-level = <2>; > + cache-unified; > + cache-size = <0x80000>; /* 512KB L2 */ > + cache-line-size = <64>; > + cache-block-size = <32>; > + cache-sets = <2048>; > + }; > + }; > + }; > + > + latte { Generic node names. > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "nintendo,latte", "simple-bus"; > + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ > + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ > + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ > + > + latte_gpu: gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > + > + espresso_pic: pic@c000078 { interrupt-controller > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > + > + ehci_0: usb@d040000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d040000 0x100>; > + interrupts = <4>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_0_0: usb@d050000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d050000 0x100>; > + interrupts = <5>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ohci_0_1: usb@d060000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d060000 0x100>; > + interrupts = <6>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_1: usb@d120000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d120000 0x100>; > + interrupts = <16>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_1_0: usb@d130000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d130000 0x100>; > + interrupts = <35>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_2: usb@d140000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d140000 0x100>; > + interrupts = <36>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_2_0: usb@d150000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d150000 0x100>; > + interrupts = <37>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + sdcard_0: sdhci@d070000 { mmc > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > + > + wifi_0: sdhci@d080000 { mmc > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d080000 0x200>; > + interrupts = <8>; > + interrupt-parent = <&latte_pic>; > + }; > + > + legacy_ipc: ipc@d800000 { > + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; > + reg = <0x0d800000 0x10>; > + interrupts = <30 31>; > + interrupt-parent = <&latte_pic>; > + }; > + > + latte_otp: otp@d8001ec { > + compatible = "nintendo,latte-otp"; > + reg = <0x0d8001ec 0x8>; > + }; > + > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x808>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38 28>; > + }; > + > + latte_pic: pic@d800440 { interrupt-controller > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > + > + gpio: gpio@d8000c0 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d8000c0 0x40>; > + gpio-controller; > + /* TODO: There are actually 31 AHBALL GPIOs */ > + ngpios = <24>; > + > + gpio-line-names = > + "POWER", "DWIFI", "FAN", "DC_DC", > + "", "Esp10WorkAround", "", "", > + "PADPD", "", "EEP_CS", "EEP_CLK", > + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", > + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", > + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + > + gpio2: gpio@d800520 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d800520 0x40>; > + gpio-controller; > + ngpios = <7>; > + > + gpio-line-names = > + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", > + "AVE_INT", "", "AVE_RESET"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + }; > + > + spi_gpio: spi-gpio { > + compatible = "spi-gpio"; > + #address-cells = <1>; > + #size-cells = <0>; > + > + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; > + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; > + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; > + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; > + num-chipselects = <1>; > + > + eeprom@0 { > + compatible = "atmel,at93c66"; > + reg = <0>; > + spi-max-frequency = <1000000>; > + spi-cs-high; > + /* TODO: wiiubrew says this is 16-bit, but I only get the correct > + * values in 8-bit... > + */ > + data-size = <8>; > + read-only; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ > + rng_seed: rng@12 { reg = <0x012 8>; }; > + ppc_pvr: pvr@20 { reg = <0x020 4>; }; > + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; > + seeprom_ver: sver@2a { reg = <0x02A 2>; }; > + otp_ver: over@2c { reg = <0x02C 2>; }; > + otp_rev: orev@2e { reg = <0x02E 2>; }; > + otp_ver_str: over-str@30 { reg = <0x030 8>; }; > + > + bc_crc: bc-crc@38 { reg = <0x038 4>; }; > + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; > + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; > + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; > + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; > + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; > + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; > + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; > + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; > + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; > + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; > + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; > + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; > + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; > + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; > + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; > + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; > + > + drive_key: drvkey@80 { reg = <0x080 16>; }; > + factory_key: fackey@90 { reg = <0x090 16>; }; > + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; > + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; > + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; > + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; > + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; > + > + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; > + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; > + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; > + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; > + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; > + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; > + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; > + sysprod_code: sp_code@158 { reg = <0x158 8>; }; > + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; > + sysprod_model: sp_model@170 { reg = <0x170 16>; }; > + > + prod_year: pyear@188 { reg = <0x188 2>; }; > + prod_date: pdate@18a { reg = <0x18A 2>; }; > + prod_time: ptime@18c { reg = <0x18C 2>; }; > + > + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; > + }; > + }; > + > + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ > + gpio-keys-polled { gpio-keys > + poll-interval = <50>; > + compatible = "gpio-keys-polled"; > + > + power { key-power (will be enforced by schema) > + label = "Power Button"; > + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; > + linux,code = <KEY_POWER>; > + }; > + }; > +}; Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree @ 2022-06-29 9:58 ` Krzysztof Kozlowski 0 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 9:58 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne On 28/06/2022 15:31, Ash Logan wrote: > Add a device tree source file for the Nintendo Wii U video game console. > > Signed-off-by: Ash Logan <ash@heyquark.com> > Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> > Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > --- > v1->v2: Style and formatting changes suggested by Rob Herring. > License remains GPL-2.0 as the other powerpc dtses are the same, happy > to change if there is a different preferred default. > v2->v3: Re-added address-cells accidentally removed in v2. > Marked latte as a simple-bus, since it is. Thank you for your patch. There is something to discuss/improve. > > arch/powerpc/boot/dts/wiiu.dts | 326 +++++++++++++++++++++++++++++++++ > 1 file changed, 326 insertions(+) > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > > diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts > new file mode 100644 > index 000000000000..44a5a1469095 > --- /dev/null > +++ b/arch/powerpc/boot/dts/wiiu.dts > @@ -0,0 +1,326 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Nintendo Wii U Device Tree Source > + * > + * Copyright (C) 2022 The linux-wiiu Team > + */ > + > +/dts-v1/; > +#include <dt-bindings/gpio/gpio.h> > +#include <dt-bindings/input/input.h> > + > +/ { > + model = "nintendo,wiiu"; It's not compatible, but user-visible string, e.g. "Nintendo Wii U" > + compatible = "nintendo,wiiu"; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + chosen { > + bootargs = "root=/dev/sda1 rootwait"; This does not belong to shared DTS. No bootargs. > + }; > + > + memory { > + device_type = "memory"; > + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ > + 0x08000000 0x00300000 /* MEM0 - 3MiB */ > + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ > + }; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + /* TODO: Add SMP */ > + PowerPC,espresso@0 { Node name should be generic, so "cpu". Unless something needs the specific node name? > + device_type = "cpu"; > + reg = <0>; > + clock-frequency = <1243125000>; /* 1.243125GHz */ > + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ > + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ > + i-cache-size = <32768>; /* 32K icache */ > + i-cache-line-size = <32>; > + i-cache-block-size = <32>; > + i-cache-sets = <128>; > + d-cache-size = <32768>; /* 32K dcache */ > + d-cache-line-size = <32>; > + d-cache-block-size = <32>; > + d-cache-sets = <128>; > + next-level-cache = <&L2_0>; > + L2_0:l2-cache { > + compatible = "cache"; > + cache-level = <2>; > + cache-unified; > + cache-size = <0x80000>; /* 512KB L2 */ > + cache-line-size = <64>; > + cache-block-size = <32>; > + cache-sets = <2048>; > + }; > + }; > + }; > + > + latte { Generic node names. > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "nintendo,latte", "simple-bus"; > + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ > + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ > + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ > + > + latte_gpu: gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > + > + espresso_pic: pic@c000078 { interrupt-controller > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + }; > + > + latte_dsp: dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > + > + ehci_0: usb@d040000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d040000 0x100>; > + interrupts = <4>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_0_0: usb@d050000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d050000 0x100>; > + interrupts = <5>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ohci_0_1: usb@d060000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d060000 0x100>; > + interrupts = <6>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_1: usb@d120000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d120000 0x100>; > + interrupts = <16>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_1_0: usb@d130000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d130000 0x100>; > + interrupts = <35>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + ehci_2: usb@d140000 { > + compatible = "nintendo,latte-usb-ehci", "usb-ehci"; > + reg = <0x0d140000 0x100>; > + interrupts = <36>; > + interrupt-parent = <&latte_pic>; > + big-endian-regs; > + }; > + > + ohci_2_0: usb@d150000 { > + compatible = "nintendo,latte-usb-ohci"; > + reg = <0x0d150000 0x100>; > + interrupts = <37>; > + interrupt-parent = <&latte_pic>; > + > + big-endian-regs; > + }; > + > + sdcard_0: sdhci@d070000 { mmc > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > + > + wifi_0: sdhci@d080000 { mmc > + compatible = "nintendo,latte-sdhci","sdhci"; > + reg = <0x0d080000 0x200>; > + interrupts = <8>; > + interrupt-parent = <&latte_pic>; > + }; > + > + legacy_ipc: ipc@d800000 { > + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; > + reg = <0x0d800000 0x10>; > + interrupts = <30 31>; > + interrupt-parent = <&latte_pic>; > + }; > + > + latte_otp: otp@d8001ec { > + compatible = "nintendo,latte-otp"; > + reg = <0x0d8001ec 0x8>; > + }; > + > + sata: ahci@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x808>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38 28>; > + }; > + > + latte_pic: pic@d800440 { interrupt-controller > + #interrupt-cells = <1>; > + interrupt-controller; > + > + compatible = "nintendo,latte-pic"; > + reg = <0x0d800440 0x30>; > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > + > + gpio: gpio@d8000c0 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d8000c0 0x40>; > + gpio-controller; > + /* TODO: There are actually 31 AHBALL GPIOs */ > + ngpios = <24>; > + > + gpio-line-names = > + "POWER", "DWIFI", "FAN", "DC_DC", > + "", "Esp10WorkAround", "", "", > + "PADPD", "", "EEP_CS", "EEP_CLK", > + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", > + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", > + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + > + gpio2: gpio@d800520 { > + #gpio-cells = <2>; > + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; > + > + reg = <0x0d800520 0x40>; > + gpio-controller; > + ngpios = <7>; > + > + gpio-line-names = > + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", > + "AVE_INT", "", "AVE_RESET"; > + > + interrupt-controller; > + #interrupt-cells = <2>; > + interrupts = <10>; > + interrupt-parent = <&latte_pic>; > + }; > + }; > + > + spi_gpio: spi-gpio { > + compatible = "spi-gpio"; > + #address-cells = <1>; > + #size-cells = <0>; > + > + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; > + gpio-sck = <&gpio 11 GPIO_ACTIVE_HIGH>; > + gpio-mosi = <&gpio 12 GPIO_ACTIVE_HIGH>; > + gpio-miso = <&gpio 13 GPIO_ACTIVE_HIGH>; > + num-chipselects = <1>; > + > + eeprom@0 { > + compatible = "atmel,at93c66"; > + reg = <0>; > + spi-max-frequency = <1000000>; > + spi-cs-high; > + /* TODO: wiiubrew says this is 16-bit, but I only get the correct > + * values in 8-bit... > + */ > + data-size = <8>; > + read-only; > + > + #address-cells = <1>; > + #size-cells = <1>; > + > + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ > + rng_seed: rng@12 { reg = <0x012 8>; }; > + ppc_pvr: pvr@20 { reg = <0x020 4>; }; > + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; > + seeprom_ver: sver@2a { reg = <0x02A 2>; }; > + otp_ver: over@2c { reg = <0x02C 2>; }; > + otp_rev: orev@2e { reg = <0x02E 2>; }; > + otp_ver_str: over-str@30 { reg = <0x030 8>; }; > + > + bc_crc: bc-crc@38 { reg = <0x038 4>; }; > + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; > + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; > + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; > + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; > + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; > + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; > + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; > + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; > + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; > + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; > + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; > + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; > + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; > + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; > + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; > + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; > + > + drive_key: drvkey@80 { reg = <0x080 16>; }; > + factory_key: fackey@90 { reg = <0x090 16>; }; > + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; > + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; > + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; > + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; > + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; > + > + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; > + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; > + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; > + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; > + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; > + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; > + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; > + sysprod_code: sp_code@158 { reg = <0x158 8>; }; > + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; > + sysprod_model: sp_model@170 { reg = <0x170 16>; }; > + > + prod_year: pyear@188 { reg = <0x188 2>; }; > + prod_date: pdate@18a { reg = <0x18A 2>; }; > + prod_time: ptime@18c { reg = <0x18C 2>; }; > + > + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; > + }; > + }; > + > + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ > + gpio-keys-polled { gpio-keys > + poll-interval = <50>; > + compatible = "gpio-keys-polled"; > + > + power { key-power (will be enforced by schema) > + label = "Power Button"; > + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; > + linux,code = <KEY_POWER>; > + }; > + }; > +}; Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree 2022-06-29 9:58 ` Krzysztof Kozlowski @ 2022-06-29 16:13 ` Segher Boessenkool -1 siblings, 0 replies; 170+ messages in thread From: Segher Boessenkool @ 2022-06-29 16:13 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, robh+dt, paulus, Ash Logan, krzysztof.kozlowski+dt, j.ne, linuxppc-dev, joel On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: > On 28/06/2022 15:31, Ash Logan wrote: > > + model = "nintendo,wiiu"; > > It's not compatible, but user-visible string, e.g. "Nintendo Wii U" The "model" property in OF is documented as: --- “model” S Standard property name to define a manufacturer’s model number. prop-encoded-array: Text string, encoded with encode-string. A manufacturer-dependent string that generally specifies the model name and number (including revision level) for this device. The format of the text string is arbitrary, although in conventional usage the string begins with the name of the device’s manufacturer as with the “name” property. Although there is no standard interpretation for the value of the “model” property, a specific device driver might use it to learn, for instance, the revision level of its particular device. See also: property, model. Used as: " XYZCO,1416-02" encode-string " model" property --- > > + cpus { > > + #address-cells = <1>; > > + #size-cells = <0>; > > + > > + /* TODO: Add SMP */ > > + PowerPC,espresso@0 { > > Node name should be generic, so "cpu". Unless something needs the > specific node name? This is how most other PowerPC firmwares do it. The PowerPC processor binding is older than the generic naming practice, so CPU nodes have device_type "cpu" instead. This is a required property btw, with that value. (There is no requirement on the names of the CPU nodes). There is no added value in generic naming for CPU nodes anyway, since you just find them as the children of the "/cpus" node :-) Segher ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree @ 2022-06-29 16:13 ` Segher Boessenkool 0 siblings, 0 replies; 170+ messages in thread From: Segher Boessenkool @ 2022-06-29 16:13 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: > On 28/06/2022 15:31, Ash Logan wrote: > > + model = "nintendo,wiiu"; > > It's not compatible, but user-visible string, e.g. "Nintendo Wii U" The "model" property in OF is documented as: --- “model” S Standard property name to define a manufacturer’s model number. prop-encoded-array: Text string, encoded with encode-string. A manufacturer-dependent string that generally specifies the model name and number (including revision level) for this device. The format of the text string is arbitrary, although in conventional usage the string begins with the name of the device’s manufacturer as with the “name” property. Although there is no standard interpretation for the value of the “model” property, a specific device driver might use it to learn, for instance, the revision level of its particular device. See also: property, model. Used as: " XYZCO,1416-02" encode-string " model" property --- > > + cpus { > > + #address-cells = <1>; > > + #size-cells = <0>; > > + > > + /* TODO: Add SMP */ > > + PowerPC,espresso@0 { > > Node name should be generic, so "cpu". Unless something needs the > specific node name? This is how most other PowerPC firmwares do it. The PowerPC processor binding is older than the generic naming practice, so CPU nodes have device_type "cpu" instead. This is a required property btw, with that value. (There is no requirement on the names of the CPU nodes). There is no added value in generic naming for CPU nodes anyway, since you just find them as the children of the "/cpus" node :-) Segher ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree 2022-06-29 16:13 ` Segher Boessenkool @ 2022-06-29 18:13 ` Krzysztof Kozlowski -1 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 18:13 UTC (permalink / raw) To: Segher Boessenkool Cc: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne On 29/06/2022 18:13, Segher Boessenkool wrote: > On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: >> On 28/06/2022 15:31, Ash Logan wrote: >>> + model = "nintendo,wiiu"; >> >> It's not compatible, but user-visible string, e.g. "Nintendo Wii U" > > The "model" property in OF is documented as: > > --- > “model” S > Standard property name to define a manufacturer’s model number. > > prop-encoded-array: > Text string, encoded with encode-string. > A manufacturer-dependent string that generally specifies the model name > and number (including revision level) for this device. The format of the > text string is arbitrary, although in conventional usage the string > begins with the name of the device’s manufacturer as with the “name” > property. > Although there is no standard interpretation for the value of the > “model” property, a specific device driver might use it to learn, for > instance, the revision level of its particular device. > > See also: property, model. > > Used as: " XYZCO,1416-02" encode-string " model" property Hm, surprising to duplicate the compatible, but OK. > --- > >>> + cpus { >>> + #address-cells = <1>; >>> + #size-cells = <0>; >>> + >>> + /* TODO: Add SMP */ >>> + PowerPC,espresso@0 { >> >> Node name should be generic, so "cpu". Unless something needs the >> specific node name? > > This is how most other PowerPC firmwares do it. The PowerPC processor > binding is older than the generic naming practice, so CPU nodes have > device_type "cpu" instead. ePAPR 1.0 from 2008 explicitly asks for generic node names. So 4 years before Nintento Wii U. Maybe earlier ePAPR-s were also asking for this, no clue, don't have them. > This is a required property btw, with that > value. (There is no requirement on the names of the CPU nodes). That's fine, I am not talking about property. > There is no added value in generic naming for CPU nodes anyway, since > you just find them as the children of the "/cpus" node :-) There is because you might have there caches. It also makes code easier to read. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree @ 2022-06-29 18:13 ` Krzysztof Kozlowski 0 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2022-06-29 18:13 UTC (permalink / raw) To: Segher Boessenkool Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, robh+dt, paulus, Ash Logan, krzysztof.kozlowski+dt, j.ne, linuxppc-dev, joel On 29/06/2022 18:13, Segher Boessenkool wrote: > On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: >> On 28/06/2022 15:31, Ash Logan wrote: >>> + model = "nintendo,wiiu"; >> >> It's not compatible, but user-visible string, e.g. "Nintendo Wii U" > > The "model" property in OF is documented as: > > --- > “model” S > Standard property name to define a manufacturer’s model number. > > prop-encoded-array: > Text string, encoded with encode-string. > A manufacturer-dependent string that generally specifies the model name > and number (including revision level) for this device. The format of the > text string is arbitrary, although in conventional usage the string > begins with the name of the device’s manufacturer as with the “name” > property. > Although there is no standard interpretation for the value of the > “model” property, a specific device driver might use it to learn, for > instance, the revision level of its particular device. > > See also: property, model. > > Used as: " XYZCO,1416-02" encode-string " model" property Hm, surprising to duplicate the compatible, but OK. > --- > >>> + cpus { >>> + #address-cells = <1>; >>> + #size-cells = <0>; >>> + >>> + /* TODO: Add SMP */ >>> + PowerPC,espresso@0 { >> >> Node name should be generic, so "cpu". Unless something needs the >> specific node name? > > This is how most other PowerPC firmwares do it. The PowerPC processor > binding is older than the generic naming practice, so CPU nodes have > device_type "cpu" instead. ePAPR 1.0 from 2008 explicitly asks for generic node names. So 4 years before Nintento Wii U. Maybe earlier ePAPR-s were also asking for this, no clue, don't have them. > This is a required property btw, with that > value. (There is no requirement on the names of the CPU nodes). That's fine, I am not talking about property. > There is no added value in generic naming for CPU nodes anyway, since > you just find them as the children of the "/cpus" node :-) There is because you might have there caches. It also makes code easier to read. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree 2022-06-29 18:13 ` Krzysztof Kozlowski @ 2022-06-29 20:28 ` Segher Boessenkool -1 siblings, 0 replies; 170+ messages in thread From: Segher Boessenkool @ 2022-06-29 20:28 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, robh+dt, paulus, Ash Logan, krzysztof.kozlowski+dt, j.ne, linuxppc-dev, joel On Wed, Jun 29, 2022 at 08:13:13PM +0200, Krzysztof Kozlowski wrote: > On 29/06/2022 18:13, Segher Boessenkool wrote: > > On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: > >>> + /* TODO: Add SMP */ > >>> + PowerPC,espresso@0 { > >> > >> Node name should be generic, so "cpu". Unless something needs the > >> specific node name? > > > > This is how most other PowerPC firmwares do it. The PowerPC processor > > binding is older than the generic naming practice, so CPU nodes have > > device_type "cpu" instead. > > ePAPR 1.0 from 2008 explicitly asks for generic node names. So 4 years > before Nintento Wii U. Maybe earlier ePAPR-s were also asking for this, > no clue, don't have them. The majority of PowerPC 750 systems long predate that. Many *current* systems implement the PowerPC Processor Binding, too (not the epapr thing, which is incompatible with the older standards!) > > There is no added value in generic naming for CPU nodes anyway, since > > you just find them as the children of the "/cpus" node :-) > > There is because you might have there caches. It also makes code easier > to read. In the processor binding the cache nodes were subnodes of cpu nodes or other cache nodes. But in some server products you can have cache that is enabled while the corresponding core is disabled; and also, not all cache belongs to only one higher level anyway. This was modelled pretty uncleanly, yup (cleaner would have been to have a /caches node as well as /cpus, for example). But on 750 you just have "l2-cache" subnodes, and all nodes in /cpus are CPUs :-) Segher ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 02/12] powerpc: wiiu: device tree @ 2022-06-29 20:28 ` Segher Boessenkool 0 siblings, 0 replies; 170+ messages in thread From: Segher Boessenkool @ 2022-06-29 20:28 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne On Wed, Jun 29, 2022 at 08:13:13PM +0200, Krzysztof Kozlowski wrote: > On 29/06/2022 18:13, Segher Boessenkool wrote: > > On Wed, Jun 29, 2022 at 11:58:18AM +0200, Krzysztof Kozlowski wrote: > >>> + /* TODO: Add SMP */ > >>> + PowerPC,espresso@0 { > >> > >> Node name should be generic, so "cpu". Unless something needs the > >> specific node name? > > > > This is how most other PowerPC firmwares do it. The PowerPC processor > > binding is older than the generic naming practice, so CPU nodes have > > device_type "cpu" instead. > > ePAPR 1.0 from 2008 explicitly asks for generic node names. So 4 years > before Nintento Wii U. Maybe earlier ePAPR-s were also asking for this, > no clue, don't have them. The majority of PowerPC 750 systems long predate that. Many *current* systems implement the PowerPC Processor Binding, too (not the epapr thing, which is incompatible with the older standards!) > > There is no added value in generic naming for CPU nodes anyway, since > > you just find them as the children of the "/cpus" node :-) > > There is because you might have there caches. It also makes code easier > to read. In the processor binding the cache nodes were subnodes of cpu nodes or other cache nodes. But in some server products you can have cache that is enabled while the corresponding core is disabled; and also, not all cache belongs to only one higher level anyway. This was modelled pretty uncleanly, yup (cleaner would have been to have a /caches node as well as /cpus, for example). But on 750 you just have "l2-cache" subnodes, and all nodes in /cpus are CPUs :-) Segher ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v3 03/12] powerpc: wiiu: bootwrapper support 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index a9cd2ea4a861..6694f578c447 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -161,6 +161,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -359,6 +360,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 55978f32fa77..83b74ffaae2b 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 03/12] powerpc: wiiu: bootwrapper support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index a9cd2ea4a861..6694f578c447 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -161,6 +161,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -359,6 +360,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 55978f32fa77..83b74ffaae2b 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 04/12] powerpc: wiiu: introduce wiiu platform 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Add help text for CONFIG_WIIU. arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 8 ++++++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 11 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..3834834c6bd7 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 + help + Select WIIU if configuring for the Nintendo Wii U. + More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 04/12] powerpc: wiiu: introduce wiiu platform @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Add help text for CONFIG_WIIU. arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 8 ++++++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 11 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..3834834c6bd7 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 + help + Select WIIU if configuring for the Nintendo Wii U. + More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 05/12] powerpc: wiiu: declare as non-coherent 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 9e2df4b66478..20eef6595a60 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -501,7 +501,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 05/12] powerpc: wiiu: declare as non-coherent @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 9e2df4b66478..20eef6595a60 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -501,7 +501,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 06/12] powerpc: wiiu: udbg support for latteipc 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Fix a missing declaration issue by including latteipc_udbg.h. arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 ++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 199 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 9f363c143d86..cee97d21f5fb 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b4aa0d88ce2c..266b0e744ddc 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 6c739beb938c..48d487efb25c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 3834834c6bd7..8dfd6ac8774d 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -6,3 +6,16 @@ config WIIU help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..4e44e0cb6494 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#include "udbg_latteipc.h" + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 06/12] powerpc: wiiu: udbg support for latteipc @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Fix a missing declaration issue by including latteipc_udbg.h. arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 ++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 199 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 9f363c143d86..cee97d21f5fb 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b4aa0d88ce2c..266b0e744ddc 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ extern void __init udbg_init_ehv_bc(void); extern void __init udbg_init_ps3gelic(void); extern void __init udbg_init_debug_opal_raw(void); extern void __init udbg_init_debug_opal_hvsi(void); +extern void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 6c739beb938c..48d487efb25c 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index b1544b2f6321..84eae25c195e 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -67,6 +67,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_raw(); #elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI) udbg_init_debug_opal_hvsi(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 3834834c6bd7..8dfd6ac8774d 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -6,3 +6,16 @@ config WIIU help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..4e44e0cb6494 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#include "udbg_latteipc.h" + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 07/12] powerpc: wiiu: espresso interrupt controller support 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 07/12] powerpc: wiiu: espresso interrupt controller support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 08/12] powerpc: wiiu: latte interrupt controller support 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- v2->v3: Make latte_pic_get_irq static. arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 8dfd6ac8774d..40ecba8396a7 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..7e3f49844166 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +static unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 08/12] powerpc: wiiu: latte interrupt controller support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- v2->v3: Make latte_pic_get_irq static. arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 8dfd6ac8774d..40ecba8396a7 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..7e3f49844166 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +static unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 09/12] powerpc: espresso processor support 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index a5dbfccd2047..3a4e84d1f674 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -736,6 +736,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 09/12] powerpc: espresso processor support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/kernel/cputable.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index a5dbfccd2047..3a4e84d1f674 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -736,6 +736,22 @@ static struct cpu_spec __initdata cpu_specs[] = { .platform = "ppc750", .oprofile_cpu_type = "ppc/750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + .oprofile_cpu_type = "ppc/750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 10/12] powerpc: wiiu: platform support 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v2->v3: Use of_platform_default_populate instead of a custom match table. arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 60 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..e3f07ce65cad --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_default_populate(NULL, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 10/12] powerpc: wiiu: platform support @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v2->v3: Use of_platform_default_populate instead of a custom match table. arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 60 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..e3f07ce65cad --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_default_populate(NULL, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 11/12] powerpc: wiiu: don't enforce flat memory 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 693a3a7a9463..6cdb561c05c5 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -124,10 +124,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 11/12] powerpc: wiiu: don't enforce flat memory @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne pgtable_32.c:mapin_ram loops over each valid memory range, which means non-contiguous memory just works. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/mm/init_32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c index 693a3a7a9463..6cdb561c05c5 100644 --- a/arch/powerpc/mm/init_32.c +++ b/arch/powerpc/mm/init_32.c @@ -124,10 +124,10 @@ void __init MMU_init(void) * lowmem_end_addr is initialized below. */ if (memblock.memory.cnt > 1) { -#ifndef CONFIG_WII +#if !defined(CONFIG_WII) && !defined(CONFIG_WIIU) memblock_enforce_memory_limit(memblock.memory.regions[0].size); pr_warn("Only using first contiguous memory region\n"); -#else +#elif defined(CONFIG_WII) wii_memory_fixups(); #endif } -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 12/12] powerpc: wiiu: add minimal default config 2022-06-28 13:31 ` Ash Logan @ 2022-06-28 13:31 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v3 12/12] powerpc: wiiu: add minimal default config @ 2022-06-28 13:31 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-06-28 13:31 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.36.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v3 00/12] powerpc: Nintendo Wii U support 2022-06-28 13:31 ` Ash Logan @ 2022-11-15 14:47 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-11-15 14:47 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, robh+dt, benh Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Hi, Your series doesn't apply anymore, can you rebase ? Thanks Christophe Le 28/06/2022 à 15:31, Ash Logan a écrit : > The following patches add basic support for the Nintendo Wii U video > game console, a PowerPC system somewhat similar to the GameCube and > Wii. > > This includes: > - devicetree source > - bootwrapper support > - udbg console to bootloader > - early udbg console > - interrupt controllers > - platform support > - recognition of the Espresso processor > - workaround for the discontiguous RAM blocks > > This is enough to boot on hardware. dmesg pics (with a small hack to > udbg-immortal, not included): > Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png > Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png > > For those who have hardware and would like to try these patches, some > modification is required to the stock OS to allow Linux. For info: > https://wiki.linux-wiiu.org/wiki/AdvancedSetup > > Some of the design choices (new platform > embedded6xx) were discussed > previously: > Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ > > Turns out even less changes were needed than previously anticipated for > discontiguous memory, and KUAP is yet to give trouble. Thanks to those > who helped and discussed this. > > Changes since v2: > - Fixed some overzealous deleting in the devicetree, oops. > - Fixed missing declarations for some functions (thanks robots) > - Fixed some checkpatch warnings. > - Mark latte as a simple-bus and use of_platform_default_populate. > Changes since v1: > - Style and formatting tweaks to the devicetree, thanks Rob Herring for > the review. > > Ash Logan (12): > dt-bindings: wiiu: Document the Nintendo Wii U devicetree > powerpc: wiiu: device tree > powerpc: wiiu: bootwrapper support > powerpc: wiiu: introduce wiiu platform > powerpc: wiiu: declare as non-coherent > powerpc: wiiu: udbg support for latteipc > powerpc: wiiu: espresso interrupt controller support > powerpc: wiiu: latte interrupt controller support > powerpc: espresso processor support > powerpc: wiiu: platform support > powerpc: wiiu: don't enforce flat memory > powerpc: wiiu: add minimal default config > > .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ > arch/powerpc/Kconfig.debug | 9 + > arch/powerpc/boot/Makefile | 4 + > arch/powerpc/boot/dts/wiiu.dts | 326 ++++++++++++++++++ > arch/powerpc/boot/wiiu-head.S | 103 ++++++ > arch/powerpc/boot/wiiu.c | 73 ++++ > arch/powerpc/boot/wrapper | 4 + > arch/powerpc/configs/wiiu_defconfig | 7 + > arch/powerpc/include/asm/udbg.h | 1 + > arch/powerpc/kernel/cputable.c | 16 + > arch/powerpc/kernel/head_book3s_32.S | 20 ++ > arch/powerpc/kernel/udbg.c | 3 + > arch/powerpc/mm/init_32.c | 4 +- > arch/powerpc/platforms/Kconfig | 1 + > arch/powerpc/platforms/Kconfig.cputype | 2 +- > arch/powerpc/platforms/Makefile | 1 + > arch/powerpc/platforms/wiiu/Kconfig | 22 ++ > arch/powerpc/platforms/wiiu/Makefile | 4 + > arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ > arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ > arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ > arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ > arch/powerpc/platforms/wiiu/setup.c | 60 ++++ > arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 +++++++ > arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ > 32 files changed, 1632 insertions(+), 3 deletions(-) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > create mode 100644 arch/powerpc/boot/wiiu-head.S > create mode 100644 arch/powerpc/boot/wiiu.c > create mode 100644 arch/powerpc/configs/wiiu_defconfig > create mode 100644 arch/powerpc/platforms/wiiu/Kconfig > create mode 100644 arch/powerpc/platforms/wiiu/Makefile > create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c > create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h > create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c > create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h > create mode 100644 arch/powerpc/platforms/wiiu/setup.c > create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c > create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h > > > base-commit: 03c765b0e3b4cb5063276b086c76f7a612856a9a ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v3 00/12] powerpc: Nintendo Wii U support @ 2022-11-15 14:47 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2022-11-15 14:47 UTC (permalink / raw) To: Ash Logan, krzysztof.kozlowski+dt, paulus, mpe, robh+dt, benh Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Hi, Your series doesn't apply anymore, can you rebase ? Thanks Christophe Le 28/06/2022 à 15:31, Ash Logan a écrit : > The following patches add basic support for the Nintendo Wii U video > game console, a PowerPC system somewhat similar to the GameCube and > Wii. > > This includes: > - devicetree source > - bootwrapper support > - udbg console to bootloader > - early udbg console > - interrupt controllers > - platform support > - recognition of the Espresso processor > - workaround for the discontiguous RAM blocks > > This is enough to boot on hardware. dmesg pics (with a small hack to > udbg-immortal, not included): > Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png > Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png > > For those who have hardware and would like to try these patches, some > modification is required to the stock OS to allow Linux. For info: > https://wiki.linux-wiiu.org/wiki/AdvancedSetup > > Some of the design choices (new platform > embedded6xx) were discussed > previously: > Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ > > Turns out even less changes were needed than previously anticipated for > discontiguous memory, and KUAP is yet to give trouble. Thanks to those > who helped and discussed this. > > Changes since v2: > - Fixed some overzealous deleting in the devicetree, oops. > - Fixed missing declarations for some functions (thanks robots) > - Fixed some checkpatch warnings. > - Mark latte as a simple-bus and use of_platform_default_populate. > Changes since v1: > - Style and formatting tweaks to the devicetree, thanks Rob Herring for > the review. > > Ash Logan (12): > dt-bindings: wiiu: Document the Nintendo Wii U devicetree > powerpc: wiiu: device tree > powerpc: wiiu: bootwrapper support > powerpc: wiiu: introduce wiiu platform > powerpc: wiiu: declare as non-coherent > powerpc: wiiu: udbg support for latteipc > powerpc: wiiu: espresso interrupt controller support > powerpc: wiiu: latte interrupt controller support > powerpc: espresso processor support > powerpc: wiiu: platform support > powerpc: wiiu: don't enforce flat memory > powerpc: wiiu: add minimal default config > > .../bindings/powerpc/nintendo/wiiu.yaml | 28 ++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 42 +++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 41 +++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 43 +++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 46 +++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 40 +++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 25 ++ > arch/powerpc/Kconfig.debug | 9 + > arch/powerpc/boot/Makefile | 4 + > arch/powerpc/boot/dts/wiiu.dts | 326 ++++++++++++++++++ > arch/powerpc/boot/wiiu-head.S | 103 ++++++ > arch/powerpc/boot/wiiu.c | 73 ++++ > arch/powerpc/boot/wrapper | 4 + > arch/powerpc/configs/wiiu_defconfig | 7 + > arch/powerpc/include/asm/udbg.h | 1 + > arch/powerpc/kernel/cputable.c | 16 + > arch/powerpc/kernel/head_book3s_32.S | 20 ++ > arch/powerpc/kernel/udbg.c | 3 + > arch/powerpc/mm/init_32.c | 4 +- > arch/powerpc/platforms/Kconfig | 1 + > arch/powerpc/platforms/Kconfig.cputype | 2 +- > arch/powerpc/platforms/Makefile | 1 + > arch/powerpc/platforms/wiiu/Kconfig | 22 ++ > arch/powerpc/platforms/wiiu/Makefile | 4 + > arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ > arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ > arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ > arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ > arch/powerpc/platforms/wiiu/setup.c | 60 ++++ > arch/powerpc/platforms/wiiu/udbg_latteipc.c | 124 +++++++ > arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ > 32 files changed, 1632 insertions(+), 3 deletions(-) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > create mode 100644 arch/powerpc/boot/dts/wiiu.dts > create mode 100644 arch/powerpc/boot/wiiu-head.S > create mode 100644 arch/powerpc/boot/wiiu.c > create mode 100644 arch/powerpc/configs/wiiu_defconfig > create mode 100644 arch/powerpc/platforms/wiiu/Kconfig > create mode 100644 arch/powerpc/platforms/wiiu/Makefile > create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c > create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h > create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c > create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h > create mode 100644 arch/powerpc/platforms/wiiu/setup.c > create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c > create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h > > > base-commit: 03c765b0e3b4cb5063276b086c76f7a612856a9a ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v4 00/11] powerpc: Nintendo Wii U support 2022-06-28 13:31 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v3: - Reworked devicetree bindings - thanks Krzysztof Kozlowski for the review. - Update devicetree source to match. - Fixes to ensure patches apply to current source. Changes since v2: - Fixed some overzealous deleting in the devicetree, oops. - Fixed missing declarations for some functions (thanks robots) - Fixed some checkpatch warnings. - Mark latte as a simple-bus and use of_platform_default_populate. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (11): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 25 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 ++ .../devicetree/bindings/usb/generic-ehci.yaml | 1 + arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 319 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cpu_specs_book3s_32.h | 15 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 22 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 60 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 126 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1657 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 094226ad94f471a9f19e8f8e7140a09c2625abaa -- 2.38.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v4 00/11] powerpc: Nintendo Wii U support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne The following patches add basic support for the Nintendo Wii U video game console, a PowerPC system somewhat similar to the GameCube and Wii. This includes: - devicetree source - bootwrapper support - udbg console to bootloader - early udbg console - interrupt controllers - platform support - recognition of the Espresso processor This is enough to boot on hardware. dmesg pics (with a small hack to udbg-immortal, not included): Link: https://wiki.linux-wiiu.org/images/7/7e/Mainline-initial-dmesg1.png Link: https://wiki.linux-wiiu.org/images/9/91/Mainline-initial-dmesg2.png For those who have hardware and would like to try these patches, some modification is required to the stock OS to allow Linux. For info: https://wiki.linux-wiiu.org/wiki/AdvancedSetup Some of the design choices (new platform > embedded6xx) were discussed previously: Link: https://lore.kernel.org/lkml/0020d47c-0e23-822c-33f5-ccb7ea4c1072@heyquark.com/T/ Turns out even less changes were needed than previously anticipated for discontiguous memory, and KUAP is yet to give trouble. Thanks to those who helped and discussed this. Changes since v3: - Reworked devicetree bindings - thanks Krzysztof Kozlowski for the review. - Update devicetree source to match. - Fixes to ensure patches apply to current source. Changes since v2: - Fixed some overzealous deleting in the devicetree, oops. - Fixed missing declarations for some functions (thanks robots) - Fixed some checkpatch warnings. - Mark latte as a simple-bus and use of_platform_default_populate. Changes since v1: - Style and formatting tweaks to the devicetree, thanks Rob Herring for the review. Ash Logan (11): dt-bindings: wiiu: Document the Nintendo Wii U devicetree powerpc: wiiu: device tree powerpc: wiiu: bootwrapper support powerpc: wiiu: introduce wiiu platform powerpc: wiiu: declare as non-coherent powerpc: wiiu: udbg support for latteipc powerpc: wiiu: espresso interrupt controller support powerpc: wiiu: latte interrupt controller support powerpc: espresso processor support powerpc: wiiu: platform support powerpc: wiiu: add minimal default config .../bindings/powerpc/nintendo/wiiu.yaml | 25 ++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 +++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 +++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 +++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 ++ .../devicetree/bindings/usb/generic-ehci.yaml | 1 + arch/powerpc/Kconfig.debug | 9 + arch/powerpc/boot/Makefile | 4 + arch/powerpc/boot/dts/wiiu.dts | 319 ++++++++++++++++++ arch/powerpc/boot/wiiu-head.S | 103 ++++++ arch/powerpc/boot/wiiu.c | 73 ++++ arch/powerpc/boot/wrapper | 4 + arch/powerpc/configs/wiiu_defconfig | 7 + arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/cpu_specs_book3s_32.h | 15 + arch/powerpc/kernel/head_book3s_32.S | 20 ++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Kconfig.cputype | 2 +- arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 22 ++ arch/powerpc/platforms/wiiu/Makefile | 4 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 ++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 ++++ arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 ++ arch/powerpc/platforms/wiiu/setup.c | 60 ++++ arch/powerpc/platforms/wiiu/udbg_latteipc.c | 126 +++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 ++ 32 files changed, 1657 insertions(+), 1 deletion(-) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml create mode 100644 arch/powerpc/boot/dts/wiiu.dts create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c create mode 100644 arch/powerpc/configs/wiiu_defconfig create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h create mode 100644 arch/powerpc/platforms/wiiu/setup.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h base-commit: 094226ad94f471a9f19e8f8e7140a09c2625abaa -- 2.38.1 ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- v3->v4: Rework to match expected style and conciceness. .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ .../devicetree/bindings/usb/generic-ehci.yaml | 1 + 9 files changed, 333 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..23703b1052d0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + + compatible: + const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..476a8ccda7a1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +allOf: + - $ref: "/schemas/interrupt-controller.yaml#" + +properties: + compatible: + const: nintendo,espresso-pic + + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + + interrupt-controller: true + + reg: + maxItems: 1 + +required: + - compatible + - '#interrupt-cells' + - interrupt-controller + - reg + +additionalProperties: false + +examples: + - | + interrupt-controller@c000078 { + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + #interrupt-cells = <1>; + interrupt-controller; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..d44ebe0d866c --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + const: nintendo,latte-gpu7 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..a53971a11e89 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +allOf: + - $ref: "/schemas/ata/ahci-common.yaml#" + +properties: + compatible: + const: nintendo,latte-ahci + + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + sata@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..772afe0c298c --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + const: nintendo,latte-dsp + + reg: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..4b71d6b9b14d --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +allOf: + - $ref: "/schemas/interrupt-controller.yaml#" + +properties: + compatible: + const: nintendo,latte-pic + + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + + interrupt-controller: true + + reg: + maxItems: 1 + + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +required: + - compatible + - '#interrupt-cells' + - interrupt-controller + - reg + +additionalProperties: false + +examples: + - | + interrupt-controller@d800440 { + compatible = "nintendo,latte-pic"; + #interrupt-cells = <1>; + interrupt-controller; + reg = <0x0d800440 0x30>; + + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..25d474fca679 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +allOf: + - $ref: "/schemas/mmc/mmc-controller.yaml#" + +properties: + compatible: + items: + - const: nintendo,latte-sdhci + - const: sdhci + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + mmc@d070000 { + compatible = "nintendo,latte-sdhci", "sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6fdf93622fcc --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +allOf: + - $ref: "/schemas/simple-bus.yaml#" + +properties: + compatible: + items: + - const: nintendo,latte + - const: simple-bus + + +required: + - compatible + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml index c5f629c5bc61..9f69b5ab21ff 100644 --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml @@ -69,6 +69,7 @@ properties: - ibm,usb-ehci-440epx - ibm,usb-ehci-460ex - nintendo,hollywood-usb-ehci + - nintendo,latte-ehci - st,spear600-ehci - const: usb-ehci - enum: -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds schema for the various Wii U devicetree nodes used. Signed-off-by: Ash Logan <ash@heyquark.com> --- v3->v4: Rework to match expected style and conciceness. .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ .../devicetree/bindings/usb/generic-ehci.yaml | 1 + 9 files changed, 333 insertions(+) create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml new file mode 100644 index 000000000000..23703b1052d0 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U bindings + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U video game console binding. + +properties: + $nodename: + const: "/" + + compatible: + const: nintendo,wiiu + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml new file mode 100644 index 000000000000..476a8ccda7a1 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U "Espresso" interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. + +allOf: + - $ref: "/schemas/interrupt-controller.yaml#" + +properties: + compatible: + const: nintendo,espresso-pic + + '#interrupt-cells': + # Interrupt numbers 0-32 in one cell + const: 1 + + interrupt-controller: true + + reg: + maxItems: 1 + +required: + - compatible + - '#interrupt-cells' + - interrupt-controller + - reg + +additionalProperties: false + +examples: + - | + interrupt-controller@c000078 { + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + #interrupt-cells = <1>; + interrupt-controller; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml new file mode 100644 index 000000000000..d44ebe0d866c --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte "GPU7" graphics processor + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the + Nintendo Wii U. + +properties: + compatible: + const: nintendo,latte-gpu7 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml new file mode 100644 index 000000000000..a53971a11e89 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte AHCI controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. + +allOf: + - $ref: "/schemas/ata/ahci-common.yaml#" + +properties: + compatible: + const: nintendo,latte-ahci + + reg: + items: + - description: | + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). + + interrupts: + items: + - description: Main HBA interrupt + - description: Vendor debugging interrupt + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + sata@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x408>; + + interrupt-parent = <&latte_pic>; + interrupts = <38>, <28>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml new file mode 100644 index 000000000000..772afe0c298c --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte DSP + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Nintendo Wii U digital signal processor, as found in the Latte chip. + +properties: + compatible: + const: nintendo,latte-dsp + + reg: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml new file mode 100644 index 000000000000..4b71d6b9b14d --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte interrupt controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. + +allOf: + - $ref: "/schemas/interrupt-controller.yaml#" + +properties: + compatible: + const: nintendo,latte-pic + + '#interrupt-cells': + # Interrupt numbers 0-64 in one cell. + const: 1 + + interrupt-controller: true + + reg: + maxItems: 1 + + interrupts: + items: + - description: Cascade interrupt for Espresso PIC + +required: + - compatible + - '#interrupt-cells' + - interrupt-controller + - reg + +additionalProperties: false + +examples: + - | + interrupt-controller@d800440 { + compatible = "nintendo,latte-pic"; + #interrupt-cells = <1>; + interrupt-controller; + reg = <0x0d800440 0x30>; + + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml new file mode 100644 index 000000000000..25d474fca679 --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml @@ -0,0 +1,46 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nintendo Wii U Latte SD Host controller + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. + +allOf: + - $ref: "/schemas/mmc/mmc-controller.yaml#" + +properties: + compatible: + items: + - const: nintendo,latte-sdhci + - const: sdhci + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + +additionalProperties: false + +examples: + - | + mmc@d070000 { + compatible = "nintendo,latte-sdhci", "sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; +... diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml new file mode 100644 index 000000000000..6fdf93622fcc --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Latte system bus + +maintainers: + - Ash Logan <ash@heyquark.com> + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> + +description: | + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. + +allOf: + - $ref: "/schemas/simple-bus.yaml#" + +properties: + compatible: + items: + - const: nintendo,latte + - const: simple-bus + + +required: + - compatible + +additionalProperties: true + +... diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml index c5f629c5bc61..9f69b5ab21ff 100644 --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml @@ -69,6 +69,7 @@ properties: - ibm,usb-ehci-440epx - ibm,usb-ehci-460ex - nintendo,hollywood-usb-ehci + - nintendo,latte-ehci - st,spear600-ehci - const: usb-ehci - enum: -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 21:36 ` Rob Herring -1 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-11-19 21:36 UTC (permalink / raw) To: Ash Logan Cc: mpe, benh, segher, linkmauve, robh+dt, linux-kernel, j.ne, christophe.leroy, rw-r-r-0644, linuxppc-dev, pali, krzysztof.kozlowski+dt, devicetree, joel, paulus On Sat, 19 Nov 2022 22:30:31 +1100, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13): yamllint warnings/errors: dtschema/dtc warnings/errors: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/fsl,spba-bus.example.dtb: spba-bus@30000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/arm,integrator-ap-lm.example.dtb: bus@c0000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/arm,integrator-ap-lm.example.dtb: bus@c0000000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/baikal,bt1-apb.example.dtb: bus@1f059000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/baikal,bt1-axi.example.dtb: bus@1f05a000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-dsp-rproc.example.dtb: bus@100000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-dsp-rproc.example.dtb: bus@100000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@100000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@100000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@28380000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@28380000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/dac/fsl,vf610-dac.example.dtb: bus@40000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/arm/stm32/st,mlahb.example.dtb: ahb@38000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/imx/fsl,aips-bus.example.dtb: bus@30000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/imx/imx8m-soc.example.dtb: soc@0: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/intel/intel,hps-copy-engine.example.dtb: bus@80000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/intel/intel,hps-copy-engine.example.dtb: bus@80000000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20221119113041.284419-2-ash@heyquark.com This check can fail if there are any dependencies. The base for a patch series is generally the most recent rc1. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-11-19 21:36 ` Rob Herring 0 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-11-19 21:36 UTC (permalink / raw) To: Ash Logan Cc: devicetree, pali, linkmauve, linux-kernel, joel, robh+dt, paulus, rw-r-r-0644, krzysztof.kozlowski+dt, linuxppc-dev, j.ne On Sat, 19 Nov 2022 22:30:31 +1100, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13): yamllint warnings/errors: dtschema/dtc warnings/errors: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/fsl,spba-bus.example.dtb: spba-bus@30000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/arm,integrator-ap-lm.example.dtb: bus@c0000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/arm,integrator-ap-lm.example.dtb: bus@c0000000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/baikal,bt1-apb.example.dtb: bus@1f059000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/bus/baikal,bt1-axi.example.dtb: bus@1f05a000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-dsp-rproc.example.dtb: bus@100000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-dsp-rproc.example.dtb: bus@100000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@100000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@100000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@28380000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.example.dtb: bus@28380000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/dac/fsl,vf610-dac.example.dtb: bus@40000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/arm/stm32/st,mlahb.example.dtb: ahb@38000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/imx/fsl,aips-bus.example.dtb: bus@30000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/imx/imx8m-soc.example.dtb: soc@0: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/intel/intel,hps-copy-engine.example.dtb: bus@80000000: compatible:0: 'nintendo,latte' was expected From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/soc/intel/intel,hps-copy-engine.example.dtb: bus@80000000: compatible: ['simple-bus'] is too short From schema: /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20221119113041.284419-2-ash@heyquark.com This check can fail if there are any dependencies. The base for a patch series is generally the most recent rc1. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command. ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-11-19 11:30 ` Ash Logan @ 2022-11-20 15:30 ` Rob Herring -1 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-11-20 15:30 UTC (permalink / raw) To: Ash Logan Cc: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, benh, segher, pali, linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel On Sat, Nov 19, 2022 at 10:30:31PM +1100, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..23703b1052d0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings Everything is a binding, so drop 'bindings'. > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | Don't need '|' if no formatting. > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + > + compatible: > + const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..476a8ccda7a1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" Drop quotes. > + > +properties: > + compatible: > + const: nintendo,espresso-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@c000078 { > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + #interrupt-cells = <1>; > + interrupt-controller; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..d44ebe0d866c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the Wrap lines at 80 unless some advantage to 100. > + Nintendo Wii U. > + > +properties: > + compatible: > + const: nintendo,latte-gpu7 > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..a53971a11e89 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,50 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +allOf: > + - $ref: "/schemas/ata/ahci-common.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-ahci > + > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + sata@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..772afe0c298c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + const: nintendo,latte-dsp > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..4b71d6b9b14d > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,55 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@d800440 { > + compatible = "nintendo,latte-pic"; > + #interrupt-cells = <1>; > + interrupt-controller; > + reg = <0x0d800440 0x30>; > + > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..25d474fca679 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +allOf: > + - $ref: "/schemas/mmc/mmc-controller.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci Just 'sdhci' is not too useful. *All* SDHCI controllers have quirks. > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + mmc@d070000 { > + compatible = "nintendo,latte-sdhci", "sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6fdf93622fcc > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,31 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +allOf: > + - $ref: "/schemas/simple-bus.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte > + - const: simple-bus If truly 'simple', then you don't need 'nintendo,latte'. Otherwise, you need a custom 'select' schema to not select all cases of 'simple-bus'. > + > + one blank line > +required: > + - compatible > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > index c5f629c5bc61..9f69b5ab21ff 100644 > --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml > +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > @@ -69,6 +69,7 @@ properties: > - ibm,usb-ehci-440epx > - ibm,usb-ehci-460ex > - nintendo,hollywood-usb-ehci > + - nintendo,latte-ehci > - st,spear600-ehci > - const: usb-ehci > - enum: > -- > 2.38.1 > > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2022-11-20 15:30 ` Rob Herring 0 siblings, 0 replies; 170+ messages in thread From: Rob Herring @ 2022-11-20 15:30 UTC (permalink / raw) To: Ash Logan Cc: devicetree, linkmauve, linuxppc-dev, linux-kernel, joel, paulus, rw-r-r-0644, krzysztof.kozlowski+dt, pali, j.ne On Sat, Nov 19, 2022 at 10:30:31PM +1100, Ash Logan wrote: > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..23703b1052d0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings Everything is a binding, so drop 'bindings'. > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | Don't need '|' if no formatting. > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + > + compatible: > + const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..476a8ccda7a1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" Drop quotes. > + > +properties: > + compatible: > + const: nintendo,espresso-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@c000078 { > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + #interrupt-cells = <1>; > + interrupt-controller; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..d44ebe0d866c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the Wrap lines at 80 unless some advantage to 100. > + Nintendo Wii U. > + > +properties: > + compatible: > + const: nintendo,latte-gpu7 > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..a53971a11e89 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,50 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +allOf: > + - $ref: "/schemas/ata/ahci-common.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-ahci > + > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + sata@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..772afe0c298c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + const: nintendo,latte-dsp > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..4b71d6b9b14d > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,55 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@d800440 { > + compatible = "nintendo,latte-pic"; > + #interrupt-cells = <1>; > + interrupt-controller; > + reg = <0x0d800440 0x30>; > + > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..25d474fca679 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +allOf: > + - $ref: "/schemas/mmc/mmc-controller.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci Just 'sdhci' is not too useful. *All* SDHCI controllers have quirks. > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + mmc@d070000 { > + compatible = "nintendo,latte-sdhci", "sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6fdf93622fcc > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,31 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +allOf: > + - $ref: "/schemas/simple-bus.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte > + - const: simple-bus If truly 'simple', then you don't need 'nintendo,latte'. Otherwise, you need a custom 'select' schema to not select all cases of 'simple-bus'. > + > + one blank line > +required: > + - compatible > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > index c5f629c5bc61..9f69b5ab21ff 100644 > --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml > +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > @@ -69,6 +69,7 @@ properties: > - ibm,usb-ehci-440epx > - ibm,usb-ehci-460ex > - nintendo,hollywood-usb-ehci > + - nintendo,latte-ehci > - st,spear600-ehci > - const: usb-ehci > - enum: > -- > 2.38.1 > > ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2022-11-19 11:30 ` Ash Logan @ 2024-02-20 16:20 ` Christophe Leroy -1 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2024-02-20 16:20 UTC (permalink / raw) To: mpe Cc: linux-kernel, linuxppc-dev, paulus, j.ne, linkmauve, Ash Logan, pali, segher, robh+dt, rw-r-r-0644, devicetree, joel, krzysztof.kozlowski+dt, benh Michael, Le 19/11/2022 à 12:30, Ash Logan a écrit : > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> There's an issue at https://github.com/linuxppc/issues/issues/410 with kernel v6.4 as a target to merging thing, any plan ? It still applies without rebase (with git am -3). Christophe > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..23703b1052d0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + > + compatible: > + const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..476a8ccda7a1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,espresso-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@c000078 { > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + #interrupt-cells = <1>; > + interrupt-controller; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..d44ebe0d866c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + const: nintendo,latte-gpu7 > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..a53971a11e89 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,50 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +allOf: > + - $ref: "/schemas/ata/ahci-common.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-ahci > + > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + sata@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..772afe0c298c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + const: nintendo,latte-dsp > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..4b71d6b9b14d > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,55 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@d800440 { > + compatible = "nintendo,latte-pic"; > + #interrupt-cells = <1>; > + interrupt-controller; > + reg = <0x0d800440 0x30>; > + > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..25d474fca679 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +allOf: > + - $ref: "/schemas/mmc/mmc-controller.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + mmc@d070000 { > + compatible = "nintendo,latte-sdhci", "sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6fdf93622fcc > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,31 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +allOf: > + - $ref: "/schemas/simple-bus.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte > + - const: simple-bus > + > + > +required: > + - compatible > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > index c5f629c5bc61..9f69b5ab21ff 100644 > --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml > +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > @@ -69,6 +69,7 @@ properties: > - ibm,usb-ehci-440epx > - ibm,usb-ehci-460ex > - nintendo,hollywood-usb-ehci > + - nintendo,latte-ehci > - st,spear600-ehci > - const: usb-ehci > - enum: ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2024-02-20 16:20 ` Christophe Leroy 0 siblings, 0 replies; 170+ messages in thread From: Christophe Leroy @ 2024-02-20 16:20 UTC (permalink / raw) To: mpe Cc: devicetree, linkmauve, pali, linux-kernel, rw-r-r-0644, joel, robh+dt, paulus, Ash Logan, krzysztof.kozlowski+dt, linuxppc-dev, j.ne Michael, Le 19/11/2022 à 12:30, Ash Logan a écrit : > Adds schema for the various Wii U devicetree nodes used. > > Signed-off-by: Ash Logan <ash@heyquark.com> There's an issue at https://github.com/linuxppc/issues/issues/410 with kernel v6.4 as a target to merging thing, any plan ? It still applies without rebase (with git am -3). Christophe > --- > v3->v4: Rework to match expected style and conciceness. > > .../bindings/powerpc/nintendo/wiiu.yaml | 25 +++++++++ > .../powerpc/nintendo/wiiu/espresso-pic.yaml | 48 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/gpu7.yaml | 42 ++++++++++++++ > .../powerpc/nintendo/wiiu/latte-ahci.yaml | 50 +++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-dsp.yaml | 35 ++++++++++++ > .../powerpc/nintendo/wiiu/latte-pic.yaml | 55 +++++++++++++++++++ > .../powerpc/nintendo/wiiu/latte-sdhci.yaml | 46 ++++++++++++++++ > .../bindings/powerpc/nintendo/wiiu/latte.yaml | 31 +++++++++++ > .../devicetree/bindings/usb/generic-ehci.yaml | 1 + > 9 files changed, 333 insertions(+) > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > create mode 100644 Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > new file mode 100644 > index 000000000000..23703b1052d0 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu.yaml > @@ -0,0 +1,25 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U bindings > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U video game console binding. > + > +properties: > + $nodename: > + const: "/" > + > + compatible: > + const: nintendo,wiiu > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > new file mode 100644 > index 000000000000..476a8ccda7a1 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/espresso-pic.yaml > @@ -0,0 +1,48 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/espresso-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U "Espresso" interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Espresso" processor. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,espresso-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-32 in one cell > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@c000078 { > + compatible = "nintendo,espresso-pic"; > + reg = <0x0c000078 0x18>; > + #interrupt-cells = <1>; > + interrupt-controller; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > new file mode 100644 > index 000000000000..d44ebe0d866c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/gpu7.yaml > @@ -0,0 +1,42 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/gpu7.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte "GPU7" graphics processor > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + GPU7 graphics processor, also known as "GX2", found in the Latte multifunction chip of the > + Nintendo Wii U. > + > +properties: > + compatible: > + const: nintendo,latte-gpu7 > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + gpu@c200000 { > + compatible = "nintendo,latte-gpu7"; > + reg = <0x0c200000 0x80000>; > + interrupts = <2>; > + interrupt-parent = <&espresso_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > new file mode 100644 > index 000000000000..a53971a11e89 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-ahci.yaml > @@ -0,0 +1,50 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-ahci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte AHCI controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U AHCI SATA controller, as found in the Latte chip. > + > +allOf: > + - $ref: "/schemas/ata/ahci-common.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-ahci > + > + reg: > + items: > + - description: | > + HBA memory registers. Note that unlike the spec, space for only 6 ports exist, with 2 vendor > + registers afterwards, thus register space should be 0x408 long (0x100+0x80*6+0x8). > + > + interrupts: > + items: > + - description: Main HBA interrupt > + - description: Vendor debugging interrupt > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + sata@d160400 { > + compatible = "nintendo,latte-ahci"; > + reg = <0x0d160400 0x408>; > + > + interrupt-parent = <&latte_pic>; > + interrupts = <38>, <28>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > new file mode 100644 > index 000000000000..772afe0c298c > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-dsp.yaml > @@ -0,0 +1,35 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-dsp.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte DSP > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Nintendo Wii U digital signal processor, as found in the Latte chip. > + > +properties: > + compatible: > + const: nintendo,latte-dsp > + > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + dsp@c005000 { > + compatible = "nintendo,latte-dsp"; > + reg = <0x0c005000 0x200>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > new file mode 100644 > index 000000000000..4b71d6b9b14d > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-pic.yaml > @@ -0,0 +1,55 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-pic.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte interrupt controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Interrupt controller found on the Nintendo Wii U for the "Latte" devices. > + > +allOf: > + - $ref: "/schemas/interrupt-controller.yaml#" > + > +properties: > + compatible: > + const: nintendo,latte-pic > + > + '#interrupt-cells': > + # Interrupt numbers 0-64 in one cell. > + const: 1 > + > + interrupt-controller: true > + > + reg: > + maxItems: 1 > + > + interrupts: > + items: > + - description: Cascade interrupt for Espresso PIC > + > +required: > + - compatible > + - '#interrupt-cells' > + - interrupt-controller > + - reg > + > +additionalProperties: false > + > +examples: > + - | > + interrupt-controller@d800440 { > + compatible = "nintendo,latte-pic"; > + #interrupt-cells = <1>; > + interrupt-controller; > + reg = <0x0d800440 0x30>; > + > + interrupt-parent = <&espresso_pic>; > + interrupts = <24>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > new file mode 100644 > index 000000000000..25d474fca679 > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte-sdhci.yaml > @@ -0,0 +1,46 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte-sdhci.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Nintendo Wii U Latte SD Host controller > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + SDHCI hosts found on the Nintendo Wii U's Latte SoC for SD cards and SDIO devices. > + > +allOf: > + - $ref: "/schemas/mmc/mmc-controller.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte-sdhci > + - const: sdhci > + > + reg: > + maxItems: 1 > + > + interrupts: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + - interrupts > + > +additionalProperties: false > + > +examples: > + - | > + mmc@d070000 { > + compatible = "nintendo,latte-sdhci", "sdhci"; > + reg = <0x0d070000 0x200>; > + interrupts = <7>; > + interrupt-parent = <&latte_pic>; > + }; > +... > diff --git a/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > new file mode 100644 > index 000000000000..6fdf93622fcc > --- /dev/null > +++ b/Documentation/devicetree/bindings/powerpc/nintendo/wiiu/latte.yaml > @@ -0,0 +1,31 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/powerpc/nintendo/wiiu/latte.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Latte system bus > + > +maintainers: > + - Ash Logan <ash@heyquark.com> > + - Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> > + > +description: | > + Latte multi-function SoC, containing many of the devices found on the Nintendo Wii U. > + > +allOf: > + - $ref: "/schemas/simple-bus.yaml#" > + > +properties: > + compatible: > + items: > + - const: nintendo,latte > + - const: simple-bus > + > + > +required: > + - compatible > + > +additionalProperties: true > + > +... > diff --git a/Documentation/devicetree/bindings/usb/generic-ehci.yaml b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > index c5f629c5bc61..9f69b5ab21ff 100644 > --- a/Documentation/devicetree/bindings/usb/generic-ehci.yaml > +++ b/Documentation/devicetree/bindings/usb/generic-ehci.yaml > @@ -69,6 +69,7 @@ properties: > - ibm,usb-ehci-440epx > - ibm,usb-ehci-460ex > - nintendo,hollywood-usb-ehci > + - nintendo,latte-ehci > - st,spear600-ehci > - const: usb-ehci > - enum: ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree 2024-02-20 16:20 ` Christophe Leroy @ 2024-02-20 16:24 ` Krzysztof Kozlowski -1 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2024-02-20 16:24 UTC (permalink / raw) To: Christophe Leroy, mpe Cc: linux-kernel, linuxppc-dev, paulus, j.ne, linkmauve, Ash Logan, pali, segher, robh+dt, rw-r-r-0644, devicetree, joel, krzysztof.kozlowski+dt, benh On 20/02/2024 17:20, Christophe Leroy wrote: > Michael, > > Le 19/11/2022 à 12:30, Ash Logan a écrit : >> Adds schema for the various Wii U devicetree nodes used. >> >> Signed-off-by: Ash Logan <ash@heyquark.com> > > There's an issue at https://github.com/linuxppc/issues/issues/410 with > kernel v6.4 as a target to merging thing, any plan ? > > It still applies without rebase (with git am -3). No, it should not be merged, because it was never tested and fails in several places. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* Re: [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree @ 2024-02-20 16:24 ` Krzysztof Kozlowski 0 siblings, 0 replies; 170+ messages in thread From: Krzysztof Kozlowski @ 2024-02-20 16:24 UTC (permalink / raw) To: Christophe Leroy, mpe Cc: devicetree, linkmauve, pali, linux-kernel, rw-r-r-0644, joel, robh+dt, paulus, Ash Logan, krzysztof.kozlowski+dt, linuxppc-dev, j.ne On 20/02/2024 17:20, Christophe Leroy wrote: > Michael, > > Le 19/11/2022 à 12:30, Ash Logan a écrit : >> Adds schema for the various Wii U devicetree nodes used. >> >> Signed-off-by: Ash Logan <ash@heyquark.com> > > There's an issue at https://github.com/linuxppc/issues/issues/410 with > kernel v6.4 as a target to merging thing, any plan ? > > It still applies without rebase (with git am -3). No, it should not be merged, because it was never tested and fails in several places. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 170+ messages in thread
* [PATCH v4 02/11] powerpc: wiiu: device tree 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. v2->v3: Re-added address-cells accidentally removed in v2. Marked latte as a simple-bus, since it is. v3->v4: Updated to match devicetree bindings. Model also changed to wup-101 in preparation for potentially different devices in future (cat-dev etc.) Chosen node removed. arch/powerpc/boot/dts/wiiu.dts | 319 +++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..ee25b0855374 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wup-101"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + memory@0 { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + soc { + compatible = "nintendo,latte", "simple-bus"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + #address-cells = <1>; + #size-cells = <1>; + + latte_gpu: gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: interrupt-controller@c000078 { + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + #interrupt-cells = <1>; + interrupt-controller; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: mmc@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: mmc@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: interrupt-controller@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + sck-gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio 12 GPIO_ACTIVE_HIGH>; + miso-gpios = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + key-power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 02/11] powerpc: wiiu: device tree @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add a device tree source file for the Nintendo Wii U video game console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v1->v2: Style and formatting changes suggested by Rob Herring. License remains GPL-2.0 as the other powerpc dtses are the same, happy to change if there is a different preferred default. v2->v3: Re-added address-cells accidentally removed in v2. Marked latte as a simple-bus, since it is. v3->v4: Updated to match devicetree bindings. Model also changed to wup-101 in preparation for potentially different devices in future (cat-dev etc.) Chosen node removed. arch/powerpc/boot/dts/wiiu.dts | 319 +++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 arch/powerpc/boot/dts/wiiu.dts diff --git a/arch/powerpc/boot/dts/wiiu.dts b/arch/powerpc/boot/dts/wiiu.dts new file mode 100644 index 000000000000..ee25b0855374 --- /dev/null +++ b/arch/powerpc/boot/dts/wiiu.dts @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Nintendo Wii U Device Tree Source + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +/dts-v1/; +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> + +/ { + model = "nintendo,wup-101"; + compatible = "nintendo,wiiu"; + + #address-cells = <1>; + #size-cells = <1>; + + memory@0 { + device_type = "memory"; + reg = <0x00000000 0x02000000 /* MEM1 - 32MiB */ + 0x08000000 0x00300000 /* MEM0 - 3MiB */ + 0x10000000 0x80000000>; /* MEM2 - 2GiB */ + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + /* TODO: Add SMP */ + PowerPC,espresso@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <1243125000>; /* 1.243125GHz */ + bus-frequency = <248625000>; /* 248.625MHz core-to-bus 5x */ + timebase-frequency = <62156250>; /* 1/4 of the bus clock */ + i-cache-size = <32768>; /* 32K icache */ + i-cache-line-size = <32>; + i-cache-block-size = <32>; + i-cache-sets = <128>; + d-cache-size = <32768>; /* 32K dcache */ + d-cache-line-size = <32>; + d-cache-block-size = <32>; + d-cache-sets = <128>; + next-level-cache = <&L2_0>; + L2_0:l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-unified; + cache-size = <0x80000>; /* 512KB L2 */ + cache-line-size = <64>; + cache-block-size = <32>; + cache-sets = <2048>; + }; + }; + }; + + soc { + compatible = "nintendo,latte", "simple-bus"; + ranges = <0x0c000000 0x0c000000 0x00400000 /* Espresso-only registers */ + 0x0d000000 0x0d000000 0x00200000 /* Latte AHB deivces */ + 0x0d800000 0x0d800000 0x00800000>; /* Latte SoC registers */ + + #address-cells = <1>; + #size-cells = <1>; + + latte_gpu: gpu@c200000 { + compatible = "nintendo,latte-gpu7"; + reg = <0x0c200000 0x80000>; + interrupts = <2>; + interrupt-parent = <&espresso_pic>; + }; + + espresso_pic: interrupt-controller@c000078 { + compatible = "nintendo,espresso-pic"; + reg = <0x0c000078 0x18>; + #interrupt-cells = <1>; + interrupt-controller; + }; + + latte_dsp: dsp@c005000 { + compatible = "nintendo,latte-dsp"; + reg = <0x0c005000 0x200>; + }; + + ehci_0: usb@d040000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d040000 0x100>; + interrupts = <4>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_0: usb@d050000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d050000 0x100>; + interrupts = <5>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_0_1: usb@d060000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d060000 0x100>; + interrupts = <6>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ehci_1: usb@d120000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d120000 0x100>; + interrupts = <16>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_1_0: usb@d130000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d130000 0x100>; + interrupts = <35>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ehci_2: usb@d140000 { + compatible = "nintendo,latte-ehci", "usb-ehci"; + reg = <0x0d140000 0x100>; + interrupts = <36>; + interrupt-parent = <&latte_pic>; + big-endian-regs; + }; + + ohci_2_0: usb@d150000 { + compatible = "nintendo,latte-ohci"; + reg = <0x0d150000 0x100>; + interrupts = <37>; + interrupt-parent = <&latte_pic>; + + big-endian-regs; + }; + + sdcard_0: mmc@d070000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d070000 0x200>; + interrupts = <7>; + interrupt-parent = <&latte_pic>; + }; + + wifi_0: mmc@d080000 { + compatible = "nintendo,latte-sdhci","sdhci"; + reg = <0x0d080000 0x200>; + interrupts = <8>; + interrupt-parent = <&latte_pic>; + }; + + legacy_ipc: ipc@d800000 { + compatible = "nintendo,latte-ipc", "nintendo,hollywood-ipc"; + reg = <0x0d800000 0x10>; + interrupts = <30 31>; + interrupt-parent = <&latte_pic>; + }; + + latte_otp: otp@d8001ec { + compatible = "nintendo,latte-otp"; + reg = <0x0d8001ec 0x8>; + }; + + sata@d160400 { + compatible = "nintendo,latte-ahci"; + reg = <0x0d160400 0x808>; + + interrupt-parent = <&latte_pic>; + interrupts = <38 28>; + }; + + latte_pic: interrupt-controller@d800440 { + #interrupt-cells = <1>; + interrupt-controller; + + compatible = "nintendo,latte-pic"; + reg = <0x0d800440 0x30>; + interrupt-parent = <&espresso_pic>; + interrupts = <24>; + }; + + gpio: gpio@d8000c0 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d8000c0 0x40>; + gpio-controller; + /* TODO: There are actually 31 AHBALL GPIOs */ + ngpios = <24>; + + gpio-line-names = + "POWER", "DWIFI", "FAN", "DC_DC", + "", "Esp10WorkAround", "", "", + "PADPD", "", "EEP_CS", "EEP_CLK", + "EEP_MOSI", "EEP_MISO", "AVE_SCL", "AVE_SDA", + "DEBUG0", "DEBUG1", "DEBUG2", "DEBUG3", + "DEBUG4", "DEBUG5", "DEBUG6", "DEBUG7"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + + gpio2: gpio@d800520 { + #gpio-cells = <2>; + compatible = "nintendo,latte-gpio", "nintendo,hollywood-gpio"; + + reg = <0x0d800520 0x40>; + gpio-controller; + ngpios = <7>; + + gpio-line-names = + "FANSPEED", "SMC_SCL", "SMC_SDA", "DC_DC2", + "AVE_INT", "", "AVE_RESET"; + + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <10>; + interrupt-parent = <&latte_pic>; + }; + }; + + spi_gpio: spi { + compatible = "spi-gpio"; + #address-cells = <1>; + #size-cells = <0>; + + cs-gpios = <&gpio 10 GPIO_ACTIVE_HIGH>; + sck-gpios = <&gpio 11 GPIO_ACTIVE_HIGH>; + mosi-gpios = <&gpio 12 GPIO_ACTIVE_HIGH>; + miso-gpios = <&gpio 13 GPIO_ACTIVE_HIGH>; + num-chipselects = <1>; + + eeprom@0 { + compatible = "atmel,at93c66"; + reg = <0>; + spi-max-frequency = <1000000>; + spi-cs-high; + /* TODO: wiiubrew says this is 16-bit, but I only get the correct + * values in 8-bit... + */ + data-size = <8>; + read-only; + + #address-cells = <1>; + #size-cells = <1>; + + /* https://wiiubrew.org/wiki/Hardware/SEEPROM */ + rng_seed: rng@12 { reg = <0x012 8>; }; + ppc_pvr: pvr@20 { reg = <0x020 4>; }; + seeprom_ver_str: sver-str@24 { reg = <0x024 6>; }; + seeprom_ver: sver@2a { reg = <0x02A 2>; }; + otp_ver: over@2c { reg = <0x02C 2>; }; + otp_rev: orev@2e { reg = <0x02E 2>; }; + otp_ver_str: over-str@30 { reg = <0x030 8>; }; + + bc_crc: bc-crc@38 { reg = <0x038 4>; }; + bc_sz: bc-sz@3c { reg = <0x03C 2>; }; + bc_ver: bc-ver@3e { reg = <0x03E 2>; }; + bc_boardtype: boardtype@42 { reg = <0x042 2>; }; + bc_boardrev: boardrev@44 { reg = <0x044 2>; }; + bc_bootsource: bootsource@46 { reg = <0x046 2>; }; + bc_ddr3size: ddr3size@48 { reg = <0x048 2>; }; + bc_ddr3speed: ddr3speed@4a { reg = <0x04A 2>; }; + bc_ppcclockmul: ppcclockmul@4c { reg = <0x04C 2>; }; + bc_iopclockmul: iopclockmul@46 { reg = <0x04E 2>; }; + bc_video1080p: video1080p@50 { reg = <0x050 2>; }; + bc_ddr3vendor: ddr3vendor@52 { reg = <0x052 2>; }; + bc_movpassivereset: movpassivereset@54 { reg = <0x054 2>; }; + bc_syspllspd: syspllspd@56 { reg = <0x056 2>; }; + bc_satadevice: satadevice@58 { reg = <0x058 2>; }; + bc_consoletype: consoletype@5a { reg = <0x05A 2>; }; + bc_deviceprescence: deviceprescence@5c { reg = <0x05C 2>; }; + + drive_key: drvkey@80 { reg = <0x080 16>; }; + factory_key: fackey@90 { reg = <0x090 16>; }; + shdd_key: shddkey@a0 { reg = <0x0A0 16>; }; + usb_key_seed: usbkeyseed@b0 { reg = <0x0B0 16>; }; + drive_key_flag: drvkeyf@c0 { reg = <0x0C0 2>; }; + usb_key_flag: udbkeyf@c2 { reg = <0x0C2 2>; }; + shdd_key_flag: shddkeyf@c4 { reg = <0x0C4 2>; }; + + sysprod_version: sp_ver@140 { reg = <0x140 4>; }; + sysprod_eeprom_version: sp_ee_ver@144 { reg = <0x144 4>; }; + sysprod_product_area: sp_parea@148 { reg = <0x148 4>; }; + sysprod_game_region: sp_region@14c { reg = <0x14C 4>; }; + sysprod_ntsc_pal: sp_ntscpal@150 { reg = <0x150 4>; }; + sysprod_5ghz_country: sp_5ghz_c@154 { reg = <0x154 2>; }; + sysprod_5ghz_country_rev: sp_5ghz_crev@156 { reg = <0x156 2>; }; + sysprod_code: sp_code@158 { reg = <0x158 8>; }; + sysprod_serial: sp_serial@160 { reg = <0x160 16>; }; + sysprod_model: sp_model@170 { reg = <0x170 16>; }; + + prod_year: pyear@188 { reg = <0x188 2>; }; + prod_date: pdate@18a { reg = <0x18A 2>; }; + prod_time: ptime@18c { reg = <0x18C 2>; }; + + boot_params: boot_params@1c0 { reg = <0x1C0 48>; }; + }; + }; + + /* TODO make this gpio-keyed once hollywood-gpio supports interrupts */ + gpio-keys { + poll-interval = <50>; + compatible = "gpio-keys-polled"; + + key-power { + label = "Power Button"; + gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; + linux,code = <KEY_POWER>; + }; + }; +}; -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 03/11] powerpc: wiiu: bootwrapper support 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index d32d95aea5d6..42f622945b4a 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -162,6 +162,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -360,6 +361,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 5bdd4dd20bbb..25fd60770659 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 03/11] powerpc: wiiu: bootwrapper support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the Nintendo Wii U game console to the powerpc bootwrapper. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- arch/powerpc/boot/Makefile | 4 ++ arch/powerpc/boot/wiiu-head.S | 103 ++++++++++++++++++++++++++++++++++ arch/powerpc/boot/wiiu.c | 73 ++++++++++++++++++++++++ arch/powerpc/boot/wrapper | 4 ++ 4 files changed, 184 insertions(+) create mode 100644 arch/powerpc/boot/wiiu-head.S create mode 100644 arch/powerpc/boot/wiiu.c diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index d32d95aea5d6..42f622945b4a 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -162,6 +162,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \ gamecube-head.S gamecube.c \ wii-head.S wii.c holly.c \ fixed-head.S mvme5100.c +src-plat-$(CONFIG_WIIU) += wiiu-head.S wiiu.c src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c @@ -360,6 +361,9 @@ image-$(CONFIG_GAMECUBE) += dtbImage.gamecube image-$(CONFIG_WII) += dtbImage.wii image-$(CONFIG_MVME5100) += dtbImage.mvme5100 +# Board port in arch/powerpc/platform/wiiu/Kconfig +image-$(CONFIG_WIIU) += dtbImage.wiiu + # Board port in arch/powerpc/platform/amigaone/Kconfig image-$(CONFIG_AMIGAONE) += cuImage.amigaone diff --git a/arch/powerpc/boot/wiiu-head.S b/arch/powerpc/boot/wiiu-head.S new file mode 100644 index 000000000000..8586e2e992d5 --- /dev/null +++ b/arch/powerpc/boot/wiiu-head.S @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Entrypoint head asm + * This code expects to be called directly after the Espresso BootROM, which implies certain MSR + * states. + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include "ppc_asm.h" + +.text +.global _zimage_start +_zimage_start: + /* Clear out all BATs. MMU is already off. */ + li r8, 0 + + mtspr 0x210, r8 /* IBAT0U */ + mtspr 0x212, r8 /* IBAT1U */ + mtspr 0x214, r8 /* IBAT2U */ + mtspr 0x216, r8 /* IBAT3U */ + mtspr 0x218, r8 /* DBAT0U */ + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x21c, r8 /* DBAT2U */ + mtspr 0x21e, r8 /* DBAT3U */ + + mtspr 0x230, r8 /* IBAT4U */ + mtspr 0x232, r8 /* IBAT5U */ + mtspr 0x234, r8 /* IBAT6U */ + mtspr 0x236, r8 /* IBAT7U */ + mtspr 0x238, r8 /* DBAT4U */ + mtspr 0x23a, r8 /* DBAT5U */ + mtspr 0x23c, r8 /* DBAT6U */ + mtspr 0x23e, r8 /* DBAT7U */ + + /* MEM1 */ + /* 32MB, starting at 0x00000000... */ + li r8, 0x000003ff@l + mtspr 0x21a, r8 /* DBAT1U */ + mtspr 0x212, r8 /* IBAT1U */ + + /* mapped into phys 0x00000000; read-write; normal caching. */ + li r8, 0x00000002@l + mtspr 0x21b, r8 /* DBAT1L */ + mtspr 0x213, r8 /* IBAT1L */ + + /* Latte MMIO area */ + /* 64MB, starting at 0x0d800000... */ + lis r8, 0x0d8007ff@h + ori r8, r8,0x0d800007ff@l + mtspr 0x21c, r8 /* DBAT2U */ + + /* mapped into phys 0x0d800000; read-write; writethrough/nocache/guard*/ + lis r8, 0x0d80006A@h + ori r8, r8,0x0d80006A@l + mtspr 0x21d, r8 /* DBAT2L */ + + /* Bootloader comms area (actually 0x89200000) */ + /* 128MiB, starting at 0x88000000... */ + lis r8, 0x88000fff@h + ori r8, r8, 0x88000fff@l + mtspr 0x21e, r8 /* DBAT3U */ + + /* mapped into phys 0x88000000; read-write; normal caching. */ + lis r8, 0x88000002@h + ori r8, r8, 0x88000002@l + mtspr 0x21f, r8 /* DBAT3L */ + + /* Turn on BAT 4 through 7, configure CPU */ + mfspr r8, 0x3f3 /* HID4 */ + oris r8, r8, 0x3200 /* L2FM: 64-byte fetch, BPD: max depth is 4, SBE */ + mtspr 0x3f3, r8 + + /* Turn on and invalidate caches */ + mfspr r8, 0x3f0 /* HID0 */ + /* HID0_ICE | HID0_ICFI | HID0_DCE | HID0_DCFI */ + ori r8, r8, (1 << 15) | (1 << 11) | (1 << 14) | (1 << 10) + mtspr 0x3f0, r8 + isync + + li r3, 0 + li r4, 0 + li r5, 0 + + bl get_lr +get_lr: + mflr r8 + /* Get absolute address of done */ + addi r8, r8, done - get_lr + + /* Set up MSR */ + /* MSR_DR | MSR_IR | MSR_FP */ + /* Data/instruction MMUs, FPU because why not */ + ori r9, r3, (1 << 4) | (1 << 5) | (1 << 13) + + /* Apply our new MSR, starting execution at "done" */ + mtsrr0 r8 + mtsrr1 r9 + sync + rfi +done: + b _zimage_start_lib diff --git a/arch/powerpc/boot/wiiu.c b/arch/powerpc/boot/wiiu.c new file mode 100644 index 000000000000..fe88eb2c42ae --- /dev/null +++ b/arch/powerpc/boot/wiiu.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Platform support and IPC debug console to linux-loader (on Starbuck) + * + * Nintendo Wii U bootwrapper support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#include <stddef.h> +#include "string.h" +#include "stdio.h" +#include "types.h" +#include "io.h" +#include "ops.h" + +BSS_STACK(8192); + +// Volatile is used here since the io.h routines require it +#define LT_IPC_PPCMSG ((volatile u32 *)0x0d800000) +#define LT_IPC_PPCCTRL ((volatile u32 *)0x0d800004) +#define LT_IPC_PPCCTRL_X1 0x1 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +static void wiiu_ipc_sendmsg(int msg) +{ + out_be32(LT_IPC_PPCMSG, msg); + out_be32(LT_IPC_PPCCTRL, LT_IPC_PPCCTRL_X1); + while (in_be32(LT_IPC_PPCCTRL) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Send logging string out over IPC to linux-loader for early printing. + * Packs 3 chars at a time where possible. + */ +static void wiiu_write_ipc(const char *buf, int len) +{ + int i = 0; + + for (i = 0; i + 2 < len; i += 3) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i + 0] << 16) | + (buf[i + 1] << 8) | buf[i + 2]; + + wiiu_ipc_sendmsg(msg); + } + + if (i < len) { + for (; i < len; i++) { + int msg = WIIU_LOADER_CMD_PRINT | (buf[i] << 16); + + wiiu_ipc_sendmsg(msg); + } + } +} + +/* + * Note 32MiB heap - not ideal but seems fine for the bootwrapper + */ +void platform_init(unsigned int r3, unsigned int r4, unsigned int r5) +{ + u32 heapsize; + + console_ops.write = wiiu_write_ipc; + printf("wiiu: bootwrapper ok\n"); + + heapsize = 32 * 1024 * 1024 - (u32)_end; + simple_alloc_init(_end, heapsize, 32, 64); + printf("wiiu: heap ok\n"); + + fdt_init(_dtb_start); + printf("wiiu: dtb ok\n"); +} diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 5bdd4dd20bbb..25fd60770659 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper @@ -344,6 +344,10 @@ gamecube|wii) link_address='0x600000' platformo="$object/$platform-head.o $object/$platform.o" ;; +wiiu) + link_address='0x600000' + platformo="$object/wiiu-head.o $object/$platform.o" + ;; microwatt) link_address='0x500000' platformo="$object/fixed-head.o $object/$platform.o" -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 04/11] powerpc: wiiu: introduce wiiu platform 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Add help text for CONFIG_WIIU. arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 8 ++++++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 11 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..3834834c6bd7 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 + help + Select WIIU if configuring for the Nintendo Wii U. + More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 04/11] powerpc: wiiu: introduce wiiu platform @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds empty platforms/wiiu for Nintendo Wii U console Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Add help text for CONFIG_WIIU. arch/powerpc/platforms/Kconfig | 1 + arch/powerpc/platforms/Makefile | 1 + arch/powerpc/platforms/wiiu/Kconfig | 8 ++++++++ arch/powerpc/platforms/wiiu/Makefile | 1 + 4 files changed, 11 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/Kconfig create mode 100644 arch/powerpc/platforms/wiiu/Makefile diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index d41dad227de8..c4a9c3c0b409 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig @@ -22,6 +22,7 @@ source "arch/powerpc/platforms/40x/Kconfig" source "arch/powerpc/platforms/amigaone/Kconfig" source "arch/powerpc/platforms/book3s/Kconfig" source "arch/powerpc/platforms/microwatt/Kconfig" +source "arch/powerpc/platforms/wiiu/Kconfig" config KVM_GUEST bool "KVM Guest support" diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index 94470fb27c99..944ddd938711 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/ obj-$(CONFIG_AMIGAONE) += amigaone/ obj-$(CONFIG_PPC_BOOK3S) += book3s/ obj-$(CONFIG_PPC_MICROWATT) += microwatt/ +obj-$(CONFIG_WIIU) += wiiu/ diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig new file mode 100644 index 000000000000..3834834c6bd7 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 + +config WIIU + bool "Nintendo Wii U" + depends on PPC_BOOK3S_32 + help + Select WIIU if configuring for the Nintendo Wii U. + More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile new file mode 100644 index 000000000000..f66554cd5c45 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -0,0 +1 @@ +# SPDX-License-Identifier: GPL-2.0 -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 05/11] powerpc: wiiu: declare as non-coherent 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 0c4eed9aea80..ae1ee77705ea 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -522,7 +522,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 05/11] powerpc: wiiu: declare as non-coherent @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne The Nintendo Wii U requires explicit cache handling when interfacing with DMA devices. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/platforms/Kconfig.cputype | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 0c4eed9aea80..ae1ee77705ea 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -522,7 +522,7 @@ config NR_CPUS config NOT_COHERENT_CACHE bool depends on 4xx || PPC_8xx || PPC_MPC512x || \ - GAMECUBE_COMMON || AMIGAONE + GAMECUBE_COMMON || AMIGAONE || WIIU select ARCH_HAS_DMA_PREP_COHERENT select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_HAS_SYNC_DMA_FOR_CPU -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 06/11] powerpc: wiiu: udbg support for latteipc 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Fix a missing declaration issue by including latteipc_udbg.h. v3->v4: Add missing of.h includes. arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 ++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 126 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 201 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 6aaf8dc60610..b87343b0d1b4 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b1f094728b35..ef1367f146fd 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ void __init udbg_init_ps3gelic(void); void __init udbg_init_debug_opal_raw(void); void __init udbg_init_debug_opal_hvsi(void); void __init udbg_init_debug_16550(void); +void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 519b60695167..5b3b1c971feb 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index 92b3fc258d11..b2ec88ef3cc1 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -69,6 +69,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_hvsi(); #elif defined(CONFIG_PPC_EARLY_DEBUG_16550) udbg_init_debug_16550(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 3834834c6bd7..8dfd6ac8774d 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -6,3 +6,16 @@ config WIIU help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..9f46a0d19e81 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#include "udbg_latteipc.h" + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 06/11] powerpc: wiiu: udbg support for latteipc @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for using the Latte chipset IPC for udbg on the Nintendo Wii U console. These messages can then be received by a special firmware running on the "Starbuck" coprocessor. Signed-off-by: Ash Logan <ash@heyquark.com> --- v2->v3: Fix a missing declaration issue by including latteipc_udbg.h. v3->v4: Add missing of.h includes. arch/powerpc/Kconfig.debug | 9 ++ arch/powerpc/include/asm/udbg.h | 1 + arch/powerpc/kernel/head_book3s_32.S | 20 ++++ arch/powerpc/kernel/udbg.c | 3 + arch/powerpc/platforms/wiiu/Kconfig | 13 ++ arch/powerpc/platforms/wiiu/Makefile | 2 + arch/powerpc/platforms/wiiu/udbg_latteipc.c | 126 ++++++++++++++++++++ arch/powerpc/platforms/wiiu/udbg_latteipc.h | 27 +++++ 8 files changed, 201 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.c create mode 100644 arch/powerpc/platforms/wiiu/udbg_latteipc.h diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug index 6aaf8dc60610..b87343b0d1b4 100644 --- a/arch/powerpc/Kconfig.debug +++ b/arch/powerpc/Kconfig.debug @@ -254,6 +254,15 @@ config PPC_EARLY_DEBUG_USBGECKO Select this to enable early debugging for Nintendo GameCube/Wii consoles via an external USB Gecko adapter. +config PPC_EARLY_DEBUG_LATTEIPC + bool "Early debugging through Latte chipset IPC" + depends on WIIU + select LATTEIPC_UDBG + help + Select this to enable early debugging for Nintendo Wii U consoles via + chipset IPC to the security coprocessor. This assumes a firmware is + running on the coprocessor to receive messages. + config PPC_EARLY_DEBUG_PS3GELIC bool "Early debugging through the PS3 Ethernet port" depends on PPC_PS3 diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h index b1f094728b35..ef1367f146fd 100644 --- a/arch/powerpc/include/asm/udbg.h +++ b/arch/powerpc/include/asm/udbg.h @@ -53,6 +53,7 @@ void __init udbg_init_ps3gelic(void); void __init udbg_init_debug_opal_raw(void); void __init udbg_init_debug_opal_hvsi(void); void __init udbg_init_debug_16550(void); +void __init udbg_init_latteipc(void); #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_UDBG_H */ diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S index 519b60695167..5b3b1c971feb 100644 --- a/arch/powerpc/kernel/head_book3s_32.S +++ b/arch/powerpc/kernel/head_book3s_32.S @@ -164,6 +164,9 @@ __after_mmu_off: #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO bl setup_usbgecko_bat #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + bl setup_latteipc_bat +#endif /* * Call setup_cpu for CPU 0 and initialize 6xx Idle @@ -1201,4 +1204,21 @@ setup_usbgecko_bat: blr #endif +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC +setup_latteipc_bat: + /* prepare a BAT for early io */ + lis r8, 0x0d80 + + /* + * 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, 0x2 /* 128K, Vs=1, Vp=0 */ + mtspr SPRN_DBAT1L, r8 + mtspr SPRN_DBAT1U, r11 + blr +#endif + .data diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index 92b3fc258d11..b2ec88ef3cc1 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c @@ -69,6 +69,9 @@ void __init udbg_early_init(void) udbg_init_debug_opal_hvsi(); #elif defined(CONFIG_PPC_EARLY_DEBUG_16550) udbg_init_debug_16550(); +#elif defined(CONFIG_PPC_EARLY_DEBUG_LATTEIPC) + /* For use on Nintendo Wii U */ + udbg_init_latteipc(); #endif #ifdef CONFIG_PPC_EARLY_DEBUG diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 3834834c6bd7..8dfd6ac8774d 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -6,3 +6,16 @@ config WIIU help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> + +config LATTEIPC_UDBG + bool "Chipset IPC udbg console for the Nintendo Wii U" + depends on WIIU + help + If you say yes to this option, support will be included for the + Wii U's chipset IPC as a udbg console. + These IPC messages can be received by a firmware running on the + console's "Starbuck" security coprocessor. + + This driver bypasses the IPC layer completely. + + If in doubt, say N here. diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index f66554cd5c45..b1e0e1307f6e 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.c b/arch/powerpc/platforms/wiiu/udbg_latteipc.c new file mode 100644 index 000000000000..9f46a0d19e81 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.c + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#include <mm/mmu_decl.h> + +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <asm/prom.h> +#include <asm/udbg.h> +#include <asm/fixmap.h> + +#include "udbg_latteipc.h" + +#define LT_MMIO_BASE ((phys_addr_t)0x0d800000) +#define LT_IPC_PPCMSG 0x00 +#define LT_IPC_PPCCTRL 0x04 +#define LT_IPC_PPCCTRL_X1 0x01 + +#define WIIU_LOADER_CMD_PRINT 0x01000000 + +void __iomem *latteipc_io_base; + +/* + * Transmits a character. + * Sends over IPC to linux-loader for printing. + */ +static void latteipc_udbg_putc(char c) +{ + void __iomem *ppcmsg_reg = latteipc_io_base + LT_IPC_PPCMSG; + void __iomem *ppcctrl_reg = latteipc_io_base + LT_IPC_PPCCTRL; + + out_be32(ppcmsg_reg, WIIU_LOADER_CMD_PRINT | (c << 16)); + out_be32(ppcctrl_reg, LT_IPC_PPCCTRL_X1); + + while (in_be32(ppcctrl_reg) & LT_IPC_PPCCTRL_X1) + barrier(); +} + +/* + * Retrieves and prepares the virtual address needed to access the hardware. + */ +static void __iomem *latteipc_udbg_setup_ipc_io_base(struct device_node *np) +{ + void __iomem *ipc_io_base = NULL; + phys_addr_t paddr; + const unsigned int *reg; + + reg = of_get_property(np, "reg", NULL); + if (reg) { + paddr = of_translate_address(np, reg); + if (paddr) + ipc_io_base = ioremap(paddr, reg[1]); + } + return ipc_io_base; +} + +/* + * Latte IPC udbg support initialization. + */ +void __init latteipc_udbg_init(void) +{ + struct device_node *np; + void __iomem *ipc_io_base; + + if (latteipc_io_base) + udbg_printf("%s: early -> final\n", __func__); + + np = of_find_compatible_node(NULL, NULL, "nintendo,latte-ipc"); + if (!np) { + udbg_printf("%s: IPC node not found\n", __func__); + goto out; + } + + ipc_io_base = latteipc_udbg_setup_ipc_io_base(np); + if (!ipc_io_base) { + udbg_printf("%s: failed to setup IPC io base\n", __func__); + goto done; + } + + udbg_putc = latteipc_udbg_putc; + udbg_printf("latteipc_udbg: ready\n"); + +done: + of_node_put(np); +out: + return; +} + +#ifdef CONFIG_PPC_EARLY_DEBUG_LATTEIPC + +void __init udbg_init_latteipc(void) +{ + /* + * At this point we have a BAT already setup that enables I/O + * to the IPC hardware. + * + * The BAT uses a virtual address range reserved at the fixmap. + * This must match the virtual address configured in + * head_32.S:setup_latteipc_bat(). + */ + latteipc_io_base = (void __iomem *)__fix_to_virt(FIX_EARLY_DEBUG_BASE); + + /* Assume a firmware is present, add hooks */ + udbg_putc = latteipc_udbg_putc; + + /* + * 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)latteipc_io_base, LT_MMIO_BASE, 128 * 1024, + PAGE_KERNEL_NCG); +} + +#endif /* CONFIG_PPC_EARLY_DEBUG_LATTEIPC */ diff --git a/arch/powerpc/platforms/wiiu/udbg_latteipc.h b/arch/powerpc/platforms/wiiu/udbg_latteipc.h new file mode 100644 index 000000000000..ca6d34e49158 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/udbg_latteipc.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U udbg support (to Starbuck coprocessor, via chipset IPC) + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on arch/powerpc/platforms/embedded6xx/udbgecko_udbg.h + * Copyright (C) 2008-2009 The GameCube Linux Team + * Copyright (C) 2008-2009 Albert Herranz + */ + +#ifndef __LATTEIPC_UDBG_H +#define __LATTEIPC_UDBG_H + +#ifdef CONFIG_LATTEIPC_UDBG + +void __init latteipc_udbg_init(void); + +#else + +static inline void __init latteipc_udbg_init(void) +{ +} + +#endif /* CONFIG_LATTEIPC_UDBG */ + +#endif /* __LATTEIPC_UDBG_H */ -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 07/11] powerpc: wiiu: espresso interrupt controller support 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 07/11] powerpc: wiiu: espresso interrupt controller support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the "Espresso" interrupt controller in the Nintendo Wii U. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- arch/powerpc/platforms/wiiu/Makefile | 1 + arch/powerpc/platforms/wiiu/espresso-pic.c | 183 +++++++++++++++++++++ arch/powerpc/platforms/wiiu/espresso-pic.h | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.c create mode 100644 arch/powerpc/platforms/wiiu/espresso-pic.h diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index b1e0e1307f6e..aabf4b43e806 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_WIIU) += espresso-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.c b/arch/powerpc/platforms/wiiu/espresso-pic.c new file mode 100644 index 000000000000..1aa5d88002d5 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.c @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on flipper-pic.c + * Copyright (C) 2004-2009 The GameCube Linux Team + * Copyright (C) 2007-2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "espresso-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "espresso-pic.h" + +static DEFINE_PER_CPU(struct espresso_pic *, espresso_pic_cpu); + +/* + * IRQ chip operations + */ + +static void espresso_pic_mask_and_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_ack(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + out_be32(&pic->icr, mask); +} + +static void espresso_pic_mask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + clrbits32(&pic->imr, mask); +} + +static void espresso_pic_unmask(struct irq_data *d) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 mask = 1 << irqd_to_hwirq(d); + + setbits32(&pic->imr, mask); +} + +static struct irq_chip espresso_pic_chip = { + .name = "espresso-pic", + .irq_ack = espresso_pic_ack, + .irq_mask_ack = espresso_pic_mask_and_ack, + .irq_mask = espresso_pic_mask, + .irq_unmask = espresso_pic_unmask, +}; + +/* + * Domain Ops + */ + +static int espresso_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("espresso-pic: %s IRQ matches with this driver\n", + node->name); + return 1; + } + return 0; +} + +static int espresso_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &espresso_pic_chip, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &espresso_pic_chip, h->host_data); + } + return 0; +} + +static void espresso_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops espresso_pic_ops = { + .match = espresso_pic_match, + .alloc = espresso_pic_alloc, + .free = espresso_pic_free, +}; + +/* Store irq domain for espresso_pic_get_irq (the function gets no arguments) */ +static struct irq_domain *espresso_irq_domain; + +unsigned int espresso_pic_get_irq(void) +{ + struct espresso_pic *pic = *this_cpu_ptr(&espresso_pic_cpu); + u32 irq_status, irq; + + irq_status = in_be32(&pic->icr) & in_be32(&pic->imr); + + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* Return first IRQ */ + irq = __ffs(irq_status); + return irq_linear_revmap(espresso_irq_domain, irq); +} + +void __init espresso_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,espresso-pic"); + struct irq_domain *host; + struct resource res; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + + if (of_address_to_resource(np, 0, &res) != 0) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct espresso_pic **pic = per_cpu_ptr(&espresso_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct espresso_pic) * cpu); + + /* Mask and Ack all IRQs */ + out_be32(&(*pic)->imr, 0); + out_be32(&(*pic)->icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, ESPRESSO_NR_IRQS, &espresso_pic_ops, + NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + /* Save irq domain for espresso_pic_get_irq */ + espresso_irq_domain = host; + + irq_set_default_host(host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/espresso-pic.h b/arch/powerpc/platforms/wiiu/espresso-pic.h new file mode 100644 index 000000000000..b5b4e44ad60e --- /dev/null +++ b/arch/powerpc/platforms/wiiu/espresso-pic.h @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Espresso" interrupt controller support + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __ESPRESSO_PIC_H +#define __ESPRESSO_PIC_H + +/* + * Instead of using COS custom IRQ remapping, the normal IRQ mapping is used: + * + * IRQ Description + * ------------------------------------------- + * 0 Error + * 1 Unused + * 2 Unused + * 3 Audio Interface (TV) + * 4 Unused + * 5 DSP Accelerator + * 6 DSP + * 7 DSP DMA + * 8 Unused + * 9 Unused + * 10 GPIPPC (?) + * 11 Unused + * 12 Audio Interface (Gamepad) + * 13 I2C + * 14 Unused + * 15 Unused + * 16 Unused + * 17 Unused + * 18 Unused + * 19 Unused + * 20 Unused + * 21 Unused + * 22 Unused + * 23 GX2 + * 24 Latte IRQ Controller + * 25 Unused + * 26 IPC (CPU2) + * 27 Unused + * 28 IPC (CPU1) + * 29 Unused + * 30 IPC (CPU0) + * 31 Unused + */ + +struct espresso_pic { + __be32 icr; /* Triggered IRQs */ + __be32 imr; /* Allowed IRQs */ +} __packed; + +#define ESPRESSO_NR_IRQS 32 + +unsigned int espresso_pic_get_irq(void); +void espresso_pic_init(void); + +#endif -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 08/11] powerpc: wiiu: latte interrupt controller support 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- v2->v3: Make latte_pic_get_irq static. arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 8dfd6ac8774d..40ecba8396a7 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..7e3f49844166 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +static unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 08/11] powerpc: wiiu: latte interrupt controller support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add support for the "Latte" interrupt controller in the Nintendo Wii U. This controller is used for the entire SoC and is wired to a cascade interrupt on the Espresso controller. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> --- v2->v3: Make latte_pic_get_irq static. arch/powerpc/platforms/wiiu/Kconfig | 1 + arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/latte-pic.c | 259 ++++++++++++++++++++++++ arch/powerpc/platforms/wiiu/latte-pic.h | 23 +++ 4 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.c create mode 100644 arch/powerpc/platforms/wiiu/latte-pic.h diff --git a/arch/powerpc/platforms/wiiu/Kconfig b/arch/powerpc/platforms/wiiu/Kconfig index 8dfd6ac8774d..40ecba8396a7 100644 --- a/arch/powerpc/platforms/wiiu/Kconfig +++ b/arch/powerpc/platforms/wiiu/Kconfig @@ -3,6 +3,7 @@ config WIIU bool "Nintendo Wii U" depends on PPC_BOOK3S_32 + select IRQ_DOMAIN_HIERARCHY help Select WIIU if configuring for the Nintendo Wii U. More information at: <https://linux-wiiu.org/> diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index aabf4b43e806..fa16c60261e6 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o +obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/latte-pic.c b/arch/powerpc/platforms/wiiu/latte-pic.c new file mode 100644 index 000000000000..7e3f49844166 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.c @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U "Latte" interrupt controller support. + * This is the controller for all the SoC devices, and has a cascade interrupt for the Espresso + * CPU interrupt controller. + * + * Copyright (C) 2022 The linux-wiiu Team + * + * Based on hlwd-pic.c + * Copyright (C) 2009 The GameCube Linux Team + * Copyright (C) 2009 Albert Herranz + */ + +#define DRV_MODULE_NAME "latte-pic" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/irq.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> +#include <linux/irqdomain.h> +#include <linux/io.h> +#include "latte-pic.h" + +static DEFINE_PER_CPU(struct lt_pic *, lt_pic_cpu); + +/* + * IRQ chip operations + * These handle both AHBALL and AHBLT IRQs, with AHBLT mapped above 32 + */ + +static void latte_pic_mask_and_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_ack(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + out_be32(&pic->ahball_icr, mask); + } else { + u32 mask = 1 << (irq - 32); + + out_be32(&pic->ahblt_icr, mask); + } +} + +static void latte_pic_mask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + clrbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + clrbits32(&pic->ahblt_imr, mask); + } +} + +static void latte_pic_unmask(struct irq_data *d) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq = irqd_to_hwirq(d); + + if (irq < LATTE_AHBALL_NR_IRQS) { + u32 mask = 1 << irq; + + setbits32(&pic->ahball_imr, mask); + } else { + u32 mask = 1 << (irq - 32); + + setbits32(&pic->ahblt_imr, mask); + } +} + +static struct irq_chip latte_pic = { + .name = "latte-pic", + .irq_ack = latte_pic_ack, + .irq_mask_ack = latte_pic_mask_and_ack, + .irq_mask = latte_pic_mask, + .irq_unmask = latte_pic_unmask, +}; + +/* + * Domain ops + */ + +static int latte_pic_match(struct irq_domain *h, struct device_node *node, + enum irq_domain_bus_token bus_token) +{ + if (h->fwnode == &node->fwnode) { + pr_debug("%s IRQ matches with this driver\n", node->name); + return 1; + } + return 0; +} + +static int latte_pic_alloc(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs, void *arg) +{ + unsigned int i; + struct irq_fwspec *fwspec = arg; + irq_hw_number_t hwirq = fwspec->param[0]; + + for (i = 0; i < nr_irqs; i++) { + irq_set_chip_data(virq + i, h->host_data); + irq_set_status_flags(virq + i, IRQ_LEVEL); + irq_set_chip_and_handler(virq + i, &latte_pic, + handle_level_irq); + irq_domain_set_hwirq_and_chip(h, virq + i, hwirq + i, + &latte_pic, h->host_data); + } + return 0; +} + +static void latte_pic_free(struct irq_domain *h, unsigned int virq, + unsigned int nr_irqs) +{ + pr_debug("free\n"); +} + +const struct irq_domain_ops latte_pic_ops = { + .match = latte_pic_match, + .alloc = latte_pic_alloc, + .free = latte_pic_free, +}; + +/* + * Determinate if there are interrupts pending + * Checks AHBALL (0-32) and AHBLT (32-64) + */ +static unsigned int latte_pic_get_irq(struct irq_domain *h) +{ + struct lt_pic *pic = *this_cpu_ptr(<_pic_cpu); + u32 irq_status, irq; + + /* Check AHBALL first */ + irq_status = in_be32(&pic->ahball_icr) & in_be32(&pic->ahball_imr); + + if (irq_status == 0) { + /* Try AHBLT */ + irq_status = + in_be32(&pic->ahblt_icr) & in_be32(&pic->ahblt_imr); + if (irq_status == 0) + return 0; /* No IRQs pending */ + + /* AHBLT is mapped above 32 (LATTE_AHBALL_NR_IRQS) */ + irq = __ffs(irq_status) + LATTE_AHBALL_NR_IRQS; + return irq_linear_revmap(h, irq); + } + + irq = __ffs(irq_status); + return irq_linear_revmap(h, irq); +} + +/* + * Cascade IRQ handler + */ +static void latte_irq_cascade(struct irq_desc *desc) +{ + struct irq_domain *irq_domain = irq_desc_get_handler_data(desc); + struct irq_chip *chip = irq_desc_get_chip(desc); + unsigned int virq; + + raw_spin_lock(&desc->lock); + chip->irq_mask(&desc->irq_data); /* IRQ_LEVEL */ + raw_spin_unlock(&desc->lock); + + virq = latte_pic_get_irq(irq_domain); + if (virq) + generic_handle_irq(virq); + else + pr_err("spurious interrupt!\n"); + + raw_spin_lock(&desc->lock); + chip->irq_ack(&desc->irq_data); /* IRQ_LEVEL */ + if (!irqd_irq_disabled(&desc->irq_data) && chip->irq_unmask) + chip->irq_unmask(&desc->irq_data); + raw_spin_unlock(&desc->lock); +} + +void __init latte_pic_init(void) +{ + struct device_node *np = + of_find_compatible_node(NULL, NULL, "nintendo,latte-pic"); + struct irq_domain *host; + struct resource res; + int irq_cascade; + void __iomem *regbase; + unsigned int cpu; + + if (!np) { + pr_err("could not find device node\n"); + return; + } + if (!of_get_property(np, "interrupts", NULL)) { + pr_err("could not find cascade interrupt!\n"); + goto out; + } + + if (of_address_to_resource(np, 0, &res)) { + pr_err("could not find resource address\n"); + goto out; + } + + regbase = ioremap(res.start, resource_size(&res)); + if (IS_ERR(regbase)) { + pr_err("could not map controller\n"); + goto out; + } + + for_each_present_cpu(cpu) { + struct lt_pic **pic = per_cpu_ptr(<_pic_cpu, cpu); + + /* Compute pic address */ + *pic = regbase + (sizeof(struct lt_pic) * cpu); + + /* Mask and Ack CPU IRQs */ + out_be32(&(*pic)->ahball_imr, 0); + out_be32(&(*pic)->ahball_icr, 0xFFFFFFFF); + } + + host = irq_domain_add_linear(np, + LATTE_AHBALL_NR_IRQS + LATTE_AHBLT_NR_IRQS, + &latte_pic_ops, NULL); + if (!host) { + pr_err("failed to allocate irq_domain\n"); + goto out; + } + + irq_cascade = irq_of_parse_and_map(np, 0); + irq_set_chained_handler_and_data(irq_cascade, latte_irq_cascade, host); + +out: + of_node_put(np); +} diff --git a/arch/powerpc/platforms/wiiu/latte-pic.h b/arch/powerpc/platforms/wiiu/latte-pic.h new file mode 100644 index 000000000000..7021d9497d35 --- /dev/null +++ b/arch/powerpc/platforms/wiiu/latte-pic.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Nintendo Wii U "Latte" interrupt controller support + * + * Copyright (C) 2022 The linux-wiiu Team + */ + +#ifndef __LATTE_PIC_H +#define __LATTE_PIC_H + +struct lt_pic { + __be32 ahball_icr; /* Triggered AHB IRQs (all) */ + __be32 ahblt_icr; /* Triggered AHB IRQs (latte only) */ + __be32 ahball_imr; /* Allowed AHB IRQs (all) */ + __be32 ahblt_imr; /* Allowed AHB IRQs (latte only) */ +} __packed; + +#define LATTE_AHBALL_NR_IRQS 32 +#define LATTE_AHBLT_NR_IRQS 32 + +void latte_pic_init(void); + +#endif -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 09/11] powerpc: espresso processor support 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- v3->v4: Move to new cpu_specs_*.h file. arch/powerpc/kernel/cpu_specs_book3s_32.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/arch/powerpc/kernel/cpu_specs_book3s_32.h b/arch/powerpc/kernel/cpu_specs_book3s_32.h index 3714634d194a..c3cc0a019ba8 100644 --- a/arch/powerpc/kernel/cpu_specs_book3s_32.h +++ b/arch/powerpc/kernel/cpu_specs_book3s_32.h @@ -275,6 +275,21 @@ static struct cpu_spec cpu_specs[] __initdata = { .machine_check = machine_check_generic, .platform = "ppc750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 09/11] powerpc: espresso processor support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds a cputable entry for the "Espresso" processor found on the Nintendo Wii U, which has a PVR unrelated to other 750CL-like chips. Only this revision has been seen in the wild. Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Ash Logan <ash@heyquark.com> --- v3->v4: Move to new cpu_specs_*.h file. arch/powerpc/kernel/cpu_specs_book3s_32.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/arch/powerpc/kernel/cpu_specs_book3s_32.h b/arch/powerpc/kernel/cpu_specs_book3s_32.h index 3714634d194a..c3cc0a019ba8 100644 --- a/arch/powerpc/kernel/cpu_specs_book3s_32.h +++ b/arch/powerpc/kernel/cpu_specs_book3s_32.h @@ -275,6 +275,21 @@ static struct cpu_spec cpu_specs[] __initdata = { .machine_check = machine_check_generic, .platform = "ppc750", }, + { /* "Espresso" (750CL-like) */ + .pvr_mask = 0xffffffff, + .pvr_value = 0x70010201, + .cpu_name = "Espresso", + .cpu_features = CPU_FTRS_750CL, + .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, + .mmu_features = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS, + .icache_bsize = 32, + .dcache_bsize = 32, + .num_pmcs = 4, + .pmc_type = PPC_PMC_IBM, + .cpu_setup = __setup_cpu_750, + .machine_check = machine_check_generic, + .platform = "ppc750", + }, { /* 745/755 */ .pvr_mask = 0xfffff000, .pvr_value = 0x00083000, -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 10/11] powerpc: wiiu: platform support 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v2->v3: Use of_platform_default_populate instead of a custom match table. arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 60 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..e3f07ce65cad --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_default_populate(NULL, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 10/11] powerpc: wiiu: platform support @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Add platform support for the Nintendo Wii U console. Signed-off-by: Ash Logan <ash@heyquark.com> Co-developed-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Signed-off-by: Roberto Van Eeden <rw-r-r-0644@protonmail.com> Co-developed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> --- v2->v3: Use of_platform_default_populate instead of a custom match table. arch/powerpc/platforms/wiiu/Makefile | 2 +- arch/powerpc/platforms/wiiu/setup.c | 60 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 arch/powerpc/platforms/wiiu/setup.c diff --git a/arch/powerpc/platforms/wiiu/Makefile b/arch/powerpc/platforms/wiiu/Makefile index fa16c60261e6..abcb7a1beebf 100644 --- a/arch/powerpc/platforms/wiiu/Makefile +++ b/arch/powerpc/platforms/wiiu/Makefile @@ -1,4 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_WIIU) += espresso-pic.o latte-pic.o +obj-$(CONFIG_WIIU) += setup.o espresso-pic.o latte-pic.o obj-$(CONFIG_LATTEIPC_UDBG) += udbg_latteipc.o diff --git a/arch/powerpc/platforms/wiiu/setup.c b/arch/powerpc/platforms/wiiu/setup.c new file mode 100644 index 000000000000..e3f07ce65cad --- /dev/null +++ b/arch/powerpc/platforms/wiiu/setup.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Nintendo Wii U board-specific support + * + * Copyright (C) 2022 The linux-wiiu Team + */ +#define DRV_MODULE_NAME "wiiu" +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt + +#include <linux/kernel.h> +#include <linux/of_platform.h> + +#include <asm/machdep.h> +#include <asm/udbg.h> + +#include "espresso-pic.h" +#include "latte-pic.h" +#include "udbg_latteipc.h" + +static int __init wiiu_probe(void) +{ + if (!of_machine_is_compatible("nintendo,wiiu")) + return 0; + + latteipc_udbg_init(); + + return 1; +} + +static void __noreturn wiiu_halt(void) +{ + for (;;) + cpu_relax(); +} + +static void __init wiiu_init_irq(void) +{ + espresso_pic_init(); + latte_pic_init(); +} + +static int __init wiiu_device_probe(void) +{ + if (!machine_is(wiiu)) + return 0; + + of_platform_default_populate(NULL, NULL, NULL); + return 0; +} +device_initcall(wiiu_device_probe); + +define_machine(wiiu) { + .name = "wiiu", + .probe = wiiu_probe, + .halt = wiiu_halt, + .progress = udbg_progress, + .calibrate_decr = generic_calibrate_decr, + .init_IRQ = wiiu_init_irq, + .get_irq = espresso_pic_get_irq, +}; -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 11/11] powerpc: wiiu: add minimal default config 2022-11-19 11:30 ` Ash Logan @ 2022-11-19 11:30 ` Ash Logan -1 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: linux-kernel, linuxppc-dev, j.ne, linkmauve, rw-r-r-0644, devicetree, joel Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
* [PATCH v4 11/11] powerpc: wiiu: add minimal default config @ 2022-11-19 11:30 ` Ash Logan 0 siblings, 0 replies; 170+ messages in thread From: Ash Logan @ 2022-11-19 11:30 UTC (permalink / raw) To: krzysztof.kozlowski+dt, paulus, mpe, christophe.leroy, robh+dt, benh, segher, pali Cc: devicetree, linkmauve, linux-kernel, rw-r-r-0644, joel, linuxppc-dev, j.ne Adds a bare-minimum config to get a kernel compiled. Will need some more interesting options once a storage device to boot from is added. Signed-off-by: Ash Logan <ash@heyquark.com> --- arch/powerpc/configs/wiiu_defconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/powerpc/configs/wiiu_defconfig diff --git a/arch/powerpc/configs/wiiu_defconfig b/arch/powerpc/configs/wiiu_defconfig new file mode 100644 index 000000000000..a761ebcdd9f2 --- /dev/null +++ b/arch/powerpc/configs/wiiu_defconfig @@ -0,0 +1,7 @@ +# CONFIG_PPC_CHRP is not set +# CONFIG_PPC_PMAC is not set +CONFIG_WIIU=y +# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set +CONFIG_HIGHMEM=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_PPC_EARLY_DEBUG=y -- 2.38.1 ^ permalink raw reply related [flat|nested] 170+ messages in thread
end of thread, other threads:[~2024-02-20 16:25 UTC | newest] Thread overview: 170+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-03-02 4:43 [PATCH 00/12] powerpc: Nintendo Wii U support Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 4:43 ` [PATCH 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 13:28 ` Rob Herring 2022-03-02 13:28 ` Rob Herring 2022-03-02 4:43 ` [PATCH 02/12] powerpc: wiiu: device tree Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 13:36 ` Rob Herring 2022-03-02 13:36 ` Rob Herring 2022-03-03 2:41 ` Ash Logan 2022-03-03 2:41 ` Ash Logan 2022-03-02 4:43 ` [PATCH 03/12] powerpc: wiiu: bootwrapper support Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 4:43 ` [PATCH 04/12] powerpc: wiiu: introduce wiiu platform Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 4:43 ` [PATCH 05/12] powerpc: wiiu: declare as non-coherent Ash Logan 2022-03-02 4:43 ` Ash Logan 2022-03-02 4:44 ` [PATCH 06/12] powerpc: wiiu: udbg support for latteipc Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-03-02 4:44 ` [PATCH 07/12] powerpc: wiiu: espresso interrupt controller support Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-03-02 4:44 ` [PATCH 08/12] powerpc: wiiu: latte " Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-03-02 4:44 ` [PATCH 09/12] powerpc: espresso processor support Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-03-02 4:44 ` [PATCH 10/12] powerpc: wiiu: platform support Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-03-02 4:44 ` [PATCH 11/12] powerpc: wiiu: don't enforce flat memory Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-05-13 22:43 ` Pali Rohár 2022-05-13 22:43 ` Pali Rohár 2022-05-20 3:41 ` Ash Logan 2022-05-20 3:41 ` Ash Logan 2022-05-20 8:04 ` Pali Rohár 2022-05-20 8:04 ` Pali Rohár 2022-05-20 10:44 ` Ash Logan 2022-05-20 10:44 ` Ash Logan 2022-05-20 12:30 ` Pali Rohár 2022-05-20 12:30 ` Pali Rohár 2022-06-09 22:24 ` Pali Rohár 2022-06-09 22:24 ` Pali Rohár 2022-08-08 18:40 ` Pali Rohár 2022-08-08 18:40 ` Pali Rohár 2022-09-08 15:25 ` Christophe Leroy 2022-09-08 15:25 ` Christophe Leroy 2022-09-08 15:35 ` Pali Rohár 2022-09-08 15:35 ` Pali Rohár 2022-09-08 20:17 ` Fragmented physical memory on powerpc/32 Pali Rohár 2022-09-08 20:17 ` Pali Rohár 2022-09-10 9:39 ` Christophe Leroy 2022-09-10 9:39 ` Christophe Leroy 2022-09-12 14:48 ` Mike Rapoport 2022-09-12 14:48 ` Mike Rapoport 2022-09-12 21:16 ` Pali Rohár 2022-09-12 21:16 ` Pali Rohár 2022-09-13 6:11 ` Christophe Leroy 2022-09-13 6:11 ` Christophe Leroy 2022-09-13 12:36 ` Christophe Leroy 2022-09-13 12:36 ` Christophe Leroy 2022-09-14 9:32 ` Mike Rapoport 2022-09-14 9:32 ` Mike Rapoport 2022-09-14 9:43 ` Christophe Leroy 2022-09-14 9:43 ` Christophe Leroy 2022-09-14 15:55 ` Mike Rapoport 2022-09-14 15:55 ` Mike Rapoport 2022-09-14 19:56 ` Pali Rohár 2022-09-14 19:56 ` Pali Rohár 2022-03-02 4:44 ` [PATCH 12/12] powerpc: wiiu: Add minimal default config Ash Logan 2022-03-02 4:44 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 00/12] powerpc: Nintendo Wii U support Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 02/12] powerpc: wiiu: device tree Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 03/12] powerpc: wiiu: bootwrapper support Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 04/12] powerpc: wiiu: introduce wiiu platform Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 05/12] powerpc: wiiu: declare as non-coherent Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 06/12] powerpc: wiiu: udbg support for latteipc Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-27 0:15 ` kernel test robot 2022-06-27 0:15 ` kernel test robot 2022-06-22 13:10 ` [PATCH v2 07/12] powerpc: wiiu: espresso interrupt controller support Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 08/12] powerpc: wiiu: latte " Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-27 2:51 ` kernel test robot 2022-06-27 2:51 ` kernel test robot 2022-06-22 13:10 ` [PATCH v2 09/12] powerpc: espresso processor support Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 10/12] powerpc: wiiu: platform support Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 11/12] powerpc: wiiu: don't enforce flat memory Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-22 13:10 ` [PATCH v2 12/12] powerpc: wiiu: Add minimal default config Ash Logan 2022-06-22 13:10 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 00/12] powerpc: Nintendo Wii U support Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 01/12] dt-bindings: wiiu: Document the Nintendo Wii U devicetree Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-29 9:52 ` Krzysztof Kozlowski 2022-06-29 9:52 ` Krzysztof Kozlowski 2022-06-28 13:31 ` [PATCH v3 02/12] powerpc: wiiu: device tree Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-29 9:58 ` Krzysztof Kozlowski 2022-06-29 9:58 ` Krzysztof Kozlowski 2022-06-29 16:13 ` Segher Boessenkool 2022-06-29 16:13 ` Segher Boessenkool 2022-06-29 18:13 ` Krzysztof Kozlowski 2022-06-29 18:13 ` Krzysztof Kozlowski 2022-06-29 20:28 ` Segher Boessenkool 2022-06-29 20:28 ` Segher Boessenkool 2022-06-28 13:31 ` [PATCH v3 03/12] powerpc: wiiu: bootwrapper support Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 04/12] powerpc: wiiu: introduce wiiu platform Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 05/12] powerpc: wiiu: declare as non-coherent Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 06/12] powerpc: wiiu: udbg support for latteipc Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 07/12] powerpc: wiiu: espresso interrupt controller support Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 08/12] powerpc: wiiu: latte " Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 09/12] powerpc: espresso processor support Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 10/12] powerpc: wiiu: platform support Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 11/12] powerpc: wiiu: don't enforce flat memory Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-06-28 13:31 ` [PATCH v3 12/12] powerpc: wiiu: add minimal default config Ash Logan 2022-06-28 13:31 ` Ash Logan 2022-11-15 14:47 ` [PATCH v3 00/12] powerpc: Nintendo Wii U support Christophe Leroy 2022-11-15 14:47 ` Christophe Leroy 2022-11-19 11:30 ` [PATCH v4 00/11] " Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 01/11] dt-bindings: wiiu: Document the Nintendo Wii U devicetree Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 21:36 ` Rob Herring 2022-11-19 21:36 ` Rob Herring 2022-11-20 15:30 ` Rob Herring 2022-11-20 15:30 ` Rob Herring 2024-02-20 16:20 ` Christophe Leroy 2024-02-20 16:20 ` Christophe Leroy 2024-02-20 16:24 ` Krzysztof Kozlowski 2024-02-20 16:24 ` Krzysztof Kozlowski 2022-11-19 11:30 ` [PATCH v4 02/11] powerpc: wiiu: device tree Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 03/11] powerpc: wiiu: bootwrapper support Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 04/11] powerpc: wiiu: introduce wiiu platform Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 05/11] powerpc: wiiu: declare as non-coherent Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 06/11] powerpc: wiiu: udbg support for latteipc Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 07/11] powerpc: wiiu: espresso interrupt controller support Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 08/11] powerpc: wiiu: latte " Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 09/11] powerpc: espresso processor support Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 10/11] powerpc: wiiu: platform support Ash Logan 2022-11-19 11:30 ` Ash Logan 2022-11-19 11:30 ` [PATCH v4 11/11] powerpc: wiiu: add minimal default config Ash Logan 2022-11-19 11:30 ` Ash Logan
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.