[U-Boot-Users] [PATCH 3/2] Fix the ft_cpu_setup() property settings.
Jerry Van Baren
gvb.uboot at gmail.com
Sun Apr 15 20:00:28 CEST 2007
Use "setter" functions instead of flags, cleaner and more flexible.
It also fixes the problem noted by Timur Tabi that the ethernet MAC
addresses were all being set incorrectly to the same MAC address.
Signed-off-by: Gerald Van Baren <vanbaren at cideas.com>
---
Hi Timur,
This patch implements the setter functions as your suggested. Please
review and let me know if it looks good.
I labeled this patch 3 of 2 since it really belongs with the two I posted
last night.
I've pushed the change to u-boot-fdt.
Best regards,
gvb
cpu/mpc83xx/cpu.c | 189 ++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 135 insertions(+), 54 deletions(-)
diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c
index aa4d9b1..e934ba6 100644
--- a/cpu/mpc83xx/cpu.c
+++ b/cpu/mpc83xx/cpu.c
@@ -300,93 +300,174 @@ void watchdog_reset (void)
#if defined(CONFIG_OF_LIBFDT)
/*
+ * "Setter" functions used to add/modify FDT entries.
+ */
+static int fdt_set_eth0(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+ /*
+ * Fix it up if it exists, don't create it if it doesn't exist.
+ */
+ if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+ return fdt_setprop(fdt, nodeoffset, name, bd->bi_enetaddr, 6);
+ }
+ return -FDT_ERR_NOTFOUND;
+}
+#ifdef CONFIG_HAS_ETH1
+/* second onboard ethernet port */
+static int fdt_set_eth1(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+ /*
+ * Fix it up if it exists, don't create it if it doesn't exist.
+ */
+ if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+ return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet1addr, 6);
+ }
+ return -FDT_ERR_NOTFOUND;
+}
+#endif
+#ifdef CONFIG_HAS_ETH2
+/* third onboard ethernet port */
+static int fdt_set_eth2(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+ /*
+ * Fix it up if it exists, don't create it if it doesn't exist.
+ */
+ if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+ return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet2addr, 6);
+ }
+ return -FDT_ERR_NOTFOUND;
+}
+#endif
+#ifdef CONFIG_HAS_ETH3
+/* fourth onboard ethernet port */
+static int fdt_set_eth3(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+ /*
+ * Fix it up if it exists, don't create it if it doesn't exist.
+ */
+ if (fdt_get_property(fdt, nodeoffset, name, 0)) {
+ return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet3addr, 6);
+ }
+ return -FDT_ERR_NOTFOUND;
+}
+#endif
+
+static int fdt_set_busfreq(void *fdt, int nodeoffset, const char *name, bd_t *bd)
+{
+ u32 tmp;
+ /*
+ * Create or update the property.
+ */
+ tmp = cpu_to_be32(bd->bi_busfreq);
+ return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
+}
+
+/*
* Fixups to the fdt. If "create" is TRUE, the node is created
* unconditionally. If "create" is FALSE, the node is updated
* only if it already exists.
*/
-#define FT_UPDATE 0x00000000 /* update existing property only */
-#define FT_CREATE 0x00000001 /* create property if it doesn't exist */
-#define FT_BUSFREQ 0x00000002 /* source is bd->bi_busfreq */
-#define FT_ENETADDR 0x00000004 /* source is bd->bi_enetaddr */
static const struct {
- int createflags;
char *node;
char *prop;
+ int (*set_fn)(void *fdt, int nodeoffset, const char *name, bd_t *bd);
} fixup_props[] = {
- { FT_CREATE | FT_BUSFREQ,
- "/cpus/" OF_CPU,
+ { "/cpus/" OF_CPU,
"bus-frequency",
+ fdt_set_busfreq
},
- { FT_CREATE | FT_BUSFREQ,
- "/cpus/" OF_SOC,
- "bus-frequency"
+ { "/cpus/" OF_SOC,
+ "bus-frequency",
+ fdt_set_busfreq
},
- { FT_CREATE | FT_BUSFREQ,
- "/" OF_SOC "/serial at 4500/",
- "clock-frequency"
+ { "/" OF_SOC "/serial at 4500/",
+ "clock-frequency",
+ fdt_set_busfreq
},
- { FT_CREATE | FT_BUSFREQ,
- "/" OF_SOC "/serial at 4600/",
- "clock-frequency"
+ { "/" OF_SOC "/serial at 4600/",
+ "clock-frequency",
+ fdt_set_busfreq
},
#ifdef CONFIG_MPC83XX_TSEC1
- { FT_UPDATE | FT_ENETADDR,
- "/" OF_SOC "/ethernet at 24000,
+ { "/" OF_SOC "/ethernet at 24000,
"mac-address",
+ fdt_set_eth0
},
- { FT_UPDATE | FT_ENETADDR,
- "/" OF_SOC "/ethernet at 24000,
+ { "/" OF_SOC "/ethernet at 24000,
"local-mac-address",
+ fdt_set_eth0
},
#endif
#ifdef CONFIG_MPC83XX_TSEC2
- { FT_UPDATE | FT_ENETADDR,
- "/" OF_SOC "/ethernet at 25000,
+ { "/" OF_SOC "/ethernet at 25000,
+ "mac-address",
+ fdt_set_eth1
+ },
+ { "/" OF_SOC "/ethernet at 25000,
+ "local-mac-address",
+ fdt_set_eth1
+ },
+#endif
+#ifdef CONFIG_UEC_ETH1
+#if CFG_UEC1_UCC_NUM == 0 /* UCC1 */
+ { "/" OF_QE "/ucc at 2000/mac-address",
+ "mac-address",
+ fdt_set_eth0
+ },
+ { "/" OF_QE "/ucc at 2000/mac-address",
+ "local-mac-address",
+ fdt_set_eth0
+ },
+#elif CFG_UEC1_UCC_NUM == 2 /* UCC3 */
+ { "/" OF_QE "/ucc at 2200/mac-address",
+ "mac-address",
+ fdt_set_eth0
+ },
+ { "/" OF_QE "/ucc at 2200/mac-address",
+ "local-mac-address",
+ fdt_set_eth0
+ },
+#endif
+#endif
+#ifdef CONFIG_UEC_ETH2
+#if CFG_UEC2_UCC_NUM == 1 /* UCC2 */
+ { "/" OF_QE "/ucc at 3000/mac-address",
"mac-address",
+ fdt_set_eth1
},
- { FT_UPDATE | FT_ENETADDR,
- "/" OF_SOC "/ethernet at 25000,
+ { "/" OF_QE "/ucc at 3000/mac-address",
"local-mac-address",
+ fdt_set_eth1
+ },
+#elif CFG_UEC1_UCC_NUM == 3 /* UCC4 */
+ { "/" OF_QE "/ucc at 3200/mac-address",
+ "mac-address",
+ fdt_set_eth1
},
+ { "/" OF_QE "/ucc at 3200/mac-address",
+ "local-mac-address",
+ fdt_set_eth1
+ },
+#endif
#endif
};
void
ft_cpu_setup(void *blob, bd_t *bd)
{
- int nodeoffset;
- int err;
- int j;
+ int nodeoffset;
+ int err;
+ int j;
for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) {
- nodeoffset = fdt_path_offset (fdt, fixup_props[j].node);
+ nodeoffset = fdt_path_offset(fdt, fixup_props[j].node);
if (nodeoffset >= 0) {
- /*
- * If unconditional create or the property already exists...
- */
- err = 0;
- if ((fixup_props[j].createflags & FT_CREATE) ||
- (fdt_get_property(fdt, nodeoffset, fixup_props[j].prop, 0))) {
- if (fixup_props[j].createflags & FT_BUSFREQ) {
- u32 tmp;
-
- tmp = cpu_to_be32(bd->bi_busfreq);
- err = fdt_setprop(fdt, nodeoffset,
- fixup_props[j].prop, &tmp, sizeof(tmp));
- } else if (fixup_props[j].createflags & FT_ENETADDR) {
- err = fdt_setprop(fdt, nodeoffset,
- fixup_props[j].prop, bd->bi_enetaddr, 6);
- } else {
- printf("ft_cpu_setup: %s %s has no flag for the value to set\n",
- fixup_props[j].node,
- fixup_props[j].prop);
- }
- if (err < 0)
- printf("libfdt: %s %s returned %s\n",
- fixup_props[j].node,
- fixup_props[j].prop,
- fdt_strerror(err));
- }
+ err = (*fixup_props[j].set_fn)(blob, nodeoffset, fixup_props[j].prop, bd);
+ if (err < 0)
+ printf("set_fn/libfdt: %s %s returned %s\n",
+ fixup_props[j].node,
+ fixup_props[j].prop,
+ fdt_strerror(err));
}
}
}
--
1.4.4.4
More information about the U-Boot
mailing list