On Fri, Jul 24, 2009 at 11:21:56AM -0400, Solomon Peachy wrote:
>This patch adds support for the ESTeem 195E Hotfoot SBC.
>I've been maintaining this out-of-tree for some time now for
>older kernels, but recently I ported it to the new unified powerpc 
>tree with the intent of pushing it upstream.
>
>The 195E boards use ancient versions of u-boot and a slightly mangled
>verison of the oft-abused ppcboot header. 
>
>There are several variants of the SBC deployed, single/dual
>ethernet+serial, and also 4MB/8MB flash variations.  In the interest of
>having a single kernel image boot on all boards, the cuboot shim detects
>the differences and mangles the DTS tree appropriately.
>
>With the exception of the CF interface that was never populated on
>production boards, this code/DTS supports all boardpop options.
>
>Signed-off-by:  Solomon Peachy <solo...@linux-wlan.com>

Overall, really nice.  Just a few questions below.

>--- linux-2.6.30/arch/powerpc/boot/cuboot-hotfoot.c    1969-12-31 
>19:00:00.000000000 -0500
>+++ linux-2.6.30.hotfoot/arch/powerpc/boot/cuboot-hotfoot.c    2009-07-07 
>12:55:23.000000000 -0400
>@@ -0,0 +1,142 @@
>+/*
>+ * Old U-boot compatibility for Esteem 195E Hotfoot CPU Board
>+ *
>+ * Author: Solomon Peachy <solo...@linux-wlan.com>
>+ *
>+ * This program is free software; you can redistribute it and/or modify it
>+ * under the terms of the GNU General Public License version 2 as published
>+ * by the Free Software Foundation.
>+ */
>+
>+#include "ops.h"
>+#include "stdio.h"
>+#include "reg.h"
>+#include "dcr.h"
>+#include "4xx.h"
>+#include "cuboot.h"
>+
>+#define TARGET_4xx
>+#define TARGET_HOTFOOT
>
>+#include "ppcboot.h"
>+
>+static bd_t bd;
>+
>+#define NUM_REGS 3
>+
>+static void hotfoot_fixups(void)
>+{
>+      u32 uart = mfdcr(DCRN_CPC0_UCR) & 0x7f;
>+
>+      dt_fixup_memory(bd.bi_memstart, bd.bi_memsize); 
>+
>+      dt_fixup_cpu_clocks(bd.bi_procfreq, bd.bi_procfreq, 0);
>+      dt_fixup_clock("/plb", bd.bi_plb_busfreq);
>+      dt_fixup_clock("/plb/opb", bd.bi_opbfreq);
>+      dt_fixup_clock("/plb/ebc", bd.bi_pci_busfreq);
>+      dt_fixup_clock("/plb/opb/ser...@ef600300", bd.bi_procfreq / uart); 
>+      dt_fixup_clock("/plb/opb/ser...@ef600400", bd.bi_procfreq / uart); 
>+      
>+      dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
>+      dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
>+
>+      /* Is this a single eth/serial board? */
>+      if ((bd.bi_enet1addr[0] == 0) && 
>+          (bd.bi_enet1addr[1] == 0) &&
>+          (bd.bi_enet1addr[2] == 0) &&
>+          (bd.bi_enet1addr[3] == 0) &&
>+          (bd.bi_enet1addr[4] == 0) &&
>+          (bd.bi_enet1addr[5] == 0)) {
>+              void *devp;
>+
>+              printf("Trimming devtree for single eth board\n");
>+
>+              devp = finddevice("/plb/opb/ser...@ef600300");
>+              if (!devp)
>+                      fatal("Can't find node for /plb/opb/ser...@ef600300");
>+              del_node(devp);

Slightly confused here.  You delete the first serial node in the single eth
case?

>+
>+              devp = finddevice("/plb/opb/ether...@ef600900");
>+              if (!devp)
>+                      fatal("Can't find node for /plb/opb/ether...@ef600900");
>+              del_node(devp);
>+      }
>+
>+      ibm4xx_quiesce_eth((u32 *)0xef600800, (u32 *)0xef600900);

Shouldn't you do the quiesce conditionally if the other eth port doesn't
exist?

>+
>+      /* Fix up flash size in fdt for 4M boards. */
>+      if (bd.bi_flashsize < 0x800000) {
>+              u32 regs[NUM_REGS];
>+              void *devp = finddevice("/plb/ebc/nor_fl...@0");
>+              if (!devp)
>+                      fatal("Can't find FDT node for nor_flash!??");
>+
>+              printf("Fixing devtree for 4M Flash\n");
>+              
>+              /* First fix up the base addresse */
>+              getprop(devp, "reg", regs, sizeof(regs));
>+              regs[0] = 0;
>+              regs[1] = 0xffc00000;
>+              regs[2] = 0x00400000;
>+              setprop(devp, "reg", regs, sizeof(regs));
>+              
>+              /* Then the offsets */
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@0");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@0");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@1");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@1");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@2");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@2");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@3");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@3");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@4");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@4");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@6");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@6");
>+              getprop(devp, "reg", regs, 2*sizeof(u32));
>+              regs[0] -= 0x400000;
>+              setprop(devp, "reg", regs,  2*sizeof(u32));
>+
>+              /* Delete the FeatFS node */
>+              devp = finddevice("/plb/ebc/nor_fl...@0/partit...@5");
>+              if (!devp)
>+                      fatal("Can't find FDT node for partit...@5");
>+              del_node(devp);
>+      }
>+}
>+
>+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
>+                 unsigned long r6, unsigned long r7)
>+{
>+      CUBOOT_INIT();
>+      platform_ops.fixups = hotfoot_fixups;
>+        platform_ops.exit = ibm40x_dbcr_reset;
>+      fdt_init(_dtb_start);
>+      serial_console_init();
>+}
>diff -Naur linux-2.6.30/arch/powerpc/boot/dts/hotfoot.dts 
>linux-2.6.30.hotfoot/arch/powerpc/boot/dts/hotfoot.dts
>--- linux-2.6.30/arch/powerpc/boot/dts/hotfoot.dts     1969-12-31 
>19:00:00.000000000 -0500
>+++ linux-2.6.30.hotfoot/arch/powerpc/boot/dts/hotfoot.dts     2009-07-07 
>12:55:23.000000000 -0400
>@@ -0,0 +1,299 @@
>+/*
>+ * Device Tree Source for ESTeem 195E Hotfoot
>+ *
>+ * Copyright 2009 AbsoluteValue Systems <solo...@linux-wlan.com>
>+ *
>+ * This file is licensed under the terms of the GNU General Public
>+ * License version 2.  This program is licensed "as is" without
>+ * any warranty of any kind, whether express or implied.
>+ */
>+
>+/dts-v1/;
>+
>+/ {
>+      #address-cells = <1>;
>+      #size-cells = <1>;
>+      model = "est,hotfoot";
>+      compatible = "est,hotfoot";
>+      dcr-parent = <&{/cpus/c...@0}>;
>+
>+      aliases {
>+              ethernet0 = &EMAC0;
>+              ethernet1 = &EMAC1;
>+              serial0 = &UART0;
>+              serial1 = &UART1;
>+      };
>+
>+      cpus {
>+              #address-cells = <1>;
>+              #size-cells = <0>;
>+
>+              c...@0 {
>+                      device_type = "cpu";
>+                      model = "PowerPC,405EP";
>+                      reg = <0x00000000>;
>+                      clock-frequency = <0>; /* Filled in by zImage */
>+                      timebase-frequency = <0>; /* Filled in by zImage */
>+                      i-cache-line-size = <0x20>;
>+                      d-cache-line-size = <0x20>;
>+                      i-cache-size = <0x4000>;
>+                      d-cache-size = <0x4000>;
>+                      dcr-controller;
>+                      dcr-access-method = "native";
>+              };
>+      };
>+
>+      memory {
>+              device_type = "memory";
>+              reg = <0x00000000 0x00000000>; /* Filled in by zImage */
>+      };
>+
>+      UIC0: interrupt-controller {
>+              compatible = "ibm,uic";
>+              interrupt-controller;
>+              cell-index = <0>;
>+              dcr-reg = <0x0c0 0x009>;
>+              #address-cells = <0>;
>+              #size-cells = <0>;
>+              #interrupt-cells = <2>;
>+      };
>+
>+      plb {
>+              compatible = "ibm,plb3";
>+              #address-cells = <1>;
>+              #size-cells = <1>;
>+              ranges;
>+              clock-frequency = <0>; /* Filled in by zImage */
>+
>+              SDRAM0: memory-controller {
>+                      compatible = "ibm,sdram-405ep";
>+                      dcr-reg = <0x010 0x002>;
>+              };
>+
>+              MAL: mcmal {
>+                      compatible = "ibm,mcmal-405ep", "ibm,mcmal";
>+                      dcr-reg = <0x180 0x062>;
>+                      num-tx-chans = <4>;
>+                      num-rx-chans = <2>;
>+                      interrupt-parent = <&UIC0>;
>+                      interrupts = <
>+                              0xb 0x4 /* TXEOB */
>+                              0xc 0x4 /* RXEOB */
>+                              0xa 0x4 /* SERR */
>+                              0xd 0x4 /* TXDE */
>+                              0xe 0x4 /* RXDE */>;
>+              };
>+
>+              POB0: opb {
>+                      compatible = "ibm,opb-405ep", "ibm,opb";
>+                      #address-cells = <1>;
>+                      #size-cells = <1>;
>+                      ranges = <0xef600000 0xef600000 0x00a00000>;
>+                      dcr-reg = <0x0a0 0x005>;
>+                      clock-frequency = <0>; /* Filled in by zImage */
>+
>+                      /* Hotfoot has UART0/UART1 swapped */
>+
>+                      UART0: ser...@ef600400 {
>+                              device_type = "serial";
>+                              compatible = "ns16550";
>+                              reg = <0xef600400 0x00000008>;
>+                              virtual-reg = <0xef600400>;
>+                              clock-frequency = <0>; /* Filled in by zImage */
>+                              current-speed = <0x9600>;

Just a question, but is the baud supposed to be 38400 or 9600?  At first glance
it almost seems like a typo :).

>+                              interrupt-parent = <&UIC0>;
>+                              interrupts = <0x1 0x4>;
>+                      };
>+
>+                      UART1: ser...@ef600300 {
>+                              device_type = "serial";
>+                              compatible = "ns16550";
>+                              reg = <0xef600300 0x00000008>;
>+                              virtual-reg = <0xef600300>;
>+                              clock-frequency = <0>; /* Filled in by zImage */
>+                              current-speed = <0x9600>;
>+                              interrupt-parent = <&UIC0>;
>+                              interrupts = <0x0 0x4>;
>+                      };
>+
>+
>+                      IIC: i...@ef600500 {
>+                              compatible = "ibm,iic-405ep", "ibm,iic";
>+                              reg = <0xef600500 0x00000011>;
>+                              interrupt-parent = <&UIC0>;
>+                              interrupts = <0x2 0x4>;
>+
>+                              r...@68 {
>+                                    /* Actually a DS1339 */
>+                                    compatible = "dallas,ds1307"; 
>+                                    reg = <0x68>;
>+                              };
>+
>+                              t...@4a { 
>+                                    /* Not present on all boards */
>+                                    compatible = "national,lm75";
>+                                    reg = <0x4a>;
>+                              };                              
>+                      };
>+
>+                      GPIO: g...@ef600700 {
>+                              #gpio-cells = <2>;
>+                              compatible = "ibm,ppc4xx-gpio";
>+                              reg = <0xef600700 0x00000020>;
>+                              gpio-controller;
>+                      };
>+
>+                      gpio-leds {
>+                           compatible = "gpio-leds";
>+                           status {
>+                                  label = "Status";
>+                                  gpios = <&GPIO 1 0>;
>+                                  /* linux,default=trigger = ".."; */

What does that comment mean?

>+                           };
>+                           radiorx {
>+                                  label = "Rx";
>+                                  gpios = <&GPIO 0xe 0>;
>+                                  /* linux,default=trigger = ".."; */
>+                           };
>+                      };
>+

<snip>

>diff -Naur linux-2.6.30/arch/powerpc/boot/ppcboot.h 
>linux-2.6.30.hotfoot/arch/powerpc/boot/ppcboot.h
>--- linux-2.6.30/arch/powerpc/boot/ppcboot.h   2009-06-09 23:05:27.000000000 
>-0400
>+++ linux-2.6.30.hotfoot/arch/powerpc/boot/ppcboot.h   2009-07-07 
>12:55:18.000000000 -0400
>@@ -52,6 +52,11 @@
>       unsigned long   bi_bootflags;   /* boot / reboot flag (for LynxOS) */
>       unsigned long   bi_ip_addr;     /* IP Address */
>       unsigned char   bi_enetaddr[6]; /* Ethernet address */
>+#if defined(TARGET_HOTFOOT)
>+      /* second onboard ethernet port */
>+      unsigned char   bi_enet1addr[6];
>+#define HAVE_ENET1ADDR
>+#endif /* TARGET_HOOTFOOT */
>       unsigned short  bi_ethspeed;    /* Ethernet speed in Mbps */
>       unsigned long   bi_intfreq;     /* Internal Freq, in MHz */
>       unsigned long   bi_busfreq;     /* Bus Freq, in MHz */
>@@ -74,6 +79,9 @@
>       unsigned int    bi_pci_busfreq; /* PCI Bus speed, in Hz */
>       unsigned char   bi_pci_enetaddr[6];     /* PCI Ethernet MAC address */
> #endif
>+#if defined(TARGET_HOTFOOT)
>+      unsigned int     bi_pllouta_freq;       /* PLL OUTA speed, in Hz */
>+#endif
> #if defined(TARGET_HYMOD)
>       hymod_conf_t    bi_hymod_conf;  /* hymod configuration information */
> #endif
>@@ -94,6 +102,10 @@
>       unsigned char   bi_enet3addr[6];
> #define HAVE_ENET3ADDR
> #endif
>+#if defined(TARGET_HOTFOOT)
>+        int             bi_phynum[2];           /* Determines phy mapping */
>+        int             bi_phymode[2];          /* Determines phy mode */
>+#endif
> #if defined(TARGET_4xx)
>       unsigned int    bi_opbfreq;             /* OB clock in Hz */
>       int             bi_iic_fast[2];         /* Use fast i2c mode */

Ok.  So I'm not really all that thrilled with changes to ppcboot.h.  We try to
keep this file as much in-sync with U-Boot as we can.  Did your HOTFOOT changes
get pulled into upstream U-Boot?

josh
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to