Commit 43349b9e authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Ralf Baechle

MIPS: Octeon: device_tree_init: use separate pass to fill mac addresses

Use separate pass to fill MAC addresses. This is needed because we want
to do this also for the appended DTB.
Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: default avatarDavid Daney <david.daney@cavium.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/12588/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 1a1590ab
...@@ -560,7 +560,7 @@ static void __init octeon_fdt_rm_ethernet(int node) ...@@ -560,7 +560,7 @@ static void __init octeon_fdt_rm_ethernet(int node)
fdt_nop_node(initial_boot_params, node); fdt_nop_node(initial_boot_params, node);
} }
static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pmac) static void __init octeon_fdt_pip_port(int iface, int i, int p, int max)
{ {
char name_buffer[20]; char name_buffer[20];
int eth; int eth;
...@@ -583,10 +583,9 @@ static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pm ...@@ -583,10 +583,9 @@ static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pm
phy_addr = cvmx_helper_board_get_mii_address(ipd_port); phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
octeon_fdt_set_phy(eth, phy_addr); octeon_fdt_set_phy(eth, phy_addr);
octeon_fdt_set_mac_addr(eth, pmac);
} }
static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac) static void __init octeon_fdt_pip_iface(int pip, int idx)
{ {
char name_buffer[20]; char name_buffer[20];
int iface; int iface;
...@@ -602,7 +601,73 @@ static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac) ...@@ -602,7 +601,73 @@ static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac)
count = cvmx_helper_ports_on_interface(idx); count = cvmx_helper_ports_on_interface(idx);
for (p = 0; p < 16; p++) for (p = 0; p < 16; p++)
octeon_fdt_pip_port(iface, idx, p, count - 1, pmac); octeon_fdt_pip_port(iface, idx, p, count - 1);
}
void __init octeon_fill_mac_addresses(void)
{
const char *alias_prop;
char name_buffer[20];
u64 mac_addr_base;
int aliases;
int pip;
int i;
aliases = fdt_path_offset(initial_boot_params, "/aliases");
if (aliases < 0)
return;
mac_addr_base =
((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
(octeon_bootinfo->mac_addr_base[5] & 0xffull);
for (i = 0; i < 2; i++) {
int mgmt;
snprintf(name_buffer, sizeof(name_buffer), "mix%d", i);
alias_prop = fdt_getprop(initial_boot_params, aliases,
name_buffer, NULL);
if (!alias_prop)
continue;
mgmt = fdt_path_offset(initial_boot_params, alias_prop);
if (mgmt < 0)
continue;
octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
}
alias_prop = fdt_getprop(initial_boot_params, aliases, "pip", NULL);
if (!alias_prop)
return;
pip = fdt_path_offset(initial_boot_params, alias_prop);
if (pip < 0)
return;
for (i = 0; i <= 4; i++) {
int iface;
int p;
snprintf(name_buffer, sizeof(name_buffer), "interface@%d", i);
iface = fdt_subnode_offset(initial_boot_params, pip,
name_buffer);
if (iface < 0)
continue;
for (p = 0; p < 16; p++) {
int eth;
snprintf(name_buffer, sizeof(name_buffer),
"ethernet@%x", p);
eth = fdt_subnode_offset(initial_boot_params, iface,
name_buffer);
if (eth < 0)
continue;
octeon_fdt_set_mac_addr(eth, &mac_addr_base);
}
}
} }
int __init octeon_prune_device_tree(void) int __init octeon_prune_device_tree(void)
...@@ -612,7 +677,6 @@ int __init octeon_prune_device_tree(void) ...@@ -612,7 +677,6 @@ int __init octeon_prune_device_tree(void)
const char *alias_prop; const char *alias_prop;
char name_buffer[20]; char name_buffer[20];
int aliases; int aliases;
u64 mac_addr_base;
if (fdt_check_header(initial_boot_params)) if (fdt_check_header(initial_boot_params))
panic("Corrupt Device Tree."); panic("Corrupt Device Tree.");
...@@ -623,15 +687,6 @@ int __init octeon_prune_device_tree(void) ...@@ -623,15 +687,6 @@ int __init octeon_prune_device_tree(void)
return -EINVAL; return -EINVAL;
} }
mac_addr_base =
((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
(octeon_bootinfo->mac_addr_base[5] & 0xffull);
if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX)) if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
max_port = 2; max_port = 2;
else if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN68XX)) else if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN68XX))
...@@ -660,7 +715,6 @@ int __init octeon_prune_device_tree(void) ...@@ -660,7 +715,6 @@ int __init octeon_prune_device_tree(void)
} else { } else {
int phy_addr = cvmx_helper_board_get_mii_address(CVMX_HELPER_BOARD_MGMT_IPD_PORT + i); int phy_addr = cvmx_helper_board_get_mii_address(CVMX_HELPER_BOARD_MGMT_IPD_PORT + i);
octeon_fdt_set_phy(mgmt, phy_addr); octeon_fdt_set_phy(mgmt, phy_addr);
octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
} }
} }
} }
...@@ -670,7 +724,7 @@ int __init octeon_prune_device_tree(void) ...@@ -670,7 +724,7 @@ int __init octeon_prune_device_tree(void)
int pip = fdt_path_offset(initial_boot_params, pip_path); int pip = fdt_path_offset(initial_boot_params, pip_path);
if (pip >= 0) if (pip >= 0)
for (i = 0; i <= 4; i++) for (i = 0; i <= 4; i++)
octeon_fdt_pip_iface(pip, i, &mac_addr_base); octeon_fdt_pip_iface(pip, i);
} }
/* I2C */ /* I2C */
......
...@@ -1108,6 +1108,7 @@ void __init prom_free_prom_memory(void) ...@@ -1108,6 +1108,7 @@ void __init prom_free_prom_memory(void)
} }
} }
void __init octeon_fill_mac_addresses(void);
int octeon_prune_device_tree(void); int octeon_prune_device_tree(void);
extern const char __appended_dtb; extern const char __appended_dtb;
...@@ -1143,6 +1144,7 @@ void __init device_tree_init(void) ...@@ -1143,6 +1144,7 @@ void __init device_tree_init(void)
if (do_prune) { if (do_prune) {
octeon_prune_device_tree(); octeon_prune_device_tree();
octeon_fill_mac_addresses();
pr_info("Using internal Device Tree.\n"); pr_info("Using internal Device Tree.\n");
} }
unflatten_and_copy_device_tree(); unflatten_and_copy_device_tree();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment