[PATCH u-boot-marvell 07/11] arm: mvebu: turris_mox: Find DT nodes by compatible or alias instead of path

Stefan Roese sr at denx.de
Fri Nov 12 14:15:09 CET 2021


On 11/3/21 03:02, Marek Behún wrote:
> From: Marek Behún <marek.behun at nic.cz>
> 
> It is better to find DT nodes by compatible strings or aliases instead
> of path.
> 
> There were issues with Linux some DTBs having different names of some
> nodes, e.g.
>    internal-regs
> instead of
>    internal-regs at d0000000
> 
> This should be a generic fix for such issues.
> 
> Also since fdt_support now contains needed functions, we can drop our
> own implementations.
> 
> Signed-off-by: Marek Behún <marek.behun at nic.cz>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   board/CZ.NIC/turris_mox/turris_mox.c | 186 +++++++++------------------
>   1 file changed, 63 insertions(+), 123 deletions(-)
> 
> diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c
> index 2202eb8cfb..03c923969e 100644
> --- a/board/CZ.NIC/turris_mox/turris_mox.c
> +++ b/board/CZ.NIC/turris_mox/turris_mox.c
> @@ -41,22 +41,14 @@
>   #define ARMADA_37XX_SPI_DOUT	(MVEBU_REGISTER(0x10608))
>   #define ARMADA_37XX_SPI_DIN	(MVEBU_REGISTER(0x1060c))
>   
> -#define ETH1_PATH	"/soc/internal-regs at d0000000/ethernet at 40000"
> -#define MDIO_PATH	"/soc/internal-regs at d0000000/mdio at 32004"
> -#define SFP_GPIO_PATH	"/soc/internal-regs at d0000000/spi at 10600/moxtet at 1/gpio at 0"
> -#define PCIE_PATH	"/soc/pcie at d0070000"
> -#define SFP_PATH	"/sfp"
> -#define LED_PATH	"/leds/led"
> -#define BUTTON_PATH	"/gpio-keys/reset"
> -
>   DECLARE_GLOBAL_DATA_PTR;
>   
>   #if defined(CONFIG_OF_BOARD_FIXUP)
>   int board_fix_fdt(void *blob)
>   {
>   	u8 topology[MAX_MOX_MODULES];
> -	int i, size, node;
> -	bool enable;
> +	enum fdt_status status;
> +	int i, size, ret;
>   
>   	/*
>   	 * SPI driver is not loaded in driver model yet, but we have to find out
> @@ -94,21 +86,15 @@ int board_fix_fdt(void *blob)
>   	if (size > 1 && (topology[1] == MOX_MODULE_PCI ||
>   			 topology[1] == MOX_MODULE_USB3 ||
>   			 topology[1] == MOX_MODULE_PASSPCI))
> -		enable = true;
> +		status = FDT_STATUS_OKAY;
>   	else
> -		enable = false;
> -
> -	node = fdt_path_offset(blob, PCIE_PATH);
> +		status = FDT_STATUS_DISABLED;
>   
> -	if (node < 0) {
> -		printf("Cannot find PCIe node in U-Boot's device tree!\n");
> -		return 0;
> -	}
> -
> -	if (fdt_setprop_string(blob, node, "status",
> -			       enable ? "okay" : "disabled") < 0) {
> -		printf("Cannot %s PCIe in U-Boot's device tree!\n",
> -		       enable ? "enable" : "disable");
> +	ret = fdt_set_status_by_compatible(blob, "marvell,armada-3700-pcie",
> +					   status);
> +	if (ret < 0) {
> +		printf("Cannot set status for PCIe in U-Boot's device tree: %s!\n",
> +		       fdt_strerror(ret));
>   		return 0;
>   	}
>   
> @@ -416,12 +402,18 @@ static bool read_reset_button(void)
>   	struct udevice *button, *led;
>   	int i;
>   
> -	if (device_get_global_by_ofnode(ofnode_path(BUTTON_PATH), &button)) {
> +	if (device_get_global_by_ofnode(
> +			ofnode_first_subnode(ofnode_by_compatible(ofnode_null(),
> +								  "gpio-keys")),
> +			&button)) {
>   		printf("Cannot find reset button!\n");
>   		return false;
>   	}
>   
> -	if (device_get_global_by_ofnode(ofnode_path(LED_PATH), &led)) {
> +	if (device_get_global_by_ofnode(
> +			ofnode_first_subnode(ofnode_by_compatible(ofnode_null(),
> +								  "gpio-leds")),
> +			&led)) {
>   		printf("Cannot find status LED!\n");
>   		return false;
>   	}
> @@ -664,92 +656,34 @@ handle_reset_btn:
>   
>   #if defined(CONFIG_OF_BOARD_SETUP)
>   
> -static int vnode_by_path(void *blob, const char *fmt, va_list ap)
> +static bool is_topaz(int id)
>   {
> -	char path[128];
> -
> -	vsnprintf(path, 128, fmt, ap);
> -	return fdt_path_offset(blob, path);
> +	return topaz && id == peridot + topaz - 1;
>   }
>   
> -static int node_by_path(void *blob, const char *fmt, ...)
> +static int switch_addr(int id)
>   {
> -	va_list ap;
> -	int res;
> -
> -	va_start(ap, fmt);
> -	res = vnode_by_path(blob, fmt, ap);
> -	va_end(ap);
> -
> -	return res;
> +	return is_topaz(id) ? 0x2 : 0x10 + id;
>   }
>   
> -static int phandle_by_path(void *blob, const char *fmt, ...)
> +static int setup_switch(void *blob, int id)
>   {
> -	va_list ap;
> -	int node, phandle, res;
> -
> -	va_start(ap, fmt);
> -	node = vnode_by_path(blob, fmt, ap);
> -	va_end(ap);
> +	int res, addr, i, node;
> +	char mdio_path[64];
>   
> +	node = fdt_node_offset_by_compatible(blob, -1, "marvell,orion-mdio");
>   	if (node < 0)
>   		return node;
>   
> -	phandle = fdt_get_phandle(blob, node);
> -	if (phandle > 0)
> -		return phandle;
> -
> -	phandle = fdt_get_max_phandle(blob);
> -	if (phandle < 0)
> -		return phandle;
> -
> -	phandle += 1;
> -
> -	res = fdt_setprop_u32(blob, node, "linux,phandle", phandle);
> +	res = fdt_get_path(blob, node, mdio_path, sizeof(mdio_path));
>   	if (res < 0)
>   		return res;
>   
> -	res = fdt_setprop_u32(blob, node, "phandle", phandle);
> -	if (res < 0)
> -		return res;
> -
> -	return phandle;
> -}
> -
> -static int enable_by_path(void *blob, const char *fmt, ...)
> -{
> -	va_list ap;
> -	int node;
> -
> -	va_start(ap, fmt);
> -	node = vnode_by_path(blob, fmt, ap);
> -	va_end(ap);
> -
> -	if (node < 0)
> -		return node;
> -
> -	return fdt_setprop_string(blob, node, "status", "okay");
> -}
> -
> -static bool is_topaz(int id)
> -{
> -	return topaz && id == peridot + topaz - 1;
> -}
> -
> -static int switch_addr(int id)
> -{
> -	return is_topaz(id) ? 0x2 : 0x10 + id;
> -}
> -
> -static int setup_switch(void *blob, int id)
> -{
> -	int res, addr, i, node, phandle;
> -
>   	addr = switch_addr(id);
>   
>   	/* first enable the switch by setting status = "okay" */
> -	res = enable_by_path(blob, MDIO_PATH "/switch%i@%x", id, addr);
> +	res = fdt_status_okay_by_pathf(blob, "%s/switch%i@%x", mdio_path, id,
> +				       addr);
>   	if (res < 0)
>   		return res;
>   
> @@ -758,13 +692,13 @@ static int setup_switch(void *blob, int id)
>   	 * enable corresponding ports
>   	 */
>   	if (id < peridot + topaz - 1) {
> -		res = enable_by_path(blob,
> -				     MDIO_PATH "/switch%i@%x/ports/port at a",
> -				     id, addr);
> +		res = fdt_status_okay_by_pathf(blob,
> +					       "%s/switch%i@%x/ports/port at a",
> +					       mdio_path, id, addr);
>   	} else if (id == peridot - 1 && !topaz && sfp) {
> -		res = enable_by_path(blob,
> -				     MDIO_PATH "/switch%i@%x/ports/port-sfp at a",
> -				     id, addr);
> +		res = fdt_status_okay_by_pathf(blob,
> +					       "%s/switch%i@%x/ports/port-sfp at a",
> +					       mdio_path, id, addr);
>   	} else {
>   		res = 0;
>   	}
> @@ -775,18 +709,21 @@ static int setup_switch(void *blob, int id)
>   		return 0;
>   
>   	/* finally change link property if needed */
> -	node = node_by_path(blob, MDIO_PATH "/switch%i@%x/ports/port at a", id,
> -			    addr);
> +	node = fdt_node_offset_by_pathf(blob, "%s/switch%i@%x/ports/port at a",
> +					mdio_path, id, addr);
>   	if (node < 0)
>   		return node;
>   
>   	for (i = id + 1; i < peridot + topaz; ++i) {
> -		phandle = phandle_by_path(blob,
> -					  MDIO_PATH "/switch%i@%x/ports/port@%x",
> -					  i, switch_addr(i),
> -					  is_topaz(i) ? 5 : 9);
> -		if (phandle < 0)
> -			return phandle;
> +		unsigned int phandle;
> +
> +		phandle = fdt_create_phandle_by_pathf(blob,
> +						      "%s/switch%i@%x/ports/port@%x",
> +						      mdio_path, i,
> +						      switch_addr(i),
> +						      is_topaz(i) ? 5 : 9);
> +		if (!phandle)
> +			return -FDT_ERR_NOPHANDLES;
>   
>   		if (i == id + 1)
>   			res = fdt_setprop_u32(blob, node, "link", phandle);
> @@ -819,18 +756,15 @@ static int remove_disabled_nodes(void *blob)
>   
>   int ft_board_setup(void *blob, struct bd_info *bd)
>   {
> -	int node, phandle, res;
> +	int res;
>   
>   	/*
>   	 * If MOX B (PCI), MOX F (USB) or MOX G (Passthrough PCI) modules are
>   	 * connected, enable the PCIe node.
>   	 */
>   	if (pci || usb || passpci) {
> -		node = fdt_path_offset(blob, PCIE_PATH);
> -		if (node < 0)
> -			return node;
> -
> -		res = fdt_setprop_string(blob, node, "status", "okay");
> +		res = fdt_status_okay_by_compatible(blob,
> +						    "marvell,armada-3700-pcie");
>   		if (res < 0)
>   			return res;
>   
> @@ -847,7 +781,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>   	if (peridot || topaz) {
>   		int i;
>   
> -		res = enable_by_path(blob, ETH1_PATH);
> +		res = fdt_status_okay_by_alias(blob, "ethernet1");
>   		if (res < 0)
>   			return res;
>   
> @@ -865,20 +799,25 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>   	 * Also enable and configure SFP GPIO controller node.
>   	 */
>   	if (sfp) {
> -		res = enable_by_path(blob, SFP_PATH);
> +		int node;
> +
> +		res = fdt_status_okay_by_compatible(blob, "sff,sfp");
>   		if (res < 0)
>   			return res;
>   
> -		res = enable_by_path(blob, ETH1_PATH);
> +		res = fdt_status_okay_by_alias(blob, "ethernet1");
>   		if (res < 0)
>   			return res;
>   
>   		if (!peridot) {
> -			phandle = phandle_by_path(blob, SFP_PATH);
> -			if (phandle < 0)
> -				return res;
> +			unsigned int phandle;
> +
> +			phandle = fdt_create_phandle_by_compatible(blob,
> +								   "sff,sfp");
> +			if (!phandle)
> +				return -FDT_ERR_NOPHANDLES;
>   
> -			node = node_by_path(blob, ETH1_PATH);
> +			node = fdt_path_offset(blob, "ethernet1");
>   			if (node < 0)
>   				return node;
>   
> @@ -892,7 +831,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>   				return res;
>   		}
>   
> -		res = enable_by_path(blob, SFP_GPIO_PATH);
> +		res = fdt_status_okay_by_compatible(blob, "cznic,moxtet-gpio");
>   		if (res < 0)
>   			return res;
>   
> @@ -900,7 +839,8 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>   			char newname[16];
>   
>   			/* moxtet-sfp is on non-zero position, change default */
> -			node = node_by_path(blob, SFP_GPIO_PATH);
> +			node = fdt_node_offset_by_compatible(blob, -1,
> +							     "cznic,moxtet-gpio");
>   			if (node < 0)
>   				return node;
>   
> 

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list