AmigaOne platform patches v2

9 messages, 4 authors, 2009-02-05 · open the first message on its own page

AmigaOne platform patches v2

From: Gerhard Pircher <hidden>
Date: 2009-02-02 21:30:41

Hi!

I updated the patches for the AmigaOne platform based on your comments.
The following changes were made compared to v1:

setup.c:
- replaced "model" entry in /proc/cpuinfo with a "vendor" entry
- replaced cache flushing code in amigaone_restart() with call to
__flush_disable_L1()
- removed feature fixup code in amigaone_probe(): only AmigaOnes with
G3 can run an unmodified kernel for now, until the PPC32 startup code
is reorganized to do the feature fixup after probe_machine()

amigaone.dts:
- removed nodes for probeable PCI devices
- removed device_type properties that are not used by the kernel

I didn't add an interrupt-map property yet. I would have to make 3
versions of the dts, if this is required.

Thanks!

Gerhard

-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger01

[PATCH v2 1/4] Add platform support for AmigaOne

From: Gerhard Pircher <hidden>
Date: 2009-02-02 21:39:11

This commit adds the setup code for booting Linux on AmigaOne G3SE (G3
only), AmigaOne XE and uA1 (G3/G4) desktop computers. These boards were
sold by Eyetech and are based on MAI Logic's Teron boards and its
Articia S northbridge.
The AmigaOne uses U-boot as firmware, which doesn't support a flattened
device tree yet. The northbridge has some design flaws, which makes it
necessary to use non cacheable memory for DMA operations
(CONFIG_NOT_COHERENT_CACHE) and to avoid setting the coherence (M) flag
for memory pages.

Signed-off-by: Gerhard Pircher <redacted>
---
 arch/powerpc/platforms/Kconfig           |    1 +
 arch/powerpc/platforms/Makefile          |    1 +
 arch/powerpc/platforms/amigaone/Kconfig  |   18 ++++
 arch/powerpc/platforms/amigaone/Makefile |    1 +
 arch/powerpc/platforms/amigaone/setup.c  |  161 ++++++++++++++++++++++++++++++
 5 files changed, 182 insertions(+), 0 deletions(-)
 create mode 100644 arch/powerpc/platforms/amigaone/Kconfig
 create mode 100644 arch/powerpc/platforms/amigaone/Makefile
 create mode 100644 arch/powerpc/platforms/amigaone/setup.c
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index 200b9cb..b25404c 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -28,6 +28,7 @@ source "arch/powerpc/platforms/86xx/Kconfig"
 source "arch/powerpc/platforms/embedded6xx/Kconfig"
 source "arch/powerpc/platforms/44x/Kconfig"
 source "arch/powerpc/platforms/40x/Kconfig"
+source "arch/powerpc/platforms/amigaone/Kconfig"
 
 config PPC_NATIVE
 	bool
diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile
index 8079e0b..f741919 100644
--- a/arch/powerpc/platforms/Makefile
+++ b/arch/powerpc/platforms/Makefile
@@ -19,3 +19,4 @@ obj-$(CONFIG_PPC_PASEMI)	+= pasemi/
 obj-$(CONFIG_PPC_CELL)		+= cell/
 obj-$(CONFIG_PPC_PS3)		+= ps3/
 obj-$(CONFIG_EMBEDDED6xx)	+= embedded6xx/
+obj-$(CONFIG_AMIGAONE)		+= amigaone/
diff --git a/arch/powerpc/platforms/amigaone/Kconfig b/arch/powerpc/platforms/amigaone/Kconfig
new file mode 100644
index 0000000..9276a96
--- /dev/null
+++ b/arch/powerpc/platforms/amigaone/Kconfig
@@ -0,0 +1,18 @@
+config AMIGAONE
+	bool "Eyetech AmigaOne/MAI Teron"
+	depends on PPC32 && BROKEN_ON_SMP && PPC_MULTIPLATFORM
+	select PPC_I8259
+	select PPC_INDIRECT_PCI
+	select PPC_UDBG_16550
+	select PCI
+	select NOT_COHERENT_CACHE
+	select CHECK_CACHE_COHERENCY
+	select DEFAULT_UIMAGE
+	select PCSPKR_PLATFORM
+	help
+	Select AmigaOne for the following machines:
+	- AmigaOne SE/Teron CX (G3 only)
+	- AmigaOne XE/Teron PX
+	- uA1/Teron mini
+	  More information is available at:
+	  <http://amigaone-linux.sourceforge.net/>.
diff --git a/arch/powerpc/platforms/amigaone/Makefile b/arch/powerpc/platforms/amigaone/Makefile
new file mode 100644
index 0000000..e6885b3
--- /dev/null
+++ b/arch/powerpc/platforms/amigaone/Makefile
@@ -0,0 +1 @@
+obj-y	+= setup.o
diff --git a/arch/powerpc/platforms/amigaone/setup.c b/arch/powerpc/platforms/amigaone/setup.c
new file mode 100644
index 0000000..c20244a
--- /dev/null
+++ b/arch/powerpc/platforms/amigaone/setup.c
@@ -0,0 +1,161 @@
+/*
+ * AmigaOne platform setup
+ *
+ * Copyright 2008 Gerhard Pircher (gerhard_pircher@gmx.net)
+ *
+ *   Based on original amigaone_setup.c source code
+ * Copyright 2003 by Hans-Joerg Frieden and Thomas Frieden
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/seq_file.h>
+#include <linux/utsrelease.h>
+
+#include <asm/machdep.h>
+#include <asm/cputable.h>
+#include <asm/prom.h>
+#include <asm/pci-bridge.h>
+#include <asm/i8259.h>
+#include <asm/time.h>
+#include <asm/udbg.h>
+
+extern void __flush_disable_L1(void);
+
+void amigaone_show_cpuinfo(struct seq_file *m)
+{
+	seq_printf(m, "vendor\t\t: Eyetech Ltd.\n");
+}
+
+static int __init amigaone_add_bridge(struct device_node *dev)
+{
+	int len;
+	struct pci_controller *hose;
+	const int *bus_range;
+
+	printk(KERN_INFO "Adding PCI host bridge %s\n", dev->full_name);
+
+	bus_range = of_get_property(dev, "bus-range", &len);
+	if ((bus_range == NULL) || (len < 2 * sizeof(int)))
+		printk(KERN_WARNING "Can't get bus-range for %s, assume"
+		       " bus 0\n", dev->full_name);
+
+	hose = pcibios_alloc_controller(dev);
+	if (hose == NULL)
+		return -ENOMEM;
+
+	hose->first_busno = bus_range ? bus_range[0] : 0;
+	hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+	setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
+
+	/* Interpret the "ranges" property */
+	/* This also maps the I/O region and sets isa_io/mem_base */
+	pci_process_bridge_OF_ranges(hose, dev, 1);
+
+	return 0;
+}
+
+void __init amigaone_setup_arch(void)
+{
+	struct device_node *np;
+
+	/* Lookup PCI host bridges. */
+	for_each_compatible_node(np, "pci", "mai-logic,articia-s")
+		amigaone_add_bridge(np);
+
+	if (ppc_md.progress)
+		ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0);
+}
+
+void __init amigaone_init_IRQ(void)
+{
+	struct device_node *pic, *np = NULL;
+	const unsigned long *prop = NULL;
+	unsigned long int_ack = 0;
+
+	/* Search for ISA interrupt controller. */
+	pic = of_find_compatible_node(NULL, "interrupt-controller",
+	                              "pnpPNP,000");
+	BUG_ON(pic == NULL);
+
+	/* Look for interrupt acknowledge address in the PCI root node. */
+	np = of_find_compatible_node(NULL, "pci", "mai-logic,articia-s");
+	if (np) {
+		prop = of_get_property(np, "8259-interrupt-acknowledge", NULL);
+		if (prop)
+			int_ack = prop[0];
+		of_node_put(np);
+	}
+
+	if (int_ack == 0)
+		printk(KERN_WARNING "Cannot find PCI interrupt acknowledge"
+		       " address, polling\n");
+
+	i8259_init(pic, int_ack);
+	ppc_md.get_irq = i8259_irq;
+	irq_set_default_host(i8259_get_host());
+}
+
+void __init amigaone_init(void)
+{
+	request_region(0x00, 0x20, "dma1");
+	request_region(0x40, 0x20, "timer");
+	request_region(0x80, 0x10, "dma page reg");
+	request_region(0xc0, 0x20, "dma2");
+}
+
+void amigaone_restart(char *cmd)
+{
+	local_irq_disable();
+
+	/* Flush and disable caches. */
+	__flush_disable_L1();
+
+        /* Set SRR0 to the reset vector and turn on MSR_IP. */
+	mtspr(SPRN_SRR0, 0xfff00100);
+	mtspr(SPRN_SRR1, MSR_IP);
+
+	/* Do an rfi to jump back to firmware. */
+	__asm__ __volatile__("rfi" : : : "memory");
+
+	/* Not reached. */
+	while (1);
+}
+
+static int __init amigaone_probe(void)
+{
+	unsigned long root = of_get_flat_dt_root();
+
+	if (of_flat_dt_is_compatible(root, "eyetech,amigaone")) {
+		/*
+		 * Coherent memory access cause complete system lockup! Thus
+		 * disable this CPU feature, even if the CPU needs it.
+		 */
+		cur_cpu_spec->cpu_features &= ~CPU_FTR_NEED_COHERENT;
+
+		ISA_DMA_THRESHOLD = 0x00ffffff;
+		DMA_MODE_READ = 0x44;
+		DMA_MODE_WRITE = 0x48;
+
+		return 1;
+	}
+
+	return 0;
+}
+
+define_machine(amigaone) {
+	.name			= "AmigaOne",
+	.probe			= amigaone_probe,
+	.setup_arch		= amigaone_setup_arch,
+	.init			= amigaone_init,
+	.show_cpuinfo		= amigaone_show_cpuinfo,
+	.init_IRQ		= amigaone_init_IRQ,
+	.restart		= amigaone_restart,
+	.calibrate_decr		= generic_calibrate_decr,
+	.progress		= udbg_progress,
+};
-- 
1.5.3.4


-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger01

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2009-02-04 03:50:16

+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+ setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
Minor in the context of amigaone but still... the above should come from
the device-tree... I suppose those are really just IO space addresses
cf8 and cfc, in which case, an option is to call that first:
+ /* Interpret the "ranges" property */
+ /* This also maps the I/O region and sets isa_io/mem_base */
+ pci_process_bridge_OF_ranges(hose, dev, 1);
And -then- use hose->io_resource.start + 0xcf8 / 0xcfc, the later can be
hard coded as they are pretty standard values.

Ben.

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: Gerhard Pircher <hidden>
Date: 2009-02-04 12:09:30

-------- Original-Nachricht --------
Datum: Wed, 04 Feb 2009 14:50:07 +1100
Von: Benjamin Herrenschmidt [off-list ref]
An: Gerhard Pircher [off-list ref]
CC: linuxppc-dev list <redacted>
Betreff: Re: [PATCH v2 1/4] Add platform support for AmigaOne
quoted
+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+ setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
Minor in the context of amigaone but still... the above should come from
the device-tree... I suppose those are really just IO space addresses
cf8 and cfc, in which case, an option is to call that first:
I agree that these addresses should come from the device-tree, but these
two config registers are not located within the normal PCI I/O address
space (0xfe000000-0xfec00000).
Maybe I should add a "reg" property to the PHB node, but I don't know if
this is the right approach. The OF PCI spec isn't very clear about this.
What do you think?

Gerhard

-- 
Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kann`s mit allen: http://www.gmx.net/de/go/multimessenger01

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2009-02-04 20:47:32

On Wed, 2009-02-04 at 13:09 +0100, Gerhard Pircher wrote:
I agree that these addresses should come from the device-tree, but these
two config registers are not located within the normal PCI I/O address
space (0xfe000000-0xfec00000).
Maybe I should add a "reg" property to the PHB node, but I don't know if
this is the right approach. The OF PCI spec isn't very clear about this.
What do you think?
Yup, "reg" in the PHB is what most machines use for that.

Cheers,
Ben.

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: Gabriel Paubert <hidden>
Date: 2009-02-04 21:00:10

On Wed, Feb 04, 2009 at 02:50:07PM +1100, Benjamin Herrenschmidt wrote:
quoted
+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+ setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
Minor in the context of amigaone but still... the above should come from
the device-tree... I suppose those are really just IO space addresses
cf8 and cfc, in which case, an option is to call that first:
Hmm, the first is feC...,the other one feE..., 2Mbytes apart.

I don't know the hardware but I've never seen something like that.
Of course a typo is always a possibility...

	Gabriel

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: Gerhard Pircher <hidden>
Date: 2009-02-04 21:35:41

-------- Original-Nachricht --------
Datum: Wed, 4 Feb 2009 21:59:41 +0100
Von: Gabriel Paubert [off-list ref]
An: Benjamin Herrenschmidt [off-list ref]
CC: Gerhard Pircher <redacted>, linuxppc-dev list <redacted>
Betreff: Re: [PATCH v2 1/4] Add platform support for AmigaOne
On Wed, Feb 04, 2009 at 02:50:07PM +1100, Benjamin Herrenschmidt wrote:
quoted
quoted
+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+ setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
Minor in the context of amigaone but still... the above should come
from the device-tree... I suppose those are really just IO space
addresses cf8 and cfc, in which case, an option is to call that first:
Hmm, the first is feC...,the other one feE..., 2Mbytes apart.

I don't know the hardware but I've never seen something like that.
Of course a typo is always a possibility...
The Pegasos 1 uses the same northbridge and chrp_find_bridges() calls
setup_indirect_pci() with the same addresses.

Gerhard

-- 
Jetzt 1 Monat kostenlos! GMX FreeDSL - Telefonanschluss + DSL 
für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a

Re: [PATCH v2 1/4] Add platform support for AmigaOne

From: John W. Linville <hidden>
Date: 2009-02-04 21:45:55

On Wed, Feb 04, 2009 at 10:35:31PM +0100, Gerhard Pircher wrote:
-------- Original-Nachricht --------
quoted
Datum: Wed, 4 Feb 2009 21:59:41 +0100
Von: Gabriel Paubert [off-list ref]
An: Benjamin Herrenschmidt [off-list ref]
CC: Gerhard Pircher <redacted>, linuxppc-dev list <redacted>
Betreff: Re: [PATCH v2 1/4] Add platform support for AmigaOne
quoted
On Wed, Feb 04, 2009 at 02:50:07PM +1100, Benjamin Herrenschmidt wrote:
quoted
quoted
+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+ setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc, 0);
Minor in the context of amigaone but still... the above should come
from the device-tree... I suppose those are really just IO space
addresses cf8 and cfc, in which case, an option is to call that first:
Hmm, the first is feC...,the other one feE..., 2Mbytes apart.

I don't know the hardware but I've never seen something like that.
Of course a typo is always a possibility...
The Pegasos 1 uses the same northbridge and chrp_find_bridges() calls
setup_indirect_pci() with the same addresses.
As a proud owner, I concur that those numbers are correct...

-- 
John W. Linville		Someday the world will need a hero, and you
linville@tuxdriver.com			might be all we have.  Be ready.

[RFC] Error handling in *_add/find_bridges()

From: Gerhard Pircher <hidden>
Date: 2009-02-05 13:36:54

Hi!

I have a minor question about the error handling in the various *_add/find_bridges functions, which are used to detect and initialize
PHBs. AFAIK all of them return an error code that is never checked in
the platform setup code (e.g. when there is no memory for the
pci_controller struct).
Shouldn't the kernel panic (BUG();), when it can't initialize the PHB
for whatever reason and the platform depends on a working PCI bus?

Thanks!

regards,

Gerhard
-- 
Jetzt 1 Monat kostenlos! GMX FreeDSL - Telefonanschluss + DSL 
für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help