[PATCH 08/14] uboot-tegra: build NVIDIA Jetson TX1 DevKit image

Tomasz Maciej Nowak tmn505 at terefe.re
Tue Oct 29 08:47:01 PDT 2024


From: Tomasz Maciej Nowak <tmn505 at gmail.com>

Complementary addition for upcoming NVIDIA Jetson TX1 DevKit support.

Signed-off-by: Tomasz Maciej Nowak <tmn505 at gmail.com>
---
 package/boot/uboot-tegra/Makefile             |  17 +-
 ...a-pass-cboot-MAC-addresses-to-os-fdt.patch | 176 ++++++++++++++++++
 ...2180-pass-bt-and-wifi-mac-to-booting.patch |  27 +++
 3 files changed, 215 insertions(+), 5 deletions(-)
 create mode 100644 package/boot/uboot-tegra/patches/001-ARM-tegra-pass-cboot-MAC-addresses-to-os-fdt.patch
 create mode 100644 package/boot/uboot-tegra/patches/002-ARM-tegra-p2371-2180-pass-bt-and-wifi-mac-to-booting.patch

diff --git a/package/boot/uboot-tegra/Makefile b/package/boot/uboot-tegra/Makefile
index 372a75175448..cbe22fd96497 100644
--- a/package/boot/uboot-tegra/Makefile
+++ b/package/boot/uboot-tegra/Makefile
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2017-2019 Tomasz Maciej Nowak <tmn505 at gmail.com>
+# Copyright (C) 2017-2024 Tomasz Maciej Nowak <tmn505 at gmail.com>
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -20,19 +20,26 @@ include $(INCLUDE_DIR)/package.mk
 
 define U-Boot/Default
   BUILD_TARGET := tegra
-  BUILD_SUBTARGET := armv7
   HIDDEN := y
 endef
 
+define U-Boot/jetson-tx1
+  NAME := NVIDIA Jetson TX1
+  BUILD_SUBTARGET := armv8
+  BUILD_DEVICES := nvidia_jetson-tx1
+  UBOOT_CONFIG := p2371-2180
+endef
+UBOOT_TARGETS += jetson-tx1
+
 define U-Boot/trimslice
   NAME := CompuLab TrimSlice
+  BUILD_SUBTARGET := armv7
   BUILD_DEVICES := compulab_trimslice
   UBOOT_IMAGE := trimslice-mmc.img trimslice-spi.img
   SOC := tegra20
   VENDOR := compulab
 endef
-
-UBOOT_TARGETS := trimslice
+UBOOT_TARGETS += trimslice
 
 define Build/bct-image
 	$(CP) $(PKG_BUILD_DIR)/u-boot-dtb-tegra.bin $(PKG_BUILD_DIR)/u-boot.bin
@@ -50,7 +57,7 @@ endef
 
 define Build/Compile
 	$(call Build/Compile/U-Boot)
-	$(call Build/bct-image)
+	$(if $(CONFIG_ARCH_64BIT),,$(call Build/bct-image))
 endef
 
 define Build/InstallDev
diff --git a/package/boot/uboot-tegra/patches/001-ARM-tegra-pass-cboot-MAC-addresses-to-os-fdt.patch b/package/boot/uboot-tegra/patches/001-ARM-tegra-pass-cboot-MAC-addresses-to-os-fdt.patch
new file mode 100644
index 000000000000..8284bbd3e368
--- /dev/null
+++ b/package/boot/uboot-tegra/patches/001-ARM-tegra-pass-cboot-MAC-addresses-to-os-fdt.patch
@@ -0,0 +1,176 @@
+From 7a5f171d5bd4ec458ffd1bb3cb162d7a42662319 Mon Sep 17 00:00:00 2001
+From: Tomasz Maciej Nowak <tmn505 at gmail.com>
+Date: Thu, 8 Aug 2024 19:34:28 +0200
+Subject: [PATCH 1/2] ARM: tegra: pass cboot MAC addresses to os fdt
+
+Beside Ethernet MAC address cboot provided fdt also contains Bluetooth
+and WiFi addresses, so lets pass them to OS FDT blob if board integrator
+requests them.
+
+Signed-off-by: Tomasz Maciej Nowak <tmn505 at gmail.com>
+---
+ arch/arm/include/asm/arch-tegra/board.h |  2 +
+ arch/arm/include/asm/arch-tegra/cboot.h |  2 +
+ arch/arm/mach-tegra/cboot.c             | 58 +++++++++++++++++++++++
+ arch/arm/mach-tegra/dt-setup.c          | 61 +++++++++++++++++++++++++
+ 4 files changed, 123 insertions(+)
+
+--- a/arch/arm/include/asm/arch-tegra/board.h
++++ b/arch/arm/include/asm/arch-tegra/board.h
+@@ -36,6 +36,8 @@ void pin_mux_display(void);  /* overrida
+ 
+ #if defined(CONFIG_ARM64)
+ void ft_mac_address_setup(void *fdt);
++void ft_btmac_address_setup(void *fdt, const char *compatible);
++void ft_wifimac_address_setup(void *fdt, const char *compatible);
+ void ft_carveout_setup(void *fdt, const char *const *nodes,
+ 		       unsigned int count);
+ #endif
+--- a/arch/arm/include/asm/arch-tegra/cboot.h
++++ b/arch/arm/include/asm/arch-tegra/cboot.h
+@@ -18,6 +18,8 @@ int cboot_dram_init(void);
+ int cboot_dram_init_banksize(void);
+ ulong cboot_get_usable_ram_top(ulong total_size);
+ int cboot_get_ethaddr(const void *fdt, uint8_t mac[ETH_ALEN]);
++int cboot_get_bdaddr(const void *fdt, uint8_t mac[ETH_ALEN]);
++int cboot_get_wifiaddr(const void *fdt, uint8_t mac[ETH_ALEN]);
+ #else
+ static inline void cboot_save_boot_params(unsigned long x0, unsigned long x1,
+ 					  unsigned long x2, unsigned long x3)
+--- a/arch/arm/mach-tegra/cboot.c
++++ b/arch/arm/mach-tegra/cboot.c
+@@ -555,6 +555,64 @@ out:
+ 	return err;
+ }
+ 
++int cboot_get_bdaddr(const void *fdt, uint8_t mac[ETH_ALEN])
++{
++	const char *prop;
++	int node, len;
++
++	node = fdt_path_offset(fdt, "/chosen");
++	if (node < 0) {
++		printf("Can't find /chosen node in cboot DTB\n");
++		return node;
++	}
++
++	prop = fdt_getprop(fdt, node, "nvidia,bluetooth-mac", &len);
++	if (!prop) {
++		printf("Can't find Bluetooth MAC address in cboot DTB\n");
++		return -ENOENT;
++	}
++
++	string_to_enetaddr(prop, mac);
++
++	if (!is_valid_ethaddr(mac)) {
++		printf("Invalid MAC address: %s\n", prop);
++		return -EINVAL;
++	}
++
++	debug("Bluetooth MAC address: %pM\n", mac);
++
++	return 0;
++}
++
++int cboot_get_wifiaddr(const void *fdt, uint8_t mac[ETH_ALEN])
++{
++	const char *prop;
++	int node, len;
++
++	node = fdt_path_offset(fdt, "/chosen");
++	if (node < 0) {
++		printf("Can't find /chosen node in cboot DTB\n");
++		return node;
++	}
++
++	prop = fdt_getprop(fdt, node, "nvidia,wifi-mac", &len);
++	if (!prop) {
++		printf("Can't find WiFi MAC address in cboot DTB\n");
++		return -ENOENT;
++	}
++
++	string_to_enetaddr(prop, mac);
++
++	if (!is_valid_ethaddr(mac)) {
++		printf("Invalid MAC address: %s\n", prop);
++		return -EINVAL;
++	}
++
++	debug("WiFi MAC address: %pM\n", mac);
++
++	return 0;
++}
++
+ static char *strip(const char *ptr)
+ {
+ 	const char *end;
+--- a/arch/arm/mach-tegra/dt-setup.c
++++ b/arch/arm/mach-tegra/dt-setup.c
+@@ -76,6 +76,67 @@ void ft_mac_address_setup(void *fdt)
+ 	}
+ }
+ 
++void ft_btmac_address_setup(void *fdt, const char *compatible)
++{
++	const void *cboot_fdt = (const void *)cboot_boot_x0;
++	uint8_t mac[ETH_ALEN];
++	int offset, err, i, o;
++
++	if (!compatible[0])
++		return;
++
++	err = cboot_get_bdaddr(cboot_fdt, mac);
++	if (err < 0)
++		memset(mac, 0, ETH_ALEN);
++
++	offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
++	if (offset < 0) {
++		printf("compatible %s not found\n", compatible);
++		return;
++	}
++
++	if (is_valid_ethaddr(mac)) {
++		/* least significant byte first */
++		for (i = 0, o = 5; i < o; i++, o--) {
++			err = mac[i];
++			mac[i] = mac[o];
++			mac[o] = err;
++		}
++
++		err = fdt_setprop(fdt, offset, "local-bd-address", mac,
++				  ETH_ALEN);
++		if (!err)
++			debug("Bluetooth MAC address set: %pM\n", mac);
++	}
++}
++
++void ft_wifimac_address_setup(void *fdt, const char *compatible)
++{
++	const void *cboot_fdt = (const void *)cboot_boot_x0;
++	uint8_t mac[ETH_ALEN];
++	int offset, err;
++
++	if (!compatible[0])
++		return;
++
++	err = cboot_get_wifiaddr(cboot_fdt, mac);
++	if (err < 0)
++		memset(mac, 0, ETH_ALEN);
++
++	offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
++	if (offset < 0) {
++		printf("compatible %s not found\n", compatible);
++		return;
++	}
++
++	if (is_valid_ethaddr(mac)) {
++		err = fdt_setprop(fdt, offset, "local-mac-address", mac,
++				  ETH_ALEN);
++		if (!err)
++			debug("WiFi MAC address set: %pM\n", mac);
++	}
++}
++
+ static int ft_copy_carveout(void *dst, const void *src, const char *node)
+ {
+ 	const char *names = "memory-region-names";
diff --git a/package/boot/uboot-tegra/patches/002-ARM-tegra-p2371-2180-pass-bt-and-wifi-mac-to-booting.patch b/package/boot/uboot-tegra/patches/002-ARM-tegra-p2371-2180-pass-bt-and-wifi-mac-to-booting.patch
new file mode 100644
index 000000000000..4da66f9990c7
--- /dev/null
+++ b/package/boot/uboot-tegra/patches/002-ARM-tegra-p2371-2180-pass-bt-and-wifi-mac-to-booting.patch
@@ -0,0 +1,27 @@
+From c63792769405eba7ba04787cf0426495f062d0bd Mon Sep 17 00:00:00 2001
+From: Tomasz Maciej Nowak <tmn505 at gmail.com>
+Date: Thu, 8 Aug 2024 20:54:34 +0200
+Subject: [PATCH 2/2] ARM: tegra: p2371-2180: pass bt and wifi mac to booting
+ os
+
+P2180 has Bluetooth+WiFi module integrated and while Ethernet MAC address
+is passed from cboot FDT, the addresses for Bluetooth and WiFi aren't.
+Therefore do the same for them in nodes specified by compatible, so
+booted OS can use them.
+
+Signed-off-by: Tomasz Maciej Nowak <tmn505 at gmail.com>
+---
+ board/nvidia/p2371-2180/p2371-2180.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/board/nvidia/p2371-2180/p2371-2180.c
++++ b/board/nvidia/p2371-2180/p2371-2180.c
+@@ -93,6 +93,8 @@ static const char * const nodes[] = {
+ int ft_board_setup(void *fdt, struct bd_info *bd)
+ {
+ 	ft_mac_address_setup(fdt);
++	ft_btmac_address_setup(fdt, "brcm,bcm43540-bt");
++	ft_wifimac_address_setup(fdt, "brcm,bcm4354-fmac");
+ 	ft_carveout_setup(fdt, nodes, ARRAY_SIZE(nodes));
+ 
+ 	return 0;
-- 
2.47.0




More information about the openwrt-devel mailing list