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