All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k
@ 2016-11-15  9:08 Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 02/15] arm64: mvebu: Add Armada-80x0 dts/dtsi files Stefan Roese
                   ` (14 more replies)
  0 siblings, 15 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This moves some of the Armada DB-88F7040 board specific files to a more
generic name: armada-8k. This is in preparation for the Armada-8k
support which will be added soon. And since both platforms share
most devices, lets also share most source files to not duplicate
the code here.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/mach-mvebu/Kconfig                                  | 10 +++++-----
 board/Marvell/mvebu_armada-8k/MAINTAINERS                    |  6 ++++++
 board/Marvell/{mvebu_db-88f7040 => mvebu_armada-8k}/Makefile |  0
 board/Marvell/{mvebu_db-88f7040 => mvebu_armada-8k}/board.c  |  0
 board/Marvell/mvebu_db-88f7040/MAINTAINERS                   |  6 ------
 configs/mvebu_db-88f7040_defconfig                           |  4 +++-
 include/configs/{mvebu_db-88f7040.h => mvebu_armada-8k.h}    |  6 +++---
 7 files changed, 17 insertions(+), 15 deletions(-)
 create mode 100644 board/Marvell/mvebu_armada-8k/MAINTAINERS
 rename board/Marvell/{mvebu_db-88f7040 => mvebu_armada-8k}/Makefile (100%)
 rename board/Marvell/{mvebu_db-88f7040 => mvebu_armada-8k}/board.c (100%)
 delete mode 100644 board/Marvell/mvebu_db-88f7040/MAINTAINERS
 rename include/configs/{mvebu_db-88f7040.h => mvebu_armada-8k.h} (97%)

diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
index 6e8026b..7248fd7 100644
--- a/arch/arm/mach-mvebu/Kconfig
+++ b/arch/arm/mach-mvebu/Kconfig
@@ -77,8 +77,8 @@ config TARGET_DB_88F6820_AMC
 	bool "Support DB-88F6820-AMC"
 	select 88F6820
 
-config TARGET_MVEBU_DB_88F7040
-	bool "Support DB-88F7040 Armada 7040"
+config TARGET_MVEBU_ARMADA_8K
+	bool "Support Armada 7k/8k platforms"
 	select ARMADA_8K
 
 config TARGET_DB_MV784MP_GP
@@ -105,7 +105,7 @@ config SYS_BOARD
 	default "db-88f6720" if TARGET_DB_88F6720
 	default "db-88f6820-gp" if TARGET_DB_88F6820_GP
 	default "db-88f6820-amc" if TARGET_DB_88F6820_AMC
-	default "mvebu_db-88f7040" if TARGET_MVEBU_DB_88F7040
+	default "mvebu_armada-8k" if TARGET_MVEBU_ARMADA_8K
 	default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
 	default "ds414" if TARGET_DS414
 	default "maxbcm" if TARGET_MAXBCM
@@ -117,7 +117,7 @@ config SYS_CONFIG_NAME
 	default "db-88f6720" if TARGET_DB_88F6720
 	default "db-88f6820-gp" if TARGET_DB_88F6820_GP
 	default "db-88f6820-amc" if TARGET_DB_88F6820_AMC
-	default "mvebu_db-88f7040" if TARGET_MVEBU_DB_88F7040
+	default "mvebu_armada-8k" if TARGET_MVEBU_ARMADA_8K
 	default "db-mv784mp-gp" if TARGET_DB_MV784MP_GP
 	default "ds414" if TARGET_DS414
 	default "maxbcm" if TARGET_MAXBCM
@@ -129,7 +129,7 @@ config SYS_VENDOR
 	default "Marvell" if TARGET_DB_88F6720
 	default "Marvell" if TARGET_DB_88F6820_GP
 	default "Marvell" if TARGET_DB_88F6820_AMC
-	default "Marvell" if TARGET_MVEBU_DB_88F7040
+	default "Marvell" if TARGET_MVEBU_ARMADA_8K
 	default "solidrun" if TARGET_CLEARFOG
 	default "Synology" if TARGET_DS414
 
diff --git a/board/Marvell/mvebu_armada-8k/MAINTAINERS b/board/Marvell/mvebu_armada-8k/MAINTAINERS
new file mode 100644
index 0000000..33923ba
--- /dev/null
+++ b/board/Marvell/mvebu_armada-8k/MAINTAINERS
@@ -0,0 +1,6 @@
+MVEBU_ARMADA_8K BOARD
+M:	Stefan Roese <sr@denx.de>
+S:	Maintained
+F:	board/Marvell/mvebu_armada-8k/
+F:	include/configs/mvebu_armada-8k.h
+F:	configs/mvebu_db-88f7040_defconfig
diff --git a/board/Marvell/mvebu_db-88f7040/Makefile b/board/Marvell/mvebu_armada-8k/Makefile
similarity index 100%
rename from board/Marvell/mvebu_db-88f7040/Makefile
rename to board/Marvell/mvebu_armada-8k/Makefile
diff --git a/board/Marvell/mvebu_db-88f7040/board.c b/board/Marvell/mvebu_armada-8k/board.c
similarity index 100%
rename from board/Marvell/mvebu_db-88f7040/board.c
rename to board/Marvell/mvebu_armada-8k/board.c
diff --git a/board/Marvell/mvebu_db-88f7040/MAINTAINERS b/board/Marvell/mvebu_db-88f7040/MAINTAINERS
deleted file mode 100644
index 820461b..0000000
--- a/board/Marvell/mvebu_db-88f7040/MAINTAINERS
+++ /dev/null
@@ -1,6 +0,0 @@
-MVEBU_DB_88F7040 BOARD
-M:	Stefan Roese <sr@denx.de>
-S:	Maintained
-F:	board/Marvell/mvebu_db-88f7040/
-F:	include/configs/mvebu_db-88f7040.h
-F:	configs/mvebu_db-88f7040_defconfig
diff --git a/configs/mvebu_db-88f7040_defconfig b/configs/mvebu_db-88f7040_defconfig
index 81152cd..f153b9c 100644
--- a/configs/mvebu_db-88f7040_defconfig
+++ b/configs/mvebu_db-88f7040_defconfig
@@ -1,8 +1,9 @@
 CONFIG_ARM=y
 CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
-CONFIG_TARGET_MVEBU_DB_88F7040=y
+CONFIG_TARGET_MVEBU_ARMADA_8K=y
 CONFIG_DEFAULT_DEVICE_TREE="armada-7040-db"
+CONFIG_SMBIOS_PRODUCT_NAME=""
 CONFIG_AHCI=y
 # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
@@ -48,3 +49,4 @@ CONFIG_DM_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_STORAGE=y
+CONFIG_SMBIOS_MANUFACTURER=""
diff --git a/include/configs/mvebu_db-88f7040.h b/include/configs/mvebu_armada-8k.h
similarity index 97%
rename from include/configs/mvebu_db-88f7040.h
rename to include/configs/mvebu_armada-8k.h
index 6feb8d7..3b35cb3 100644
--- a/include/configs/mvebu_db-88f7040.h
+++ b/include/configs/mvebu_armada-8k.h
@@ -4,8 +4,8 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-#ifndef _CONFIG_MVEBU_DB_88F7040_H
-#define _CONFIG_MVEBU_DB_88F7040_H
+#ifndef _CONFIG_MVEBU_ARMADA_8K_H
+#define _CONFIG_MVEBU_ARMADA_8K_H
 
 /*
  * High Level Configuration Options (easy to change)
@@ -128,4 +128,4 @@
 #define CONFIG_CMD_PART
 #define CONFIG_PARTITION_UUIDS
 
-#endif /* _CONFIG_MVEBU_DB_88F7040_H */
+#endif /* _CONFIG_MVEBU_ARMADA_8K_H */
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 02/15] arm64: mvebu: Add Armada-80x0 dts/dtsi files
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 03/15] arm64: mvebu: armada-8k: Only configure xHCI power on DB-88F7040 board Stefan Roese
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

Add the latest version of the DT files from the Linux kernel.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/armada-8020.dtsi        |  56 ++++++++
 arch/arm/dts/armada-8040-db.dts      | 150 +++++++++++++++++++++
 arch/arm/dts/armada-8040.dtsi        |  56 ++++++++
 arch/arm/dts/armada-cp110-slave.dtsi | 249 +++++++++++++++++++++++++++++++++++
 4 files changed, 511 insertions(+)
 create mode 100644 arch/arm/dts/armada-8020.dtsi
 create mode 100644 arch/arm/dts/armada-8040-db.dts
 create mode 100644 arch/arm/dts/armada-8040.dtsi
 create mode 100644 arch/arm/dts/armada-cp110-slave.dtsi

diff --git a/arch/arm/dts/armada-8020.dtsi b/arch/arm/dts/armada-8020.dtsi
new file mode 100644
index 0000000..048e5cf
--- /dev/null
+++ b/arch/arm/dts/armada-8020.dtsi
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for the Armada 8020 SoC, made of an AP806 Dual and
+ * two CP110.
+ */
+
+#include "armada-ap806-dual.dtsi"
+#include "armada-cp110-master.dtsi"
+#include "armada-cp110-slave.dtsi"
+
+/ {
+	model = "Marvell Armada 8020";
+	compatible = "marvell,armada8020", "marvell,armada-ap806-dual",
+		     "marvell,armada-ap806";
+};
diff --git a/arch/arm/dts/armada-8040-db.dts b/arch/arm/dts/armada-8040-db.dts
new file mode 100644
index 0000000..6e6f182
--- /dev/null
+++ b/arch/arm/dts/armada-8040-db.dts
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada 8040 Development board platform
+ */
+
+#include "armada-8040.dtsi"
+
+/ {
+	model = "Marvell Armada 8040 DB board";
+	compatible = "marvell,armada8040-db", "marvell,armada8040",
+		     "marvell,armada-ap806-quad", "marvell,armada-ap806";
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+
+	memory at 00000000 {
+		device_type = "memory";
+		reg = <0x0 0x0 0x0 0x80000000>;
+	};
+};
+
+&i2c0 {
+	status = "okay";
+	clock-frequency = <100000>;
+};
+
+&spi0 {
+	status = "okay";
+
+	spi-flash at 0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <10000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				label = "U-Boot";
+				reg = <0 0x200000>;
+			};
+			partition at 400000 {
+				label = "Filesystem";
+				reg = <0x200000 0xce0000>;
+			};
+		};
+	};
+};
+
+/* Accessible over the mini-USB CON9 connector on the main board */
+&uart0 {
+	status = "okay";
+};
+
+
+/* CON5 on CP0 expansion */
+&cpm_pcie2 {
+	status = "okay";
+};
+
+&cpm_i2c0 {
+	status = "okay";
+	clock-frequency = <100000>;
+};
+
+/* CON4 on CP0 expansion */
+&cpm_sata0 {
+	status = "okay";
+};
+
+/* CON9 on CP0 expansion */
+&cpm_usb3_0 {
+	status = "okay";
+};
+
+/* CON10 on CP0 expansion */
+&cpm_usb3_1 {
+	status = "okay";
+};
+
+/* CON5 on CP1 expansion */
+&cps_pcie2 {
+	status = "okay";
+};
+
+&cps_i2c0 {
+	status = "okay";
+	clock-frequency = <100000>;
+};
+
+/* CON4 on CP1 expansion */
+&cps_sata0 {
+	status = "okay";
+};
+
+/* CON9 on CP1 expansion */
+&cps_usb3_0 {
+	status = "okay";
+};
+
+/* CON10 on CP1 expansion */
+&cps_usb3_1 {
+	status = "okay";
+};
diff --git a/arch/arm/dts/armada-8040.dtsi b/arch/arm/dts/armada-8040.dtsi
new file mode 100644
index 0000000..9c1b28c
--- /dev/null
+++ b/arch/arm/dts/armada-8040.dtsi
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for the Armada 8040 SoC, made of an AP806 Quad and
+ * two CP110.
+ */
+
+#include "armada-ap806-quad.dtsi"
+#include "armada-cp110-master.dtsi"
+#include "armada-cp110-slave.dtsi"
+
+/ {
+	model = "Marvell Armada 8040";
+	compatible = "marvell,armada8040", "marvell,armada-ap806-quad",
+		     "marvell,armada-ap806";
+};
diff --git a/arch/arm/dts/armada-cp110-slave.dtsi b/arch/arm/dts/armada-cp110-slave.dtsi
new file mode 100644
index 0000000..842fb33
--- /dev/null
+++ b/arch/arm/dts/armada-cp110-slave.dtsi
@@ -0,0 +1,249 @@
+/*
+ * Copyright (C) 2016 Marvell Technology Group Ltd.
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPLv2 or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This library is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Device Tree file for Marvell Armada CP110 Slave.
+ */
+
+/ {
+	cp110-slave {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		compatible = "simple-bus";
+		interrupt-parent = <&gic>;
+		ranges;
+
+		config-space {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "simple-bus";
+			interrupt-parent = <&gic>;
+			ranges = <0x0 0x0 0xf4000000 0x2000000>;
+
+			cps_syscon0: system-controller at 440000 {
+				compatible = "marvell,cp110-system-controller0",
+					     "syscon";
+				reg = <0x440000 0x1000>;
+				#clock-cells = <2>;
+				core-clock-output-names =
+					"cps-apll", "cps-ppv2-core", "cps-eip",
+					"cps-core", "cps-nand-core";
+				gate-clock-output-names =
+					"cps-audio", "cps-communit", "cps-nand",
+					"cps-ppv2", "cps-sdio", "cps-mg-domain",
+					"cps-mg-core", "cps-xor1", "cps-xor0",
+					"cps-gop-dp", "none", "cps-pcie_x10",
+					"cps-pcie_x11", "cps-pcie_x4", "cps-pcie-xor",
+					"cps-sata", "cps-sata-usb", "cps-main",
+					"cps-sd-mmc", "none", "none",
+					"cps-slow-io", "cps-usb3h0", "cps-usb3h1",
+					"cps-usb3dev", "cps-eip150", "cps-eip197";
+			};
+
+			cps_sata0: sata at 540000 {
+				compatible = "marvell,armada-8k-ahci";
+				reg = <0x540000 0x30000>;
+				interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&cps_syscon0 1 15>;
+				status = "disabled";
+			};
+
+			cps_usb3_0: usb3 at 500000 {
+				compatible = "marvell,armada-8k-xhci",
+					     "generic-xhci";
+				reg = <0x500000 0x4000>;
+				dma-coherent;
+				interrupts = <GIC_SPI 286 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&cps_syscon0 1 22>;
+				status = "disabled";
+			};
+
+			cps_usb3_1: usb3 at 510000 {
+				compatible = "marvell,armada-8k-xhci",
+					     "generic-xhci";
+				reg = <0x510000 0x4000>;
+				dma-coherent;
+				interrupts = <GIC_SPI 285 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&cps_syscon0 1 23>;
+				status = "disabled";
+			};
+
+			cps_xor0: xor at 6a0000 {
+				compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+				reg = <0x6a0000 0x1000>,
+				      <0x6b0000 0x1000>;
+				dma-coherent;
+				msi-parent = <&gic_v2m0>;
+				clocks = <&cps_syscon0 1 8>;
+			};
+
+			cps_xor1: xor at 6c0000 {
+				compatible = "marvell,armada-7k-xor", "marvell,xor-v2";
+				reg = <0x6c0000 0x1000>,
+				      <0x6d0000 0x1000>;
+				dma-coherent;
+				msi-parent = <&gic_v2m0>;
+				clocks = <&cps_syscon0 1 7>;
+			};
+
+			cps_spi0: spi at 700600 {
+				compatible = "marvell,armada-380-spi";
+				reg = <0x700600 0x50>;
+				#address-cells = <0x1>;
+				#size-cells = <0x0>;
+				cell-index = <1>;
+				clocks = <&cps_syscon0 0 3>;
+				status = "disabled";
+			};
+
+			cps_spi1: spi at 700680 {
+				compatible = "marvell,armada-380-spi";
+				reg = <0x700680 0x50>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				cell-index = <2>;
+				clocks = <&cps_syscon0 1 21>;
+				status = "disabled";
+			};
+
+			cps_i2c0: i2c at 701000 {
+				compatible = "marvell,mv78230-i2c";
+				reg = <0x701000 0x20>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				interrupts = <GIC_SPI 310 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&cps_syscon0 1 21>;
+				status = "disabled";
+			};
+
+			cps_i2c1: i2c at 701100 {
+				compatible = "marvell,mv78230-i2c";
+				reg = <0x701100 0x20>;
+				#address-cells = <1>;
+				#size-cells = <0>;
+				interrupts = <GIC_SPI 311 IRQ_TYPE_LEVEL_HIGH>;
+				clocks = <&cps_syscon0 1 21>;
+				status = "disabled";
+			};
+		};
+
+		cps_pcie0: pcie at f4600000 {
+			compatible = "marvell,armada8k-pcie", "snps,dw-pcie";
+			reg = <0 0xf4600000 0 0x10000>,
+			      <0 0xfaf00000 0 0x80000>;
+			reg-names = "ctrl", "config";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			#interrupt-cells = <1>;
+			device_type = "pci";
+			dma-coherent;
+			msi-parent = <&gic_v2m0>;
+
+			bus-range = <0 0xff>;
+			ranges =
+				/* downstream I/O */
+				<0x81000000 0 0xfd000000 0  0xfd000000 0 0x10000
+				/* non-prefetchable memory */
+				0x82000000 0 0xfa000000 0  0xfa000000 0 0xf00000>;
+			interrupt-map-mask = <0 0 0 0>;
+			interrupt-map = <0 0 0 0 &gic 0 GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
+			interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>;
+			num-lanes = <1>;
+			clocks = <&cps_syscon0 1 13>;
+			status = "disabled";
+		};
+
+		cps_pcie1: pcie at f4620000 {
+			compatible = "marvell,armada8k-pcie", "snps,dw-pcie";
+			reg = <0 0xf4620000 0 0x10000>,
+			      <0 0xfbf00000 0 0x80000>;
+			reg-names = "ctrl", "config";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			#interrupt-cells = <1>;
+			device_type = "pci";
+			dma-coherent;
+			msi-parent = <&gic_v2m0>;
+
+			bus-range = <0 0xff>;
+			ranges =
+				/* downstream I/O */
+				<0x81000000 0 0xfd010000 0  0xfd010000 0 0x10000
+				/* non-prefetchable memory */
+				0x82000000 0 0xfb000000 0  0xfb000000 0 0xf00000>;
+			interrupt-map-mask = <0 0 0 0>;
+			interrupt-map = <0 0 0 0 &gic 0 GIC_SPI 258 IRQ_TYPE_LEVEL_HIGH>;
+			interrupts = <GIC_SPI 258 IRQ_TYPE_LEVEL_HIGH>;
+
+			num-lanes = <1>;
+			clocks = <&cps_syscon0 1 11>;
+			status = "disabled";
+		};
+
+		cps_pcie2: pcie at f4640000 {
+			compatible = "marvell,armada8k-pcie", "snps,dw-pcie";
+			reg = <0 0xf4640000 0 0x10000>,
+			      <0 0xfcf00000 0 0x80000>;
+			reg-names = "ctrl", "config";
+			#address-cells = <3>;
+			#size-cells = <2>;
+			#interrupt-cells = <1>;
+			device_type = "pci";
+			dma-coherent;
+			msi-parent = <&gic_v2m0>;
+
+			bus-range = <0 0xff>;
+			ranges =
+				/* downstream I/O */
+				<0x81000000 0 0xfd020000 0  0xfd020000 0 0x10000
+				/* non-prefetchable memory */
+				0x82000000 0 0xfc000000 0  0xfc000000 0 0xf00000>;
+			interrupt-map-mask = <0 0 0 0>;
+			interrupt-map = <0 0 0 0 &gic 0 GIC_SPI 257 IRQ_TYPE_LEVEL_HIGH>;
+			interrupts = <GIC_SPI 257 IRQ_TYPE_LEVEL_HIGH>;
+
+			num-lanes = <1>;
+			clocks = <&cps_syscon0 1 12>;
+			status = "disabled";
+		};
+	};
+};
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 03/15] arm64: mvebu: armada-8k: Only configure xHCI power on DB-88F7040 board
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 02/15] arm64: mvebu: Add Armada-80x0 dts/dtsi files Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 04/15] arm64: mvebu: Add slave CP area to the memory map Stefan Roese
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This patch uses of_machine_is_compatible() to detect the board at runtime
and only configured the I2C IO expander for the xHCI power / reset on
the DB-88F7040 board. As this code will be used by other Armada-7k/8k
ports, its necessary to use this runtime detection here.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 board/Marvell/mvebu_armada-8k/board.c | 146 ++++++++++++++++++----------------
 1 file changed, 78 insertions(+), 68 deletions(-)

diff --git a/board/Marvell/mvebu_armada-8k/board.c b/board/Marvell/mvebu_armada-8k/board.c
index 48bd55c..7d1b5d9 100644
--- a/board/Marvell/mvebu_armada-8k/board.c
+++ b/board/Marvell/mvebu_armada-8k/board.c
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <i2c.h>
 #include <asm/io.h>
 #include <asm/arch/cpu.h>
@@ -12,6 +13,11 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * Information specific to the DB-88F7040 eval board. We strive to use
+ * DT for such platform specfic configurations. At some point, this
+ * might be removed here and implemented via DT.
+ */
 /* IO expander I2C device */
 #define I2C_IO_EXP_ADDR		0x21
 #define I2C_IO_CFG_REG_0	0x6
@@ -44,45 +50,47 @@ int board_xhci_config(void)
 	int ret;
 	u8 buf[8];
 
-	/* Configure IO exander PCA9555: 7bit address 0x21 */
-	ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
-	if (ret) {
-		printf("Cannot find PCA9555: %d\n", ret);
-		return 0;
-	}
-
-	/*
-	 * Read configuration (direction) and set VBUS pin as output
-	 * (reset pin = output)
-	 */
-	ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to read IO expander value via I2C\n");
-		return -EIO;
-	}
-	buf[0] &= ~I2C_IO_REG_VBUS;
-	buf[0] &= ~I2C_IO_REG_CL;
-	ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to set IO expander via I2C\n");
-		return -EIO;
-	}
-
-	/* Read output value and configure it */
-	ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to read IO expander value via I2C\n");
-		return -EIO;
+	if (of_machine_is_compatible("marvell,armada7040-db")) {
+		/* Configure IO exander PCA9555: 7bit address 0x21 */
+		ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+		if (ret) {
+			printf("Cannot find PCA9555: %d\n", ret);
+			return 0;
+		}
+
+		/*
+		 * Read configuration (direction) and set VBUS pin as output
+		 * (reset pin = output)
+		 */
+		ret = dm_i2c_read(dev, I2C_IO_CFG_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to read IO expander value via I2C\n");
+			return -EIO;
+		}
+		buf[0] &= ~I2C_IO_REG_VBUS;
+		buf[0] &= ~I2C_IO_REG_CL;
+		ret = dm_i2c_write(dev, I2C_IO_CFG_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to set IO expander via I2C\n");
+			return -EIO;
+		}
+
+		/* Read output value and configure it */
+		ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to read IO expander value via I2C\n");
+			return -EIO;
+		}
+		buf[0] &= ~I2C_IO_REG_VBUS;
+		buf[0] |= I2C_IO_REG_CL;
+		ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to set IO expander via I2C\n");
+			return -EIO;
+		}
+
+		mdelay(500); /* required delay to let output value settle */
 	}
-	buf[0] &= ~I2C_IO_REG_VBUS;
-	buf[0] |= I2C_IO_REG_CL;
-	ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to set IO expander via I2C\n");
-		return -EIO;
-	}
-
-	mdelay(500); /* required delay to let output value settle */
 
 	return 0;
 }
@@ -93,38 +101,40 @@ int board_xhci_enable(void)
 	int ret;
 	u8 buf[8];
 
-	/*
-	 * This function enables all USB ports simultaniously,
-	 * it only needs to get called once
-	 */
-	if (usb_enabled)
-		return 0;
-
-	/* Configure IO exander PCA9555: 7bit address 0x21 */
-	ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
-	if (ret) {
-		printf("Cannot find PCA9555: %d\n", ret);
-		return 0;
-	}
-
-	/* Read VBUS output value */
-	ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to read IO expander value via I2C\n");
-		return -EIO;
+	if (of_machine_is_compatible("marvell,armada7040-db")) {
+		/*
+		 * This function enables all USB ports simultaniously,
+		 * it only needs to get called once
+		 */
+		if (usb_enabled)
+			return 0;
+
+		/* Configure IO exander PCA9555: 7bit address 0x21 */
+		ret = i2c_get_chip_for_busnum(0, I2C_IO_EXP_ADDR, 1, &dev);
+		if (ret) {
+			printf("Cannot find PCA9555: %d\n", ret);
+			return 0;
+		}
+
+		/* Read VBUS output value */
+		ret = dm_i2c_read(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to read IO expander value via I2C\n");
+			return -EIO;
+		}
+
+		/* Enable VBUS power: Set output value of VBUS pin as enabled */
+		buf[0] |= I2C_IO_REG_VBUS;
+		ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
+		if (ret) {
+			printf("Failed to set IO expander via I2C\n");
+			return -EIO;
+		}
+
+		mdelay(500); /* required delay to let output value settle */
+		usb_enabled = 1;
 	}
 
-	/* Enable VBUS power: Set output value of VBUS pin as enabled */
-	buf[0] |= I2C_IO_REG_VBUS;
-	ret = dm_i2c_write(dev, I2C_IO_DATA_OUT_REG_0, buf, 1);
-	if (ret) {
-		printf("Failed to set IO expander via I2C\n");
-		return -EIO;
-	}
-
-	mdelay(500); /* required delay to let output value settle */
-	usb_enabled = 1;
-
 	return 0;
 }
 
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 04/15] arm64: mvebu: Add slave CP area to the memory map
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 02/15] arm64: mvebu: Add Armada-80x0 dts/dtsi files Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 03/15] arm64: mvebu: armada-8k: Only configure xHCI power on DB-88F7040 board Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 05/15] arm64: mvebu: Add support for the DB-88F8040 Armada 8k devel board Stefan Roese
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

To enable access to the slave CP its memory needs to be added to the
MMU memory map.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/mach-mvebu/armada8k/cpu.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-mvebu/armada8k/cpu.c b/arch/arm/mach-mvebu/armada8k/cpu.c
index 036430c..f8e69d6 100644
--- a/arch/arm/mach-mvebu/armada8k/cpu.c
+++ b/arch/arm/mach-mvebu/armada8k/cpu.c
@@ -39,7 +39,7 @@ static struct mm_region mvebu_mem_map[] = {
 			 PTE_BLOCK_NON_SHARE
 	},
 	{
-		/* SRAM, MMIO regions - CP110 region */
+		/* SRAM, MMIO regions - CP110 master region */
 		.phys = 0xf2000000UL,
 		.virt = 0xf2000000UL,
 		.size = 0x02000000UL,	/* 32MiB internal registers */
@@ -47,6 +47,14 @@ static struct mm_region mvebu_mem_map[] = {
 			 PTE_BLOCK_NON_SHARE
 	},
 	{
+		/* SRAM, MMIO regions - CP110 slave region */
+		.phys = 0xf4000000UL,
+		.virt = 0xf4000000UL,
+		.size = 0x02000000UL,	/* 32MiB internal registers */
+		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE
+	},
+	{
 		/* List terminator */
 		0,
 	}
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 05/15] arm64: mvebu: Add support for the DB-88F8040 Armada 8k devel board
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (2 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 04/15] arm64: mvebu: Add slave CP area to the memory map Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 06/15] arm64: mvebu: armada-cp110-master.dtsi: Rename comphy DT node names Stefan Roese
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This patch adds the necessary files to support the Marvell Armada 8k
devel board. Most board specfic files are shared with the Armada 7k
boards under the name "armada-8k*". So only minimal changes are
necessary to add this basic board support (except the DT files of
course).

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/Makefile                     |  1 +
 board/Marvell/mvebu_armada-8k/MAINTAINERS |  1 +
 configs/mvebu_db-88f8040_defconfig        | 52 +++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+)
 create mode 100644 configs/mvebu_db-88f8040_defconfig

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 836a8c4..5c66340 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -73,6 +73,7 @@ dtb-$(CONFIG_ARCH_MVEBU) +=			\
 	armada-388-gp.dtb			\
 	armada-385-amc.dtb			\
 	armada-7040-db.dtb			\
+	armada-8040-db.dtb			\
 	armada-xp-gp.dtb			\
 	armada-xp-maxbcm.dtb			\
 	armada-xp-synology-ds414.dtb		\
diff --git a/board/Marvell/mvebu_armada-8k/MAINTAINERS b/board/Marvell/mvebu_armada-8k/MAINTAINERS
index 33923ba..e0b965d 100644
--- a/board/Marvell/mvebu_armada-8k/MAINTAINERS
+++ b/board/Marvell/mvebu_armada-8k/MAINTAINERS
@@ -4,3 +4,4 @@ S:	Maintained
 F:	board/Marvell/mvebu_armada-8k/
 F:	include/configs/mvebu_armada-8k.h
 F:	configs/mvebu_db-88f7040_defconfig
+F:	configs/mvebu_db-88f8040_defconfig
diff --git a/configs/mvebu_db-88f8040_defconfig b/configs/mvebu_db-88f8040_defconfig
new file mode 100644
index 0000000..eccb0f0
--- /dev/null
+++ b/configs/mvebu_db-88f8040_defconfig
@@ -0,0 +1,52 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MVEBU=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TARGET_MVEBU_ARMADA_8K=y
+CONFIG_DEFAULT_DEVICE_TREE="armada-8040-db"
+CONFIG_SMBIOS_PRODUCT_NAME=""
+CONFIG_AHCI=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_FPGA is not set
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_BLOCK_CACHE=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MVTWSI=y
+CONFIG_MISC=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_PHYLIB=y
+CONFIG_MVEBU_COMPHY_SUPPORT=y
+# CONFIG_SPL_SERIAL_PRESENT is not set
+CONFIG_DEBUG_UART=y
+CONFIG_DEBUG_UART_BASE=0xf0512000
+CONFIG_DEBUG_UART_CLOCK=200000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_SYS_NS16550=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_SMBIOS_MANUFACTURER=""
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 06/15] arm64: mvebu: armada-cp110-master.dtsi: Rename comphy DT node names
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (3 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 05/15] arm64: mvebu: Add support for the DB-88F8040 Armada 8k devel board Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 07/15] arm64: mvebu: armada-cp110-slave.dtsi: Add COMPHY / UTMI device tree nodes Stefan Roese
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

Since the cp110 slave also has comphy DT nodes, the names need to be
renamed to avoid a name clash. Lets use the common naming scheme:
"cpm_xxx" for master and "cps_xxx" for slave.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/armada-7040-db.dts       | 6 +++---
 arch/arm/dts/armada-cp110-master.dtsi | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/arm/dts/armada-7040-db.dts b/arch/arm/dts/armada-7040-db.dts
index 7d0059a..b8fe5a9 100644
--- a/arch/arm/dts/armada-7040-db.dts
+++ b/arch/arm/dts/armada-7040-db.dts
@@ -152,7 +152,7 @@
 	status = "okay";
 };
 
-&comphy_cp110 {
+&cpm_comphy {
 	phy0 {
 		phy-type = <PHY_TYPE_SGMII2>;
 		phy-speed = <PHY_SPEED_3_125G>;
@@ -184,10 +184,10 @@
 	};
 };
 
-&utmi0 {
+&cpm_utmi0 {
 	status = "okay";
 };
 
-&utmi1 {
+&cpm_utmi1 {
 	status = "okay";
 };
diff --git a/arch/arm/dts/armada-cp110-master.dtsi b/arch/arm/dts/armada-cp110-master.dtsi
index 7da98bf..422d754 100644
--- a/arch/arm/dts/armada-cp110-master.dtsi
+++ b/arch/arm/dts/armada-cp110-master.dtsi
@@ -149,7 +149,7 @@
 				status = "disabled";
 			};
 
-			comphy_cp110: comphy at 441000 {
+			cpm_comphy: comphy at 441000 {
 				compatible = "marvell,mvebu-comphy", "marvell,comphy-cp110";
 				reg = <0x441000 0x8>,
 				      <0x120000 0x8>;
@@ -157,7 +157,7 @@
 				max-lanes = <6>;
 			};
 
-			utmi0: utmi at 580000 {
+			cpm_utmi0: utmi at 580000 {
 				compatible = "marvell,mvebu-utmi-2.6.0";
 				reg = <0x580000 0x1000>,	/* utmi-unit */
 				      <0x440420 0x4>,		/* usb-cfg */
@@ -166,7 +166,7 @@
 				status = "disabled";
 			};
 
-			utmi1: utmi at 581000 {
+			cpm_utmi1: utmi at 581000 {
 				compatible = "marvell,mvebu-utmi-2.6.0";
 				reg = <0x581000 0x1000>,	/* utmi-unit */
 				      <0x440420 0x4>,		/* usb-cfg */
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 07/15] arm64: mvebu: armada-cp110-slave.dtsi: Add COMPHY / UTMI device tree nodes
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (4 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 06/15] arm64: mvebu: armada-cp110-master.dtsi: Rename comphy DT node names Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 08/15] arm64: mvebu: armada-8040-db.dts: Add COMPHY configuration Stefan Roese
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This patch adds the COMPHY and UTMI device tree nodes to the cp110-slave
dtsi file for the Armada 8K.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/armada-cp110-slave.dtsi | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/arch/arm/dts/armada-cp110-slave.dtsi b/arch/arm/dts/armada-cp110-slave.dtsi
index 842fb33..a7f77b9 100644
--- a/arch/arm/dts/armada-cp110-slave.dtsi
+++ b/arch/arm/dts/armada-cp110-slave.dtsi
@@ -44,6 +44,8 @@
  * Device Tree file for Marvell Armada CP110 Slave.
  */
 
+#include <dt-bindings/comphy/comphy_data.h>
+
 / {
 	cp110-slave {
 		#address-cells = <2>;
@@ -164,6 +166,23 @@
 				clocks = <&cps_syscon0 1 21>;
 				status = "disabled";
 			};
+
+			cps_comphy: comphy at 441000 {
+				compatible = "marvell,mvebu-comphy", "marvell,comphy-cp110";
+				reg = <0x441000 0x8>,
+				      <0x120000 0x8>;
+				mux-bitcount = <4>;
+				max-lanes = <6>;
+			};
+
+			cps_utmi0: utmi at 580000 {
+				compatible = "marvell,mvebu-utmi-2.6.0";
+				reg = <0x580000 0x1000>,	/* utmi-unit */
+				      <0x440420 0x4>,		/* usb-cfg */
+				      <0x440440 0x4>;		/* utmi-cfg */
+				utmi-port = <UTMI_PHY_TO_USB_HOST0>;
+				status = "disabled";
+			};
 		};
 
 		cps_pcie0: pcie at f4600000 {
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 08/15] arm64: mvebu: armada-8040-db.dts: Add COMPHY configuration
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (5 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 07/15] arm64: mvebu: armada-cp110-slave.dtsi: Add COMPHY / UTMI device tree nodes Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 09/15] arm64: mvebu: armada-8040-db.dts: Add I2C and SPI aliases Stefan Roese
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This patch adds the COMPHY device tree configuration to the DT file for
the Marvell DB-88F8040 devel board.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/armada-8040-db.dts | 84 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

diff --git a/arch/arm/dts/armada-8040-db.dts b/arch/arm/dts/armada-8040-db.dts
index 6e6f182..4978092 100644
--- a/arch/arm/dts/armada-8040-db.dts
+++ b/arch/arm/dts/armada-8040-db.dts
@@ -148,3 +148,87 @@
 &cps_usb3_1 {
 	status = "okay";
 };
+
+&cpm_comphy {
+	/*
+	 * Serdes Configuration:
+	 * Lane 0: SGMII2
+	 * Lane 1: USB3_HOST0
+	 * Lane 2: KR (10G)
+	 * Lane 3: SATA1
+	 * Lane 4: USB3_HOST1
+	 * Lane 5: PEX2x1
+	 */
+	phy0 {
+		phy-type = <PHY_TYPE_SGMII2>;
+		phy-speed = <PHY_SPEED_3_125G>;
+	};
+
+	phy1 {
+		phy-type = <PHY_TYPE_USB3_HOST0>;
+	};
+
+	phy2 {
+		phy-type = <PHY_TYPE_KR>;
+	};
+
+	phy3 {
+		phy-type = <PHY_TYPE_SATA1>;
+	};
+
+	phy4 {
+		phy-type = <PHY_TYPE_USB3_HOST1>;
+	};
+
+	phy5 {
+		phy-type = <PHY_TYPE_PEX2>;
+	};
+};
+
+&cps_comphy {
+	/*
+	 * Serdes Configuration:
+	 * Lane 0: SGMII2
+	 * Lane 1: USB3_HOST0
+	 * Lane 2: KR (10G)
+	 * Lane 3: SATA1
+	 * Lane 4: Unconnected
+	 * Lane 5: PEX2x1
+	 */
+	phy0 {
+		phy-type = <PHY_TYPE_SGMII2>;
+		phy-speed = <PHY_SPEED_3_125G>;
+	};
+
+	phy1 {
+		phy-type = <PHY_TYPE_USB3_HOST0>;
+	};
+
+	phy2 {
+		phy-type = <PHY_TYPE_KR>;
+	};
+
+	phy3 {
+		phy-type = <PHY_TYPE_SATA1>;
+	};
+
+	phy4 {
+		phy-type = <PHY_TYPE_UNCONNECTED>;
+	};
+
+	phy5 {
+		phy-type = <PHY_TYPE_PEX2>;
+	};
+};
+
+&cpm_utmi0 {
+	status = "okay";
+};
+
+&cpm_utmi1 {
+	status = "okay";
+};
+
+&cps_utmi0 {
+	status = "okay";
+};
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 09/15] arm64: mvebu: armada-8040-db.dts: Add I2C and SPI aliases
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (6 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 08/15] arm64: mvebu: armada-8040-db.dts: Add COMPHY configuration Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 10/15] arm64: mvebu: Init COMPHY from the slave-CP on the A8k Stefan Roese
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

Add I2C and SPI aliases to enable usage in U-Boot. Otherwise U-Boot will
not be able to use the SPI NOR chip for environment storage and use
"i2c dev 0" to select this I2C bus.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/dts/armada-8040-db.dts | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/dts/armada-8040-db.dts b/arch/arm/dts/armada-8040-db.dts
index 4978092..7fb674b 100644
--- a/arch/arm/dts/armada-8040-db.dts
+++ b/arch/arm/dts/armada-8040-db.dts
@@ -55,6 +55,11 @@
 		stdout-path = "serial0:115200n8";
 	};
 
+	aliases {
+		i2c0 = &cpm_i2c0;
+		spi0 = &spi0;
+	};
+
 	memory at 00000000 {
 		device_type = "memory";
 		reg = <0x0 0x0 0x0 0x80000000>;
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 10/15] arm64: mvebu: Init COMPHY from the slave-CP on the A8k
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (7 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 09/15] arm64: mvebu: armada-8040-db.dts: Add I2C and SPI aliases Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 11/15] drivers/phy: marvell: Add support for the slave CP COMPHY device Stefan Roese
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

The Armada8k implements 2 CPs (communication processors) and the 2nd
CP also is equipped with a COMPHY controller. This patch now loops
over all enabled MISC devices (CP110) enabled in the DT to initialize
all CPs.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/mach-mvebu/arm64-common.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-mvebu/arm64-common.c b/arch/arm/mach-mvebu/arm64-common.c
index 7055a81..1fc2ff2 100644
--- a/arch/arm/mach-mvebu/arm64-common.c
+++ b/arch/arm/mach-mvebu/arm64-common.c
@@ -109,12 +109,20 @@ int arch_early_init_r(void)
 {
 	struct udevice *dev;
 	int ret;
-
-	/* Call the comphy code via the MISC uclass driver */
-	ret = uclass_get_device(UCLASS_MISC, 0, &dev);
-	if (ret) {
-		debug("COMPHY init failed: %d\n", ret);
-		return -ENODEV;
+	int i;
+
+	/*
+	 * Loop over all MISC uclass drivers to call the comphy code
+	 * and init all CP110 devices enabled in the DT
+	 */
+	i = 0;
+	while (1) {
+		/* Call the comphy code via the MISC uclass driver */
+		ret = uclass_get_device(UCLASS_MISC, i++, &dev);
+
+		/* We're done, once no further CP110 device is found */
+		if (ret)
+			break;
 	}
 
 	/* Cause the SATA device to do its early init */
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 11/15] drivers/phy: marvell: Add support for the slave CP COMPHY device
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (8 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 10/15] arm64: mvebu: Init COMPHY from the slave-CP on the A8k Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K Stefan Roese
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

With the support for the Armada 8k, a 2nd COMPHY controller now needs
to get supported from the CP110 slave controller. This patch adds support
for this 2nd contoller in the COMPHY driver.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 drivers/phy/marvell/comphy.h      |  2 +-
 drivers/phy/marvell/comphy_core.c | 15 +++++++++++++--
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/phy/marvell/comphy.h b/drivers/phy/marvell/comphy.h
index df5b7d5..0a15692 100644
--- a/drivers/phy/marvell/comphy.h
+++ b/drivers/phy/marvell/comphy.h
@@ -69,7 +69,7 @@
 	(0x3 << DFX_DEV_GEN_PCIE_CLK_SRC_OFFSET)
 
 #define MAX_LANE_OPTIONS			10
-#define MAX_UTMI_PHY_COUNT			2
+#define MAX_UTMI_PHY_COUNT			3
 
 struct comphy_mux_options {
 	u32 type;
diff --git a/drivers/phy/marvell/comphy_core.c b/drivers/phy/marvell/comphy_core.c
index 651397d..bc2508b 100644
--- a/drivers/phy/marvell/comphy_core.c
+++ b/drivers/phy/marvell/comphy_core.c
@@ -112,6 +112,7 @@ static int comphy_probe(struct udevice *dev)
 	struct comphy_map comphy_map_data[MAX_LANE_OPTIONS];
 	int subnode;
 	int lane;
+	int last_idx = 0;
 
 	/* Save base addresses for later use */
 	chip_cfg->comphy_base_addr = (void *)dev_get_addr_index(dev, 0);
@@ -178,10 +179,20 @@ static int comphy_probe(struct udevice *dev)
 	/* PHY power UP sequence */
 	chip_cfg->ptr_comphy_chip_init(chip_cfg, comphy_map_data);
 	/* PHY print SerDes status */
+	if (of_machine_is_compatible("marvell,armada8040"))
+		printf("Comphy chip #%d:\n", chip_cfg->comphy_index);
 	comphy_print(chip_cfg, comphy_map_data);
 
-	/* Initialize dedicated PHYs (not muxed SerDes lanes) */
-	comphy_dedicated_phys_init();
+	/*
+	 * Only run the dedicated PHY init code once, in the last PHY init call
+	 */
+	if (of_machine_is_compatible("marvell,armada8040"))
+		last_idx = 1;
+
+	if (chip_cfg->comphy_index == last_idx) {
+		/* Initialize dedicated PHYs (not muxed SerDes lanes) */
+		comphy_dedicated_phys_init();
+	}
 
 	return 0;
 }
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (9 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 11/15] drivers/phy: marvell: Add support for the slave CP COMPHY device Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-18  1:14   ` Simon Glass
  2016-11-28 12:38   ` [U-Boot] [PATCH 12/15 v2] " Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 13/15] arm64: mvebu: Add regions for PCI spaces to the memory map Stefan Roese
                   ` (3 subsequent siblings)
  14 siblings, 2 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

From: Shadi Ammouri <shadi@marvell.com>

This patch adds a driver for the PCIe controller integrated in the
Marvell Armada-8K SoC. This controller is based on the DesignWare
IP core.

The original version was written by Shadi and Yehuda. I ported this
driver to the latest mainline U-Boot version with DM support.

Tested on the Marvell DB-88F8040 Armada-8K eval board.

Signed-off-by: Shadi Ammouri <shadi@marvell.com>
Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 drivers/pci/Kconfig         |  10 ++
 drivers/pci/Makefile        |   1 +
 drivers/pci/pcie_dw_mvebu.c | 415 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 426 insertions(+)
 create mode 100644 drivers/pci/pcie_dw_mvebu.c

diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index b8376b4..ff2c370 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -33,6 +33,16 @@ config PCI_PNP
 	help
 	  Enable PCI memory and I/O space resource allocation and assignment.
 
+config PCIE_DW_MVEBU
+	bool "Enable Armada-8K PCIe driver (DesignWare core)"
+	default n
+	depends on DM_PCI
+	depends on ARMADA_8K
+	help
+	  Say Y here if you want to enable PCIe controller support on
+	  Armada-8K SoCs. The PCIe controller on Armada-8K is based on
+	  DesignWare hardware.
+
 config PCI_SANDBOX
 	bool "Sandbox PCI support"
 	depends on SANDBOX && DM_PCI
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
index 9583e91..86717a4 100644
--- a/drivers/pci/Makefile
+++ b/drivers/pci/Makefile
@@ -30,5 +30,6 @@ obj-$(CONFIG_SH7780_PCI) +=pci_sh7780.o
 obj-$(CONFIG_PCI_TEGRA) += pci_tegra.o
 obj-$(CONFIG_TSI108_PCI) += tsi108_pci.o
 obj-$(CONFIG_WINBOND_83C553) += w83c553f.o
+obj-$(CONFIG_PCIE_DW_MVEBU) += pcie_dw_mvebu.o
 obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape.o
 obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o
diff --git a/drivers/pci/pcie_dw_mvebu.c b/drivers/pci/pcie_dw_mvebu.c
new file mode 100644
index 0000000..dd5ba34
--- /dev/null
+++ b/drivers/pci/pcie_dw_mvebu.c
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2015 Marvell International Ltd.
+ *
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ *
+ * Based on:
+ *   - drivers/pci/pcie_imx.c
+ *   - drivers/pci/pci_mvebu.c
+ *   - drivers/pci/pcie_xilinx.c
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <pci.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* PCI Config space registers */
+#define PCIE_CONFIG_BAR0		0x10
+#define PCIE_LINK_STATUS_REG		0x80
+#define PCIE_LINK_STATUS_SPEED_OFF	16
+#define PCIE_LINK_STATUS_SPEED_MASK	0xf
+#define PCIE_LINK_STATUS_WIDTH_OFF	20
+#define PCIE_LINK_STATUS_WIDTH_MASK	0xf
+
+/* Resizable bar capability registers */
+#define RESIZABLE_BAR_CAP		0x250
+#define RESIZABLE_BAR_CTL0		0x254
+#define RESIZABLE_BAR_CTL1		0x258
+
+/* iATU registers */
+#define PCIE_ATU_VIEWPORT		0x900
+#define PCIE_ATU_REGION_INBOUND		(0x1 << 31)
+#define PCIE_ATU_REGION_OUTBOUND	(0x0 << 31)
+#define PCIE_ATU_REGION_INDEX1		(0x1 << 0)
+#define PCIE_ATU_REGION_INDEX0		(0x0 << 0)
+#define PCIE_ATU_CR1			0x904
+#define PCIE_ATU_TYPE_MEM		(0x0 << 0)
+#define PCIE_ATU_TYPE_IO		(0x2 << 0)
+#define PCIE_ATU_TYPE_CFG0		(0x4 << 0)
+#define PCIE_ATU_TYPE_CFG1		(0x5 << 0)
+#define PCIE_ATU_CR2			0x908
+#define PCIE_ATU_ENABLE			(0x1 << 31)
+#define PCIE_ATU_BAR_MODE_ENABLE	(0x1 << 30)
+#define PCIE_ATU_LOWER_BASE		0x90C
+#define PCIE_ATU_UPPER_BASE		0x910
+#define PCIE_ATU_LIMIT			0x914
+#define PCIE_ATU_LOWER_TARGET		0x918
+#define PCIE_ATU_BUS(x)			(((x) & 0xff) << 24)
+#define PCIE_ATU_DEV(x)			(((x) & 0x1f) << 19)
+#define PCIE_ATU_FUNC(x)		(((x) & 0x7) << 16)
+#define PCIE_ATU_UPPER_TARGET		0x91C
+
+#define PCIE_LINK_CAPABILITY		0x7C
+#define PCIE_LINK_CTL_2			0xA0
+#define TARGET_LINK_SPEED_MASK		0xF
+#define LINK_SPEED_GEN_1		0x1
+#define LINK_SPEED_GEN_2		0x2
+#define LINK_SPEED_GEN_3		0x3
+
+#define PCIE_GEN3_RELATED		0x890
+#define GEN3_EQU_DISABLE		(1 << 16)
+#define GEN3_ZRXDC_NON_COMP		(1 << 0)
+
+#define PCIE_GEN3_EQU_CTRL		0x8A8
+#define GEN3_EQU_EVAL_2MS_DISABLE	(1 << 5)
+
+#define PCIE_ROOT_COMPLEX_MODE_MASK	(0xF << 4)
+
+#define PCIE_LINK_UP_TIMEOUT_MS		100
+
+#define PCIE_GLOBAL_CONTROL		0x8000
+#define PCIE_APP_LTSSM_EN		(1 << 2)
+#define PCIE_DEVICE_TYPE_OFFSET		(4)
+#define PCIE_DEVICE_TYPE_MASK		(0xF)
+#define PCIE_DEVICE_TYPE_EP		(0x0) /* Endpoint */
+#define PCIE_DEVICE_TYPE_LEP		(0x1) /* Legacy endpoint */
+#define PCIE_DEVICE_TYPE_RC		(0x4) /* Root complex */
+
+#define PCIE_GLOBAL_STATUS		0x8008
+#define PCIE_GLB_STS_RDLH_LINK_UP	(1 << 1)
+#define PCIE_GLB_STS_PHY_LINK_UP	(1 << 9)
+
+#define PCIE_ARCACHE_TRC		0x8050
+#define PCIE_AWCACHE_TRC		0x8054
+#define ARCACHE_SHAREABLE_CACHEABLE	0x3511
+#define AWCACHE_SHAREABLE_CACHEABLE	0x5311
+
+#define LINK_SPEED_GEN_1                0x1
+#define LINK_SPEED_GEN_2                0x2
+#define LINK_SPEED_GEN_3                0x3
+
+struct pcie_dw_mvebu {
+	struct pci_controller hose;
+	void *ctrl_base;
+	void *cfg_base;
+	fdt_size_t cfg_size;
+	int first_busno;
+};
+
+static int pcie_dw_get_link_speed(void *regs_base)
+{
+	return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
+		PCIE_LINK_STATUS_SPEED_OFF) & PCIE_LINK_STATUS_SPEED_MASK;
+}
+
+static int pcie_dw_get_link_width(void *regs_base)
+{
+	return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
+		PCIE_LINK_STATUS_WIDTH_OFF) & PCIE_LINK_STATUS_WIDTH_MASK;
+}
+
+static uintptr_t set_cfg_address(struct pcie_dw_mvebu *pcie,
+				 pci_dev_t d, int where)
+{
+	uintptr_t va_address;
+
+	/*
+	 * Region #0 is used for Outbound CFG space access.
+	 * Direction = Outbound
+	 * Region Index = 0
+	 */
+	writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
+
+	if (PCI_BUS(d) == (pcie->first_busno + 1))
+		/* For local bus, change TLP Type field to 4. */
+		writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
+	else
+		/* Otherwise, change TLP Type field to 5. */
+		writel(PCIE_ATU_TYPE_CFG1, pcie->ctrl_base + PCIE_ATU_CR1);
+
+	if (PCI_BUS(d) == pcie->first_busno) {
+		/* Accessing root port configuration space. */
+		va_address = (uintptr_t)pcie->ctrl_base;
+	} else {
+		writel(d << 8, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
+		va_address = (uintptr_t)pcie->cfg_base;
+	}
+
+	va_address += (where & ~0x3);
+
+	return va_address;
+}
+
+static int pcie_dw_addr_valid(pci_dev_t d, int first_busno)
+{
+	if ((PCI_BUS(d) == first_busno) && (PCI_DEV(d) > 0))
+		return 0;
+	if ((PCI_BUS(d) == first_busno + 1) && (PCI_DEV(d) > 0))
+		return 0;
+
+	return 1;
+}
+
+static int pcie_dw_mvebu_read_config(struct udevice *bus, pci_dev_t bdf,
+				     uint offset, ulong *valuep,
+				     enum pci_size_t size)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
+	uintptr_t va_address;
+	ulong value;
+
+	debug("PCIE CFG read:  (b,d,f)=(%2d,%2d,%2d) ",
+	      PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
+
+	if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
+		debug("- out of range\n");
+		*valuep = pci_get_ff(size);
+		return 0;
+	}
+
+	va_address = set_cfg_address(pcie, bdf, offset);
+
+	value = readl(va_address);
+
+	debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
+	*valuep = pci_conv_32_to_size(value, offset, size);
+
+	return 0;
+}
+
+static int pcie_dw_mvebu_write_config(struct udevice *bus, pci_dev_t bdf,
+				      uint offset, ulong value,
+				      enum pci_size_t size)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
+	uintptr_t va_address;
+	ulong old;
+
+	debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
+	      PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
+	debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
+
+	if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
+		debug("- out of range\n");
+		return 0;
+	}
+
+	va_address = set_cfg_address(pcie, bdf, offset);
+
+	old = readl(va_address);
+	value = pci_conv_size_to_32(old, value, offset, size);
+	writel(value, va_address);
+
+	return 0;
+}
+
+static void pcie_dw_configure(void *regs_base, u32 cap_speed)
+{
+	u32 reg;
+
+	/* TODO: need to read the serdes speed from the dts
+		 and according to it configure the PCIe gen  */
+
+	/* Set link to GEN 3 */
+	reg  = readl(regs_base + PCIE_LINK_CTL_2);
+	reg &= ~TARGET_LINK_SPEED_MASK;
+	reg |= cap_speed;
+	writel(reg, regs_base + PCIE_LINK_CTL_2);
+
+	reg  = readl(regs_base + PCIE_LINK_CAPABILITY);
+	reg &= ~TARGET_LINK_SPEED_MASK;
+	reg |= cap_speed;
+	writel(reg, regs_base + PCIE_LINK_CAPABILITY);
+
+	reg = readl(regs_base + PCIE_GEN3_EQU_CTRL);
+	reg |= GEN3_EQU_EVAL_2MS_DISABLE;
+	writel(reg, regs_base + PCIE_GEN3_EQU_CTRL);
+}
+
+static int is_link_up(void *regs_base)
+{
+	u32 mask = PCIE_GLB_STS_RDLH_LINK_UP | PCIE_GLB_STS_PHY_LINK_UP;
+	u32 reg;
+
+	reg = readl(regs_base + PCIE_GLOBAL_STATUS);
+	if ((reg & mask) == mask)
+		return 1;
+
+	return 0;
+}
+
+static int wait_link_up(void *regs_base)
+{
+	unsigned long timeout;
+
+	timeout = get_timer(0) + PCIE_LINK_UP_TIMEOUT_MS;
+	while (!is_link_up(regs_base)) {
+		if (get_timer(0) > timeout)
+			return 0;
+	};
+
+	return 1;
+}
+
+static int pcie_dw_mvebu_pcie_link_up(void *regs_base, u32 cap_speed)
+{
+	u32 reg;
+
+	if (!is_link_up(regs_base)) {
+		/* Disable LTSSM state machine to enable configuration */
+		reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
+		reg &= ~(PCIE_APP_LTSSM_EN);
+		writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
+	}
+
+	reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
+	reg &= ~(PCIE_DEVICE_TYPE_MASK << PCIE_DEVICE_TYPE_OFFSET);
+	reg |= (PCIE_DEVICE_TYPE_RC << PCIE_DEVICE_TYPE_OFFSET);
+	writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
+
+	/* Set the PCIe master AXI attributes */
+	writel(ARCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_ARCACHE_TRC);
+	writel(AWCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_AWCACHE_TRC);
+
+	/* DW pre link configurations */
+	pcie_dw_configure(regs_base, cap_speed);
+
+	if (!is_link_up(regs_base)) {
+		/* Configuration done. Start LTSSM */
+		reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
+		reg |= PCIE_APP_LTSSM_EN;
+		writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
+	}
+
+	/* Check that link was established */
+	if (!wait_link_up(regs_base))
+		return 0;
+
+	/*
+	 * Link can be established in Gen 1. still need to wait
+	 * till MAC nagaotiation is completed
+	 */
+	udelay(100);
+
+	return 1;
+}
+
+/*
+ * iATU region setup
+ */
+static int pcie_dw_regions_setup(struct pcie_dw_mvebu *pcie)
+{
+	/*
+	 * Region #0 is used for Outbound CFG space access.
+	 * Direction = Outbound
+	 * Region Index = 0
+	 */
+	writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
+
+	writel((u32)(uintptr_t)pcie->cfg_base, pcie->ctrl_base
+	       + PCIE_ATU_LOWER_BASE);
+	writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_BASE);
+	writel((u32)(uintptr_t)pcie->cfg_base + pcie->cfg_size,
+	       pcie->ctrl_base + PCIE_ATU_LIMIT);
+
+	writel(0, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
+	writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_TARGET);
+	writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
+	writel(PCIE_ATU_ENABLE, pcie->ctrl_base + PCIE_ATU_CR2);
+
+	return 0;
+}
+
+static void pcie_dw_set_host_bars(void *regs_base)
+{
+	u32 size = gd->ram_size;
+	u64 max_size;
+	u32 reg;
+	u32 bar0;
+
+	/* Verify the maximal BAR size */
+	reg = readl(regs_base + RESIZABLE_BAR_CAP);
+	max_size = 1ULL << (5 + (reg + (1 << 4)));
+
+	if (size > max_size) {
+		size = max_size;
+		printf("Warning: PCIe BARs can't map all DRAM space\n");
+	}
+
+	/* Set the BAR base and size towards DDR */
+	bar0 = CONFIG_SYS_SDRAM_BASE & ~0xf;
+	bar0 |= PCI_BASE_ADDRESS_MEM_TYPE_32;
+	writel(CONFIG_SYS_SDRAM_BASE, regs_base + PCIE_CONFIG_BAR0);
+
+	reg = ((size >> 20) - 1) << 12;
+	writel(size, regs_base + RESIZABLE_BAR_CTL0);
+}
+
+static int pcie_dw_mvebu_probe(struct udevice *dev)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
+
+	pcie->first_busno = dev->seq;
+
+	/* Don't register host if link is down */
+	if (!pcie_dw_mvebu_pcie_link_up(pcie->ctrl_base, LINK_SPEED_GEN_3)) {
+		printf("PCIE-%d: Link down\n", dev->seq);
+		return -ENODEV;
+	}
+
+	printf("PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", dev->seq,
+	       pcie_dw_get_link_speed(pcie->ctrl_base),
+	       pcie_dw_get_link_width(pcie->ctrl_base), pcie->hose.first_busno);
+
+	pcie_dw_regions_setup(pcie);
+	pcie_dw_set_host_bars(pcie->ctrl_base);
+
+	return 0;
+}
+
+static int pcie_dw_mvebu_ofdata_to_platdata(struct udevice *dev)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
+
+	pcie->ctrl_base = (void *)dev_get_addr_index(dev, 0);
+	if (IS_ERR(pcie->ctrl_base))
+		return PTR_ERR(pcie->ctrl_base);
+
+	/*
+	 * We need to know the size for the cfg space as well from the
+	 * DT "reg" property. dev_get_addr_index() doesn't provide this
+	 * size, so we need to use a different method to acquire the
+	 * address and size here.
+	 */
+	pcie->cfg_base = (void *)fdtdec_get_addr_size_auto_noparent(
+		gd->fdt_blob, dev->of_offset, "reg", 1, &pcie->cfg_size, true);
+	if (pcie->cfg_base == NULL)
+		return -ENODEV;
+
+	return 0;
+}
+
+static const struct dm_pci_ops pcie_dw_mvebu_ops = {
+	.read_config	= pcie_dw_mvebu_read_config,
+	.write_config	= pcie_dw_mvebu_write_config,
+};
+
+static const struct udevice_id pcie_dw_mvebu_ids[] = {
+	{ .compatible = "marvell,armada8k-pcie" },
+	{ }
+};
+
+U_BOOT_DRIVER(pcie_dw_mvebu) = {
+	.name			= "pcie_dw_mvebu",
+	.id			= UCLASS_PCI,
+	.of_match		= pcie_dw_mvebu_ids,
+	.ops			= &pcie_dw_mvebu_ops,
+	.ofdata_to_platdata	= pcie_dw_mvebu_ofdata_to_platdata,
+	.probe			= pcie_dw_mvebu_probe,
+	.priv_auto_alloc_size	= sizeof(struct pcie_dw_mvebu),
+};
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 13/15] arm64: mvebu: Add regions for PCI spaces to the memory map
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (10 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 14/15] arm64: mvebu: Add PCI support to DB-88F8040 board Stefan Roese
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

To use the PCIe driver, its controller memory and the PCIe regions need
to get mapped in the MMU. Otherwise these areas can't be accessed.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/mach-mvebu/armada8k/cpu.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/arm/mach-mvebu/armada8k/cpu.c b/arch/arm/mach-mvebu/armada8k/cpu.c
index f8e69d6..2719d68 100644
--- a/arch/arm/mach-mvebu/armada8k/cpu.c
+++ b/arch/arm/mach-mvebu/armada8k/cpu.c
@@ -55,6 +55,14 @@ static struct mm_region mvebu_mem_map[] = {
 			 PTE_BLOCK_NON_SHARE
 	},
 	{
+		/* PCI regions */
+		.phys = 0xf8000000UL,
+		.virt = 0xf8000000UL,
+		.size = 0x08000000UL,	/* 128MiB PCI space (master & slave) */
+		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+			 PTE_BLOCK_NON_SHARE
+	},
+	{
 		/* List terminator */
 		0,
 	}
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 14/15] arm64: mvebu: Add PCI support to DB-88F8040 board
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (11 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 13/15] arm64: mvebu: Add regions for PCI spaces to the memory map Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-11-15  9:08 ` [U-Boot] [PATCH 15/15] arm64: mvebu: Restrict memory size to a usable maximum Stefan Roese
  2016-12-05 12:56 ` [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

This patch adds PCI support to the Marvell Armada-8K devel board.
Additionally the Intel E1000 ethernet driver is enabled so that
network support is available on this board, even without the
internal network interfaces being supported (yet).

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 configs/mvebu_db-88f8040_defconfig | 3 +++
 include/configs/mvebu_armada-8k.h  | 8 ++++++++
 2 files changed, 11 insertions(+)

diff --git a/configs/mvebu_db-88f8040_defconfig b/configs/mvebu_db-88f8040_defconfig
index eccb0f0..61d58b5 100644
--- a/configs/mvebu_db-88f8040_defconfig
+++ b/configs/mvebu_db-88f8040_defconfig
@@ -36,6 +36,9 @@ CONFIG_SPI_FLASH_MACRONIX=y
 CONFIG_SPI_FLASH_SPANSION=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_PHYLIB=y
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_PCIE_DW_MVEBU=y
 CONFIG_MVEBU_COMPHY_SUPPORT=y
 # CONFIG_SPL_SERIAL_PRESENT is not set
 CONFIG_DEBUG_UART=y
diff --git a/include/configs/mvebu_armada-8k.h b/include/configs/mvebu_armada-8k.h
index 3b35cb3..8ab5bbe 100644
--- a/include/configs/mvebu_armada-8k.h
+++ b/include/configs/mvebu_armada-8k.h
@@ -128,4 +128,12 @@
 #define CONFIG_CMD_PART
 #define CONFIG_PARTITION_UUIDS
 
+/*
+ * PCI configuration
+ */
+#ifdef CONFIG_PCIE_DW_MVEBU
+#define CONFIG_E1000
+#define CONFIG_CMD_PCI
+#endif
+
 #endif /* _CONFIG_MVEBU_ARMADA_8K_H */
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 15/15] arm64: mvebu: Restrict memory size to a usable maximum
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (12 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 14/15] arm64: mvebu: Add PCI support to DB-88F8040 board Stefan Roese
@ 2016-11-15  9:08 ` Stefan Roese
  2016-12-05 12:56 ` [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-15  9:08 UTC (permalink / raw)
  To: u-boot

Not all memory is mapped in the MMU. So we need to restrict the memory
size so that U-Boot does not try to access it. Also, the internal
registers are located at 0xf000.0000 - 0xffff.ffff. Currently only 2GiB
are mapped for system memory. This is what we pass to the U-Boot
subsystem here.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
 arch/arm/mach-mvebu/arm64-common.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arch/arm/mach-mvebu/arm64-common.c b/arch/arm/mach-mvebu/arm64-common.c
index 1fc2ff2..8f02655 100644
--- a/arch/arm/mach-mvebu/arm64-common.c
+++ b/arch/arm/mach-mvebu/arm64-common.c
@@ -17,6 +17,23 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 /*
+ * Not all memory is mapped in the MMU. So we need to restrict the
+ * memory size so that U-Boot does not try to access it. Also, the
+ * internal registers are located at 0xf000.0000 - 0xffff.ffff.
+ * Currently only 2GiB are mapped for system memory. This is what
+ * we pass to the U-Boot subsystem here.
+ */
+#define USABLE_RAM_SIZE		0x80000000
+
+ulong board_get_usable_ram_top(ulong total_size)
+{
+	if (gd->ram_size > USABLE_RAM_SIZE)
+		return USABLE_RAM_SIZE;
+
+	return gd->ram_size;
+}
+
+/*
  * On ARMv8, MBus is not configured in U-Boot. To enable compilation
  * of the already implemented drivers, lets add a dummy version of
  * this function so that linking does not fail.
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K
  2016-11-15  9:08 ` [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K Stefan Roese
@ 2016-11-18  1:14   ` Simon Glass
  2016-11-25 13:56     ` Stefan Roese
  2016-11-28 12:38   ` [U-Boot] [PATCH 12/15 v2] " Stefan Roese
  1 sibling, 1 reply; 23+ messages in thread
From: Simon Glass @ 2016-11-18  1:14 UTC (permalink / raw)
  To: u-boot

Hi,

On 15 November 2016 at 02:08, Stefan Roese <sr@denx.de> wrote:
> From: Shadi Ammouri <shadi@marvell.com>
>
> This patch adds a driver for the PCIe controller integrated in the
> Marvell Armada-8K SoC. This controller is based on the DesignWare
> IP core.
>
> The original version was written by Shadi and Yehuda. I ported this
> driver to the latest mainline U-Boot version with DM support.
>
> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>
> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Nadav Haklai <nadavh@marvell.com>
> Cc: Neta Zur Hershkovits <neta@marvell.com>
> Cc: Kostya Porotchkin <kostap@marvell.com>
> Cc: Omri Itach <omrii@marvell.com>
> Cc: Igal Liberman <igall@marvell.com>
> Cc: Haim Boot <hayim@marvell.com>
> Cc: Hanna Hawa <hannah@marvell.com>
> ---
>  drivers/pci/Kconfig         |  10 ++
>  drivers/pci/Makefile        |   1 +
>  drivers/pci/pcie_dw_mvebu.c | 415 ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 426 insertions(+)
>  create mode 100644 drivers/pci/pcie_dw_mvebu.c
>
> diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
> index b8376b4..ff2c370 100644
> --- a/drivers/pci/Kconfig
> +++ b/drivers/pci/Kconfig
> @@ -33,6 +33,16 @@ config PCI_PNP
>         help
>           Enable PCI memory and I/O space resource allocation and assignment.
>
> +config PCIE_DW_MVEBU
> +       bool "Enable Armada-8K PCIe driver (DesignWare core)"
> +       default n
> +       depends on DM_PCI
> +       depends on ARMADA_8K
> +       help
> +         Say Y here if you want to enable PCIe controller support on
> +         Armada-8K SoCs. The PCIe controller on Armada-8K is based on
> +         DesignWare hardware.
> +
>  config PCI_SANDBOX
>         bool "Sandbox PCI support"
>         depends on SANDBOX && DM_PCI
> diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
> index 9583e91..86717a4 100644
> --- a/drivers/pci/Makefile
> +++ b/drivers/pci/Makefile
> @@ -30,5 +30,6 @@ obj-$(CONFIG_SH7780_PCI) +=pci_sh7780.o
>  obj-$(CONFIG_PCI_TEGRA) += pci_tegra.o
>  obj-$(CONFIG_TSI108_PCI) += tsi108_pci.o
>  obj-$(CONFIG_WINBOND_83C553) += w83c553f.o
> +obj-$(CONFIG_PCIE_DW_MVEBU) += pcie_dw_mvebu.o
>  obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape.o
>  obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o
> diff --git a/drivers/pci/pcie_dw_mvebu.c b/drivers/pci/pcie_dw_mvebu.c
> new file mode 100644
> index 0000000..dd5ba34
> --- /dev/null
> +++ b/drivers/pci/pcie_dw_mvebu.c
> @@ -0,0 +1,415 @@
> +/*
> + * Copyright (C) 2015 Marvell International Ltd.
> + *
> + * Copyright (C) 2016 Stefan Roese <sr@denx.de>
> + *
> + * Based on:
> + *   - drivers/pci/pcie_imx.c
> + *   - drivers/pci/pci_mvebu.c
> + *   - drivers/pci/pcie_xilinx.c
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <pci.h>
> +#include <asm/io.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/* PCI Config space registers */
> +#define PCIE_CONFIG_BAR0               0x10
> +#define PCIE_LINK_STATUS_REG           0x80
> +#define PCIE_LINK_STATUS_SPEED_OFF     16
> +#define PCIE_LINK_STATUS_SPEED_MASK    0xf
> +#define PCIE_LINK_STATUS_WIDTH_OFF     20
> +#define PCIE_LINK_STATUS_WIDTH_MASK    0xf
> +
> +/* Resizable bar capability registers */
> +#define RESIZABLE_BAR_CAP              0x250
> +#define RESIZABLE_BAR_CTL0             0x254
> +#define RESIZABLE_BAR_CTL1             0x258
> +
> +/* iATU registers */
> +#define PCIE_ATU_VIEWPORT              0x900
> +#define PCIE_ATU_REGION_INBOUND                (0x1 << 31)
> +#define PCIE_ATU_REGION_OUTBOUND       (0x0 << 31)
> +#define PCIE_ATU_REGION_INDEX1         (0x1 << 0)
> +#define PCIE_ATU_REGION_INDEX0         (0x0 << 0)
> +#define PCIE_ATU_CR1                   0x904
> +#define PCIE_ATU_TYPE_MEM              (0x0 << 0)
> +#define PCIE_ATU_TYPE_IO               (0x2 << 0)
> +#define PCIE_ATU_TYPE_CFG0             (0x4 << 0)
> +#define PCIE_ATU_TYPE_CFG1             (0x5 << 0)
> +#define PCIE_ATU_CR2                   0x908
> +#define PCIE_ATU_ENABLE                        (0x1 << 31)
> +#define PCIE_ATU_BAR_MODE_ENABLE       (0x1 << 30)
> +#define PCIE_ATU_LOWER_BASE            0x90C
> +#define PCIE_ATU_UPPER_BASE            0x910
> +#define PCIE_ATU_LIMIT                 0x914
> +#define PCIE_ATU_LOWER_TARGET          0x918
> +#define PCIE_ATU_BUS(x)                        (((x) & 0xff) << 24)
> +#define PCIE_ATU_DEV(x)                        (((x) & 0x1f) << 19)
> +#define PCIE_ATU_FUNC(x)               (((x) & 0x7) << 16)
> +#define PCIE_ATU_UPPER_TARGET          0x91C
> +
> +#define PCIE_LINK_CAPABILITY           0x7C
> +#define PCIE_LINK_CTL_2                        0xA0
> +#define TARGET_LINK_SPEED_MASK         0xF
> +#define LINK_SPEED_GEN_1               0x1
> +#define LINK_SPEED_GEN_2               0x2
> +#define LINK_SPEED_GEN_3               0x3
> +
> +#define PCIE_GEN3_RELATED              0x890
> +#define GEN3_EQU_DISABLE               (1 << 16)
> +#define GEN3_ZRXDC_NON_COMP            (1 << 0)
> +
> +#define PCIE_GEN3_EQU_CTRL             0x8A8
> +#define GEN3_EQU_EVAL_2MS_DISABLE      (1 << 5)
> +
> +#define PCIE_ROOT_COMPLEX_MODE_MASK    (0xF << 4)
> +
> +#define PCIE_LINK_UP_TIMEOUT_MS                100
> +
> +#define PCIE_GLOBAL_CONTROL            0x8000
> +#define PCIE_APP_LTSSM_EN              (1 << 2)
> +#define PCIE_DEVICE_TYPE_OFFSET                (4)
> +#define PCIE_DEVICE_TYPE_MASK          (0xF)
> +#define PCIE_DEVICE_TYPE_EP            (0x0) /* Endpoint */
> +#define PCIE_DEVICE_TYPE_LEP           (0x1) /* Legacy endpoint */
> +#define PCIE_DEVICE_TYPE_RC            (0x4) /* Root complex */
> +
> +#define PCIE_GLOBAL_STATUS             0x8008
> +#define PCIE_GLB_STS_RDLH_LINK_UP      (1 << 1)
> +#define PCIE_GLB_STS_PHY_LINK_UP       (1 << 9)
> +
> +#define PCIE_ARCACHE_TRC               0x8050
> +#define PCIE_AWCACHE_TRC               0x8054
> +#define ARCACHE_SHAREABLE_CACHEABLE    0x3511
> +#define AWCACHE_SHAREABLE_CACHEABLE    0x5311
> +
> +#define LINK_SPEED_GEN_1                0x1
> +#define LINK_SPEED_GEN_2                0x2
> +#define LINK_SPEED_GEN_3                0x3
> +
> +struct pcie_dw_mvebu {
> +       struct pci_controller hose;

Why is this here? It should be accessible with dev_get_uclass_priv(bus).

> +       void *ctrl_base;

It would be nice if this were a C struct rather than offsets.

> +       void *cfg_base;
> +       fdt_size_t cfg_size;
> +       int first_busno;

What are these two for? Needs comments.

> +};
> +
> +static int pcie_dw_get_link_speed(void *regs_base)
> +{
> +       return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
> +               PCIE_LINK_STATUS_SPEED_OFF) & PCIE_LINK_STATUS_SPEED_MASK;

I suggest making the MASK a shifted value, so that you mask and then shift.

> +}
> +
> +static int pcie_dw_get_link_width(void *regs_base)
> +{
> +       return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
> +               PCIE_LINK_STATUS_WIDTH_OFF) & PCIE_LINK_STATUS_WIDTH_MASK;
> +}
> +
> +static uintptr_t set_cfg_address(struct pcie_dw_mvebu *pcie,
> +                                pci_dev_t d, int where)

Function comment? Much of this file could do with function comments.

> +{
> +       uintptr_t va_address;
> +
> +       /*
> +        * Region #0 is used for Outbound CFG space access.
> +        * Direction = Outbound
> +        * Region Index = 0
> +        */
> +       writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
> +
> +       if (PCI_BUS(d) == (pcie->first_busno + 1))
> +               /* For local bus, change TLP Type field to 4. */
> +               writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
> +       else
> +               /* Otherwise, change TLP Type field to 5. */
> +               writel(PCIE_ATU_TYPE_CFG1, pcie->ctrl_base + PCIE_ATU_CR1);
> +
> +       if (PCI_BUS(d) == pcie->first_busno) {
> +               /* Accessing root port configuration space. */
> +               va_address = (uintptr_t)pcie->ctrl_base;
> +       } else {
> +               writel(d << 8, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
> +               va_address = (uintptr_t)pcie->cfg_base;
> +       }
> +
> +       va_address += (where & ~0x3);
> +
> +       return va_address;
> +}
> +
> +static int pcie_dw_addr_valid(pci_dev_t d, int first_busno)
> +{
> +       if ((PCI_BUS(d) == first_busno) && (PCI_DEV(d) > 0))
> +               return 0;
> +       if ((PCI_BUS(d) == first_busno + 1) && (PCI_DEV(d) > 0))
> +               return 0;
> +
> +       return 1;
> +}
> +
> +static int pcie_dw_mvebu_read_config(struct udevice *bus, pci_dev_t bdf,
> +                                    uint offset, ulong *valuep,
> +                                    enum pci_size_t size)
> +{
> +       struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
> +       uintptr_t va_address;
> +       ulong value;
> +
> +       debug("PCIE CFG read:  (b,d,f)=(%2d,%2d,%2d) ",
> +             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
> +
> +       if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
> +               debug("- out of range\n");
> +               *valuep = pci_get_ff(size);
> +               return 0;
> +       }
> +
> +       va_address = set_cfg_address(pcie, bdf, offset);
> +
> +       value = readl(va_address);
> +
> +       debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
> +       *valuep = pci_conv_32_to_size(value, offset, size);
> +
> +       return 0;
> +}
> +
> +static int pcie_dw_mvebu_write_config(struct udevice *bus, pci_dev_t bdf,
> +                                     uint offset, ulong value,
> +                                     enum pci_size_t size)
> +{
> +       struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
> +       uintptr_t va_address;
> +       ulong old;
> +
> +       debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
> +             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
> +       debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
> +
> +       if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
> +               debug("- out of range\n");
> +               return 0;
> +       }
> +
> +       va_address = set_cfg_address(pcie, bdf, offset);
> +
> +       old = readl(va_address);
> +       value = pci_conv_size_to_32(old, value, offset, size);
> +       writel(value, va_address);
> +
> +       return 0;
> +}
> +
> +static void pcie_dw_configure(void *regs_base, u32 cap_speed)
> +{
> +       u32 reg;
> +
> +       /* TODO: need to read the serdes speed from the dts
> +                and according to it configure the PCIe gen  */

/*
 * TODO(email): ..
 * ...
 */

> +
> +       /* Set link to GEN 3 */
> +       reg  = readl(regs_base + PCIE_LINK_CTL_2);
> +       reg &= ~TARGET_LINK_SPEED_MASK;
> +       reg |= cap_speed;
> +       writel(reg, regs_base + PCIE_LINK_CTL_2);

clrsetbits_le32()

> +
> +       reg  = readl(regs_base + PCIE_LINK_CAPABILITY);
> +       reg &= ~TARGET_LINK_SPEED_MASK;
> +       reg |= cap_speed;
> +       writel(reg, regs_base + PCIE_LINK_CAPABILITY);
> +
> +       reg = readl(regs_base + PCIE_GEN3_EQU_CTRL);
> +       reg |= GEN3_EQU_EVAL_2MS_DISABLE;
> +       writel(reg, regs_base + PCIE_GEN3_EQU_CTRL);

setbits_le32()

> +}
> +
> +static int is_link_up(void *regs_base)

const void? It would be better as a struct though

> +{
> +       u32 mask = PCIE_GLB_STS_RDLH_LINK_UP | PCIE_GLB_STS_PHY_LINK_UP;
> +       u32 reg;
> +
> +       reg = readl(regs_base + PCIE_GLOBAL_STATUS);
> +       if ((reg & mask) == mask)
> +               return 1;
> +
> +       return 0;
> +}
> +
> +static int wait_link_up(void *regs_base)

Better to return 0 if OK, -ETIMEDOUT if not.

> +{
> +       unsigned long timeout;
> +
> +       timeout = get_timer(0) + PCIE_LINK_UP_TIMEOUT_MS;
> +       while (!is_link_up(regs_base)) {
> +               if (get_timer(0) > timeout)
> +                       return 0;
> +       };
> +
> +       return 1;
> +}
> +
> +static int pcie_dw_mvebu_pcie_link_up(void *regs_base, u32 cap_speed)

Better to return 0 if OK, -ve error if not

> +{
> +       u32 reg;
> +
> +       if (!is_link_up(regs_base)) {
> +               /* Disable LTSSM state machine to enable configuration */
> +               reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
> +               reg &= ~(PCIE_APP_LTSSM_EN);
> +               writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
> +       }
> +
> +       reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
> +       reg &= ~(PCIE_DEVICE_TYPE_MASK << PCIE_DEVICE_TYPE_OFFSET);
> +       reg |= (PCIE_DEVICE_TYPE_RC << PCIE_DEVICE_TYPE_OFFSET);
> +       writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
> +
> +       /* Set the PCIe master AXI attributes */
> +       writel(ARCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_ARCACHE_TRC);
> +       writel(AWCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_AWCACHE_TRC);
> +
> +       /* DW pre link configurations */
> +
(regs_base, cap_speed);
> +
> +       if (!is_link_up(regs_base)) {
> +               /* Configuration done. Start LTSSM */
> +               reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
> +               reg |= PCIE_APP_LTSSM_EN;
> +               writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
> +       }
> +
> +       /* Check that link was established */
> +       if (!wait_link_up(regs_base))
> +               return 0;
> +
> +       /*
> +        * Link can be established in Gen 1. still need to wait
> +        * till MAC nagaotiation is completed
> +        */
> +       udelay(100);
> +
> +       return 1;
> +}
> +
> +/*
> + * iATU region setup
> + */
> +static int pcie_dw_regions_setup(struct pcie_dw_mvebu *pcie)
> +{
> +       /*
> +        * Region #0 is used for Outbound CFG space access.
> +        * Direction = Outbound
> +        * Region Index = 0
> +        */
> +       writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
> +
> +       writel((u32)(uintptr_t)pcie->cfg_base, pcie->ctrl_base
> +              + PCIE_ATU_LOWER_BASE);
> +       writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_BASE);
> +       writel((u32)(uintptr_t)pcie->cfg_base + pcie->cfg_size,
> +              pcie->ctrl_base + PCIE_ATU_LIMIT);
> +
> +       writel(0, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
> +       writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_TARGET);
> +       writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
> +       writel(PCIE_ATU_ENABLE, pcie->ctrl_base + PCIE_ATU_CR2);
> +
> +       return 0;
> +}
> +
> +static void pcie_dw_set_host_bars(void *regs_base)
> +{
> +       u32 size = gd->ram_size;
> +       u64 max_size;
> +       u32 reg;
> +       u32 bar0;
> +
> +       /* Verify the maximal BAR size */
> +       reg = readl(regs_base + RESIZABLE_BAR_CAP);
> +       max_size = 1ULL << (5 + (reg + (1 << 4)));
> +
> +       if (size > max_size) {
> +               size = max_size;
> +               printf("Warning: PCIe BARs can't map all DRAM space\n");

Isn't this an error? If so I suggest returning it.

> +       }
> +
> +       /* Set the BAR base and size towards DDR */
> +       bar0 = CONFIG_SYS_SDRAM_BASE & ~0xf;
> +       bar0 |= PCI_BASE_ADDRESS_MEM_TYPE_32;
> +       writel(CONFIG_SYS_SDRAM_BASE, regs_base + PCIE_CONFIG_BAR0);
> +
> +       reg = ((size >> 20) - 1) << 12;
> +       writel(size, regs_base + RESIZABLE_BAR_CTL0);
> +}
> +
> +static int pcie_dw_mvebu_probe(struct udevice *dev)
> +{
> +       struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
> +
> +       pcie->first_busno = dev->seq;

OK I see what that variable is now. But please comment it at the top.

> +
> +       /* Don't register host if link is down */
> +       if (!pcie_dw_mvebu_pcie_link_up(pcie->ctrl_base, LINK_SPEED_GEN_3)) {
> +               printf("PCIE-%d: Link down\n", dev->seq);
> +               return -ENODEV;
> +       }
> +
> +       printf("PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", dev->seq,
> +              pcie_dw_get_link_speed(pcie->ctrl_base),
> +              pcie_dw_get_link_width(pcie->ctrl_base), pcie->hose.first_busno);
> +
> +       pcie_dw_regions_setup(pcie);
> +       pcie_dw_set_host_bars(pcie->ctrl_base);
> +
> +       return 0;
> +}
> +
> +static int pcie_dw_mvebu_ofdata_to_platdata(struct udevice *dev)
> +{
> +       struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
> +
> +       pcie->ctrl_base = (void *)dev_get_addr_index(dev, 0);
> +       if (IS_ERR(pcie->ctrl_base))
> +               return PTR_ERR(pcie->ctrl_base);
> +
> +       /*
> +        * We need to know the size for the cfg space as well from the
> +        * DT "reg" property. dev_get_addr_index() doesn't provide this
> +        * size, so we need to use a different method to acquire the
> +        * address and size here.
> +        */
> +       pcie->cfg_base = (void *)fdtdec_get_addr_size_auto_noparent(
> +               gd->fdt_blob, dev->of_offset, "reg", 1, &pcie->cfg_size, true);

This function returns FDT_ADDR_T_NONE on failure. Do we need to add a
dev_get_addr_size()?

> +       if (pcie->cfg_base == NULL)
> +               return -ENODEV;
> +
> +       return 0;
> +}
> +
> +static const struct dm_pci_ops pcie_dw_mvebu_ops = {
> +       .read_config    = pcie_dw_mvebu_read_config,
> +       .write_config   = pcie_dw_mvebu_write_config,
> +};
> +
> +static const struct udevice_id pcie_dw_mvebu_ids[] = {
> +       { .compatible = "marvell,armada8k-pcie" },
> +       { }
> +};
> +
> +U_BOOT_DRIVER(pcie_dw_mvebu) = {
> +       .name                   = "pcie_dw_mvebu",
> +       .id                     = UCLASS_PCI,
> +       .of_match               = pcie_dw_mvebu_ids,
> +       .ops                    = &pcie_dw_mvebu_ops,
> +       .ofdata_to_platdata     = pcie_dw_mvebu_ofdata_to_platdata,
> +       .probe                  = pcie_dw_mvebu_probe,
> +       .priv_auto_alloc_size   = sizeof(struct pcie_dw_mvebu),
> +};
> --
> 2.10.2
>

Regards,
Simon

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K
  2016-11-18  1:14   ` Simon Glass
@ 2016-11-25 13:56     ` Stefan Roese
  0 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-11-25 13:56 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 18.11.2016 02:14, Simon Glass wrote:
> On 15 November 2016 at 02:08, Stefan Roese <sr@denx.de> wrote:
>> From: Shadi Ammouri <shadi@marvell.com>
>>
>> This patch adds a driver for the PCIe controller integrated in the
>> Marvell Armada-8K SoC. This controller is based on the DesignWare
>> IP core.
>>
>> The original version was written by Shadi and Yehuda. I ported this
>> driver to the latest mainline U-Boot version with DM support.
>>
>> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>>
>> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
>> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Nadav Haklai <nadavh@marvell.com>
>> Cc: Neta Zur Hershkovits <neta@marvell.com>
>> Cc: Kostya Porotchkin <kostap@marvell.com>
>> Cc: Omri Itach <omrii@marvell.com>
>> Cc: Igal Liberman <igall@marvell.com>
>> Cc: Haim Boot <hayim@marvell.com>
>> Cc: Hanna Hawa <hannah@marvell.com>
>> ---
>>  drivers/pci/Kconfig         |  10 ++
>>  drivers/pci/Makefile        |   1 +
>>  drivers/pci/pcie_dw_mvebu.c | 415 ++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 426 insertions(+)
>>  create mode 100644 drivers/pci/pcie_dw_mvebu.c
>>
>> diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
>> index b8376b4..ff2c370 100644
>> --- a/drivers/pci/Kconfig
>> +++ b/drivers/pci/Kconfig
>> @@ -33,6 +33,16 @@ config PCI_PNP
>>         help
>>           Enable PCI memory and I/O space resource allocation and assignment.
>>
>> +config PCIE_DW_MVEBU
>> +       bool "Enable Armada-8K PCIe driver (DesignWare core)"
>> +       default n
>> +       depends on DM_PCI
>> +       depends on ARMADA_8K
>> +       help
>> +         Say Y here if you want to enable PCIe controller support on
>> +         Armada-8K SoCs. The PCIe controller on Armada-8K is based on
>> +         DesignWare hardware.
>> +
>>  config PCI_SANDBOX
>>         bool "Sandbox PCI support"
>>         depends on SANDBOX && DM_PCI
>> diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
>> index 9583e91..86717a4 100644
>> --- a/drivers/pci/Makefile
>> +++ b/drivers/pci/Makefile
>> @@ -30,5 +30,6 @@ obj-$(CONFIG_SH7780_PCI) +=pci_sh7780.o
>>  obj-$(CONFIG_PCI_TEGRA) += pci_tegra.o
>>  obj-$(CONFIG_TSI108_PCI) += tsi108_pci.o
>>  obj-$(CONFIG_WINBOND_83C553) += w83c553f.o
>> +obj-$(CONFIG_PCIE_DW_MVEBU) += pcie_dw_mvebu.o
>>  obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape.o
>>  obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o
>> diff --git a/drivers/pci/pcie_dw_mvebu.c b/drivers/pci/pcie_dw_mvebu.c
>> new file mode 100644
>> index 0000000..dd5ba34
>> --- /dev/null
>> +++ b/drivers/pci/pcie_dw_mvebu.c
>> @@ -0,0 +1,415 @@
>> +/*
>> + * Copyright (C) 2015 Marvell International Ltd.
>> + *
>> + * Copyright (C) 2016 Stefan Roese <sr@denx.de>
>> + *
>> + * Based on:
>> + *   - drivers/pci/pcie_imx.c
>> + *   - drivers/pci/pci_mvebu.c
>> + *   - drivers/pci/pcie_xilinx.c
>> + *
>> + * SPDX-License-Identifier:    GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <pci.h>
>> +#include <asm/io.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +/* PCI Config space registers */
>> +#define PCIE_CONFIG_BAR0               0x10
>> +#define PCIE_LINK_STATUS_REG           0x80
>> +#define PCIE_LINK_STATUS_SPEED_OFF     16
>> +#define PCIE_LINK_STATUS_SPEED_MASK    0xf
>> +#define PCIE_LINK_STATUS_WIDTH_OFF     20
>> +#define PCIE_LINK_STATUS_WIDTH_MASK    0xf
>> +
>> +/* Resizable bar capability registers */
>> +#define RESIZABLE_BAR_CAP              0x250
>> +#define RESIZABLE_BAR_CTL0             0x254
>> +#define RESIZABLE_BAR_CTL1             0x258
>> +
>> +/* iATU registers */
>> +#define PCIE_ATU_VIEWPORT              0x900
>> +#define PCIE_ATU_REGION_INBOUND                (0x1 << 31)
>> +#define PCIE_ATU_REGION_OUTBOUND       (0x0 << 31)
>> +#define PCIE_ATU_REGION_INDEX1         (0x1 << 0)
>> +#define PCIE_ATU_REGION_INDEX0         (0x0 << 0)
>> +#define PCIE_ATU_CR1                   0x904
>> +#define PCIE_ATU_TYPE_MEM              (0x0 << 0)
>> +#define PCIE_ATU_TYPE_IO               (0x2 << 0)
>> +#define PCIE_ATU_TYPE_CFG0             (0x4 << 0)
>> +#define PCIE_ATU_TYPE_CFG1             (0x5 << 0)
>> +#define PCIE_ATU_CR2                   0x908
>> +#define PCIE_ATU_ENABLE                        (0x1 << 31)
>> +#define PCIE_ATU_BAR_MODE_ENABLE       (0x1 << 30)
>> +#define PCIE_ATU_LOWER_BASE            0x90C
>> +#define PCIE_ATU_UPPER_BASE            0x910
>> +#define PCIE_ATU_LIMIT                 0x914
>> +#define PCIE_ATU_LOWER_TARGET          0x918
>> +#define PCIE_ATU_BUS(x)                        (((x) & 0xff) << 24)
>> +#define PCIE_ATU_DEV(x)                        (((x) & 0x1f) << 19)
>> +#define PCIE_ATU_FUNC(x)               (((x) & 0x7) << 16)
>> +#define PCIE_ATU_UPPER_TARGET          0x91C
>> +
>> +#define PCIE_LINK_CAPABILITY           0x7C
>> +#define PCIE_LINK_CTL_2                        0xA0
>> +#define TARGET_LINK_SPEED_MASK         0xF
>> +#define LINK_SPEED_GEN_1               0x1
>> +#define LINK_SPEED_GEN_2               0x2
>> +#define LINK_SPEED_GEN_3               0x3
>> +
>> +#define PCIE_GEN3_RELATED              0x890
>> +#define GEN3_EQU_DISABLE               (1 << 16)
>> +#define GEN3_ZRXDC_NON_COMP            (1 << 0)
>> +
>> +#define PCIE_GEN3_EQU_CTRL             0x8A8
>> +#define GEN3_EQU_EVAL_2MS_DISABLE      (1 << 5)
>> +
>> +#define PCIE_ROOT_COMPLEX_MODE_MASK    (0xF << 4)
>> +
>> +#define PCIE_LINK_UP_TIMEOUT_MS                100
>> +
>> +#define PCIE_GLOBAL_CONTROL            0x8000
>> +#define PCIE_APP_LTSSM_EN              (1 << 2)
>> +#define PCIE_DEVICE_TYPE_OFFSET                (4)
>> +#define PCIE_DEVICE_TYPE_MASK          (0xF)
>> +#define PCIE_DEVICE_TYPE_EP            (0x0) /* Endpoint */
>> +#define PCIE_DEVICE_TYPE_LEP           (0x1) /* Legacy endpoint */
>> +#define PCIE_DEVICE_TYPE_RC            (0x4) /* Root complex */
>> +
>> +#define PCIE_GLOBAL_STATUS             0x8008
>> +#define PCIE_GLB_STS_RDLH_LINK_UP      (1 << 1)
>> +#define PCIE_GLB_STS_PHY_LINK_UP       (1 << 9)
>> +
>> +#define PCIE_ARCACHE_TRC               0x8050
>> +#define PCIE_AWCACHE_TRC               0x8054
>> +#define ARCACHE_SHAREABLE_CACHEABLE    0x3511
>> +#define AWCACHE_SHAREABLE_CACHEABLE    0x5311
>> +
>> +#define LINK_SPEED_GEN_1                0x1
>> +#define LINK_SPEED_GEN_2                0x2
>> +#define LINK_SPEED_GEN_3                0x3
>> +
>> +struct pcie_dw_mvebu {
>> +       struct pci_controller hose;
>
> Why is this here? It should be accessible with dev_get_uclass_priv(bus).

Changed for v2.

>> +       void *ctrl_base;
>
> It would be nice if this were a C struct rather than offsets.

If I'm not mistaken, we're moving away from using C structs in U-Boot
as its done in Linux as well.

>> +       void *cfg_base;
>> +       fdt_size_t cfg_size;
>> +       int first_busno;
>
> What are these two for? Needs comments.

Will add in v2.

>> +};
>> +
>> +static int pcie_dw_get_link_speed(void *regs_base)
>> +{
>> +       return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
>> +               PCIE_LINK_STATUS_SPEED_OFF) & PCIE_LINK_STATUS_SPEED_MASK;
>
> I suggest making the MASK a shifted value, so that you mask and then shift.

Yes, thats cleaner. Will change in v2.

>> +}
>> +
>> +static int pcie_dw_get_link_width(void *regs_base)
>> +{
>> +       return ((readl(regs_base + PCIE_LINK_STATUS_REG)) >>
>> +               PCIE_LINK_STATUS_WIDTH_OFF) & PCIE_LINK_STATUS_WIDTH_MASK;
>> +}
>> +
>> +static uintptr_t set_cfg_address(struct pcie_dw_mvebu *pcie,
>> +                                pci_dev_t d, int where)
>
> Function comment? Much of this file could do with function comments.

Sure. Let me see, what I can come up with in v2.

>> +{
>> +       uintptr_t va_address;
>> +
>> +       /*
>> +        * Region #0 is used for Outbound CFG space access.
>> +        * Direction = Outbound
>> +        * Region Index = 0
>> +        */
>> +       writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
>> +
>> +       if (PCI_BUS(d) == (pcie->first_busno + 1))
>> +               /* For local bus, change TLP Type field to 4. */
>> +               writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
>> +       else
>> +               /* Otherwise, change TLP Type field to 5. */
>> +               writel(PCIE_ATU_TYPE_CFG1, pcie->ctrl_base + PCIE_ATU_CR1);
>> +
>> +       if (PCI_BUS(d) == pcie->first_busno) {
>> +               /* Accessing root port configuration space. */
>> +               va_address = (uintptr_t)pcie->ctrl_base;
>> +       } else {
>> +               writel(d << 8, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
>> +               va_address = (uintptr_t)pcie->cfg_base;
>> +       }
>> +
>> +       va_address += (where & ~0x3);
>> +
>> +       return va_address;
>> +}
>> +
>> +static int pcie_dw_addr_valid(pci_dev_t d, int first_busno)
>> +{
>> +       if ((PCI_BUS(d) == first_busno) && (PCI_DEV(d) > 0))
>> +               return 0;
>> +       if ((PCI_BUS(d) == first_busno + 1) && (PCI_DEV(d) > 0))
>> +               return 0;
>> +
>> +       return 1;
>> +}
>> +
>> +static int pcie_dw_mvebu_read_config(struct udevice *bus, pci_dev_t bdf,
>> +                                    uint offset, ulong *valuep,
>> +                                    enum pci_size_t size)
>> +{
>> +       struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
>> +       uintptr_t va_address;
>> +       ulong value;
>> +
>> +       debug("PCIE CFG read:  (b,d,f)=(%2d,%2d,%2d) ",
>> +             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
>> +
>> +       if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
>> +               debug("- out of range\n");
>> +               *valuep = pci_get_ff(size);
>> +               return 0;
>> +       }
>> +
>> +       va_address = set_cfg_address(pcie, bdf, offset);
>> +
>> +       value = readl(va_address);
>> +
>> +       debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
>> +       *valuep = pci_conv_32_to_size(value, offset, size);
>> +
>> +       return 0;
>> +}
>> +
>> +static int pcie_dw_mvebu_write_config(struct udevice *bus, pci_dev_t bdf,
>> +                                     uint offset, ulong value,
>> +                                     enum pci_size_t size)
>> +{
>> +       struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
>> +       uintptr_t va_address;
>> +       ulong old;
>> +
>> +       debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
>> +             PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
>> +       debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
>> +
>> +       if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
>> +               debug("- out of range\n");
>> +               return 0;
>> +       }
>> +
>> +       va_address = set_cfg_address(pcie, bdf, offset);
>> +
>> +       old = readl(va_address);
>> +       value = pci_conv_size_to_32(old, value, offset, size);
>> +       writel(value, va_address);
>> +
>> +       return 0;
>> +}
>> +
>> +static void pcie_dw_configure(void *regs_base, u32 cap_speed)
>> +{
>> +       u32 reg;
>> +
>> +       /* TODO: need to read the serdes speed from the dts
>> +                and according to it configure the PCIe gen  */
>
> /*
>  * TODO(email): ..
>  * ...
>  */

Okay.

>> +
>> +       /* Set link to GEN 3 */
>> +       reg  = readl(regs_base + PCIE_LINK_CTL_2);
>> +       reg &= ~TARGET_LINK_SPEED_MASK;
>> +       reg |= cap_speed;
>> +       writel(reg, regs_base + PCIE_LINK_CTL_2);
>
> clrsetbits_le32()

Okay.

>> +
>> +       reg  = readl(regs_base + PCIE_LINK_CAPABILITY);
>> +       reg &= ~TARGET_LINK_SPEED_MASK;
>> +       reg |= cap_speed;
>> +       writel(reg, regs_base + PCIE_LINK_CAPABILITY);
>> +
>> +       reg = readl(regs_base + PCIE_GEN3_EQU_CTRL);
>> +       reg |= GEN3_EQU_EVAL_2MS_DISABLE;
>> +       writel(reg, regs_base + PCIE_GEN3_EQU_CTRL);
>
> setbits_le32()

Okay.

>> +}
>> +
>> +static int is_link_up(void *regs_base)
>
> const void? It would be better as a struct though

Again, I really think that we are moving away from the "old"
U-Boot rule to use structs and are more and more going with
offsets as macros - exactly what the kernel promotes.

>> +{
>> +       u32 mask = PCIE_GLB_STS_RDLH_LINK_UP | PCIE_GLB_STS_PHY_LINK_UP;
>> +       u32 reg;
>> +
>> +       reg = readl(regs_base + PCIE_GLOBAL_STATUS);
>> +       if ((reg & mask) == mask)
>> +               return 1;
>> +
>> +       return 0;
>> +}
>> +
>> +static int wait_link_up(void *regs_base)
>
> Better to return 0 if OK, -ETIMEDOUT if not.

The function is named "is_link_up()", so returning "1" for "true"
makes the calling code clearer for my taste. I can change the
function to use "bool" instead of "int" and use "false / true"
as well if you prefer this.

>> +{
>> +       unsigned long timeout;
>> +
>> +       timeout = get_timer(0) + PCIE_LINK_UP_TIMEOUT_MS;
>> +       while (!is_link_up(regs_base)) {
>> +               if (get_timer(0) > timeout)
>> +                       return 0;
>> +       };
>> +
>> +       return 1;
>> +}
>> +
>> +static int pcie_dw_mvebu_pcie_link_up(void *regs_base, u32 cap_speed)
>
> Better to return 0 if OK, -ve error if not

Changing this function to 0 / -ETIMEDOUT makes more sense
in this function in contrast to the one above, IMHO. But
this makes the use of these functions inconsistant.

>> +{
>> +       u32 reg;
>> +
>> +       if (!is_link_up(regs_base)) {
>> +               /* Disable LTSSM state machine to enable configuration */
>> +               reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
>> +               reg &= ~(PCIE_APP_LTSSM_EN);
>> +               writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
>> +       }
>> +
>> +       reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
>> +       reg &= ~(PCIE_DEVICE_TYPE_MASK << PCIE_DEVICE_TYPE_OFFSET);
>> +       reg |= (PCIE_DEVICE_TYPE_RC << PCIE_DEVICE_TYPE_OFFSET);
>> +       writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
>> +
>> +       /* Set the PCIe master AXI attributes */
>> +       writel(ARCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_ARCACHE_TRC);
>> +       writel(AWCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_AWCACHE_TRC);
>> +
>> +       /* DW pre link configurations */
>> +
> (regs_base, cap_speed);
>> +
>> +       if (!is_link_up(regs_base)) {
>> +               /* Configuration done. Start LTSSM */
>> +               reg = readl(regs_base + PCIE_GLOBAL_CONTROL);
>> +               reg |= PCIE_APP_LTSSM_EN;
>> +               writel(reg, regs_base + PCIE_GLOBAL_CONTROL);
>> +       }
>> +
>> +       /* Check that link was established */
>> +       if (!wait_link_up(regs_base))
>> +               return 0;
>> +
>> +       /*
>> +        * Link can be established in Gen 1. still need to wait
>> +        * till MAC nagaotiation is completed
>> +        */
>> +       udelay(100);
>> +
>> +       return 1;
>> +}
>> +
>> +/*
>> + * iATU region setup
>> + */
>> +static int pcie_dw_regions_setup(struct pcie_dw_mvebu *pcie)
>> +{
>> +       /*
>> +        * Region #0 is used for Outbound CFG space access.
>> +        * Direction = Outbound
>> +        * Region Index = 0
>> +        */
>> +       writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
>> +
>> +       writel((u32)(uintptr_t)pcie->cfg_base, pcie->ctrl_base
>> +              + PCIE_ATU_LOWER_BASE);
>> +       writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_BASE);
>> +       writel((u32)(uintptr_t)pcie->cfg_base + pcie->cfg_size,
>> +              pcie->ctrl_base + PCIE_ATU_LIMIT);
>> +
>> +       writel(0, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
>> +       writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_TARGET);
>> +       writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
>> +       writel(PCIE_ATU_ENABLE, pcie->ctrl_base + PCIE_ATU_CR2);
>> +
>> +       return 0;
>> +}
>> +
>> +static void pcie_dw_set_host_bars(void *regs_base)
>> +{
>> +       u32 size = gd->ram_size;
>> +       u64 max_size;
>> +       u32 reg;
>> +       u32 bar0;
>> +
>> +       /* Verify the maximal BAR size */
>> +       reg = readl(regs_base + RESIZABLE_BAR_CAP);
>> +       max_size = 1ULL << (5 + (reg + (1 << 4)));
>> +
>> +       if (size > max_size) {
>> +               size = max_size;
>> +               printf("Warning: PCIe BARs can't map all DRAM space\n");
>
> Isn't this an error? If so I suggest returning it.

No, its a warning as the message explains. The PCIe drivers should
still be able to work correctly, AFAICTO. If later tests show
that this is a problem which needs to get addresses, I'll come
back and will either return with error here or add the missing
fixes.

>> +       }
>> +
>> +       /* Set the BAR base and size towards DDR */
>> +       bar0 = CONFIG_SYS_SDRAM_BASE & ~0xf;
>> +       bar0 |= PCI_BASE_ADDRESS_MEM_TYPE_32;
>> +       writel(CONFIG_SYS_SDRAM_BASE, regs_base + PCIE_CONFIG_BAR0);
>> +
>> +       reg = ((size >> 20) - 1) << 12;
>> +       writel(size, regs_base + RESIZABLE_BAR_CTL0);
>> +}
>> +
>> +static int pcie_dw_mvebu_probe(struct udevice *dev)
>> +{
>> +       struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
>> +
>> +       pcie->first_busno = dev->seq;
>
> OK I see what that variable is now. But please comment it at the top.

Will do.

>> +
>> +       /* Don't register host if link is down */
>> +       if (!pcie_dw_mvebu_pcie_link_up(pcie->ctrl_base, LINK_SPEED_GEN_3)) {
>> +               printf("PCIE-%d: Link down\n", dev->seq);
>> +               return -ENODEV;
>> +       }
>> +
>> +       printf("PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", dev->seq,
>> +              pcie_dw_get_link_speed(pcie->ctrl_base),
>> +              pcie_dw_get_link_width(pcie->ctrl_base), pcie->hose.first_busno);
>> +
>> +       pcie_dw_regions_setup(pcie);
>> +       pcie_dw_set_host_bars(pcie->ctrl_base);
>> +
>> +       return 0;
>> +}
>> +
>> +static int pcie_dw_mvebu_ofdata_to_platdata(struct udevice *dev)
>> +{
>> +       struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
>> +
>> +       pcie->ctrl_base = (void *)dev_get_addr_index(dev, 0);
>> +       if (IS_ERR(pcie->ctrl_base))
>> +               return PTR_ERR(pcie->ctrl_base);
>> +
>> +       /*
>> +        * We need to know the size for the cfg space as well from the
>> +        * DT "reg" property. dev_get_addr_index() doesn't provide this
>> +        * size, so we need to use a different method to acquire the
>> +        * address and size here.
>> +        */
>> +       pcie->cfg_base = (void *)fdtdec_get_addr_size_auto_noparent(
>> +               gd->fdt_blob, dev->of_offset, "reg", 1, &pcie->cfg_size, true);
>
> This function returns FDT_ADDR_T_NONE on failure. Do we need to add a
> dev_get_addr_size()?

Yes, this might be better. Let me see if I can cook up a patch for
such a new function.

Thanks for your review,
Stefan

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15 v2] pci: mvebu: Add PCIe driver for Armada-8K
  2016-11-15  9:08 ` [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K Stefan Roese
  2016-11-18  1:14   ` Simon Glass
@ 2016-11-28 12:38   ` Stefan Roese
  2016-12-03  4:26     ` Simon Glass
  1 sibling, 1 reply; 23+ messages in thread
From: Stefan Roese @ 2016-11-28 12:38 UTC (permalink / raw)
  To: u-boot

From: Shadi Ammouri <shadi@marvell.com>

This patch adds a driver for the PCIe controller integrated in the
Marvell Armada-8K SoC. This controller is based on the DesignWare
IP core.

The original version was written by Shadi and Yehuda. I ported this
driver to the latest mainline U-Boot version with DM support.

Tested on the Marvell DB-88F8040 Armada-8K eval board.

Signed-off-by: Shadi Ammouri <shadi@marvell.com>
Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Neta Zur Hershkovits <neta@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Omri Itach <omrii@marvell.com>
Cc: Igal Liberman <igall@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
---
v2:
- Removed host struct from private data struct
- Added comments to structs and functions
- Moved shift into the macro for PCIE_LINK_STATUS_SPEED_MASK
  and PCIE_LINK_STATUS_WIDTH_MASK
- Added Email addresses to ToDo statement
- Used clrsetbits_le32(9 where applicable
- Added const to register base pointer
- Used new core function dev_get_addr_size_index() to retrieve
  addr and size
- Added code to configure the PCIe root complex device as PCI
  bridge device

 drivers/pci/Kconfig         |  10 +
 drivers/pci/Makefile        |   1 +
 drivers/pci/pcie_dw_mvebu.c | 535 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 546 insertions(+)
 create mode 100644 drivers/pci/pcie_dw_mvebu.c

diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index b8376b4..ff2c370 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -33,6 +33,16 @@ config PCI_PNP
 	help
 	  Enable PCI memory and I/O space resource allocation and assignment.
 
+config PCIE_DW_MVEBU
+	bool "Enable Armada-8K PCIe driver (DesignWare core)"
+	default n
+	depends on DM_PCI
+	depends on ARMADA_8K
+	help
+	  Say Y here if you want to enable PCIe controller support on
+	  Armada-8K SoCs. The PCIe controller on Armada-8K is based on
+	  DesignWare hardware.
+
 config PCI_SANDBOX
 	bool "Sandbox PCI support"
 	depends on SANDBOX && DM_PCI
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
index 9583e91..86717a4 100644
--- a/drivers/pci/Makefile
+++ b/drivers/pci/Makefile
@@ -30,5 +30,6 @@ obj-$(CONFIG_SH7780_PCI) +=pci_sh7780.o
 obj-$(CONFIG_PCI_TEGRA) += pci_tegra.o
 obj-$(CONFIG_TSI108_PCI) += tsi108_pci.o
 obj-$(CONFIG_WINBOND_83C553) += w83c553f.o
+obj-$(CONFIG_PCIE_DW_MVEBU) += pcie_dw_mvebu.o
 obj-$(CONFIG_PCIE_LAYERSCAPE) += pcie_layerscape.o
 obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o
diff --git a/drivers/pci/pcie_dw_mvebu.c b/drivers/pci/pcie_dw_mvebu.c
new file mode 100644
index 0000000..890a265
--- /dev/null
+++ b/drivers/pci/pcie_dw_mvebu.c
@@ -0,0 +1,535 @@
+/*
+ * Copyright (C) 2015 Marvell International Ltd.
+ *
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ *
+ * Based on:
+ *   - drivers/pci/pcie_imx.c
+ *   - drivers/pci/pci_mvebu.c
+ *   - drivers/pci/pcie_xilinx.c
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <pci.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* PCI Config space registers */
+#define PCIE_CONFIG_BAR0		0x10
+#define PCIE_LINK_STATUS_REG		0x80
+#define PCIE_LINK_STATUS_SPEED_OFF	16
+#define PCIE_LINK_STATUS_SPEED_MASK	(0xf << PCIE_LINK_STATUS_SPEED_OFF)
+#define PCIE_LINK_STATUS_WIDTH_OFF	20
+#define PCIE_LINK_STATUS_WIDTH_MASK	(0xf << PCIE_LINK_STATUS_WIDTH_OFF)
+
+/* Resizable bar capability registers */
+#define RESIZABLE_BAR_CAP		0x250
+#define RESIZABLE_BAR_CTL0		0x254
+#define RESIZABLE_BAR_CTL1		0x258
+
+/* iATU registers */
+#define PCIE_ATU_VIEWPORT		0x900
+#define PCIE_ATU_REGION_INBOUND		(0x1 << 31)
+#define PCIE_ATU_REGION_OUTBOUND	(0x0 << 31)
+#define PCIE_ATU_REGION_INDEX1		(0x1 << 0)
+#define PCIE_ATU_REGION_INDEX0		(0x0 << 0)
+#define PCIE_ATU_CR1			0x904
+#define PCIE_ATU_TYPE_MEM		(0x0 << 0)
+#define PCIE_ATU_TYPE_IO		(0x2 << 0)
+#define PCIE_ATU_TYPE_CFG0		(0x4 << 0)
+#define PCIE_ATU_TYPE_CFG1		(0x5 << 0)
+#define PCIE_ATU_CR2			0x908
+#define PCIE_ATU_ENABLE			(0x1 << 31)
+#define PCIE_ATU_BAR_MODE_ENABLE	(0x1 << 30)
+#define PCIE_ATU_LOWER_BASE		0x90C
+#define PCIE_ATU_UPPER_BASE		0x910
+#define PCIE_ATU_LIMIT			0x914
+#define PCIE_ATU_LOWER_TARGET		0x918
+#define PCIE_ATU_BUS(x)			(((x) & 0xff) << 24)
+#define PCIE_ATU_DEV(x)			(((x) & 0x1f) << 19)
+#define PCIE_ATU_FUNC(x)		(((x) & 0x7) << 16)
+#define PCIE_ATU_UPPER_TARGET		0x91C
+
+#define PCIE_LINK_CAPABILITY		0x7C
+#define PCIE_LINK_CTL_2			0xA0
+#define TARGET_LINK_SPEED_MASK		0xF
+#define LINK_SPEED_GEN_1		0x1
+#define LINK_SPEED_GEN_2		0x2
+#define LINK_SPEED_GEN_3		0x3
+
+#define PCIE_GEN3_RELATED		0x890
+#define GEN3_EQU_DISABLE		(1 << 16)
+#define GEN3_ZRXDC_NON_COMP		(1 << 0)
+
+#define PCIE_GEN3_EQU_CTRL		0x8A8
+#define GEN3_EQU_EVAL_2MS_DISABLE	(1 << 5)
+
+#define PCIE_ROOT_COMPLEX_MODE_MASK	(0xF << 4)
+
+#define PCIE_LINK_UP_TIMEOUT_MS		100
+
+#define PCIE_GLOBAL_CONTROL		0x8000
+#define PCIE_APP_LTSSM_EN		(1 << 2)
+#define PCIE_DEVICE_TYPE_OFFSET		(4)
+#define PCIE_DEVICE_TYPE_MASK		(0xF)
+#define PCIE_DEVICE_TYPE_EP		(0x0) /* Endpoint */
+#define PCIE_DEVICE_TYPE_LEP		(0x1) /* Legacy endpoint */
+#define PCIE_DEVICE_TYPE_RC		(0x4) /* Root complex */
+
+#define PCIE_GLOBAL_STATUS		0x8008
+#define PCIE_GLB_STS_RDLH_LINK_UP	(1 << 1)
+#define PCIE_GLB_STS_PHY_LINK_UP	(1 << 9)
+
+#define PCIE_ARCACHE_TRC		0x8050
+#define PCIE_AWCACHE_TRC		0x8054
+#define ARCACHE_SHAREABLE_CACHEABLE	0x3511
+#define AWCACHE_SHAREABLE_CACHEABLE	0x5311
+
+#define LINK_SPEED_GEN_1                0x1
+#define LINK_SPEED_GEN_2                0x2
+#define LINK_SPEED_GEN_3                0x3
+
+/**
+ * struct pcie_dw_mvebu - MVEBU DW PCIe controller state
+ *
+ * @ctrl_base: The base address of the register space
+ * @cfg_base: The base address of the configuration space
+ * @cfg_size: The size of the configuration space which is needed
+ *            as it gets written into the PCIE_ATU_LIMIT register
+ * @first_busno: This driver supports multiple PCIe controllers.
+ *               first_busno stores the bus number of the PCIe root-port
+ *               number which may vary depending on the PCIe setup
+ *               (PEX switches etc).
+ */
+struct pcie_dw_mvebu {
+	void *ctrl_base;
+	void *cfg_base;
+	fdt_size_t cfg_size;
+	int first_busno;
+};
+
+static int pcie_dw_get_link_speed(const void *regs_base)
+{
+	return (readl(regs_base + PCIE_LINK_STATUS_REG) &
+		PCIE_LINK_STATUS_SPEED_MASK) >> PCIE_LINK_STATUS_SPEED_OFF;
+}
+
+static int pcie_dw_get_link_width(const void *regs_base)
+{
+	return (readl(regs_base + PCIE_LINK_STATUS_REG) &
+		PCIE_LINK_STATUS_WIDTH_MASK) >> PCIE_LINK_STATUS_WIDTH_OFF;
+}
+
+/**
+ * set_cfg_address() - Configure the PCIe controller config space access
+ *
+ * @pcie: Pointer to the PCI controller state
+ * @d: PCI device to access
+ * @where: Offset in the configuration space
+ *
+ * Configures the PCIe controller to access the configuration space of
+ * a specific PCIe device and returns the address to use for this
+ * access.
+ *
+ * Return: Address that can be used to access the configation space
+ *         of the requested device / offset
+ */
+static uintptr_t set_cfg_address(struct pcie_dw_mvebu *pcie,
+				 pci_dev_t d, uint where)
+{
+	uintptr_t va_address;
+
+	/*
+	 * Region #0 is used for Outbound CFG space access.
+	 * Direction = Outbound
+	 * Region Index = 0
+	 */
+	writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
+
+	if (PCI_BUS(d) == (pcie->first_busno + 1))
+		/* For local bus, change TLP Type field to 4. */
+		writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
+	else
+		/* Otherwise, change TLP Type field to 5. */
+		writel(PCIE_ATU_TYPE_CFG1, pcie->ctrl_base + PCIE_ATU_CR1);
+
+	if (PCI_BUS(d) == pcie->first_busno) {
+		/* Accessing root port configuration space. */
+		va_address = (uintptr_t)pcie->ctrl_base;
+	} else {
+		writel(d << 8, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
+		va_address = (uintptr_t)pcie->cfg_base;
+	}
+
+	va_address += where & ~0x3;
+
+	return va_address;
+}
+
+/**
+ * pcie_dw_addr_valid() - Check for valid bus address
+ *
+ * @d: The PCI device to access
+ * @first_busno: Bus number of the PCIe controller root complex
+ *
+ * Return 1 (true) if the PCI device can be accessed by this controller.
+ *
+ * Return: 1 on valid, 0 on invalid
+ */
+static int pcie_dw_addr_valid(pci_dev_t d, int first_busno)
+{
+	if ((PCI_BUS(d) == first_busno) && (PCI_DEV(d) > 0))
+		return 0;
+	if ((PCI_BUS(d) == first_busno + 1) && (PCI_DEV(d) > 0))
+		return 0;
+
+	return 1;
+}
+
+/**
+ * pcie_dw_mvebu_read_config() - Read from configuration space
+ *
+ * @bus: Pointer to the PCI bus
+ * @bdf: Identifies the PCIe device to access
+ * @offset: The offset into the device's configuration space
+ * @valuep: A pointer at which to store the read value
+ * @size: Indicates the size of access to perform
+ *
+ * Read a value of size @size from offset @offset within the configuration
+ * space of the device identified by the bus, device & function numbers in @bdf
+ * on the PCI bus @bus.
+ *
+ * Return: 0 on success
+ */
+static int pcie_dw_mvebu_read_config(struct udevice *bus, pci_dev_t bdf,
+				     uint offset, ulong *valuep,
+				     enum pci_size_t size)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
+	uintptr_t va_address;
+	ulong value;
+
+	debug("PCIE CFG read:  (b,d,f)=(%2d,%2d,%2d) ",
+	      PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
+
+	if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
+		debug("- out of range\n");
+		*valuep = pci_get_ff(size);
+		return 0;
+	}
+
+	va_address = set_cfg_address(pcie, bdf, offset);
+
+	value = readl(va_address);
+
+	debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
+	*valuep = pci_conv_32_to_size(value, offset, size);
+
+	return 0;
+}
+
+/**
+ * pcie_dw_mvebu_write_config() - Write to configuration space
+ *
+ * @bus: Pointer to the PCI bus
+ * @bdf: Identifies the PCIe device to access
+ * @offset: The offset into the device's configuration space
+ * @value: The value to write
+ * @size: Indicates the size of access to perform
+ *
+ * Write the value @value of size @size from offset @offset within the
+ * configuration space of the device identified by the bus, device & function
+ * numbers in @bdf on the PCI bus @bus.
+ *
+ * Return: 0 on success
+ */
+static int pcie_dw_mvebu_write_config(struct udevice *bus, pci_dev_t bdf,
+				      uint offset, ulong value,
+				      enum pci_size_t size)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(bus);
+	uintptr_t va_address;
+	ulong old;
+
+	debug("PCIE CFG write: (b,d,f)=(%2d,%2d,%2d) ",
+	      PCI_BUS(bdf), PCI_DEV(bdf), PCI_FUNC(bdf));
+	debug("(addr,val)=(0x%04x, 0x%08lx)\n", offset, value);
+
+	if (!pcie_dw_addr_valid(bdf, pcie->first_busno)) {
+		debug("- out of range\n");
+		return 0;
+	}
+
+	va_address = set_cfg_address(pcie, bdf, offset);
+
+	old = readl(va_address);
+	value = pci_conv_size_to_32(old, value, offset, size);
+	writel(value, va_address);
+
+	return 0;
+}
+
+/**
+ * pcie_dw_configure() - Configure link capabilities and speed
+ *
+ * @regs_base: A pointer to the PCIe controller registers
+ * @cap_speed: The capabilities and speed to configure
+ *
+ * Configure the link capabilities and speed in the PCIe root complex.
+ */
+static void pcie_dw_configure(const void *regs_base, u32 cap_speed)
+{
+	/*
+	 * TODO (shadi at marvell.com, sr at denx.de):
+	 * Need to read the serdes speed from the dts and according to it
+	 * configure the PCIe gen
+	 */
+
+	/* Set link to GEN 3 */
+	clrsetbits_le32(regs_base + PCIE_LINK_CTL_2,
+			TARGET_LINK_SPEED_MASK, cap_speed);
+	clrsetbits_le32(regs_base + PCIE_LINK_CAPABILITY,
+			TARGET_LINK_SPEED_MASK, cap_speed);
+	setbits_le32(regs_base + PCIE_GEN3_EQU_CTRL, GEN3_EQU_EVAL_2MS_DISABLE);
+}
+
+/**
+ * is_link_up() - Return the link state
+ *
+ * @regs_base: A pointer to the PCIe controller registers
+ *
+ * Return: 1 (true) for active line and 0 (false) for no link
+ */
+static int is_link_up(const void *regs_base)
+{
+	u32 mask = PCIE_GLB_STS_RDLH_LINK_UP | PCIE_GLB_STS_PHY_LINK_UP;
+	u32 reg;
+
+	reg = readl(regs_base + PCIE_GLOBAL_STATUS);
+	if ((reg & mask) == mask)
+		return 1;
+
+	return 0;
+}
+
+/**
+ * wait_link_up() - Wait for the link to come up
+ *
+ * @regs_base: A pointer to the PCIe controller registers
+ *
+ * Return: 1 (true) for active line and 0 (false) for no link (timeout)
+ */
+static int wait_link_up(const void *regs_base)
+{
+	unsigned long timeout;
+
+	timeout = get_timer(0) + PCIE_LINK_UP_TIMEOUT_MS;
+	while (!is_link_up(regs_base)) {
+		if (get_timer(0) > timeout)
+			return 0;
+	};
+
+	return 1;
+}
+
+/**
+ * pcie_dw_mvebu_pcie_link_up() - Configure the PCIe root port
+ *
+ * @regs_base: A pointer to the PCIe controller registers
+ * @cap_speed: The capabilities and speed to configure
+ *
+ * Configure the PCIe controller root complex depending on the
+ * requested link capabilities and speed.
+ *
+ * Return: 1 (true) for active line and 0 (false) for no link
+ */
+static int pcie_dw_mvebu_pcie_link_up(const void *regs_base, u32 cap_speed)
+{
+	if (!is_link_up(regs_base)) {
+		/* Disable LTSSM state machine to enable configuration */
+		clrbits_le32(regs_base + PCIE_GLOBAL_CONTROL,
+			     PCIE_APP_LTSSM_EN);
+	}
+
+	clrsetbits_le32(regs_base + PCIE_GLOBAL_CONTROL,
+			PCIE_DEVICE_TYPE_MASK << PCIE_DEVICE_TYPE_OFFSET,
+			PCIE_DEVICE_TYPE_RC << PCIE_DEVICE_TYPE_OFFSET);
+
+	/* Set the PCIe master AXI attributes */
+	writel(ARCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_ARCACHE_TRC);
+	writel(AWCACHE_SHAREABLE_CACHEABLE, regs_base + PCIE_AWCACHE_TRC);
+
+	/* DW pre link configurations */
+	pcie_dw_configure(regs_base, cap_speed);
+
+	if (!is_link_up(regs_base)) {
+		/* Configuration done. Start LTSSM */
+		setbits_le32(regs_base + PCIE_GLOBAL_CONTROL,
+			     PCIE_APP_LTSSM_EN);
+	}
+
+	/* Check that link was established */
+	if (!wait_link_up(regs_base))
+		return 0;
+
+	/*
+	 * Link can be established in Gen 1. still need to wait
+	 * till MAC nagaotiation is completed
+	 */
+	udelay(100);
+
+	return 1;
+}
+
+/**
+ * pcie_dw_regions_setup() - iATU region setup
+ *
+ * @pcie: Pointer to the PCI controller state
+ *
+ * Configure the iATU regions in the PCIe controller for outbound access.
+ */
+static void pcie_dw_regions_setup(struct pcie_dw_mvebu *pcie)
+{
+	/*
+	 * Region #0 is used for Outbound CFG space access.
+	 * Direction = Outbound
+	 * Region Index = 0
+	 */
+	writel(0, pcie->ctrl_base + PCIE_ATU_VIEWPORT);
+
+	writel((u32)(uintptr_t)pcie->cfg_base, pcie->ctrl_base
+	       + PCIE_ATU_LOWER_BASE);
+	writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_BASE);
+	writel((u32)(uintptr_t)pcie->cfg_base + pcie->cfg_size,
+	       pcie->ctrl_base + PCIE_ATU_LIMIT);
+
+	writel(0, pcie->ctrl_base + PCIE_ATU_LOWER_TARGET);
+	writel(0, pcie->ctrl_base + PCIE_ATU_UPPER_TARGET);
+	writel(PCIE_ATU_TYPE_CFG0, pcie->ctrl_base + PCIE_ATU_CR1);
+	writel(PCIE_ATU_ENABLE, pcie->ctrl_base + PCIE_ATU_CR2);
+}
+
+/**
+ * pcie_dw_set_host_bars() - Configure the host BARs
+ *
+ * @regs_base: A pointer to the PCIe controller registers
+ *
+ * Configure the host BARs of the PCIe controller root port so that
+ * PCI(e) devices may access the system memory.
+ */
+static void pcie_dw_set_host_bars(const void *regs_base)
+{
+	u32 size = gd->ram_size;
+	u64 max_size;
+	u32 reg;
+	u32 bar0;
+
+	/* Verify the maximal BAR size */
+	reg = readl(regs_base + RESIZABLE_BAR_CAP);
+	max_size = 1ULL << (5 + (reg + (1 << 4)));
+
+	if (size > max_size) {
+		size = max_size;
+		printf("Warning: PCIe BARs can't map all DRAM space\n");
+	}
+
+	/* Set the BAR base and size towards DDR */
+	bar0 = CONFIG_SYS_SDRAM_BASE & ~0xf;
+	bar0 |= PCI_BASE_ADDRESS_MEM_TYPE_32;
+	writel(CONFIG_SYS_SDRAM_BASE, regs_base + PCIE_CONFIG_BAR0);
+
+	reg = ((size >> 20) - 1) << 12;
+	writel(size, regs_base + RESIZABLE_BAR_CTL0);
+}
+
+/**
+ * pcie_dw_mvebu_probe() - Probe the PCIe bus for active link
+ *
+ * @dev: A pointer to the device being operated on
+ *
+ * Probe for an active link on the PCIe bus and configure the controller
+ * to enable this port.
+ *
+ * Return: 0 on success, else -ENODEV
+ */
+static int pcie_dw_mvebu_probe(struct udevice *dev)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
+	struct udevice *ctlr = pci_get_controller(dev);
+	struct pci_controller *hose = dev_get_uclass_priv(ctlr);
+
+	pcie->first_busno = dev->seq;
+
+	/* Don't register host if link is down */
+	if (!pcie_dw_mvebu_pcie_link_up(pcie->ctrl_base, LINK_SPEED_GEN_3)) {
+		printf("PCIE-%d: Link down\n", dev->seq);
+		return -ENODEV;
+	}
+
+	printf("PCIE-%d: Link up (Gen%d-x%d, Bus%d)\n", dev->seq,
+	       pcie_dw_get_link_speed(pcie->ctrl_base),
+	       pcie_dw_get_link_width(pcie->ctrl_base), hose->first_busno);
+
+	pcie_dw_regions_setup(pcie);
+
+	/* Set the CLASS_REV of RC CFG header to PCI_CLASS_BRIDGE_PCI */
+	clrsetbits_le32(pcie->ctrl_base + PCI_CLASS_REVISION,
+			0xffff << 16, PCI_CLASS_BRIDGE_PCI << 16);
+
+	pcie_dw_set_host_bars(pcie->ctrl_base);
+
+	return 0;
+}
+
+/**
+ * pcie_dw_mvebu_ofdata_to_platdata() - Translate from DT to device state
+ *
+ * @dev: A pointer to the device being operated on
+ *
+ * Translate relevant data from the device tree pertaining to device @dev into
+ * state that the driver will later make use of. This state is stored in the
+ * device's private data structure.
+ *
+ * Return: 0 on success, else -EINVAL
+ */
+static int pcie_dw_mvebu_ofdata_to_platdata(struct udevice *dev)
+{
+	struct pcie_dw_mvebu *pcie = dev_get_priv(dev);
+
+	/* Get the controller base address */
+	pcie->ctrl_base = (void *)dev_get_addr_index(dev, 0);
+	if (pcie->ctrl_base == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	/* Get the config space base address and size */
+	pcie->cfg_base = (void *)dev_get_addr_size_index(dev, 1,
+							 &pcie->cfg_size);
+	if (pcie->cfg_base == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	return 0;
+}
+
+static const struct dm_pci_ops pcie_dw_mvebu_ops = {
+	.read_config	= pcie_dw_mvebu_read_config,
+	.write_config	= pcie_dw_mvebu_write_config,
+};
+
+static const struct udevice_id pcie_dw_mvebu_ids[] = {
+	{ .compatible = "marvell,armada8k-pcie" },
+	{ }
+};
+
+U_BOOT_DRIVER(pcie_dw_mvebu) = {
+	.name			= "pcie_dw_mvebu",
+	.id			= UCLASS_PCI,
+	.of_match		= pcie_dw_mvebu_ids,
+	.ops			= &pcie_dw_mvebu_ops,
+	.ofdata_to_platdata	= pcie_dw_mvebu_ofdata_to_platdata,
+	.probe			= pcie_dw_mvebu_probe,
+	.priv_auto_alloc_size	= sizeof(struct pcie_dw_mvebu),
+};
-- 
2.10.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15 v2] pci: mvebu: Add PCIe driver for Armada-8K
  2016-11-28 12:38   ` [U-Boot] [PATCH 12/15 v2] " Stefan Roese
@ 2016-12-03  4:26     ` Simon Glass
  2016-12-03  9:20       ` Stefan Roese
  0 siblings, 1 reply; 23+ messages in thread
From: Simon Glass @ 2016-12-03  4:26 UTC (permalink / raw)
  To: u-boot

On 28 November 2016 at 05:38, Stefan Roese <sr@denx.de> wrote:
> From: Shadi Ammouri <shadi@marvell.com>
>
> This patch adds a driver for the PCIe controller integrated in the
> Marvell Armada-8K SoC. This controller is based on the DesignWare
> IP core.
>
> The original version was written by Shadi and Yehuda. I ported this
> driver to the latest mainline U-Boot version with DM support.
>
> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>
> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Nadav Haklai <nadavh@marvell.com>
> Cc: Neta Zur Hershkovits <neta@marvell.com>
> Cc: Kostya Porotchkin <kostap@marvell.com>
> Cc: Omri Itach <omrii@marvell.com>
> Cc: Igal Liberman <igall@marvell.com>
> Cc: Haim Boot <hayim@marvell.com>
> Cc: Hanna Hawa <hannah@marvell.com>
> ---
> v2:
> - Removed host struct from private data struct
> - Added comments to structs and functions
> - Moved shift into the macro for PCIE_LINK_STATUS_SPEED_MASK
>   and PCIE_LINK_STATUS_WIDTH_MASK
> - Added Email addresses to ToDo statement
> - Used clrsetbits_le32(9 where applicable
> - Added const to register base pointer
> - Used new core function dev_get_addr_size_index() to retrieve
>   addr and size
> - Added code to configure the PCIe root complex device as PCI
>   bridge device
>
>  drivers/pci/Kconfig         |  10 +
>  drivers/pci/Makefile        |   1 +
>  drivers/pci/pcie_dw_mvebu.c | 535 ++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 546 insertions(+)

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15 v2] pci: mvebu: Add PCIe driver for Armada-8K
  2016-12-03  4:26     ` Simon Glass
@ 2016-12-03  9:20       ` Stefan Roese
  2016-12-03 18:31         ` Simon Glass
  0 siblings, 1 reply; 23+ messages in thread
From: Stefan Roese @ 2016-12-03  9:20 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 03.12.2016 05:26, Simon Glass wrote:
> On 28 November 2016 at 05:38, Stefan Roese <sr@denx.de> wrote:
>> From: Shadi Ammouri <shadi@marvell.com>
>>
>> This patch adds a driver for the PCIe controller integrated in the
>> Marvell Armada-8K SoC. This controller is based on the DesignWare
>> IP core.
>>
>> The original version was written by Shadi and Yehuda. I ported this
>> driver to the latest mainline U-Boot version with DM support.
>>
>> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>>
>> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
>> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Nadav Haklai <nadavh@marvell.com>
>> Cc: Neta Zur Hershkovits <neta@marvell.com>
>> Cc: Kostya Porotchkin <kostap@marvell.com>
>> Cc: Omri Itach <omrii@marvell.com>
>> Cc: Igal Liberman <igall@marvell.com>
>> Cc: Haim Boot <hayim@marvell.com>
>> Cc: Hanna Hawa <hannah@marvell.com>
>> ---
>> v2:
>> - Removed host struct from private data struct
>> - Added comments to structs and functions
>> - Moved shift into the macro for PCIE_LINK_STATUS_SPEED_MASK
>>   and PCIE_LINK_STATUS_WIDTH_MASK
>> - Added Email addresses to ToDo statement
>> - Used clrsetbits_le32(9 where applicable
>> - Added const to register base pointer
>> - Used new core function dev_get_addr_size_index() to retrieve
>>   addr and size
>> - Added code to configure the PCIe root complex device as PCI
>>   bridge device
>>
>>  drivers/pci/Kconfig         |  10 +
>>  drivers/pci/Makefile        |   1 +
>>  drivers/pci/pcie_dw_mvebu.c | 535 ++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 546 insertions(+)
>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Thanks.

I would like to integrate this PCIE driver in my next mvebu pull
request, introducing the Armada 8K support. But it depends on the
DM patch
"dm: core: Add dev_get_addr_size_index() to retrieve addr and size".
What is your plan with this one? Will you pull this patch soon?
Or should I pull it with my mvebu patch series?

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15 v2] pci: mvebu: Add PCIe driver for Armada-8K
  2016-12-03  9:20       ` Stefan Roese
@ 2016-12-03 18:31         ` Simon Glass
  2016-12-05 12:23           ` Stefan Roese
  0 siblings, 1 reply; 23+ messages in thread
From: Simon Glass @ 2016-12-03 18:31 UTC (permalink / raw)
  To: u-boot

Hi Stefan,

On 3 December 2016 at 02:20, Stefan Roese <sr@denx.de> wrote:
> Hi Simon,
>
>
> On 03.12.2016 05:26, Simon Glass wrote:
>>
>> On 28 November 2016 at 05:38, Stefan Roese <sr@denx.de> wrote:
>>>
>>> From: Shadi Ammouri <shadi@marvell.com>
>>>
>>> This patch adds a driver for the PCIe controller integrated in the
>>> Marvell Armada-8K SoC. This controller is based on the DesignWare
>>> IP core.
>>>
>>> The original version was written by Shadi and Yehuda. I ported this
>>> driver to the latest mainline U-Boot version with DM support.
>>>
>>> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>>>
>>> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
>>> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
>>> Signed-off-by: Stefan Roese <sr@denx.de>
>>> Cc: Simon Glass <sjg@chromium.org>
>>> Cc: Nadav Haklai <nadavh@marvell.com>
>>> Cc: Neta Zur Hershkovits <neta@marvell.com>
>>> Cc: Kostya Porotchkin <kostap@marvell.com>
>>> Cc: Omri Itach <omrii@marvell.com>
>>> Cc: Igal Liberman <igall@marvell.com>
>>> Cc: Haim Boot <hayim@marvell.com>
>>> Cc: Hanna Hawa <hannah@marvell.com>
>>> ---
>>> v2:
>>> - Removed host struct from private data struct
>>> - Added comments to structs and functions
>>> - Moved shift into the macro for PCIE_LINK_STATUS_SPEED_MASK
>>>   and PCIE_LINK_STATUS_WIDTH_MASK
>>> - Added Email addresses to ToDo statement
>>> - Used clrsetbits_le32(9 where applicable
>>> - Added const to register base pointer
>>> - Used new core function dev_get_addr_size_index() to retrieve
>>>   addr and size
>>> - Added code to configure the PCIe root complex device as PCI
>>>   bridge device
>>>
>>>  drivers/pci/Kconfig         |  10 +
>>>  drivers/pci/Makefile        |   1 +
>>>  drivers/pci/pcie_dw_mvebu.c | 535
>>> ++++++++++++++++++++++++++++++++++++++++++++
>>>  3 files changed, 546 insertions(+)
>>
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>
>
> Thanks.
>
> I would like to integrate this PCIE driver in my next mvebu pull
> request, introducing the Armada 8K support. But it depends on the
> DM patch
> "dm: core: Add dev_get_addr_size_index() to retrieve addr and size".
> What is your plan with this one? Will you pull this patch soon?
> Or should I pull it with my mvebu patch series?

I did have a second set of patches including this. So I've pushed it
into dm/master and sent an updated pull request.

Regards,
Simon

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 12/15 v2] pci: mvebu: Add PCIe driver for Armada-8K
  2016-12-03 18:31         ` Simon Glass
@ 2016-12-05 12:23           ` Stefan Roese
  0 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-12-05 12:23 UTC (permalink / raw)
  To: u-boot

On 03.12.2016 19:31, Simon Glass wrote:
>> On 03.12.2016 05:26, Simon Glass wrote:
>>>
>>> On 28 November 2016 at 05:38, Stefan Roese <sr@denx.de> wrote:
>>>>
>>>> From: Shadi Ammouri <shadi@marvell.com>
>>>>
>>>> This patch adds a driver for the PCIe controller integrated in the
>>>> Marvell Armada-8K SoC. This controller is based on the DesignWare
>>>> IP core.
>>>>
>>>> The original version was written by Shadi and Yehuda. I ported this
>>>> driver to the latest mainline U-Boot version with DM support.
>>>>
>>>> Tested on the Marvell DB-88F8040 Armada-8K eval board.
>>>>
>>>> Signed-off-by: Shadi Ammouri <shadi@marvell.com>
>>>> Signed-off-by: Yehuda Yitschak <yehuday@marvell.com>
>>>> Signed-off-by: Stefan Roese <sr@denx.de>
>>>> Cc: Simon Glass <sjg@chromium.org>
>>>> Cc: Nadav Haklai <nadavh@marvell.com>
>>>> Cc: Neta Zur Hershkovits <neta@marvell.com>
>>>> Cc: Kostya Porotchkin <kostap@marvell.com>
>>>> Cc: Omri Itach <omrii@marvell.com>
>>>> Cc: Igal Liberman <igall@marvell.com>
>>>> Cc: Haim Boot <hayim@marvell.com>
>>>> Cc: Hanna Hawa <hannah@marvell.com>
>>>> ---
>>>> v2:
>>>> - Removed host struct from private data struct
>>>> - Added comments to structs and functions
>>>> - Moved shift into the macro for PCIE_LINK_STATUS_SPEED_MASK
>>>>   and PCIE_LINK_STATUS_WIDTH_MASK
>>>> - Added Email addresses to ToDo statement
>>>> - Used clrsetbits_le32(9 where applicable
>>>> - Added const to register base pointer
>>>> - Used new core function dev_get_addr_size_index() to retrieve
>>>>   addr and size
>>>> - Added code to configure the PCIe root complex device as PCI
>>>>   bridge device
>>>>
>>>>  drivers/pci/Kconfig         |  10 +
>>>>  drivers/pci/Makefile        |   1 +
>>>>  drivers/pci/pcie_dw_mvebu.c | 535
>>>> ++++++++++++++++++++++++++++++++++++++++++++
>>>>  3 files changed, 546 insertions(+)
>>>
>>>
>>> Reviewed-by: Simon Glass <sjg@chromium.org>
>>
>>
>> Thanks.
>>
>> I would like to integrate this PCIE driver in my next mvebu pull
>> request, introducing the Armada 8K support. But it depends on the
>> DM patch
>> "dm: core: Add dev_get_addr_size_index() to retrieve addr and size".
>> What is your plan with this one? Will you pull this patch soon?
>> Or should I pull it with my mvebu patch series?
>
> I did have a second set of patches including this. So I've pushed it
> into dm/master and sent an updated pull request.

Thanks Simon!

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k
  2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
                   ` (13 preceding siblings ...)
  2016-11-15  9:08 ` [U-Boot] [PATCH 15/15] arm64: mvebu: Restrict memory size to a usable maximum Stefan Roese
@ 2016-12-05 12:56 ` Stefan Roese
  14 siblings, 0 replies; 23+ messages in thread
From: Stefan Roese @ 2016-12-05 12:56 UTC (permalink / raw)
  To: u-boot

On 15.11.2016 10:08, Stefan Roese wrote:
> This moves some of the Armada DB-88F7040 board specific files to a more
> generic name: armada-8k. This is in preparation for the Armada-8k
> support which will be added soon. And since both platforms share
> most devices, lets also share most source files to not duplicate
> the code here.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Nadav Haklai <nadavh@marvell.com>
> Cc: Neta Zur Hershkovits <neta@marvell.com>
> Cc: Kostya Porotchkin <kostap@marvell.com>
> Cc: Omri Itach <omrii@marvell.com>
> Cc: Igal Liberman <igall@marvell.com>
> Cc: Haim Boot <hayim@marvell.com>
> Cc: Hanna Hawa <hannah@marvell.com>

The whole patchset is:

Applied to u-boot-marvell/master.

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2016-12-05 12:56 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-15  9:08 [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 02/15] arm64: mvebu: Add Armada-80x0 dts/dtsi files Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 03/15] arm64: mvebu: armada-8k: Only configure xHCI power on DB-88F7040 board Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 04/15] arm64: mvebu: Add slave CP area to the memory map Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 05/15] arm64: mvebu: Add support for the DB-88F8040 Armada 8k devel board Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 06/15] arm64: mvebu: armada-cp110-master.dtsi: Rename comphy DT node names Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 07/15] arm64: mvebu: armada-cp110-slave.dtsi: Add COMPHY / UTMI device tree nodes Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 08/15] arm64: mvebu: armada-8040-db.dts: Add COMPHY configuration Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 09/15] arm64: mvebu: armada-8040-db.dts: Add I2C and SPI aliases Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 10/15] arm64: mvebu: Init COMPHY from the slave-CP on the A8k Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 11/15] drivers/phy: marvell: Add support for the slave CP COMPHY device Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 12/15] pci: mvebu: Add PCIe driver for Armada-8K Stefan Roese
2016-11-18  1:14   ` Simon Glass
2016-11-25 13:56     ` Stefan Roese
2016-11-28 12:38   ` [U-Boot] [PATCH 12/15 v2] " Stefan Roese
2016-12-03  4:26     ` Simon Glass
2016-12-03  9:20       ` Stefan Roese
2016-12-03 18:31         ` Simon Glass
2016-12-05 12:23           ` Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 13/15] arm64: mvebu: Add regions for PCI spaces to the memory map Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 14/15] arm64: mvebu: Add PCI support to DB-88F8040 board Stefan Roese
2016-11-15  9:08 ` [U-Boot] [PATCH 15/15] arm64: mvebu: Restrict memory size to a usable maximum Stefan Roese
2016-12-05 12:56 ` [U-Boot] [PATCH 01/15] arm64: mvebu: Rename db-88f7040 files to armada-8k Stefan Roese

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.