[02/07] db410c: update wlan and bt mac addresses from firmware

Message ID 1515148197-30234-2-git-send-email-jorge.ramirez-ortiz@linaro.org
State Accepted
Commit e2beb872f7aea055114073218650a1c6234a1cff
Headers show
Series
  • [01/07] db410c: configs: increase gunzip buffer size for the kernel
Related show

Commit Message

Jorge Ramirez Jan. 5, 2018, 10:29 a.m.
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 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@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

Comments

Jorge Ramirez Jan. 8, 2018, 8:41 a.m. | #1
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@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@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@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

Patch

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@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@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