[U-Boot] [PATCH] fdt: rework fdt_fixup_ethernet() to use env instead of bd_t

Move to using the environment variables 'ethaddr', 'eth1addr', etc.. instead of bd->bi_enetaddr, bi_enet1addr, etc.
This makes the code a bit more flexible to the number of ethernet interfaces. Right now we assume a max of 10 interfaces.
Signed-off-by: Kumar Gala galak@kernel.crashing.org --- common/fdt_support.c | 65 +++++++++++++++++++++++------------------------- cpu/74xx_7xx/cpu.c | 2 +- cpu/mpc512x/cpu.c | 2 +- cpu/mpc8260/cpu.c | 2 +- cpu/mpc83xx/fdt.c | 2 +- cpu/mpc85xx/fdt.c | 2 +- cpu/mpc86xx/fdt.c | 2 +- cpu/mpc8xx/fdt.c | 2 +- cpu/ppc4xx/fdt.c | 2 +- include/fdt_support.h | 2 +- 10 files changed, 40 insertions(+), 43 deletions(-)
diff --git a/common/fdt_support.c b/common/fdt_support.c index 93b144e..0b67ee0 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -371,49 +371,46 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size) #if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) ||\ defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3)
-void fdt_fixup_ethernet(void *fdt, bd_t *bd) +#define CFG_MAX_NUM_ETH (10) +void fdt_fixup_ethernet(void *fdt) { + int i, j; int node; const char *path;
node = fdt_path_offset(fdt, "/aliases"); if (node >= 0) { -#if defined(CONFIG_HAS_ETH0) - path = fdt_getprop(fdt, node, "ethernet0", NULL); - if (path) { - do_fixup_by_path(fdt, path, "mac-address", - bd->bi_enetaddr, 6, 0); - do_fixup_by_path(fdt, path, "local-mac-address", - bd->bi_enetaddr, 6, 1); - } -#endif -#if defined(CONFIG_HAS_ETH1) - path = fdt_getprop(fdt, node, "ethernet1", NULL); - if (path) { - do_fixup_by_path(fdt, path, "mac-address", - bd->bi_enet1addr, 6, 0); - do_fixup_by_path(fdt, path, "local-mac-address", - bd->bi_enet1addr, 6, 1); - } -#endif -#if defined(CONFIG_HAS_ETH2) - path = fdt_getprop(fdt, node, "ethernet2", NULL); - if (path) { - do_fixup_by_path(fdt, path, "mac-address", - bd->bi_enet2addr, 6, 0); - do_fixup_by_path(fdt, path, "local-mac-address", - bd->bi_enet2addr, 6, 1); - } -#endif -#if defined(CONFIG_HAS_ETH3) - path = fdt_getprop(fdt, node, "ethernet3", NULL); - if (path) { + char enet[12], mac[10], *tmp, *end; + unsigned char mac_addr[6]; + + for (i = 0; i < CFG_MAX_NUM_ETH; i++) { + sprintf(enet, "ethernet%d", i); + sprintf(mac, "eth%daddr",i); + + sprintf(mac, i ? "eth%daddr" : "ethaddr", i); + tmp = getenv(mac); + path = fdt_getprop(fdt, node, enet, NULL); + + if (!path) { + debug("No alias for %s\n", enet); + continue; + } + if (!tmp) { + debug("No environment variable for %s\n", mac); + continue; + } + + for (j = 0; j < 6; j++) { + mac_addr[j] = tmp ? simple_strtoul(tmp, &end, 16) : 0; + if (tmp) + tmp = (*end) ? end+1 : end; + } + do_fixup_by_path(fdt, path, "mac-address", - bd->bi_enet3addr, 6, 0); + &mac_addr, 6, 0); do_fixup_by_path(fdt, path, "local-mac-address", - bd->bi_enet3addr, 6, 1); + &mac_addr, 6, 1); } -#endif } } #endif diff --git a/cpu/74xx_7xx/cpu.c b/cpu/74xx_7xx/cpu.c index ea43c9a..c007abc 100644 --- a/cpu/74xx_7xx/cpu.c +++ b/cpu/74xx_7xx/cpu.c @@ -314,7 +314,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
- fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); } #endif /* ------------------------------------------------------------------------- */ diff --git a/cpu/mpc512x/cpu.c b/cpu/mpc512x/cpu.c index 703e188..1f39ac4 100644 --- a/cpu/mpc512x/cpu.c +++ b/cpu/mpc512x/cpu.c @@ -191,7 +191,7 @@ void ft_cpu_setup(void *blob, bd_t *bd) #endif ft_clock_setup(blob, bd); #ifdef CONFIG_HAS_ETH0 - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); #endif } #endif diff --git a/cpu/mpc8260/cpu.c b/cpu/mpc8260/cpu.c index 4d5d141..efb8ed6 100644 --- a/cpu/mpc8260/cpu.c +++ b/cpu/mpc8260/cpu.c @@ -307,7 +307,7 @@ void ft_cpu_setup (void *blob, bd_t *bd)
#if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) ||\ defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3) - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); #endif
do_fixup_by_path_u32(blob, cpu_path, "bus-frequency", bd->bi_busfreq, 1); diff --git a/cpu/mpc83xx/fdt.c b/cpu/mpc83xx/fdt.c index fda85c1..39bd9dc 100644 --- a/cpu/mpc83xx/fdt.c +++ b/cpu/mpc83xx/fdt.c @@ -53,7 +53,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
#if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) ||\ defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3) - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); #endif
do_fixup_by_prop_u32(blob, "device_type", "cpu", 4, diff --git a/cpu/mpc85xx/fdt.c b/cpu/mpc85xx/fdt.c index c159934..bc1550d 100644 --- a/cpu/mpc85xx/fdt.c +++ b/cpu/mpc85xx/fdt.c @@ -212,7 +212,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
#if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) ||\ defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3) - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); #endif
do_fixup_by_prop_u32(blob, "device_type", "cpu", 4, diff --git a/cpu/mpc86xx/fdt.c b/cpu/mpc86xx/fdt.c index 80a5c78..12d9052 100644 --- a/cpu/mpc86xx/fdt.c +++ b/cpu/mpc86xx/fdt.c @@ -25,7 +25,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
#if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) \ || defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3) - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob); #endif
#ifdef CFG_NS16550 diff --git a/cpu/mpc8xx/fdt.c b/cpu/mpc8xx/fdt.c index 567094a..7130983 100644 --- a/cpu/mpc8xx/fdt.c +++ b/cpu/mpc8xx/fdt.c @@ -40,7 +40,7 @@ void ft_cpu_setup(void *blob, bd_t *bd) gd->brg_clk, 1);
/* Fixup ethernet MAC addresses */ - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob);
fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize); } diff --git a/cpu/ppc4xx/fdt.c b/cpu/ppc4xx/fdt.c index 0323dc5..a97484f 100644 --- a/cpu/ppc4xx/fdt.c +++ b/cpu/ppc4xx/fdt.c @@ -130,7 +130,7 @@ void ft_cpu_setup(void *blob, bd_t *bd) * Fixup all ethernet nodes * Note: aliases in the dts are required for this */ - fdt_fixup_ethernet(blob, bd); + fdt_fixup_ethernet(blob);
/* * Fixup all available PCIe nodes by setting the device_type property diff --git a/include/fdt_support.h b/include/fdt_support.h index a7c6326..f2f2cd5 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -45,7 +45,7 @@ void do_fixup_by_compat(void *fdt, const char *compat, void do_fixup_by_compat_u32(void *fdt, const char *compat, const char *prop, u32 val, int create); int fdt_fixup_memory(void *blob, u64 start, u64 size); -void fdt_fixup_ethernet(void *fdt, bd_t *bd); +void fdt_fixup_ethernet(void *fdt); int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, const void *val, int len, int create); void fdt_fixup_qe_firmware(void *fdt);

Dear Kumar Gala,
In message Pine.LNX.4.64.0808181344310.9116@blarg.am.freescale.net you wrote:
Move to using the environment variables 'ethaddr', 'eth1addr', etc.. instead of bd->bi_enetaddr, bi_enet1addr, etc.
This makes the code a bit more flexible to the number of ethernet interfaces. Right now we assume a max of 10 interfaces.
How does this match with our very static way of selecting this using 'CONFIG_HAS_ETH<n>' #defines? There is no such thing as CONFIG_HAS_ETH8 anywhere in the code...
Best regards,
Wolfgang Denk

On Aug 18, 2008, at 2:12 PM, Wolfgang Denk wrote:
Dear Kumar Gala,
In message Pine.LNX.4.64.0808181344310.9116@blarg.am.freescale.net you wrote:
Move to using the environment variables 'ethaddr', 'eth1addr', etc.. instead of bd->bi_enetaddr, bi_enet1addr, etc.
This makes the code a bit more flexible to the number of ethernet interfaces. Right now we assume a max of 10 interfaces.
How does this match with our very static way of selecting this using 'CONFIG_HAS_ETH<n>' #defines? There is no such thing as CONFIG_HAS_ETH8 anywhere in the code...
oops, forgot about that. I think we just have the code exist always (for CONFIG_OF_LIBFDT)
- k

On Aug 18, 2008, at 2:16 PM, Kumar Gala wrote:
On Aug 18, 2008, at 2:12 PM, Wolfgang Denk wrote:
Dear Kumar Gala,
In message Pine.LNX.4.64.0808181344310.9116@blarg.am.freescale.net you wrote:
Move to using the environment variables 'ethaddr', 'eth1addr', etc.. instead of bd->bi_enetaddr, bi_enet1addr, etc.
This makes the code a bit more flexible to the number of ethernet interfaces. Right now we assume a max of 10 interfaces.
How does this match with our very static way of selecting this using 'CONFIG_HAS_ETH<n>' #defines? There is no such thing as CONFIG_HAS_ETH8 anywhere in the code...
oops, forgot about that. I think we just have the code exist always (for CONFIG_OF_LIBFDT)
74xx_7xx, mpc8xx, ppc4xx -- called regardless of CONFIG_HAS_ETHn mpc512x -- called only based on HAS_ETH0 mpc8260, mpc83xx, mpc85xx, mpc86xx -- called if HAS_ETH0 || HAS_ETH1 || HAS_ETH2 || HAS_ETH3
With ETH3 being the max today.
We have a part (p4080) in the works with 8 interfaces (its unlikely we'll have support for all 8 in u-boot, but do want to be ablity to set mac addresses for all 8.)
- k

Dear Kumar Gala,
In message 27B1F145-B4F1-42E8-930C-3A26D1E914CF@kernel.crashing.org you wrote:
74xx_7xx, mpc8xx, ppc4xx -- called regardless of CONFIG_HAS_ETHn mpc512x -- called only based on HAS_ETH0 mpc8260, mpc83xx, mpc85xx, mpc86xx -- called if HAS_ETH0 || HAS_ETH1 || HAS_ETH2 || HAS_ETH3
With ETH3 being the max today.
Yes. and I have to admit that I really dislike this static configuration which prevents any loops in the code.
We have a part (p4080) in the works with 8 interfaces (its unlikely we'll have support for all 8 in u-boot, but do want to be ablity to set mac addresses for all 8.)
I guess we should try to find some clever way of overcoming the old style.
Best regards,
Wolfgang Denk
participants (2)
-
Kumar Gala
-
Wolfgang Denk