[U-Boot] [PATCH 1/2] fdt: Add new fdt_set_node_status & fdt_set_status_by_alias helpers

From: Shengzhou Liu Shengzhou.Liu@freescale.com
Add common function fdt_set_node_status() to assist in various locations that we set a nodes status. This function utilizes the status values that are part of the EPAPR spec (on power.org).
fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an alias string to identify the node to update.
We also add some shortcut functions to help the common cases of setting "okay" and "disabled":
fdt_status_okay() fdt_status_disabled() fdt_status_okay_by_alias() fdt_status_disabled_by_alias()
Finally, we fixup the corenet_ds ethernet code which previously had a function by the same name that can be replaced with the new helpers.
Signed-off-by: Shengzhou Liu Shengzhou.Liu@freescale.com Signed-off-by: Kumar Gala galak@kernel.crashing.org --- board/freescale/corenet_ds/eth_hydra.c | 26 ++------------ board/freescale/corenet_ds/eth_p4080.c | 36 +++++-------------- common/fdt_support.c | 60 +++++++++++++++++++++++++++++++- include/fdt_support.h | 28 +++++++++++++++ 4 files changed, 101 insertions(+), 49 deletions(-)
diff --git a/board/freescale/corenet_ds/eth_hydra.c b/board/freescale/corenet_ds/eth_hydra.c index 91b3408..a7a5e13 100644 --- a/board/freescale/corenet_ds/eth_hydra.c +++ b/board/freescale/corenet_ds/eth_hydra.c @@ -70,6 +70,7 @@ #include <fm_eth.h> #include <fsl_mdio.h> #include <malloc.h> +#include <fdt_support.h> #include <asm/fsl_dtsec.h>
#include "../common/ngpixis.h" @@ -200,25 +201,6 @@ static int hydra_mdio_init(char *realbusname, char *fakebusname) }
/* - * Given an alias or a path for a node, set the status of that node. - * - * If 'alias' is not a valid alias, then it is treated as a full path to the - * node. No error checking is performed. - * - * This function is normally called to set the status for a virtual MDIO node. - */ -static void fdt_set_node_status(void *fdt, const char *alias, - const char *status) -{ - const char *path = fdt_get_alias(fdt, alias); - - if (!path) - path = alias; - - do_fixup_by_path(fdt, path, "status", status, strlen(status) + 1, 1); -} - -/* * Given an alias or a path for a node, set the mux value of that node. * * If 'alias' is not a valid alias, then it is treated as a full path to the @@ -372,14 +354,14 @@ void fdt_fixup_board_enet(void *fdt) case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane >= 0) { - fdt_set_node_status(fdt, "emi1_sgmii", "okay"); + fdt_status_okay_by_alias(fdt, "emi1_sgmii"); /* Also set the MUX value */ fdt_set_mdio_mux(fdt, "emi1_sgmii", mdio_mux[i].val); } break; case PHY_INTERFACE_MODE_RGMII: - fdt_set_node_status(fdt, "emi1_rgmii", "okay"); + fdt_status_okay_by_alias(fdt, "emi1_rgmii"); break; default: break; @@ -388,7 +370,7 @@ void fdt_fixup_board_enet(void *fdt)
lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) - fdt_set_node_status(fdt, "emi2_xgmii", "okay"); + fdt_status_okay_by_alias(fdt, "emi2_xgmii"); #endif }
diff --git a/board/freescale/corenet_ds/eth_p4080.c b/board/freescale/corenet_ds/eth_p4080.c index d4657f7..00dfa9a 100644 --- a/board/freescale/corenet_ds/eth_p4080.c +++ b/board/freescale/corenet_ds/eth_p4080.c @@ -199,22 +199,6 @@ static int p4080ds_mdio_init(char *realbusname, u32 muxval) return mdio_register(bus); }
-/* - * Sets the specified node's status to the value contained in "status" - * If the first character of the specified path is "/" then we use - * alias as a path. Otherwise, we look for an alias of that name - */ -static void fdt_set_node_status(void *fdt, const char *alias, - const char *status) -{ - const char *path = fdt_get_alias(fdt, alias); - - if (!path) - path = alias; - - do_fixup_by_path(fdt, path, "status", status, strlen(status) + 1, 1); -} - void board_ft_fman_fixup_port(void *blob, char * prop, phys_addr_t pa, enum fm_port port, int offset) { @@ -255,28 +239,28 @@ void fdt_fixup_board_enet(void *fdt) */
/* We've got six MDIO nodes that may or may not need to exist */ - fdt_set_node_status(fdt, "emi1_slot3", "disabled"); - fdt_set_node_status(fdt, "emi1_slot4", "disabled"); - fdt_set_node_status(fdt, "emi1_slot5", "disabled"); - fdt_set_node_status(fdt, "emi2_slot4", "disabled"); - fdt_set_node_status(fdt, "emi2_slot5", "disabled"); + fdt_status_disabled_by_alias(fdt, "emi1_slot3"); + fdt_status_disabled_by_alias(fdt, "emi1_slot4"); + fdt_status_disabled_by_alias(fdt, "emi1_slot5"); + fdt_status_disabled_by_alias(fdt, "emi2_slot4"); + fdt_status_disabled_by_alias(fdt, "emi2_slot5");
for (i = 0; i < NUM_FM_PORTS; i++) { switch (mdio_mux[i]) { case EMI1_SLOT3: - fdt_set_node_status(fdt, "emi1_slot3", "okay"); + fdt_status_okay_by_alias(fdt, "emi1_slot3"); break; case EMI1_SLOT4: - fdt_set_node_status(fdt, "emi1_slot4", "okay"); + fdt_status_okay_by_alias(fdt, "emi1_slot4"); break; case EMI1_SLOT5: - fdt_set_node_status(fdt, "emi1_slot5", "okay"); + fdt_status_okay_by_alias(fdt, "emi1_slot5"); break; case EMI2_SLOT4: - fdt_set_node_status(fdt, "emi2_slot4", "okay"); + fdt_status_okay_by_alias(fdt, "emi2_slot4"); break; case EMI2_SLOT5: - fdt_set_node_status(fdt, "emi2_slot5", "okay"); + fdt_status_okay_by_alias(fdt, "emi2_slot5"); break; } } diff --git a/common/fdt_support.c b/common/fdt_support.c index 46aa842..16854f6 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -2,7 +2,7 @@ * (C) Copyright 2007 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com * - * Copyright 2010 Freescale Semiconductor, Inc. + * Copyright 2010-2011 Freescale Semiconductor, Inc. * * See file CREDITS for list of people who contributed to this * project. @@ -1255,6 +1255,64 @@ int fdt_create_phandle(void *fdt, int nodeoffset) return phandle; }
+/* + * fdt_set_node_status: Set status for the given node + * + * @fdt: ptr to device tree + * @nodeoffset: node to update + * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, + * FDT_STATUS_FAIL, FDT_STATUS_FAIL_ERROR_CODE + * @error_code: optional, only used if status is FDT_STATUS_FAIL_ERROR_CODE + */ +int fdt_set_node_status(void *fdt, int nodeoffset, + enum fdt_status status, unsigned int error_code) +{ + char buf[16]; + int ret = 0; + + if (nodeoffset < 0) + return nodeoffset; + + switch (status) { + case FDT_STATUS_OKAY: + ret = fdt_setprop_string(fdt, nodeoffset, "status", "okay"); + break; + case FDT_STATUS_DISABLED: + ret = fdt_setprop_string(fdt, nodeoffset, "status", "disabled"); + break; + case FDT_STATUS_FAIL: + ret = fdt_setprop_string(fdt, nodeoffset, "status", "fail"); + break; + case FDT_STATUS_FAIL_ERROR_CODE: + sprintf(buf, "fail-%d", error_code); + ret = fdt_setprop_string(fdt, nodeoffset, "status", buf); + break; + default: + printf("Invalid fdt status: %x\n", status); + ret = -1; + break; + } + + return ret; +} + +/* + * fdt_set_status_by_alias: Set status for the given node given an alias + * + * @fdt: ptr to device tree + * @alias: alias of node to update + * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, + * FDT_STATUS_FAIL, FDT_STATUS_FAIL_ERROR_CODE + * @error_code: optional, only used if status is FDT_STATUS_FAIL_ERROR_CODE + */ +int fdt_set_status_by_alias(void *fdt, const char* alias, + enum fdt_status status, unsigned int error_code) +{ + int offset = fdt_path_offset(fdt, alias); + + return fdt_set_node_status(fdt, offset, status, error_code); +} + #if defined(CONFIG_VIDEO) int fdt_add_edid(void *blob, const char *compat, unsigned char *edid_buf) { diff --git a/include/fdt_support.h b/include/fdt_support.h index 8f06aac..08b4de1 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -97,5 +97,33 @@ int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr); u64 fdt_get_base_address(void *fdt, int node);
+enum fdt_status { + FDT_STATUS_OKAY, + FDT_STATUS_DISABLED, + FDT_STATUS_FAIL, + FDT_STATUS_FAIL_ERROR_CODE, +}; +int fdt_set_node_status(void *fdt, int nodeoffset, + enum fdt_status status, unsigned int error_code); +static inline int fdt_status_okay(void *fdt, int nodeoffset) +{ + return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_OKAY, 0); +} +static inline int fdt_status_disabled(void *fdt, int nodeoffset) +{ + return fdt_set_node_status(fdt, nodeoffset, FDT_STATUS_DISABLED, 0); +} + +int fdt_set_status_by_alias(void *fdt, const char* alias, + enum fdt_status status, unsigned int error_code); +static inline int fdt_status_okay_by_alias(void *fdt, const char* alias) +{ + return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_OKAY, 0); +} +static inline int fdt_status_disabled_by_alias(void *fdt, const char* alias) +{ + return fdt_set_status_by_alias(fdt, alias, FDT_STATUS_DISABLED, 0); +} + #endif /* ifdef CONFIG_OF_LIBFDT */ #endif /* ifndef __FDT_SUPPORT_H */

From: Shengzhou Liu Shengzhou.Liu@freescale.com
For P3060 and P4080, USB pins are multiplexed with other functions. Update the device tree status for USB ports based on setting of RCW[EC1] & RCW[EC2] which describe if pins are muxed to usb.
Signed-off-by: Shengzhou Liu Shengzhou.Liu@freescale.com Signed-off-by: Kumar Gala galak@kernel.crashing.org --- arch/powerpc/cpu/mpc85xx/fdt.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c index d20c94c..5c85a4f 100644 --- a/arch/powerpc/cpu/mpc85xx/fdt.c +++ b/arch/powerpc/cpu/mpc85xx/fdt.c @@ -538,6 +538,27 @@ void fdt_fixup_fman_firmware(void *blob) #define fdt_fixup_fman_firmware(x) #endif
+#if defined(CONFIG_PPC_P4080) || defined(CONFIG_PPC_P3060) +static void fdt_fixup_usb(void *fdt) +{ + ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); + u32 rcwsr11 = in_be32(&gur->rcwsr[11]); + int off; + + off = fdt_node_offset_by_compatible(fdt, -1, "fsl,mpc85xx-usb2-mph"); + if ((rcwsr11 & FSL_CORENET_RCWSR11_EC1) != + FSL_CORENET_RCWSR11_EC1_FM1_USB1) + fdt_status_disabled(fdt, off); + + off = fdt_node_offset_by_compatible(fdt, -1, "fsl,mpc85xx-usb2-dr"); + if ((rcwsr11 & FSL_CORENET_RCWSR11_EC2) != + FSL_CORENET_RCWSR11_EC2_USB2) + fdt_status_disabled(fdt, off); +} +#else +#define fdt_fixup_usb(x) +#endif + void ft_cpu_setup(void *blob, bd_t *bd) { int off; @@ -642,6 +663,8 @@ void ft_cpu_setup(void *blob, bd_t *bd)
do_fixup_by_compat_u32(blob, "fsl,flexcan-v1.0", "clock_freq", gd->bus_clk, 1); + + fdt_fixup_usb(blob); }
/*

On Oct 14, 2011, at 2:10 PM, Kumar Gala wrote:
From: Shengzhou Liu Shengzhou.Liu@freescale.com
For P3060 and P4080, USB pins are multiplexed with other functions. Update the device tree status for USB ports based on setting of RCW[EC1] & RCW[EC2] which describe if pins are muxed to usb.
Signed-off-by: Shengzhou Liu Shengzhou.Liu@freescale.com Signed-off-by: Kumar Gala galak@kernel.crashing.org
arch/powerpc/cpu/mpc85xx/fdt.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-)
applied to 85xx
- k

Hi Kumar, Shengzhou,
On 10/14/2011 03:10 PM, Kumar Gala wrote:
From: Shengzhou LiuShengzhou.Liu@freescale.com
Add common function fdt_set_node_status() to assist in various locations that we set a nodes status. This function utilizes the status values that are part of the EPAPR spec (on power.org).
fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an alias string to identify the node to update.
We also add some shortcut functions to help the common cases of setting "okay" and "disabled":
fdt_status_okay() fdt_status_disabled() fdt_status_okay_by_alias() fdt_status_disabled_by_alias()
Finally, we fixup the corenet_ds ethernet code which previously had a function by the same name that can be replaced with the new helpers.
Signed-off-by: Shengzhou LiuShengzhou.Liu@freescale.com Signed-off-by: Kumar Galagalak@kernel.crashing.org
board/freescale/corenet_ds/eth_hydra.c | 26 ++------------ board/freescale/corenet_ds/eth_p4080.c | 36 +++++-------------- common/fdt_support.c | 60 +++++++++++++++++++++++++++++++- include/fdt_support.h | 28 +++++++++++++++ 4 files changed, 101 insertions(+), 49 deletions(-)
While this touches fdt_support.[ch] which is nominally "mine", it is coupled with the Freescale support. I could make you break it into two, but then I would have to do more work and you (and wd) would have to make sure they went into u-boot in the right order. That sounds ugly, so I would prefer Kumar apply it to his subrepo to feed into u-boot.
Acked-by: Gerald Van Baren vanbaren@cideas.com
Best regards, gvb
[snip]

On Oct 15, 2011, at 8:04 AM, Jerry Van Baren wrote:
Hi Kumar, Shengzhou,
On 10/14/2011 03:10 PM, Kumar Gala wrote:
From: Shengzhou LiuShengzhou.Liu@freescale.com
Add common function fdt_set_node_status() to assist in various locations that we set a nodes status. This function utilizes the status values that are part of the EPAPR spec (on power.org).
fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an alias string to identify the node to update.
We also add some shortcut functions to help the common cases of setting "okay" and "disabled":
fdt_status_okay() fdt_status_disabled() fdt_status_okay_by_alias() fdt_status_disabled_by_alias()
Finally, we fixup the corenet_ds ethernet code which previously had a function by the same name that can be replaced with the new helpers.
Signed-off-by: Shengzhou LiuShengzhou.Liu@freescale.com Signed-off-by: Kumar Galagalak@kernel.crashing.org
board/freescale/corenet_ds/eth_hydra.c | 26 ++------------ board/freescale/corenet_ds/eth_p4080.c | 36 +++++-------------- common/fdt_support.c | 60 +++++++++++++++++++++++++++++++- include/fdt_support.h | 28 +++++++++++++++ 4 files changed, 101 insertions(+), 49 deletions(-)
While this touches fdt_support.[ch] which is nominally "mine", it is coupled with the Freescale support. I could make you break it into two, but then I would have to do more work and you (and wd) would have to make sure they went into u-boot in the right order. That sounds ugly, so I would prefer Kumar apply it to his subrepo to feed into u-boot.
Acked-by: Gerald Van Baren vanbaren@cideas.com
Best regards, gvb
applied to 85xx
- k

Dear Kumar Gala,
In message 1318619444-2059-1-git-send-email-galak@kernel.crashing.org you wrote:
From: Shengzhou Liu Shengzhou.Liu@freescale.com
Add common function fdt_set_node_status() to assist in various locations that we set a nodes status. This function utilizes the status values that are part of the EPAPR spec (on power.org).
fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an alias string to identify the node to update.
We also add some shortcut functions to help the common cases of setting "okay" and "disabled":
fdt_status_okay() fdt_status_disabled() fdt_status_okay_by_alias() fdt_status_disabled_by_alias()
Finally, we fixup the corenet_ds ethernet code which previously had a function by the same name that can be replaced with the new helpers.
Signed-off-by: Shengzhou Liu Shengzhou.Liu@freescale.com Signed-off-by: Kumar Gala galak@kernel.crashing.org
This patch breaks a number of boards by growing the code size even for boards which never make use of this new stuff.
Affected boards: TQM8555 TQM8541
[Building with ELDK 4.2]:
+ ./MAKEALL TQM8555 Configuring for TQM8555 - Board: TQM85xx, Options: MPC8555,TQM8555=y,HOSTNAME=tqm8555,BOARDNAME="TQM8555" ppc_6xx-ld: warning: dot moved backwards before `.bss' ppc_6xx-ld: warning: dot moved backwards before `.bss' ppc_6xx-ld: u-boot: section .text lma 0xfffc0000 overlaps previous sections ppc_6xx-ld: u-boot: section .rodata lma 0xfffef388 overlaps previous sections ppc_6xx-ld: u-boot: section .reloc lma 0xffffa400 overlaps previous sections ppc_6xx-ld: u-boot: section .data lma 0xffffcd3c overlaps previous sections ppc_6xx-ld: u-boot: section .u_boot_cmd lma 0xffffea68 overlaps previous sections ppc_6xx-ld: u-boot: section .bootpg lma 0xfffff0dc overlaps previous sections
Please fix.
Best regards,
Wolfgang Denk

On Oct 23, 2011, at 3:49 AM, Wolfgang Denk wrote:
Dear Kumar Gala,
In message 1318619444-2059-1-git-send-email-galak@kernel.crashing.org you wrote:
From: Shengzhou Liu Shengzhou.Liu@freescale.com
Add common function fdt_set_node_status() to assist in various locations that we set a nodes status. This function utilizes the status values that are part of the EPAPR spec (on power.org).
fdt_set_status_by_alias() is based on fdt_set_node_status() but uses an alias string to identify the node to update.
We also add some shortcut functions to help the common cases of setting "okay" and "disabled":
fdt_status_okay() fdt_status_disabled() fdt_status_okay_by_alias() fdt_status_disabled_by_alias()
Finally, we fixup the corenet_ds ethernet code which previously had a function by the same name that can be replaced with the new helpers.
Signed-off-by: Shengzhou Liu Shengzhou.Liu@freescale.com Signed-off-by: Kumar Gala galak@kernel.crashing.org
This patch breaks a number of boards by growing the code size even for boards which never make use of this new stuff.
Affected boards: TQM8555 TQM8541
[Building with ELDK 4.2]:
- ./MAKEALL TQM8555
Configuring for TQM8555 - Board: TQM85xx, Options: MPC8555,TQM8555=y,HOSTNAME=tqm8555,BOARDNAME="TQM8555" ppc_6xx-ld: warning: dot moved backwards before `.bss' ppc_6xx-ld: warning: dot moved backwards before `.bss' ppc_6xx-ld: u-boot: section .text lma 0xfffc0000 overlaps previous sections ppc_6xx-ld: u-boot: section .rodata lma 0xfffef388 overlaps previous sections ppc_6xx-ld: u-boot: section .reloc lma 0xffffa400 overlaps previous sections ppc_6xx-ld: u-boot: section .data lma 0xffffcd3c overlaps previous sections ppc_6xx-ld: u-boot: section .u_boot_cmd lma 0xffffea68 overlaps previous sections ppc_6xx-ld: u-boot: section .bootpg lma 0xfffff0dc overlaps previous sections
Is part of our issue with older gcc-4.2 toolchain that the linker doesn't garbage collect unused functions?
- k

Dear Kumar Gala,
In message 8D0C487D-8573-4556-AD02-60DAF1104C38@kernel.crashing.org you wrote:
[Building with ELDK 4.2]:
...
Is part of our issue with older gcc-4.2 toolchain that the linker doesn't garbage collect unused functions?
Which binutils version is minimally needed? ElDK 4.2 uses GNU ld version 2.17.50.0.12 20070128 ...
Best regards,
Wolfgang Denk
participants (3)
-
Jerry Van Baren
-
Kumar Gala
-
Wolfgang Denk