summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/dts/tegra186-p2771-0000.dtsi5
-rw-r--r--arch/arm/dts/tegra186.dtsi20
-rw-r--r--arch/arm/mach-tegra/board186.c7
-rw-r--r--arch/arm/mach-tegra/tegra186/Makefile1
-rw-r--r--arch/arm/mach-tegra/tegra186/nvtboot_board.c54
5 files changed, 86 insertions, 1 deletions
diff --git a/arch/arm/dts/tegra186-p2771-0000.dtsi b/arch/arm/dts/tegra186-p2771-0000.dtsi
index 6e07108..54b2539 100644
--- a/arch/arm/dts/tegra186-p2771-0000.dtsi
+++ b/arch/arm/dts/tegra186-p2771-0000.dtsi
@@ -25,6 +25,11 @@
reg = <0x0 0x80000000 0x0 0x60000000>;
};
+ ethernet@2490000 {
+ status = "okay";
+ phy-reset-gpios = <&gpio_main TEGRA_MAIN_GPIO(M, 4) GPIO_ACTIVE_LOW>;
+ };
+
i2c@3160000 {
status = "okay";
};
diff --git a/arch/arm/dts/tegra186.dtsi b/arch/arm/dts/tegra186.dtsi
index f878b65..dd9e3b8 100644
--- a/arch/arm/dts/tegra186.dtsi
+++ b/arch/arm/dts/tegra186.dtsi
@@ -31,6 +31,26 @@
#interrupt-cells = <2>;
};
+ ethernet@2490000 {
+ compatible = "nvidia,tegra186-eqos", "snps,dwc-qos-ethernet-4.10";
+ reg = <0x0 0x02490000 0x0 0x10000>;
+ interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&bpmp TEGRA186_CLK_AXI_CBB>,
+ <&bpmp TEGRA186_CLK_EQOS_AXI>,
+ <&bpmp TEGRA186_CLK_EQOS_RX>,
+ <&bpmp TEGRA186_CLK_EQOS_PTP_REF>,
+ <&bpmp TEGRA186_CLK_EQOS_TX>;
+ clock-names = "slave_bus",
+ "master_bus",
+ "rx",
+ "ptp_ref",
+ "tx";
+ resets = <&bpmp TEGRA186_RESET_EQOS>;
+ reset-names = "eqos";
+ phy-mode = "rgmii";
+ status = "disabled";
+ };
+
uarta: serial@3100000 {
compatible = "nvidia,tegra186-uart", "nvidia,tegra20-uart";
reg = <0x0 0x03100000 0x0 0x10000>;
diff --git a/arch/arm/mach-tegra/board186.c b/arch/arm/mach-tegra/board186.c
index a071758..691c3fd 100644
--- a/arch/arm/mach-tegra/board186.c
+++ b/arch/arm/mach-tegra/board186.c
@@ -24,7 +24,12 @@ int board_init(void)
return tegra_board_init();
}
-int board_late_init(void)
+__weak int tegra_soc_board_init_late(void)
{
return 0;
}
+
+int board_late_init(void)
+{
+ return tegra_soc_board_init_late();
+}
diff --git a/arch/arm/mach-tegra/tegra186/Makefile b/arch/arm/mach-tegra/tegra186/Makefile
index 7f46a05..56f3378 100644
--- a/arch/arm/mach-tegra/tegra186/Makefile
+++ b/arch/arm/mach-tegra/tegra186/Makefile
@@ -4,5 +4,6 @@
obj-y += ../board186.o
obj-y += cache.o
+obj-y += nvtboot_board.o
obj-y += nvtboot_ll.o
obj-y += nvtboot_mem.o
diff --git a/arch/arm/mach-tegra/tegra186/nvtboot_board.c b/arch/arm/mach-tegra/tegra186/nvtboot_board.c
new file mode 100644
index 0000000..1d78346
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra186/nvtboot_board.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, NVIDIA CORPORATION.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdt_support.h>
+#include <fdtdec.h>
+#include <asm/arch/tegra.h>
+
+extern unsigned long nvtboot_boot_x0;
+
+/*
+ * Attempt to use /chosen/nvidia,ether-mac in the nvtboot DTB to U-Boot's
+ * ethaddr environment variable if possible.
+ */
+static int set_ethaddr_from_nvtboot(void)
+{
+ const void *nvtboot_blob = (void *)nvtboot_boot_x0;
+ int ret, node, len;
+ const u32 *prop;
+
+ /* Already a valid address in the environment? If so, keep it */
+ if (getenv("ethaddr"))
+ return 0;
+
+ node = fdt_path_offset(nvtboot_blob, "/chosen");
+ if (node < 0) {
+ printf("Can't find /chosen node in nvtboot DTB\n");
+ return node;
+ }
+ prop = fdt_getprop(nvtboot_blob, node, "nvidia,ether-mac", &len);
+ if (!prop) {
+ printf("Can't find nvidia,ether-mac property in nvtboot DTB\n");
+ return -ENOENT;
+ }
+
+ ret = setenv("ethaddr", (void *)prop);
+ if (ret) {
+ printf("Failed to set ethaddr from nvtboot DTB: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+int tegra_soc_board_init_late(void)
+{
+ /* Ignore errors here; not all cases care about Ethernet addresses */
+ set_ethaddr_from_nvtboot();
+
+ return 0;
+}