[U-Boot] [PATCH 02/07] db410c: update wlan and bt mac addresses from firmware

Jorge Ramirez jorge.ramirez-ortiz at linaro.org
Mon Jan 8 08:41:06 UTC 2018


On 01/05/2018 11:29 AM, Jorge Ramirez-Ortiz wrote:
> The firmware that runs before u-boot modifies u-boot's device tree
> adding the local-mac-address and local-bd-address properties for the
> compatibles "qcom,wcnss-bt" and "qcom,wcnss-wlan".

this is an important patch for distros to be able to boot with 
networking support.
at the moment users have to jump through hoops to fake their MAC addresses.

I'd also appreciate some feedback on the series since it adds some new 
features and fixes.

thanks!

>
> This commit reads that firmware, retrieves the properties and fixups
> the device tree that is passed to the kernel before booting.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz at linaro.org>
> ---
>   arch/arm/dts/dragonboard410c.dts                 | 10 +++++
>   board/qualcomm/dragonboard410c/Makefile          |  1 +
>   board/qualcomm/dragonboard410c/dragonboard410c.c | 49 +++++++++++++++++++++---
>   board/qualcomm/dragonboard410c/lowlevel_init.S   | 28 ++++++++++++++
>   configs/dragonboard410c_defconfig                |  3 ++
>   5 files changed, 85 insertions(+), 6 deletions(-)
>   create mode 100644 board/qualcomm/dragonboard410c/lowlevel_init.S
>
> diff --git a/arch/arm/dts/dragonboard410c.dts b/arch/arm/dts/dragonboard410c.dts
> index 7746622..25aeac4 100644
> --- a/arch/arm/dts/dragonboard410c.dts
> +++ b/arch/arm/dts/dragonboard410c.dts
> @@ -86,6 +86,16 @@
>   			clock-frequency = <200000000>;
>   		};
>   
> +		wcnss {
> +			bt {
> +				compatible="qcom,wcnss-bt";
> +			};
> +
> +			wifi {
> +				compatible="qcom,wcnss-wlan";
> +			};
> +		};
> +
>   		spmi at 200f000 {
>   			compatible = "qcom,spmi-pmic-arb";
>   			reg = <0x200f800 0x200 0x2400000 0x400000 0x2c00000 0x400000>;
> diff --git a/board/qualcomm/dragonboard410c/Makefile b/board/qualcomm/dragonboard410c/Makefile
> index cd67808..5082383 100644
> --- a/board/qualcomm/dragonboard410c/Makefile
> +++ b/board/qualcomm/dragonboard410c/Makefile
> @@ -5,4 +5,5 @@
>   #
>   
>   obj-y	:= dragonboard410c.o
> +obj-y	+= lowlevel_init.o
>   extra-y += head.o
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index 848e278..99fc91b 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -10,9 +10,16 @@
>   #include <dm.h>
>   #include <usb.h>
>   #include <asm/gpio.h>
> +#include <fdt_support.h>
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +/* pointer to the device tree ammended by the firmware */
> +extern const void *fw_dtb;
> +
> +static char wlan_mac[ARP_HLEN];
> +static char bt_mac[ARP_HLEN];
> +
>   int dram_init(void)
>   {
>   	gd->ram_size = PHYS_SDRAM_1_SIZE;
> @@ -27,7 +34,6 @@ int dram_init_banksize(void)
>   	return 0;
>   }
>   
> -
>   int board_prepare_usb(enum usb_init_type type)
>   {
>   	static struct udevice *pmic_gpio;
> @@ -96,11 +102,6 @@ int board_prepare_usb(enum usb_init_type type)
>   	return 0;
>   }
>   
> -int board_init(void)
> -{
> -	return 0;
> -}
> -
>   /* Check for vol- button - if pressed - stop autoboot */
>   int misc_init_r(void)
>   {
> @@ -134,3 +135,39 @@ int misc_init_r(void)
>   
>   	return 0;
>   }
> +
> +int board_init(void)
> +{
> +	int offset, len;
> +	const char *mac;
> +
> +	/* take a copy of the firmware information (the user could unknownly
> +	   overwrite that DDR via tftp or other means)  */
> +
> +	offset = fdt_node_offset_by_compatible(fw_dtb, -1, "qcom,wcnss-wlan");
> +	if (offset >= 0) {
> +		mac = fdt_getprop(fw_dtb, offset, "local-mac-address", &len);
> +		if (mac)
> +			memcpy(wlan_mac, mac, ARP_HLEN);
> +	}
> +
> +	offset = fdt_node_offset_by_compatible(fw_dtb, -1, "qcom,wcnss-bt");
> +	if (offset >= 0) {
> +		mac = fdt_getprop(fw_dtb, offset, "local-bd-address", &len);
> +		if (mac)
> +			memcpy(bt_mac, mac, ARP_HLEN);
> +	}
> +
> +	return 0;
> +}
> +
> +int ft_board_setup(void *blob, bd_t *bd)
> +{
> +	do_fixup_by_compat(blob, "qcom,wcnss-wlan", "local-mac-address",
> +		wlan_mac, ARP_HLEN, 1);
> +
> +	do_fixup_by_compat(blob, "qcom,wcnss-bt", "local-bd-address",
> +		bt_mac, ARP_HLEN, 1);
> +
> +	return 0;
> +}
> diff --git a/board/qualcomm/dragonboard410c/lowlevel_init.S b/board/qualcomm/dragonboard410c/lowlevel_init.S
> new file mode 100644
> index 0000000..15b2d0c
> --- /dev/null
> +++ b/board/qualcomm/dragonboard410c/lowlevel_init.S
> @@ -0,0 +1,28 @@
> +/*
> + * (C) Copyright 2016
> + * Cédric Schieli <cschieli at gmail.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <config.h>
> +
> +.align 8
> +.global fw_dtb
> +fw_dtb:
> +	.dword 0x0
> +
> +/*
> + * Routine: save_boot_params (called after reset from start.S)
> + * Description: save ATAG/FDT address provided by the firmware at boot time
> + */
> +
> +.global save_boot_params
> +save_boot_params:
> +
> +	/* The firmware provided ATAG/FDT address can be found in r2/x0 */
> +	adr	x8, fw_dtb
> +	str	x0, [x8]
> +
> +	/* Returns */
> +	b	save_boot_params_ret
> diff --git a/configs/dragonboard410c_defconfig b/configs/dragonboard410c_defconfig
> index b71bff7..cfe9be9 100644
> --- a/configs/dragonboard410c_defconfig
> +++ b/configs/dragonboard410c_defconfig
> @@ -44,3 +44,6 @@ CONFIG_USB_ETHER_ASIX88179=y
>   CONFIG_USB_ETHER_MCS7830=y
>   CONFIG_USB_ETHER_SMSC95XX=y
>   CONFIG_OF_LIBFDT_OVERLAY=y
> +CONFIG_OF_CONTROL=y
> +CONFIG_ENV_IS_IN_MMC=y
> +CONFIG_OF_BOARD_SETUP=y



More information about the U-Boot mailing list