On Mon, Mar 07, 2005 at 01:57:39PM +0100, Nicolas DET wrote:
> Hello James,
> 
> On 07/03/2005, you wrote:
> > Hi Nicolas,
> 
> > A few general comments:-
> 
> > - mv64x60 stuff is best posted to linuxppc-embedded
> 
> ok.
> I would just add that our platform (Pegasos II) is using MV64361 from
> Marvell and is a complete computer.

Cross-posting to linuxppc-embedded to reach everyone. In particular comments
from Mark and Dale are welcome.

> > - you change several generic files to support your platform. It should
> >    be possible to support new mv64x60 platforms by writing a new
> >    xxx_setup.c file in arch/ppc/platforms with no other generic changes.
> >    It is a goal that all mv64x60 boards can be supported by the generic
> >    code in arch/ppc/syslib. If some changes need to be made outside
> >    arch/ppc/platforms to support your board, try to make them generic so
> >    that other similar boards would be able to use them. I suggest you
> >    clone chrp_setup.c or katana.c rather than adding conditionals in
> >    chrp_setup.c for your board. Then use code in your board specific
> >    setup file to call arch/ppc/syslib mv64x60 routines as appropriate.
> 
> There is almost no changes compare to 2.6.11 (from kernel.org).

I have appended a (slightly revised) version of the patch, which is against a
saturday/sunday checkout of bk://dfarnsworth.bkbits.net/linux-2.5-mv643xx-enet, 
which is what Mark and Dale are working on. Viewed like that the patch is
against to really manageable size, altough it may need some fine-tuning. The
rest of your comments probably apply to Dale's and Mark's work in the above
tree though.

Friendly,

Sven Luther
-------------- next part --------------
--- linux-2.5-mv643xx-enet/arch/ppc/boot/simple/Makefile        2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/arch/ppc/boot/simple/Makefile  2005-03-07 
14:13:14.000000000 +0100
@@ -162,7 +162,7 @@
 boot-$(CONFIG_8260)            += embed_config.o
 boot-$(CONFIG_BSEIP)           += iic.o
 boot-$(CONFIG_MBX)             += iic.o pci.o qspan_pci.o
-boot-$(CONFIG_MV64X60)         += misc-mv64x60.o
+boot-$(CONFIG_MV64X60)         += misc-mv64x60.o mv64x60_stub.o
 boot-$(CONFIG_RPXCLASSIC)      += iic.o pci.o qspan_pci.o
 boot-$(CONFIG_RPXLITE)         += iic.o
 # Different boards need different serial implementations.
--- linux-2.5-mv643xx-enet/arch/ppc/platforms/chrp_setup.c      2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/arch/ppc/platforms/chrp_setup.c        2005-03-07 
14:13:14.000000000 +0100
@@ -217,8 +217,13 @@
        }
 }
 
+#ifdef CONFIG_MV64X60
+#include <linux/mv643xx.h>
+#include <asm/mv64x60.h>
+#endif
+
 
-static void __init pegasos_set_l2cr(void)
+static void __init pegasos_stuff(void)
 {
        struct device_node *np;
 
@@ -242,6 +247,19 @@
                        _set_L2CR((*l2cr) | 0x80000000);
                }
        }
+
+#ifdef CONFIG_MV64X60
+       // Pegasos II (MV64361)
+       // We have to call mv64x60_init() in arch/ppc/syslib/mv64x60.c 
+       // This call will do NOTHING but set the correct value for IRQ & reg 
base...
+       // This is needed because new Marvell ethernet driver get theses info 
from
+       // there
+       {
+               static struct mv64x60_handle bh;
+               static struct mv64x60_setup_info si;
+               mv64x60_init(&bh, &si);
+       }
+#endif
 }
 
 void __init chrp_setup_arch(void)
@@ -262,7 +280,7 @@
                ROOT_DEV = Root_SDA2; /* sda2 (sda1 is for the kernel) */
 
        /* On pegasos, enable the L2 cache if not already done by OF */
-       pegasos_set_l2cr();
+       pegasos_stuff();
 
        /* Lookup PCI host bridges */
        chrp_find_bridges();
--- linux-2.5-mv643xx-enet/arch/ppc/syslib/Makefile     2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/arch/ppc/syslib/Makefile       2005-03-07 
14:13:14.000000000 +0100
@@ -59,8 +59,8 @@
                                        open_pic.o i8259.o hawk_common.o
 obj-$(CONFIG_MENF1)            += todc_time.o i8259.o mpc10x_common.o \
                                        pci_auto.o indirect_pci.o
-obj-$(CONFIG_MV64360)          += mv64360_pic.o
-obj-$(CONFIG_MV64X60)          += mv64x60.o mv64x60_win.o indirect_pci.o
+obj-$(CONFIG_MV64360)          +=
+obj-$(CONFIG_MV64X60)          += mv64x60.o mv64x60_win.o indirect_pci.o 
mv64360_pic.o
 obj-$(CONFIG_MVME5100)         += open_pic.o todc_time.o indirect_pci.o \
                                        pci_auto.o hawk_common.o
 obj-$(CONFIG_MVME5100_IPMC761_PRESENT) += i8259.o
--- linux-2.5-mv643xx-enet/arch/ppc/syslib/mv64360_pic.c        2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/arch/ppc/syslib/mv64360_pic.c  2005-03-07 
14:13:14.000000000 +0100
@@ -369,6 +369,10 @@
        u32     mask;
        int     rc;
 
+       if ( mv64360_ispegasos2() ) return 0;
+
+       printk("not pegasos\n");
+
        /* Clear old errors and register CPU interface error intr handler */
        mv64x60_write(&bh, MV64x60_CPU_ERR_CAUSE, 0);
        if ((rc = request_irq(MV64x60_IRQ_CPU_ERR,
--- linux-2.5-mv643xx-enet/arch/ppc/syslib/mv64x60.c    2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/arch/ppc/syslib/mv64x60.c      2005-03-07 
14:21:04.000000000 +0100
@@ -314,15 +314,15 @@
 static struct resource mv64x60_eth_shared_resources[] = {
        [0] = {
                .name   = "ethernet shared base",
-               .start  = MV64340_ETH_SHARED_REGS,
-               .end    = MV64340_ETH_SHARED_REGS +
-                                       MV64340_ETH_SHARED_REGS_SIZE - 1,
+               .start  = MV643XX_ETH_SHARED_REGS,
+               .end    = MV643XX_ETH_SHARED_REGS +
+                                       MV643XX_ETH_SHARED_REGS_SIZE - 1,
                .flags  = IORESOURCE_MEM,
        },
 };
 
 static struct platform_device mv64x60_eth_shared_device = {
-       .name           = MV64XXX_ETH_SHARED_NAME,
+       .name           = MV643XX_ETH_SHARED_NAME,
        .id             = 0,
        .num_resources  = ARRAY_SIZE(mv64x60_eth_shared_resources),
        .resource       = mv64x60_eth_shared_resources,
@@ -341,7 +341,7 @@
 static struct mv64xxx_eth_platform_data eth0_pd;
 
 static struct platform_device eth0_device = {
-       .name           = MV64XXX_ETH_NAME,
+       .name           = MV643XX_ETH_NAME,
        .id             = 0,
        .num_resources  = ARRAY_SIZE(mv64x60_eth0_resources),
        .resource       = mv64x60_eth0_resources,
@@ -361,10 +361,10 @@
        },
 };
 
-static struct mv64xxx_eth_platform_data eth1_pd;
+static struct mv643xx_eth_platform_data eth1_pd;
 
 static struct platform_device eth1_device = {
-       .name           = MV64XXX_ETH_NAME,
+       .name           = MV643XX_ETH_NAME,
        .id             = 1,
        .num_resources  = ARRAY_SIZE(mv64x60_eth1_resources),
        .resource       = mv64x60_eth1_resources,
@@ -475,17 +475,58 @@
 {
        u32     mem_windows[MV64x60_CPU2MEM_WINDOWS][2];
 
-       if (ppc_md.progress)
-               ppc_md.progress("mv64x60 initialization", 0x0);
+       if (ppc_md.progress) ppc_md.progress("mv64x60 initialization", 0x0);
+
+#if defined(CONFIG_PPC_MULTIPLATFORM)
+       if (mv64360_ispegasos2())
+       {
+               // Pegasos II stuff
+
+               if (ppc_md.progress)
+                       ppc_md.progress("mv64x60: Pegasos II Detected, skiping 
most of the init code & patching the ressources tables", 0x0);
+
+               spin_lock_init(&mv64x60_lock);
+
+               if (mv64x60_get_type(bh) || mv64x60_setup_for_chip(bh))
+               {
+                       if (ppc_md.progress) ppc_md.progress("mv64x60_init: 
Init error", 0x0);
+                       return -1;
+               }
+
+               // Pegasos II use IRQ 9 for every port
+               // Also notice that the ethernet driver (& others) have to 
+               // use SA_SHIRQ instead of SA_INTERRUPT
+               // Also the Pegasos II has only port 0 & 1 available (MV64361)
+               
+#ifdef CONFIG_MV643XX_ETH_0
+               mv64x60_eth0_resources[0].start = 9;
+               mv64x60_eth0_resources[0].end = 9;
+#endif
 
+#ifdef CONFIG_MV643XX_ETH_1
+               mv64x60_eth1_resources[0].start = 9;
+               mv64x60_eth1_resources[0].end = 9;
+#endif
+
+               // Marvell register is at 0xf1000000 on Pegasos II
+               mv64x60_eth_shared_resources[0].start = 0xf1000000 + 
MV643XX_ETH_SHARED_REGS;
+               mv64x60_eth_shared_resources[0].end = 0xf1000000 + 
MV643XX_ETH_SHARED_REGS + MV643XX_ETH_SHARED_REGS_SIZE - 1;
+       
+               // For Pegasos II, we stop here
+               // Indeed, we only need the resources info for
+               // the ethernet driver ATM
+               if (ppc_md.progress) ppc_md.progress("mv64x60: End", 0x0);
+               return 0;
+       }
+#endif
+       
        spin_lock_init(&mv64x60_lock);
        mv64x60_early_init(bh, si);
 
        if (mv64x60_get_type(bh) || mv64x60_setup_for_chip(bh)) {
                iounmap(bh->v_base);
                bh->v_base = 0;
-               if (ppc_md.progress)
-                       ppc_md.progress("mv64x60_init: Can't determine chip",0);
+               if (ppc_md.progress) ppc_md.progress("mv64x60_init: Can't 
determine chip",0);
                return -1;
        }
 
@@ -823,6 +864,18 @@
        u16     val;
        u8      save_exclude;
 
+#if defined(CONFIG_PPC_MULTIPLATFORM)
+       if (mv64360_ispegasos2())
+       {
+               // we could use the OF pci stuff
+               // but we know Pegasos II use the MV64361 chipset
+               // If people think it's not nice enough I could add some PCI 
code
+               // to detect that using OF
+               bh->type = MV64x60_TYPE_MV64360;
+               return 0;
+       }
+#endif
+
        memset(&hose, 0, sizeof(hose));
        setup_indirect_pci_nomap(&hose, bh->v_base + MV64x60_PCI0_CONFIG_ADDR,
                bh->v_base + MV64x60_PCI0_CONFIG_DATA);
--- linux-2.5-mv643xx-enet/drivers/net/Kconfig  2005-03-07 14:15:29.000000000 
+0100
+++ kernel-source-2.6.11/drivers/net/Kconfig    2005-03-07 14:13:14.000000000 
+0100
@@ -2094,11 +2094,11 @@
 
 config MV643XX_ETH
        tristate "MV-643XX Ethernet support"
-       depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360
+       depends on MOMENCO_OCELOT_CA || MOMENCO_JAGUAR_ATX || MV64X60
        help
          This driver supports the gigabit Ethernet on the Marvell MV643XX
-         chipset which is used in the Momenco Ocelot C and Jaguar ATX and
-         Pegasos II, amongst other PPC and MIPS boards.
+         chipset which is used in the Momenco Ocelot C, Jaguar ATX and
+         bPlan Pegasos II computer.
 
 config MV643XX_ETH_0
        bool "MV-643XX Port 0"
--- linux-2.5-mv643xx-enet/drivers/net/mv643xx_eth.c    2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/drivers/net/mv643xx_eth.c      2005-03-07 
14:25:38.000000000 +0100
@@ -44,6 +44,7 @@
 #include <asm/pgtable.h>
 #include <asm/system.h>
 #include <asm/delay.h>
+#include <asm/mv64x60.h>
 #include "mv643xx_eth.h"
 
 /*
@@ -664,11 +665,16 @@
        struct mv643xx_private *mp = netdev_priv(dev);
        unsigned int port_num = mp->port_num;
        int err;
-
+#if defined(CONFIG_PPC_MULTIPLATFORM)
+       int IRQ_Flags = mv64360_ispegasos2() ? SA_SHIRQ : SA_INTERRUPT;
+#else
+       int IRQ_Flags = SA_INTERRUPT;
+#endif
+       
        spin_lock_irq(&mp->lock);
 
        err = request_irq(dev->irq, mv643xx_eth_int_handler,
-                       SA_INTERRUPT | SA_SAMPLE_RANDOM, dev->name, dev);
+                       IRQ_Flags | SA_SAMPLE_RANDOM, dev->name, dev);
 
        if (err) {
                printk(KERN_ERR "Can not assign IRQ number to MV643XX_eth%d\n",
@@ -1383,6 +1389,8 @@
        BUG_ON(!res);
        dev->irq = res->start;
 
+       printk(KERN_INFO "%s: Using IRQ %d\n", __func__, dev->irq);
+
        mp->port_num = port_num;
 
        dev->open = mv643xx_eth_open;
@@ -1587,6 +1595,8 @@
                if (rc)
                        driver_unregister(&mv643xx_eth_shared_driver);
        }
+
+       printk("%s: return %d\n", __func__, rc);
        return rc;
 }
 
--- linux-2.5-mv643xx-enet/include/asm-ppc/mv64x60.h    2005-03-07 
14:15:29.000000000 +0100
+++ kernel-source-2.6.11/include/asm-ppc/mv64x60.h      2005-03-07 
14:18:27.000000000 +0100
@@ -27,6 +27,19 @@
 #include <asm/pci-bridge.h>
 #include <asm/mv64x60_defs.h>
 
+/*
+ * return 1 if you are on a Pegasos II, 0 otherwise
+ * this code is useful to execute the correct code 
+ * on the correct machine
+ * 
+*/
+#if defined(CONFIG_PPC_MULTIPLATFORM)
+extern inline int mv64360_ispegasos2(void)
+{
+       return ((_machine == _MACH_chrp) && (_chrp_type == _CHRP_Pegasos)) ? 1 
: 0;
+}
+#endif
+
 extern u8      mv64x60_pci_exclude_bridge;
 
 extern spinlock_t mv64x60_lock;

Reply via email to